Merge branch 'refs/heads/dev_robotaxi-d_240912_6.7.0' into dev_robotaxi-d_240912_6.7.2_local

This commit is contained in:
donghongyu-pc
2024-10-24 12:51:43 +08:00
5 changed files with 148 additions and 71 deletions

View File

@@ -119,7 +119,7 @@ object ConfigStartUp {
}
val mapParams = MapParams.init()
mapParams.setDebugMode(true)
mapParams.setDebugMode(false)
// 1-使用本地地图数据0-使用在线地图数据
// .setDataFileSource(1)
.setIsRecordLogs(false)

View File

@@ -5,7 +5,6 @@ import android.util.Log
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener
import com.mogo.eagle.core.function.api.och.IOchFunctionCallNotify
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
@@ -24,22 +23,15 @@ object ColdStartManager: IMoGoAutopilotStatusListener, IDataCenterBizListener {
private var isColdStartSuccess: Boolean = false //当天是否冷启动成功
private var loginStatus: Boolean = false //当前登录状态
private var ipcConnectedTime: Long = System.currentTimeMillis()
private val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat())
//获取当天是否点击过“立即用车”
private var coldStartNowDay = millis2String(ColdStartConfig.getColdStartNowTime(), TimeUtils.getMdFormat())
//获取当天是否冷启动成功
private var coldStartSuccessDay = millis2String(ColdStartConfig.getColdStartSuccessTime(), TimeUtils.getMdFormat())
fun init(context: Context){
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerDataCenterBizListener.addListener(TAG,this)
val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat())
//获取当天是否点击过“立即用车”
val coldStartNowDay = millis2String(ColdStartConfig.getColdStartNowTime(), TimeUtils.getMdFormat())
if(coldStartNowDay == currentDay){
isColdStartNow = true
}
//获取当天是否冷启动成功
val coldStartSuccessDay = millis2String(ColdStartConfig.getColdStartSuccessTime(), TimeUtils.getMdFormat())
if(coldStartSuccessDay == currentDay){
isColdStartSuccess = true
}
}
override fun onAutopilotIpcConnectStatusChanged(
@@ -50,6 +42,15 @@ object ColdStartManager: IMoGoAutopilotStatusListener, IDataCenterBizListener {
if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){
//域控连接异常
if(status != AdasConstants.IpcConnectionStatus.CONNECTED){
coldStartNowDay = millis2String(ColdStartConfig.getColdStartNowTime(), TimeUtils.getMdFormat())
if(coldStartNowDay == currentDay){
isColdStartNow = true
}
//获取当天是否冷启动成功
coldStartSuccessDay = millis2String(ColdStartConfig.getColdStartSuccessTime(), TimeUtils.getMdFormat())
if(coldStartSuccessDay == currentDay){
isColdStartSuccess = true
}
//当前进入主页方式为立即用车,则在主页面不再展示冷启动页面
if(isColdStartNow && !isColdStartSuccess){
return
@@ -76,6 +77,7 @@ object ColdStartManager: IMoGoAutopilotStatusListener, IDataCenterBizListener {
override fun invokeLoginStatus(isLogin: Boolean) {
super.invokeLoginStatus(isLogin)
loginStatus = isLogin
Log.i("xuxinchao","loginStatus="+loginStatus)
}
}

View File

@@ -233,17 +233,19 @@ object StatusManager {
}
}?.forEachIndexed { index, status ->
val shl = 1 shl index
xor = if (status is RouteDownloadStatus) {
if (status.state == RouteStart) {
if (status.isException()) {
xor = if (status is RouteDownloadStatus) {
if (status.state == RouteStart) {
xor or shl
} else {
xor or (shl shl 1)
}
} else {
if (status is OtherErrorStatus) {
CallerDevaToolsManager.getExtra().putString(R.id.autopilot_start_error.toString(), status.reason?.getUnableLaunchReason())
}
xor or shl
} else {
xor or (shl shl 1)
}
} else {
if (status is OtherErrorStatus) {
CallerDevaToolsManager.getExtra().putString(R.id.autopilot_start_error.toString(), status.reason?.getUnableLaunchReason())
}
xor or shl
}
}
return xor

View File

@@ -304,11 +304,11 @@ class OperatePanelLayout : LinearLayout {
}
override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean {
return true
return false
}
override fun onPreferenceClick(preference: Preference): Boolean {
return true
return false
}
}
@@ -1255,7 +1255,7 @@ class OperatePanelLayout : LinearLayout {
KEY_ALL_MERGE_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
@@ -1275,7 +1275,7 @@ class OperatePanelLayout : LinearLayout {
KEY_BLIND_AREA_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
@@ -1295,7 +1295,7 @@ class OperatePanelLayout : LinearLayout {
KEY_BEYOND_VISUAL_RANGE_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
@@ -1315,7 +1315,7 @@ class OperatePanelLayout : LinearLayout {
KEY_TRANSPARENT_TRANSFER_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {
@@ -1335,7 +1335,7 @@ class OperatePanelLayout : LinearLayout {
KEY_PURE_OBU_MODE -> {
if (preference.extras.containsKey("is_checked")) {
preference.extras.remove("is_checked")
return true
return false
}
val isChecked = newValue as? Boolean ?: false
if (isChecked) {

View File

@@ -6,6 +6,7 @@ import android.content.Context
import android.os.Build
import android.os.CountDownTimer
import android.text.Html
import android.text.TextUtils
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
@@ -21,7 +22,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerColdStartStateListenerM
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.ResourceUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.zhjt.mogo.adas.data.AdasConstants
import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartAnalyticsManager
import com.zhjt.mogo_core_function_devatools.coldstart.ColdStartConfig
@@ -38,7 +38,9 @@ import kotlinx.android.synthetic.main.view_cold_start.view.viewColdStartDivider
import kotlinx.android.synthetic.main.view_cold_start.view.viewSsmConnectDivider
import system_master.SsmInfo
import system_master.SystemStatusInfo
import java.lang.StringBuilder
import java.util.Locale
import java.util.regex.Matcher
import java.util.regex.Pattern
/**
* 冷启动呈现二期
@@ -73,6 +75,8 @@ class ColdStartView @JvmOverloads constructor(
private var coldStartResultListener: ColdStartResultListener ?= null
private var newColdStart: Boolean = false //SSM是否支持新版冷启动
init {
LayoutInflater.from(context).inflate(R.layout.view_cold_start, this, true)
initView()
@@ -186,6 +190,11 @@ class ColdStartView @JvmOverloads constructor(
ThreadUtils.runOnUiThread {
//SSM连接成功
connectSSMSuccess()
//通过autoPilotReady判断冷启动是否成功
if(status.hasAutoPilotReady() && status.autoPilotReady && !coldStartStatus){
coldStartStatus = true
showColdStartSuccessView()
}
}
}
@@ -200,6 +209,22 @@ class ColdStartView @JvmOverloads constructor(
ThreadUtils.runOnUiThread {
//SSM连接成功
connectSSMSuccess()
//版本兼容
if(parseVersion(true, statusInf.masterVersion) > 40600){
//主动查询冷启动状态
if(!newColdStart){
newColdStart = true
CallerAutoPilotControlManager.sendSsmFuncQueryColdStartState()
}
}else{
newColdStart = false
//通过autoPilotReady判断冷启动是否成功
Log.i(TAG,"statusInf.autoPilotReady="+statusInf.autoPilotReady)
if(statusInf.hasAutoPilotReady() && statusInf.autoPilotReady && !coldStartStatus){
coldStartStatus = true
showColdStartSuccessView()
}
}
}
}
@@ -217,36 +242,41 @@ class ColdStartView @JvmOverloads constructor(
isQuery: Boolean,
coldStartState: SsmInfo.ColdStartState?
) {
coldStartState?.let {
Log.i(TAG,"节点自上报冷启动状态="+it.eventStatus)
Log.i(TAG,"冷启动状态="+it.processStatus)
Log.i(TAG,"旧冷启动超时原因="+it.processTimeoutReason)
ThreadUtils.runOnUiThread {
if(it.eventStatus == SsmInfo.CSState.COLD_START_READY){
//冷启动就绪
showColdStartSuccessView()
//冷启动成功埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartSuccess)
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
tvColdStartContent.text = getColdStartEventStatus(it.eventStatus)
nodeStatusSb.clear()
it.nodeList.forEach {node->
Log.i(TAG,"node nodeName="+node.nodeName+"node status="+node.status)
val nodeDetail = node.nodeName+ " " + getColdStartNodeStatus(node.status)
if(node.status == SsmInfo.NodeStatus.NODE_FAILED || node.status ==SsmInfo.NodeStatus.NODE_TIMEOUT){
nodeStatusSb.append("<font color=\"#FFCD3D\">${nodeDetail}</font>")
}else{
nodeStatusSb.append("<font color=\"#B2FFFFFF\">${nodeDetail}</font>")
if(newColdStart){
coldStartState?.let {
Log.i(TAG,"节点自上报冷启动状态="+it.eventStatus)
Log.i(TAG,"旧冷启动状态="+it.processStatus)
Log.i(TAG,"旧冷启动超时原因="+it.processTimeoutReason)
ThreadUtils.runOnUiThread {
if(it.eventStatus == SsmInfo.CSState.COLD_START_READY){
if(!coldStartStatus){
//冷启动就绪
coldStartStatus = true
showColdStartSuccessView()
}
//冷启动成功埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.coldStartSuccess)
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
tvColdStartContent.text = getColdStartEventStatus(it.eventStatus)
nodeStatusSb.clear()
it.nodeList.forEach {node->
Log.i(TAG,"node nodeName="+node.nodeName+"node status="+node.status)
val nodeDetail = node.nodeName+ " " + getColdStartNodeStatus(node.status)
if(node.status == SsmInfo.NodeStatus.NODE_FAILED || node.status ==SsmInfo.NodeStatus.NODE_TIMEOUT){
nodeStatusSb.append("<font color=\"#FFCD3D\">${nodeDetail}</font>")
}else{
nodeStatusSb.append("<font color=\"#B2FFFFFF\">${nodeDetail}</font>")
}
nodeStatusSb.append("<br>")
}
tvColdStartNodeState.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(nodeStatusSb.toString(), Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(nodeStatusSb.toString())
}
nodeStatusSb.append("<br>")
}
tvColdStartNodeState.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(nodeStatusSb.toString(), Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(nodeStatusSb.toString())
}
}
}
@@ -401,13 +431,10 @@ class ColdStartView @JvmOverloads constructor(
connectSSMTimer?.cancel()
//开始启动冷启动等待倒计时
coldStartProcess()
//主动查询冷启动状态
CallerAutoPilotControlManager.sendSsmFuncQueryColdStartState()
//SSM连接成功埋点统计
ColdStartAnalyticsManager.coldStartStepAnalytics(ColdStartAnalyticsManager.ssmConnectSuccess)
}
ssmConnectStatus = true
coldStartStatus = false
}
/**
@@ -518,13 +545,15 @@ class ColdStartView @JvmOverloads constructor(
* 冷启动成功视图
*/
private fun showColdStartSuccessView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_success)
coldStartRotationAnim?.cancel()
ivColdStartStatus.rotation = 0f
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))
tvColdStartContent.text = resources.getString(R.string.cold_start_success_content)
connectColdStartTimer?.cancel()
hideColdStartView()
if(coldStartStatus){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_success)
coldStartRotationAnim?.cancel()
ivColdStartStatus.rotation = 0f
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))
tvColdStartContent.text = resources.getString(R.string.cold_start_success_content)
connectColdStartTimer?.cancel()
hideColdStartView()
}
}
/**
@@ -548,4 +577,48 @@ class ColdStartView @JvmOverloads constructor(
coldStartResultListener = listener
}
private val pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+")
/**
* 解析版本 格式 xxx.xxx.xxx(x的数量不固定)
* 仅用于版本比较,不能用于展示
* 例如:
* "12.03.04" 解析结果120304
* "2.11.0" 解析结果21100
* "3.0.0" 解析结果30000
* 目前已用于DockerVersion和MaserVersion的解析
*
* @param isUseAll 是否使用全部截取数据 true表示 12.34.56 截取之后 123456 false表示12.34.56 截取之后 12
* @param ver 版本字符串 例如:"MAP-taxi_RoboTaxi_df_2.8.0.3_20220928_test" 解析结果为280
* @return -1表示解析失败
*/
private fun parseVersion(isUseAll: Boolean, ver: String): Int {
var version = -1
if (!TextUtils.isEmpty(ver)) {
try {
val matcher: Matcher = pattern.matcher(ver)
if (matcher.find()) {
var group = matcher.group()
if (!TextUtils.isEmpty(group)) {
val format = "%02d"
if (isUseAll) {
val temp = group.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
group = String.format(Locale.getDefault(), format, temp[0].toInt())
group += String.format(Locale.getDefault(), format, temp[1].toInt())
group += String.format(Locale.getDefault(), format, temp[2].toInt())
} else {
group = group.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()[0]
}
version = group.toInt()
}
}
} catch (e: Exception) {
Log.e(TAG, "版本解析失败=$ver", e)
}
}
return version
}
}