Merge remote-tracking branch 'origin/dev_robotaxi-d_241210_6.9.0' into dev_robotaxi-d_241210_6.9.0

This commit is contained in:
xyz
2025-01-08 14:43:18 +08:00
11 changed files with 179 additions and 48 deletions

View File

@@ -12,6 +12,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.zhjt.mogo.adas.data.AdasConstants
import com.zhjt.mogo_core_function_devatools.ota.OTAUpgradeConfig
/**
* 冷启动管理
@@ -82,7 +83,9 @@ object ColdStartManager: IMoGoAutopilotStatusListener, IDataCenterBizListener {
override fun invokeLoginStatus(isLogin: Boolean) {
super.invokeLoginStatus(isLogin)
loginStatus = isLogin
Log.i("xuxinchao","loginStatus="+loginStatus)
if(loginStatus){
OTAUpgradeConfig.coldStartCompleted = true
}
}
}

View File

@@ -19,4 +19,13 @@ object OTAUpgradeConfig {
//当前SSM版本是否支持OTA升级默认不支持
@JvmField
var supportOTA: Boolean = false
//是否是主动查询
@JvmField
var isQuery: Boolean = false
//已经提示过升级的列表
@JvmField
var promptedUpgrade: ArrayList<String> = ArrayList()
//已经提示过升级成功的列表
@JvmField
var upgradeFinish: ArrayList<String> = ArrayList()
}

View File

@@ -1,6 +1,7 @@
package com.zhjt.mogo_core_function_devatools.ota
import android.content.Context
import android.text.TextUtils
import android.util.Log
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.deva.ota.OtaUpgradeInfo
@@ -17,6 +18,9 @@ import com.mogo.eagle.core.utilcode.util.ToastUtils
import org.json.JSONArray
import org.json.JSONObject
import system_master.SsmInfo
import java.util.Locale
import java.util.regex.Matcher
import java.util.regex.Pattern
/**
* OTA升级管理类
@@ -56,6 +60,17 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener,
}
}
/**
* 定频SSM接口
* 1hz hq m1 MAP350开始支持其他车型MAP360开始支持
* 定频SSM接入后 onStatusQueryResp 状态查询应答接口将弃用
* @param statusInf 数据
*/
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {
//判断当前SSM版本是否支持OTA升级
OTAUpgradeConfig.supportOTA = parseVersion(true, statusInf.masterVersion) >= 40800
}
/**
* 是否有订单
* @param inOrder true有订单 false没有订单
@@ -76,18 +91,6 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener,
if(request.otaToken.isNotEmpty()){
if(OTAUpgradeConfig.otaToken != request.otaToken){
OTAUpgradeConfig.otaToken = request.otaToken
//冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示
if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus
&& !OTAUpgradeConfig.inOrder){
//触发强提示升级
CallerHmiManager.showOTAUpgradeDialog(true)
}else{
//触发弱提示升级
//冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级,
// 并toast提示“收到车辆部署任务请在车辆空闲时发起升级”
CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY)
ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级")
}
}
}
//解析JSON
@@ -104,7 +107,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener,
val taskId = productInfo.optInt("task_id")
val taskItemId = productInfo.optInt("task_item_id")
val otaType = productInfo.optInt("ota_type")
val productName = productInfo.optString("product_name")
var productName = productInfo.optString("product_name")
val needRestart = productInfo.optBoolean("need_restart")
val isDelay = productInfo.optBoolean("is_delay")
val curSize = productInfo.optDouble("cur_size")
@@ -124,21 +127,45 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener,
Log.i(TAG, "cur_size=$curSize")
Log.i(TAG, "total_size=$totalSize")
//// 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败
if(productStatus == 0 || productStatus == 1 || productStatus == 2){
upgradeComplete = false
CallerOTAManager.invokeOtaDownloadStatus(true)
}else{
CallerOTAManager.invokeOtaDownloadStatus(false)
if(index == 0){
//是否需要触发提示升级只判断第一个任务
if(productStatus == 0){
if(!OTAUpgradeConfig.promptedUpgrade.contains(request.otaToken)){
//冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示
if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus
&& !OTAUpgradeConfig.inOrder){
//触发强提示升级
CallerHmiManager.showOTAUpgradeDialog(true)
}else{
//触发弱提示升级
//冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级,
// 并toast提示“收到车辆部署任务请在车辆空闲时发起升级”
CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY)
ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级")
}
OTAUpgradeConfig.promptedUpgrade.add(request.otaToken)
}
return
}
}
// 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败
if(productStatus == 0 || productStatus == 1 || productStatus == 2){
upgradeComplete = false
}
if(productName.contains(":")){
productName = productName.trim().substringAfterLast(":")
}
val otaUpgradeInfo = OtaUpgradeInfo(token, productStatus,failReason,upgradeReason,
taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize)
otaUpgradeList.add(otaUpgradeInfo)
}
CallerHmiManager.showOTADownloadStatusDialog(otaUpgradeList)
CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList)
if(upgradeComplete){
OTAUpgradeConfig.otaToken = ""
CallerOTAManager.invokeOtaDownloadStatus(false)
}else{
CallerOTAManager.invokeOtaDownloadStatus(true)
}
}
@@ -160,8 +187,6 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener,
if(status.otaInfo.otaToken.isNotEmpty()){
if(OTAUpgradeConfig.otaToken != status.otaInfo.otaToken){
OTAUpgradeConfig.otaToken = status.otaInfo.otaToken
//触发升级提示
CallerHmiManager.showOTAUpgradeDialog(true)
}
}
@@ -180,7 +205,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener,
val taskId = productInfo.optInt("task_id")
val taskItemId = productInfo.optInt("task_item_id")
val otaType = productInfo.optInt("ota_type")
val productName = productInfo.optString("product_name")
var productName = productInfo.optString("product_name")
val needRestart = productInfo.optBoolean("need_restart")
val isDelay = productInfo.optBoolean("is_delay")
val curSize = productInfo.optDouble("cur_size")
@@ -199,32 +224,111 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener,
Log.i(TAG, "is_delay=$isDelay")
Log.i(TAG, "cur_size=$curSize")
Log.i(TAG, "total_size=$totalSize")
//// 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败
if(index == 0){
//是否需要触发提示升级只判断第一个任务
if(productStatus == 0){
if(!OTAUpgradeConfig.promptedUpgrade.contains(status.otaInfo.otaToken)){
//冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示
if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus
&& !OTAUpgradeConfig.inOrder){
//触发强提示升级
CallerHmiManager.showOTAUpgradeDialog(true)
}else{
//触发弱提示升级
//冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级,
// 并toast提示“收到车辆部署任务请在车辆空闲时发起升级”
CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY)
ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级")
}
OTAUpgradeConfig.promptedUpgrade.add(status.otaInfo.otaToken)
}
return
}
}
// 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败
if(productStatus == 0 || productStatus == 1 || productStatus == 2){
upgradeComplete = false
CallerOTAManager.invokeOtaDownloadStatus(true)
}else{
CallerOTAManager.invokeOtaDownloadStatus(false)
}
if(productStatus == 4){
upgradeResult = false
}
if(productName.contains(":")){
productName = productName.trim().substringAfterLast(":")
}
val otaUpgradeInfo = OtaUpgradeInfo(token, productStatus,failReason,upgradeReason,
taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize)
otaUpgradeList.add(otaUpgradeInfo)
}
if(upgradeComplete){
OTAUpgradeConfig.otaToken = ""
CallerHmiManager.showOTAResultDialog(upgradeResult)
if(OTAUpgradeConfig.isQuery){
ToastUtils.showLong("暂无待升级任务!")
OTAUpgradeConfig.isQuery = false
}else{
if(!OTAUpgradeConfig.upgradeFinish.contains(status.otaInfo.otaToken)){
CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList)
CallerHmiManager.showOTAResultDialog(upgradeResult)
OTAUpgradeConfig.upgradeFinish.add(status.otaInfo.otaToken)
}
}
CallerOTAManager.invokeOtaDownloadStatus(false)
}else{
//通知关闭提示升级窗口存在域控也在进行5min倒计时与app存在时间差域控会更早完成倒计时触发升级
// 此时通知app开始升级app收到后即使未完成倒计时也关闭提示弹窗开始展示下载进展
CallerHmiManager.showOTAUpgradeDialog(false)
CallerHmiManager.showOTADownloadStatusDialog(otaUpgradeList)
CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList)
CallerOTAManager.invokeOtaDownloadStatus(true)
}
}
}
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
}
}

View File

@@ -139,6 +139,8 @@ class CarInfoTabView @JvmOverloads constructor(
)
if(OTAUpgradeConfig.supportOTA){
//查询OTA状态
OTAUpgradeConfig.isQuery = true
OTAUpgradeConfig.promptedUpgrade.remove(OTAUpgradeConfig.otaToken)
CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken)
}else{
ToastUtils.showLong("当前域控版本不支持OTA升级")

View File

@@ -691,19 +691,26 @@ class MoGoHmiProvider : IMoGoHmiProvider {
/**
* 展示OTA升级下载状态弹窗
*/
override fun showOTADownloadStatusDialog(list: List<OtaUpgradeInfo>) {
override fun showOTADownloadStatusDialog(isShow: Boolean,list: List<OtaUpgradeInfo>) {
ThreadUtils.runOnUiThread{
if(otaDownloadStatusDialog?.isShowing == true){
otaDownloadStatusDialog?.notifyDownloadStatus(list)
return@runOnUiThread
}
context?.let {
if(otaDownloadStatusDialog == null){
otaDownloadStatusDialog = OTADownloadStatusDialog(it)
if(isShow){
if(otaDownloadStatusDialog?.isShowing == true){
otaDownloadStatusDialog?.notifyDownloadStatus(list)
return@runOnUiThread
}
context?.let {
if(otaDownloadStatusDialog == null){
otaDownloadStatusDialog = OTADownloadStatusDialog(it)
}
otaDownloadStatusDialog?.show()
otaDownloadStatusDialog?.notifyDownloadStatus(list)
}
}else{
if(otaDownloadStatusDialog?.isShowing == true){
otaDownloadStatusDialog?.dismiss()
}
otaDownloadStatusDialog?.show()
otaDownloadStatusDialog?.notifyDownloadStatus(list)
}
}
}

View File

@@ -2,11 +2,14 @@ package com.mogo.eagle.core.function.hmi.ui.tools
import android.content.Context
import android.os.CountDownTimer
import android.util.Log
import androidx.annotation.UiThread
import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.zhjt.mogo_core_function_devatools.ota.OTAUpgradeConfig
import kotlinx.android.synthetic.main.dialog_ota_upgrade.tv_upgrade_later
import kotlinx.android.synthetic.main.dialog_ota_upgrade.tv_upgrade_now
@@ -50,9 +53,11 @@ class OTAUpgradeDialog(context: Context) :
override fun onFinish() {
//立即升级
CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY)
ThreadUtils.runOnUiThread {
UiThreadHandler.postDelayed({
CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken)
dismiss()
}
},2000
)
}
}

View File

@@ -33,6 +33,9 @@ class OTADownloadStatusAdapter(private val context: Context): RecyclerView.Adapt
val otaUpgradeInfo = it[position]
holder.tvProductName.text = otaUpgradeInfo.product_name
holder.tvDownloadProgress.text = "${(otaUpgradeInfo.cur_size*100/otaUpgradeInfo.total_size).toInt()}%"
if(otaUpgradeInfo.cur_size == otaUpgradeInfo.total_size){
holder.tvDownloadProgress.text = "部署中"
}
holder.pbDownloadProgress.progress = (otaUpgradeInfo.cur_size*100/otaUpgradeInfo.total_size).toInt()
// 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败
// holder.tvDownloadStatus.text = when (otaUpgradeInfo.status) {

View File

@@ -279,8 +279,6 @@ class ColdStartView @JvmOverloads constructor(
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
}
//判断当前SSM版本是否支持OTA升级
OTAUpgradeConfig.supportOTA = parseVersion(true, statusInf.masterVersion) >= 40800
}
}

View File

@@ -21,7 +21,7 @@
<TextView
android:id="@+id/tvProductName"
android:layout_width="wrap_content"
android:layout_width="@dimen/dp_600"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/pbDownloadProgress"
app:layout_constraintLeft_toLeftOf="@id/pbDownloadProgress"

View File

@@ -333,7 +333,7 @@ interface IMoGoHmiProvider :IProvider{
/**
* 展示OTA升级下载状态弹窗
*/
fun showOTADownloadStatusDialog(list: List<OtaUpgradeInfo>)
fun showOTADownloadStatusDialog(isShow: Boolean,list: List<OtaUpgradeInfo>)
/**
* 展示OTA升级结果弹窗

View File

@@ -483,8 +483,8 @@ object CallerHmiManager {
/**
* 展示OTA升级下载状态弹窗
*/
fun showOTADownloadStatusDialog(list: List<OtaUpgradeInfo>){
hmiProviderApi?.showOTADownloadStatusDialog(list)
fun showOTADownloadStatusDialog(isShow: Boolean,list: List<OtaUpgradeInfo>){
hmiProviderApi?.showOTADownloadStatusDialog(isShow,list)
}