diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartManager.kt index fb15b749cc..50529ff580 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/coldstart/ColdStartManager.kt @@ -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 + } } } \ 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/ota/OTAUpgradeConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeConfig.kt index 107e745d4e..e3b480519d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeConfig.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeConfig.kt @@ -19,4 +19,13 @@ object OTAUpgradeConfig { //当前SSM版本是否支持OTA升级,默认不支持 @JvmField var supportOTA: Boolean = false + //是否是主动查询 + @JvmField + var isQuery: Boolean = false + //已经提示过升级的列表 + @JvmField + var promptedUpgrade: ArrayList = ArrayList() + //已经提示过升级成功的列表 + @JvmField + var upgradeFinish: ArrayList = ArrayList() } \ 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/ota/OTAUpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt index 416b035588..17597bd3f9 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt @@ -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 + } + } \ 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/bone/tab/CarInfoTabView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt index 5081ad941c..5bf3577a34 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt @@ -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升级") diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index 881f47c690..0b9d7fb0d0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -691,19 +691,26 @@ class MoGoHmiProvider : IMoGoHmiProvider { /** * 展示OTA升级下载状态弹窗 */ - override fun showOTADownloadStatusDialog(list: List) { + override fun showOTADownloadStatusDialog(isShow: Boolean,list: List) { 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) } + } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt index 55aa433a6a..d14461553b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt @@ -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 + ) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/adapter/OTADownloadStatusAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/adapter/OTADownloadStatusAdapter.kt index 7aa65e31aa..033aa34971 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/adapter/OTADownloadStatusAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/adapter/OTADownloadStatusAdapter.kt @@ -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) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt index 54d8f0617c..ba47e9f56c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ColdStartView.kt @@ -279,8 +279,6 @@ class ColdStartView @JvmOverloads constructor( ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis()) } } - //判断当前SSM版本是否支持OTA升级 - OTAUpgradeConfig.supportOTA = parseVersion(true, statusInf.masterVersion) >= 40800 } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_ota_download_status.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_ota_download_status.xml index d733c8ecb6..cea7004e5e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_ota_download_status.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_ota_download_status.xml @@ -21,7 +21,7 @@ ) + fun showOTADownloadStatusDialog(isShow: Boolean,list: List) /** * 展示OTA升级结果弹窗 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index b51f2a22d6..d44d39057e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -483,8 +483,8 @@ object CallerHmiManager { /** * 展示OTA升级下载状态弹窗 */ - fun showOTADownloadStatusDialog(list: List){ - hmiProviderApi?.showOTADownloadStatusDialog(list) + fun showOTADownloadStatusDialog(isShow: Boolean,list: List){ + hmiProviderApi?.showOTADownloadStatusDialog(isShow,list) }