From f64c5d273de57608fdf5bfec01bdb5fdf4bad390 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 23 Jun 2025 14:57:21 +0800 Subject: [PATCH 01/11] =?UTF-8?q?[8.1.0=5Fnew=5Fota]OTA=202.0=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autopilot/MoGoAutopilotControlProvider.kt | 8 +++ .../autopilot/adapter/MoGoAdasListenerImpl.kt | 3 + .../ota/OTAUpgradeConfig.kt | 19 ++++++ .../ota/OTAUpgradeManager.kt | 59 +++++++++++++++++++ .../function/hmi/bone/tab/CarInfoTabView.kt | 26 +++++--- .../IMoGoAutopilotControlProvider.kt | 6 ++ .../function/api/devatools/IOTAListener.kt | 8 +++ .../CallerAutoPilotControlManager.kt | 8 +++ .../call/devatools/CallerOTAManager.kt | 13 ++++ .../zhidao/support/adas/high/AdasChannel.java | 15 +++++ .../zhidao/support/adas/high/AdasManager.java | 10 ++++ .../support/adas/high/IAdasNetCommApi.java | 6 ++ 12 files changed, 173 insertions(+), 8 deletions(-) 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 3d07c2ff3b..5ae64d85ee 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 @@ -1556,6 +1556,14 @@ class MoGoAutopilotControlProvider : return AdasManager.getInstance().sendSsmFuncOtaStatusQuery(token)>-1 } + /** + * OTA2.0查询 + * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON + */ + override fun sendOtaPadMsgQuery(queryStr: String): Boolean { + return AdasManager.getInstance().sendOtaPadMsgQuery(queryStr) > -1 + } + /** * 人工接管时获取前方和后方摄像头数据 * 一次请求域控回调次两次摄像头数据 根据{@link MessagePad.CaptureImgOnTakeOver#getUuid()}进行区分是否是哪次请求 diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index 0b0315c04a..51ff1b22e0 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -622,6 +622,9 @@ class MoGoAdasListenerImpl : OnAdasListener { timestamp: Long, status: SsmInfo.PureStr? ) { + if(status != null){ + CallerOTAManager.invokeOtaPureStr(token,timestamp,status) + } } /** 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 e3b480519d..7adf6454c9 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 @@ -28,4 +28,23 @@ object OTAUpgradeConfig { //已经提示过升级成功的列表 @JvmField var upgradeFinish: ArrayList = ArrayList() + + + + var token: String = "" + + + + + + + + + + + + + + + } \ 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 9176eb045e..6eb17d52dc 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 @@ -394,6 +394,65 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, } + /** + * OTA 2.0 新接口 + * @param token PadSsmMsg唯一消息ID + * @param timestamp 消息发送时间 单位:毫秒 + * @param status OTA 2.0 数据 + */ + override fun onOtaPureStr(token: Long, timestamp: Long, status: SsmInfo.PureStr) { + super.onOtaPureStr(token, timestamp, status) + Log.i(TAG, "onOtaPureStr token=$token") + Log.i(TAG, "onOtaPureStr timestamp=$timestamp") + Log.i(TAG, "onOtaPureStr status=$status") + Log.i(TAG, "onOtaPureStr status.data=${status.data}") + val jsonObject = JSONObject(status.data) + val cmd = jsonObject.optString("cmd") + val otaToken = jsonObject.optString("token") + val otaStatus = jsonObject.optString("status") + val upgradeReason = jsonObject.optString("upgrade_reason") + val isDelay = jsonObject.optBoolean("is_delay") + val isCancel = jsonObject.optBoolean("is_cancel") + + Log.i(TAG, "cmd=$cmd") + Log.i(TAG, "otaToken=$otaToken") + Log.i(TAG, "otaStatus=$otaStatus") + Log.i(TAG, "upgradeReason=$upgradeReason") + Log.i(TAG, "isDelay=$isDelay") + Log.i(TAG, "isCancel=$isCancel") + + val products = jsonObject.optString("products") + val productsArray = JSONArray(products) + if(productsArray.length() > 0){ + for(index in 0 until productsArray.length()){ + val productInfo = productsArray[index] as JSONObject + val productStatus = productInfo.optString("status") + val failReason = productInfo.optString("fail_reason") + val speed = productInfo.optDouble("speed") + val leftTime = productInfo.optInt("left_time") + val name = productInfo.optString("name") + val curSize = productInfo.optInt("cur_size") + val totalSize = productInfo.optInt("total_size") + + Log.i(TAG, "productStatus=$productStatus") + Log.i(TAG, "failReason=$failReason") + Log.i(TAG, "speed=$speed") + Log.i(TAG, "leftTime=$leftTime") + Log.i(TAG, "name=$name") + Log.i(TAG, "curSize=$curSize") + Log.i(TAG, "totalSize=$totalSize") + + } + } + + if(otaToken.isNotEmpty()){ + CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason) + } + + + } + + private val pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+") /** 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 757fcef971..897ed3ca13 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 @@ -154,14 +154,24 @@ class CarInfoTabView @JvmOverloads constructor( "${SceneConstant.M_HMI}${TAG}", "ad version view clicked" ) - if(OTAUpgradeConfig.supportOTA){ - //查询OTA状态 - OTAUpgradeConfig.isQuery = true - OTAUpgradeConfig.promptedUpgrade.remove(OTAUpgradeConfig.otaToken) - CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken) - }else{ - ToastUtils.showLong("当前SSM节点未成功启动或当前版本不支持OTA升级") - } +// if(OTAUpgradeConfig.supportOTA){ +// //查询OTA状态 +// OTAUpgradeConfig.isQuery = true +// OTAUpgradeConfig.promptedUpgrade.remove(OTAUpgradeConfig.otaToken) +// CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken) +// }else{ +// ToastUtils.showLong("当前SSM节点未成功启动或当前版本不支持OTA升级") +// } + + + //查询OTA升级 + val query: JSONObject = JSONObject() + query.put("cmd","PAD_QUERY_UPGRADE_STATUS") + query.put("token",OTAUpgradeConfig.token) + Log.i("xuxinchao",query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + + } tvHDMapVersion.text = tvHDMapVersion.text.toString() + DebugConfig.getMapVersion() //高精地图 检查更新 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index f6ed32c610..8fbb433272 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -730,6 +730,12 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { */ fun sendSsmFuncOtaStatusQuery(token: String): Boolean + /** + * OTA2.0查询 + * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON + */ + fun sendOtaPadMsgQuery(queryStr: String): Boolean + /** * 人工接管时获取前方和后方摄像头数据 * 一次请求域控回调次两次摄像头数据 根据{@link MessagePad.CaptureImgOnTakeOver#getUuid()}进行区分是否是哪次请求 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IOTAListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IOTAListener.kt index 533a27c3a8..e28c012110 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IOTAListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IOTAListener.kt @@ -34,4 +34,12 @@ interface IOTAListener { */ fun onOtaDownloadStatus(status: Boolean){} + /** + * OTA 2.0 新接口 + * @param token PadSsmMsg唯一消息ID + * @param timestamp 消息发送时间 单位:毫秒 + * @param status OTA 2.0 数据 + */ + fun onOtaPureStr(token: Long,timestamp: Long,status: SsmInfo.PureStr){} + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index f62b6edbc5..ea6b23100b 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -1095,6 +1095,14 @@ object CallerAutoPilotControlManager { return providerApi?.sendSsmFuncOtaStatusQuery(token)?:false } + /** + * OTA2.0查询 + * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON + */ + fun sendOtaPadMsgQuery(queryStr: String): Boolean{ + return providerApi?.sendOtaPadMsgQuery(queryStr)?:false + } + /** * 人工接管时获取前方和后方摄像头数据 * 一次请求域控回调次两次摄像头数据 根据{@link MessagePad.CaptureImgOnTakeOver#getUuid()}进行区分是否是哪次请求 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerOTAManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerOTAManager.kt index 6474028f11..2b2230fa8b 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerOTAManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerOTAManager.kt @@ -56,4 +56,17 @@ object CallerOTAManager: CallerBase() { } } + /** + * OTA 2.0 新接口 + * @param token PadSsmMsg唯一消息ID + * @param timestamp 消息发送时间 单位:毫秒 + * @param status OTA 2.0 数据 + */ + fun invokeOtaPureStr(token: Long,timestamp: Long,status: SsmInfo.PureStr){ + M_LISTENERS.forEach { + val listener = it.value + listener.onOtaPureStr(token, timestamp, status) + } + } + } \ No newline at end of file diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index f6db68ae6b..7529bc3dd8 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -3100,6 +3100,21 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec return sendSsmFuncMsg(true, system_master.SsmInfo.MessageType.OTA_STATUS_QUERY, builder.build().toByteString()); } + /** + * 查询OTA2.0状态 + * @param queryStr 域控发送OTA升级请求中的 {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} + * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID + * * >=0:表示添加到WS发送消息队列 + * * =0:表示乘客屏模式添加到WS发送消息队列 + * * -1L:添加到WS发送消息队列失败 + */ + @Override + public long sendOtaPadMsgQuery(@Nullable String queryStr) { + SsmInfo.PureStr.Builder builder = SsmInfo.PureStr.newBuilder(); + builder.setData(TextUtils.isEmpty(queryStr) ? "" : queryStr); + return sendSsmFuncMsg(true,system_master.SsmInfo.MessageType.OTA_PAD_MSG,builder.build().toByteString()); + } + /** * 查询冷启动状态 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java index f25e5bdd2c..f22677c2a8 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java @@ -1861,6 +1861,16 @@ public class AdasManager implements IAdasNetCommApi { return mChannel == null ? -1L : mChannel.sendSsmFuncOtaStatusQuery(token); } + /** + * OTA2.0 请求命令下发 + * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON + * @return + */ + @Override + public long sendOtaPadMsgQuery(@Nullable String queryStr) { + return mChannel == null ? -1L : mChannel.sendOtaPadMsgQuery(queryStr); + } + /** * 查询冷启动状态 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java index 19732731b1..ba4057d396 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java @@ -1348,6 +1348,12 @@ public interface IAdasNetCommApi { */ long sendSsmFuncOtaStatusQuery(@Nullable String token); + /** + * OTA2.0查询 + * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON + */ + long sendOtaPadMsgQuery(@Nullable String queryStr); + /** * 查询冷启动状态 * From dbf2b08dd7672d8ef8b2d3ca04d6d7703a4e0d78 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 23 Jun 2025 15:07:59 +0800 Subject: [PATCH 02/11] =?UTF-8?q?[8.1.0=5Fota=5Fnew]OTA2.0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../function/hmi/ui/tools/OTAUpgradeDialog.kt | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) 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 1cfbb44b87..c0fdfbd5e4 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 @@ -15,6 +15,7 @@ import com.zhjt.mogo_core_function_devatools.ota.OTAUpgradeConfig import kotlinx.android.synthetic.main.dialog_ota_upgrade.tvUpgradeContent import kotlinx.android.synthetic.main.dialog_ota_upgrade.tv_upgrade_later import kotlinx.android.synthetic.main.dialog_ota_upgrade.tv_upgrade_now +import org.json.JSONObject import system_master.SsmInfo /** @@ -40,22 +41,41 @@ class OTAUpgradeDialog(context: Context) : private fun initView(){ //立即升级 tv_upgrade_now.setOnClickListener { - val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) - if(result){ - ToastUtils.showShort("立即升级命令发送成功") - }else{ - ToastUtils.showShort("立即升级命令发送失败") - } +// val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) +// if(result){ +// ToastUtils.showShort("立即升级命令发送成功") +// }else{ +// ToastUtils.showShort("立即升级命令发送失败") +// } + + val query: JSONObject = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",true) + query.put("reason","") + Log.i("xuxinchao",query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + + dismiss() } //稍后升级 tv_upgrade_later.setOnClickListener { - val delayResult = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) - if(delayResult){ - ToastUtils.showShort("稍后升级命令发送成功") - }else{ - ToastUtils.showShort("稍后升级命令发送失败") - } +// val delayResult = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) +// if(delayResult){ +// ToastUtils.showShort("稍后升级命令发送成功") +// }else{ +// ToastUtils.showShort("稍后升级命令发送失败") +// } + + //不允许OTA升级 + val query: JSONObject = JSONObject() + query.put("cmd","PAD_NOT_ALLOW_UPGRADE_REASON") + query.put("token",OTAUpgradeConfig.token) + query.put("data","自动驾驶中") + Log.i("xuxinchao",query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + dismiss() } upgradeWaitingTimer = object: CountDownTimer(UPGRADE_WAITING_TIME,UPGRADE_WAITING_TIME){ From 132cfcccbb2257b48b122160e372aeda63d288a3 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 23 Jun 2025 17:28:02 +0800 Subject: [PATCH 03/11] [8.1.0_new_ota]OTA2.0 --- .../ota/OTAUpgradeManager.kt | 56 +++++++++++++++++-- .../function/hmi/ui/tools/OTAUpgradeDialog.kt | 9 +-- 2 files changed, 56 insertions(+), 9 deletions(-) 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 6eb17d52dc..a75f12913e 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 @@ -423,6 +423,7 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val products = jsonObject.optString("products") val productsArray = JSONArray(products) + val otaUpgradeList = ArrayList() if(productsArray.length() > 0){ for(index in 0 until productsArray.length()){ val productInfo = productsArray[index] as JSONObject @@ -431,8 +432,8 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, val speed = productInfo.optDouble("speed") val leftTime = productInfo.optInt("left_time") val name = productInfo.optString("name") - val curSize = productInfo.optInt("cur_size") - val totalSize = productInfo.optInt("total_size") + val curSize = productInfo.optDouble("cur_size") + val totalSize = productInfo.optDouble("total_size") Log.i(TAG, "productStatus=$productStatus") Log.i(TAG, "failReason=$failReason") @@ -442,13 +443,31 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "curSize=$curSize") Log.i(TAG, "totalSize=$totalSize") + + + val otaUpgradeInfo = OtaUpgradeInfo(otaToken, getProjectStatus(productStatus),failReason,upgradeReason, + 0,0,1,name,true,isDelay,curSize,totalSize,leftTime) + otaUpgradeList.add(otaUpgradeInfo) + } } - - if(otaToken.isNotEmpty()){ + //请求升级 + if(cmd == "ASK_PAD_UPGRADE" && otaToken.isNotEmpty()){ CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason) } - + //升级中 + if(cmd == "PAD_UPGRADE_REPORT"){ + CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) + } + //升级完成 + if(otaStatus == "fail"){ + CallerHmiManager.showOTADownloadStatusDialog(false,emptyList()) + CallerHmiManager.showOTAResultDialog(isShow = true, result = false) + } + if(otaStatus == "success"){ + CallerHmiManager.showOTADownloadStatusDialog(false,emptyList()) + CallerHmiManager.showOTAResultDialog(isShow = true, result = true) + } } @@ -497,5 +516,32 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, return version } + private fun getProjectStatus(status: String): Int{ + return when(status){ + "init"->{ + 0 + } + "downloading"->{ + 1 + } + "sync_slave"->{ + 2 + } + "upgrading"->{ + 2 + } + "success"->{ + 3 + } + "fail"->{ + 4 + } + else->{ + 0 + } + + } + } + } \ 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/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 c0fdfbd5e4..f947733163 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 @@ -48,7 +48,7 @@ class OTAUpgradeDialog(context: Context) : // ToastUtils.showShort("立即升级命令发送失败") // } - val query: JSONObject = JSONObject() + val query = JSONObject() query.put("cmd","ASK_PAD_UPGRADE_RES") query.put("token",OTAUpgradeConfig.token) query.put("allow_upgrade",true) @@ -69,10 +69,11 @@ class OTAUpgradeDialog(context: Context) : // } //不允许OTA升级 - val query: JSONObject = JSONObject() - query.put("cmd","PAD_NOT_ALLOW_UPGRADE_REASON") + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") query.put("token",OTAUpgradeConfig.token) - query.put("data","自动驾驶中") + query.put("allow_upgrade",false) + query.put("reason","") Log.i("xuxinchao",query.toString()) CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) From f605fe572c67521019de280b3ee6c0715d9c9b87 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 24 Jun 2025 10:57:48 +0800 Subject: [PATCH 04/11] =?UTF-8?q?[8.1.0=5Fnew=5Fota]OTA2.0=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=B6=85=E6=97=B6=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ota/OTAUpgradeManager.kt | 27 +++++++++++++++++++ .../function/hmi/bone/tab/CarInfoTabView.kt | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) 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 a75f12913e..ae49413cc3 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 @@ -46,6 +46,8 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, private var responseTimeoutNum: Int = 0 //响应超时次数 private var shouldShowColdStartWindow: Boolean = false //是否需要展示冷启动页面 + private var versionTwoTimeoutNum: Int = 0 //OTA2.0版本响应超时次数 + private val handler =object : Handler(Looper.getMainLooper()){ override fun handleMessage(msg: Message) { super.handleMessage(msg) @@ -68,6 +70,24 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, //司机屏弹窗提示用车人执行车辆下电操作 CallerHmiManager.showOTAPowerOffFinishDialog() shouldShowColdStartWindow = true + }else if(msg.what == 3){ + //OTA2.0超时查询 + if(versionTwoTimeoutNum<40){ + versionTwoTimeoutNum++ + //30秒没有收到OTA升级推送主动进行查询 + Log.i(TAG,"30秒没有收到OTA升级推送主动进行查询") + //查询OTA升级 + val query = JSONObject() + query.put("cmd","PAD_QUERY_UPGRADE_STATUS") + query.put("token",OTAUpgradeConfig.token) + Log.i("xuxinchao",query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + this.sendEmptyMessageDelayed(3,30000) + }else{ + Log.i(TAG,"20分钟没有收到OTA升级推送置为失败") + CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) + CallerHmiManager.showOTAResultDialog(isShow = true, result = false) + } } } } @@ -458,15 +478,22 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, //升级中 if(cmd == "PAD_UPGRADE_REPORT"){ CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) + versionTwoTimeoutNum = 0 + handler.removeMessages(3) + handler.sendEmptyMessageDelayed(3,30000) } //升级完成 if(otaStatus == "fail"){ CallerHmiManager.showOTADownloadStatusDialog(false,emptyList()) CallerHmiManager.showOTAResultDialog(isShow = true, result = false) + versionTwoTimeoutNum = 0 + handler.removeMessages(3) } if(otaStatus == "success"){ CallerHmiManager.showOTADownloadStatusDialog(false,emptyList()) CallerHmiManager.showOTAResultDialog(isShow = true, result = true) + versionTwoTimeoutNum = 0 + handler.removeMessages(3) } } 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 897ed3ca13..b248924d74 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 @@ -165,7 +165,7 @@ class CarInfoTabView @JvmOverloads constructor( //查询OTA升级 - val query: JSONObject = JSONObject() + val query = JSONObject() query.put("cmd","PAD_QUERY_UPGRADE_STATUS") query.put("token",OTAUpgradeConfig.token) Log.i("xuxinchao",query.toString()) From c4b576e4764d8bb409af51879775afd5805f2d18 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 24 Jun 2025 11:40:37 +0800 Subject: [PATCH 05/11] =?UTF-8?q?[8.1.0=5Fnew=5Fota]OTA20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ota/OTAUpgradeConfig.kt | 7 +++- .../ota/OTAUpgradeManager.kt | 40 +++++++++++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) 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 7adf6454c9..17f0bb6d1a 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 @@ -29,10 +29,13 @@ object OTAUpgradeConfig { @JvmField var upgradeFinish: ArrayList = ArrayList() - - + //OTA2.0 Token + @JvmField var token: String = "" + //已经提示过升级的列表 + var promptedUpgradeTwo: ArrayList = ArrayList() + 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 ae49413cc3..3a6a2864fc 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 @@ -441,6 +441,8 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "isDelay=$isDelay") Log.i(TAG, "isCancel=$isCancel") + OTAUpgradeConfig.token = otaToken + val products = jsonObject.optString("products") val productsArray = JSONArray(products) val otaUpgradeList = ArrayList() @@ -463,18 +465,48 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "curSize=$curSize") Log.i(TAG, "totalSize=$totalSize") - - val otaUpgradeInfo = OtaUpgradeInfo(otaToken, getProjectStatus(productStatus),failReason,upgradeReason, 0,0,1,name,true,isDelay,curSize,totalSize,leftTime) otaUpgradeList.add(otaUpgradeInfo) } } + //请求升级 - if(cmd == "ASK_PAD_UPGRADE" && otaToken.isNotEmpty()){ - CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason) + if(cmd == "ASK_PAD_UPGRADE" && otaStatus == "init"){ + if(!OTAUpgradeConfig.promptedUpgradeTwo.contains(otaToken)){ + //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 + if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus + && !OTAUpgradeConfig.inOrder){ + //触发强提示升级 + CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason) + }else{ + //触发弱提示升级 + //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, + // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” + + val reason = if(OTAUpgradeConfig.autopilotStatus){ + "处于自驾中" + }else if(OTAUpgradeConfig.inOrder){ + "处于订单中" + }else{ + "冷启动未完成" + } + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",false) + query.put("reason",reason) + Log.i("xuxinchao",query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + + ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") + } + OTAUpgradeConfig.promptedUpgradeTwo.add(otaToken) + } + return } + //升级中 if(cmd == "PAD_UPGRADE_REPORT"){ CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) From 3f20a6a9f200a86413afe8086374b7315fec7fcb Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 24 Jun 2025 11:52:13 +0800 Subject: [PATCH 06/11] =?UTF-8?q?[8.1.0=5Fnew=5Fota]=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=97=A0OTA=E5=8D=87=E7=BA=A7=E4=BB=BB=E5=8A=A1=E6=8F=90?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo_core_function_devatools/ota/OTAUpgradeManager.kt | 7 +++++++ 1 file changed, 7 insertions(+) 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 3a6a2864fc..ff6696e990 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 @@ -428,6 +428,13 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, Log.i(TAG, "onOtaPureStr status.data=${status.data}") val jsonObject = JSONObject(status.data) val cmd = jsonObject.optString("cmd") + + //无升级任务 + if("ASK_PAD_NO_UPGRADE" == cmd){ + ToastUtils.showShort("暂无OTA升级任务") + return + } + val otaToken = jsonObject.optString("token") val otaStatus = jsonObject.optString("status") val upgradeReason = jsonObject.optString("upgrade_reason") From 9dd0222547dc6f243559556bc49180ae527f798c Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 24 Jun 2025 15:32:29 +0800 Subject: [PATCH 07/11] =?UTF-8?q?[8.1.0=5Fnew=5Fota]OTA2.0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ota/OTAUpgradeManager.kt | 51 +++++++++---------- .../zhidao/support/adas/high/AdasChannel.java | 2 +- 2 files changed, 25 insertions(+), 28 deletions(-) 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 ff6696e990..6ec9755f15 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 @@ -481,35 +481,32 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, //请求升级 if(cmd == "ASK_PAD_UPGRADE" && otaStatus == "init"){ - if(!OTAUpgradeConfig.promptedUpgradeTwo.contains(otaToken)){ - //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 - if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus - && !OTAUpgradeConfig.inOrder){ - //触发强提示升级 - CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason) + //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 + if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus + && !OTAUpgradeConfig.inOrder){ + //触发强提示升级 + CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason) + }else{ + //触发弱提示升级 + //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, + // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” + + val reason = if(OTAUpgradeConfig.autopilotStatus){ + "处于自驾中" + }else if(OTAUpgradeConfig.inOrder){ + "处于订单中" }else{ - //触发弱提示升级 - //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, - // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” - - val reason = if(OTAUpgradeConfig.autopilotStatus){ - "处于自驾中" - }else if(OTAUpgradeConfig.inOrder){ - "处于订单中" - }else{ - "冷启动未完成" - } - val query = JSONObject() - query.put("cmd","ASK_PAD_UPGRADE_RES") - query.put("token",OTAUpgradeConfig.token) - query.put("allow_upgrade",false) - query.put("reason",reason) - Log.i("xuxinchao",query.toString()) - CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) - - ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") + "冷启动未完成" } - OTAUpgradeConfig.promptedUpgradeTwo.add(otaToken) + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",false) + query.put("reason",reason) + Log.i("xuxinchao",query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + + ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") } return } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 7529bc3dd8..593665dfb9 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -3112,7 +3112,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec public long sendOtaPadMsgQuery(@Nullable String queryStr) { SsmInfo.PureStr.Builder builder = SsmInfo.PureStr.newBuilder(); builder.setData(TextUtils.isEmpty(queryStr) ? "" : queryStr); - return sendSsmFuncMsg(true,system_master.SsmInfo.MessageType.OTA_PAD_MSG,builder.build().toByteString()); + return sendSsmFuncMsg(false,system_master.SsmInfo.MessageType.OTA_PAD_MSG,builder.build().toByteString()); } /** From 6d05e427ee2fc94251ef1425be1b58270692f79a Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Fri, 27 Jun 2025 18:04:33 +0800 Subject: [PATCH 08/11] =?UTF-8?q?[8.1.0=5Fnew=5Fota]OTA2.0=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=82=B9=E5=87=BB=E6=8E=A8=E8=BF=9F=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f947733163..f8e7c0a995 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 @@ -73,7 +73,7 @@ class OTAUpgradeDialog(context: Context) : query.put("cmd","ASK_PAD_UPGRADE_RES") query.put("token",OTAUpgradeConfig.token) query.put("allow_upgrade",false) - query.put("reason","") + query.put("reason","user click") Log.i("xuxinchao",query.toString()) CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) From cde3c4e74a3b855b5af32aaffd2b48ab867ba639 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Thu, 3 Jul 2025 17:53:17 +0800 Subject: [PATCH 09/11] =?UTF-8?q?[new=5Fota]=E6=B5=8B=E8=AF=95=E6=88=AA?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/setting/DebugSettingView.kt | 112 ++++++----- .../hmi/ui/setting/ScreenUtilsTest.java | 183 ++++++++++++++++++ .../main/res/layout/view_debug_setting.xml | 16 ++ .../mogo-core-function-patch/build.gradle | 2 +- 4 files changed, 259 insertions(+), 54 deletions(-) create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ScreenUtilsTest.java diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index b99a477056..81077544a8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -6,8 +6,10 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent +import android.graphics.Bitmap import android.graphics.Color import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable import android.os.Build import android.os.Environment.* import android.os.Process @@ -27,6 +29,9 @@ import androidx.core.content.ContextCompat import androidx.core.view.MenuCompat import androidx.lifecycle.lifecycleScope import chassis.Chassis +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target import com.mogo.cloud.network.cronet.NetworkQualityListener import com.mogo.cloud.network.cronet.QuicConfig import com.mogo.cloud.passport.MoGoAiCloudClient @@ -73,6 +78,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_FUSION_COLOR import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener import com.mogo.eagle.core.function.api.setting.ISopSettingListener import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager @@ -90,6 +96,7 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManage 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.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager @@ -115,6 +122,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.permissions.BackgrounderPermission import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.AppStateManager import com.mogo.eagle.core.utilcode.util.AppUtils import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.CommonUtils @@ -140,23 +148,17 @@ import com.mogo.support.device.DevicesManager import com.mogo.support.device.IBindStateChangeListener import com.mogo.tts.base.IMogoTTSCallback import com.zhjt.mogo.adas.data.AdasConstants -import com.zhjt.mogo_core_function_devatools.rviz.common.config.SSHAccountConfig -import com.zhjt.mogo_core_function_devatools.rviz.dialog.ChangeDefaultConfigDialog -import com.zhjt.mogo_core_function_devatools.rviz.ui.activity.AutopilotCheckAct -import com.zhjt.mogo_core_function_devatools.rviz.ui.activity.FmdAct import com.zhjt.service.chain.ChainLog import kotlinx.android.synthetic.main.view_debug_setting.view.appVersionInfoLayout import kotlinx.android.synthetic.main.view_debug_setting.view.brakeThresholdDivider import kotlinx.android.synthetic.main.view_debug_setting.view.btChangeEnv import kotlinx.android.synthetic.main.view_debug_setting.view.btnAppReboot -import kotlinx.android.synthetic.main.view_debug_setting.view.btnAutoCheck import kotlinx.android.synthetic.main.view_debug_setting.view.btnBrakeThreshold import kotlinx.android.synthetic.main.view_debug_setting.view.btnConnectServerIp import kotlinx.android.synthetic.main.view_debug_setting.view.btnDeleteDB import kotlinx.android.synthetic.main.view_debug_setting.view.btnDisconnectIpc import kotlinx.android.synthetic.main.view_debug_setting.view.btnDrawFusion import kotlinx.android.synthetic.main.view_debug_setting.view.btnEnsureMap -import kotlinx.android.synthetic.main.view_debug_setting.view.btnFmd import kotlinx.android.synthetic.main.view_debug_setting.view.btnHdVisualAdjust import kotlinx.android.synthetic.main.view_debug_setting.view.btnIpcReboot import kotlinx.android.synthetic.main.view_debug_setting.view.btnPointCloudColor @@ -195,7 +197,6 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.changesight_top_bt import kotlinx.android.synthetic.main.view_debug_setting.view.clDebugContain import kotlinx.android.synthetic.main.view_debug_setting.view.commonLayout import kotlinx.android.synthetic.main.view_debug_setting.view.controlCenterLayout -import kotlinx.android.synthetic.main.view_debug_setting.view.debugCenterLayout import kotlinx.android.synthetic.main.view_debug_setting.view.deviceBindLayout import kotlinx.android.synthetic.main.view_debug_setting.view.domainControllerLayout import kotlinx.android.synthetic.main.view_debug_setting.view.eagleEyeControllerLayout @@ -214,6 +215,9 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.etThreshold import kotlinx.android.synthetic.main.view_debug_setting.view.exportAllLogs import kotlinx.android.synthetic.main.view_debug_setting.view.hdMapControllerLayout import kotlinx.android.synthetic.main.view_debug_setting.view.hmiControllerLayout +import kotlinx.android.synthetic.main.view_debug_setting.view.ivScreenTest +import kotlinx.android.synthetic.main.view_debug_setting.view.ivScreenTestThree +import kotlinx.android.synthetic.main.view_debug_setting.view.ivScreenTestTwo import kotlinx.android.synthetic.main.view_debug_setting.view.logLoadingView import kotlinx.android.synthetic.main.view_debug_setting.view.logcatCenterLayout import kotlinx.android.synthetic.main.view_debug_setting.view.obuConnectStatusTv @@ -234,7 +238,6 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.tbChangeCurrentSki import kotlinx.android.synthetic.main.view_debug_setting.view.tbControlCenter import kotlinx.android.synthetic.main.view_debug_setting.view.tbControlPassengerDriverMonitor import kotlinx.android.synthetic.main.view_debug_setting.view.tbCronet -import kotlinx.android.synthetic.main.view_debug_setting.view.tbDebugCenter import kotlinx.android.synthetic.main.view_debug_setting.view.tbDeviceBind import kotlinx.android.synthetic.main.view_debug_setting.view.tbDomainController import kotlinx.android.synthetic.main.view_debug_setting.view.tbDrawPointCloudData @@ -373,7 +376,7 @@ internal class DebugSettingView @JvmOverloads constructor( IMoGoSweeperFutianCleanSystemListener, IMoGoObuInfoListener, ISopSettingListener, IViewControlListener, IMoGoCloudListener, IBindStateChangeListener, - IReceivedMsgListener { + IReceivedMsgListener , IMoGoMapScreenListener { companion object { private const val TAG = "DebugSettingView" @@ -608,10 +611,6 @@ internal class DebugSettingView @JvmOverloads constructor( } } //动态配置鹰眼显示MAP版本 - if(AppConfigInfo.mapShowName.isEmpty()){ - AppConfigInfo.mapShowName = CallerAutoPilotStatusListenerManager.getDockerVersion()+"" - SPUtils.getInstance().put("mapShowName", AppConfigInfo.mapShowName) - } etMapShowName.setText(AppConfigInfo.mapShowName) etMapShowName.text?.let { etMapShowName.setSelection(it.length) } btnEnsureMap.setOnClickListener { @@ -635,6 +634,13 @@ internal class DebugSettingView @JvmOverloads constructor( //隐藏状态中心 statusCenterLayout.visibility = View.GONE } + + + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(TAG,this) + //开启高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() + } /** @@ -812,41 +818,6 @@ internal class DebugSettingView @JvmOverloads constructor( } } - /** - * 调试中心 - */ - tbDebugCenter.setOnCheckedChangeListener { buttonView, isChecked -> - if (isChecked) { - buttonView.setCompoundDrawables(null, null, iconDown, null) - //展示调试中心 - debugCenterLayout.visibility = View.VISIBLE - } else { - buttonView.setCompoundDrawables(null, null, iconRight, null) - //隐藏日志中心 - debugCenterLayout.visibility = View.GONE - } - } - /** - * 故障诊断 - */ - btnFmd.onClick{ - ActivityUtils.startActivity(FmdAct::class.java) - } - /** - * 故障诊断 长按设置 - */ - btnFmd.setOnLongClickListener { - ChangeDefaultConfigDialog(ActivityUtils.getTopActivity()).show() - true - } - - /** - * 自动驾驶检测 - */ - btnAutoCheck.onClick { - ActivityUtils.startActivity(AutopilotCheckAct::class.java) - } - /** * 日志中心 */ @@ -1422,6 +1393,45 @@ internal class DebugSettingView @JvmOverloads constructor( } } + override fun onMapScreen(bitmap: Bitmap) { + super.onMapScreen(bitmap) +// //图片保存本地 +// val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) +// val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+ +// "MapScreen" + File.separator+ currentDay + File.separator +// val fileName = "$takeOverBagId.png" +// val path = fileDir + fileName +// if (!File(fileDir).exists()) { +// File(fileDir).mkdirs() +// } +// RecordBitmapUtils.bitmap2Path(bitmap,path) + + val forBitmap = ScreenUtilsTest.captureWithStatusBar(AppStateManager.currentActivity()) + +// Log.i("xuxinchao","bitmap="+forBitmap) +// +// val result = ScreenUtilsTest.mergeBitmaps(bitmap,forBitmap) + + + val result = ScreenUtilsTest.compoundBitmap(forBitmap,bitmap) + + ThreadUtils.runOnUiThread { + ivScreenTest.setImageBitmap(forBitmap) + + ivScreenTestTwo.setImageBitmap(bitmap) + + ivScreenTestThree.setImageBitmap(result) + + + } + + + + + //注销高精地图截图监听回调 + CallerMapScreenListenerManager.removeListener(TAG) + } + /** * 设置鹰眼本地参数配置监听 */ @@ -1570,17 +1580,13 @@ internal class DebugSettingView @JvmOverloads constructor( */ @SuppressLint("SetTextI18n") private fun setDomainControllerCheckedChangeListener() { - val string = SharedPrefsMgr.getInstance() - .getString(SharedPrefsConstants.inputIpDomainController, "192.168.1.") - etAutopilotIP.setText(string) + etAutopilotIP.setText("192.168.1.") etAutopilotIP.text?.let { etAutopilotIP.setSelection(it.length) } //设置工控机IP btnSetAutopilotIP.setOnClickListener { val autoPilotIp = etAutopilotIP.text.toString() if (autoPilotIp.isNotEmpty()) { - SSHAccountConfig.setRosMasterIp(autoPilotIp.split(":", ":").first()) CallerAutoPilotControlManager.resetIpAddress(autoPilotIp) - SharedPrefsMgr.getInstance().putString(SharedPrefsConstants.inputIpDomainController,autoPilotIp) } else { ToastUtils.showShort("请输入正确的IP地址") } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ScreenUtilsTest.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ScreenUtilsTest.java new file mode 100644 index 0000000000..13dbb93baf --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ScreenUtilsTest.java @@ -0,0 +1,183 @@ +package com.mogo.eagle.core.function.hmi.ui.setting; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.util.Log; +import android.view.View; +import android.view.WindowManager; + +public class ScreenUtilsTest { + + /** + * 获取当前屏幕截图,包含状态栏 + * + * @param activity activity + * @return Bitmap + */ + public static Bitmap captureWithStatusBar(Activity activity) { + View view = activity.getWindow().getDecorView(); + view.setDrawingCacheEnabled(true); + view.buildDrawingCache(); + Bitmap bmp = view.getDrawingCache(); + int width = getScreenWidth(activity); + int height = getScreenHeight(activity); + Bitmap ret = Bitmap.createBitmap(bmp, 0, 0, width, height); + view.destroyDrawingCache(); + return ret; + } + + /** + * 获取当前屏幕截图,不包含状态栏 + * + * @param activity activity + * @return Bitmap + */ + public static Bitmap captureWithoutStatusBar(Activity activity) { + View view = activity.getWindow().getDecorView(); + view.setDrawingCacheEnabled(true); + view.buildDrawingCache(); + Bitmap bmp = view.getDrawingCache(); + int statusBarHeight = getStatusBarHeight(activity); + int width = getScreenWidth(activity); + int height = getScreenHeight(activity); + Bitmap ret = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height - statusBarHeight); + view.destroyDrawingCache(); + return ret; + } + + /** + * 得到屏幕的高 + * + * @param context + * @return + */ + public static int getScreenHeight(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + int height = wm.getDefaultDisplay().getHeight(); + return height; + } + + /** + * 得到屏幕的宽 + * + * @param context + * @return + */ + public static int getScreenWidth(Context context) { + WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + int width = wm.getDefaultDisplay().getWidth(); + return width; + } + + /** + * 获取状态栏高度 + * + * @param context 上下文 + * @return 状态栏高度 + */ + public static int getStatusBarHeight(Context context) { + int result = 0; + int resourceId = context.getResources() + .getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = context.getResources().getDimensionPixelSize(resourceId); + } + return result; + } + + + public static Bitmap mergeBitmaps(Bitmap background, Bitmap foreground) { + // 创建一个新的Bitmap,大小为两个Bitmap的最大宽度和最大高度 + int width = Math.max(background.getWidth(), foreground.getWidth()); + int height = Math.max(background.getHeight(), foreground.getHeight()); + Bitmap mergedBitmap = Bitmap.createBitmap(width, height, background.getConfig()); + + Canvas canvas = new Canvas(mergedBitmap); + // 绘制背景图 + canvas.drawBitmap(background, 0, 0, null); + // 绘制前景图,可以调整位置 + canvas.drawBitmap(foreground, 0, 0, null); // 根据需要调整位置 + + return mergedBitmap; + } + + + public static Bitmap overlayBitmaps(Bitmap bitmap1, Bitmap bitmap2, int xOffset, int yOffset) { + // 创建一个新的Bitmap,其大小足以容纳两个重叠的bitmap + int width = Math.max(bitmap1.getWidth(), bitmap2.getWidth()); + int height = bitmap1.getHeight() + bitmap2.getHeight(); // 假定重叠在垂直方向 + Bitmap result = Bitmap.createBitmap(width, height, bitmap1.getConfig()); + + // 使用Canvas绘制bitmap1和bitmap2 + Canvas canvas = new Canvas(result); + canvas.drawBitmap(bitmap1, 0, 0, null); // 首先绘制bitmap1 + canvas.drawBitmap(bitmap2, xOffset, bitmap1.getHeight() + yOffset, null); // 然后绘制bitmap2,根据需要调整xOffset和yOffset + + return result; + } + + + /** + * 将2张图片合成 + * @param downBitmap 底部图片 + * @param upBitmap 置顶的图片 + * @return + */ + public static Bitmap compoundBitmap(Bitmap downBitmap,Bitmap upBitmap) + { + Bitmap mBitmap = downBitmap.copy(Bitmap.Config.ARGB_8888, true); + //如果遇到黑色,则显示downBitmap里面的颜色值,如果不是则显示upBitmap里面的颜色值 + //循环获得bitmap所有像素点 + int mBitmapWidth = mBitmap.getWidth(); + int mBitmapHeight = mBitmap.getHeight(); + //首先保证downBitmap和 upBitmap是一致的高宽大小 + Log.i("xuxinchao","mBitmapWidth="+mBitmapWidth); + Log.i("xuxinchao","mBitmapHeight="+mBitmapHeight); + Log.i("xuxinchao","upBitmap.getWidth()="+upBitmap.getWidth()); + Log.i("xuxinchao","upBitmap.getHeight()="+upBitmap.getHeight()); +// if(mBitmapWidth==upBitmap.getWidth() && mBitmapHeight==upBitmap.getHeight()) +// { +// for (int i = 0; i < mBitmapHeight; i++) { +// for (int j = 0; j < mBitmapWidth; j++) { +// //获得Bitmap 图片中每一个点的color颜色值 +// //将需要填充的颜色值如果不是 +// //在这说明一下 如果color 是全透明 或者全黑 返回值为 0 +// //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000 +// //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了 +// int color = upBitmap.getPixel(j, i); +// Log.i("xuxinchao","color="+color); +// //将颜色值存在一个数组中 方便后面修改 +// if (color != Color.BLACK) { +// mBitmap.setPixel(j, i, upBitmap.getPixel(j, i)); //将白色替换成透明色 +// } +// } +// } +// } + + for (int i = 0; i < mBitmapHeight; i++) { + for (int j = 0; j < mBitmapWidth; j++) { + //获得Bitmap 图片中每一个点的color颜色值 + //将需要填充的颜色值如果不是 + //在这说明一下 如果color 是全透明 或者全黑 返回值为 0 + //getPixel()不带透明通道 getPixel32()才带透明部分 所以全透明是0x00000000 + //而不透明黑色是0xFF000000 如果不计算透明部分就都是0了 + int color = upBitmap.getPixel(j, i); + Log.i("xuxinchao","color="+color); + //将颜色值存在一个数组中 方便后面修改 + if (color != Color.BLACK) { + mBitmap.setPixel(j, i, upBitmap.getPixel(j, i)); //将白色替换成透明色 + } + } + } + + +// downBitmap.recycle(); +// upBitmap.recycle(); + return mBitmap; + } + + +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index c8dac5aab8..97a88feb4c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -742,6 +742,22 @@ android:layout_height="1dp" android:background="#F0F0F0" /> + + + + + + diff --git a/core/function-impl/mogo-core-function-patch/build.gradle b/core/function-impl/mogo-core-function-patch/build.gradle index ba300f0ce0..de0a0dcab5 100644 --- a/core/function-impl/mogo-core-function-patch/build.gradle +++ b/core/function-impl/mogo-core-function-patch/build.gradle @@ -85,7 +85,7 @@ rootProject.gradle.taskGraph.whenReady { TaskExecutionGraph graph -> def packageTask = (PackageApplication) t2 def outDir = packageTask.outputDirectory def apkNames = packageTask.apkNames - if (apkNames != null && apkNames.size() > 0) { + if (false) { apkNames.forEach { apkName -> def apk = new File(outDir, apkName) def lp = new File(rootProject.rootDir, "local.properties") From 8c8e37d867d785eb959948e42ebb52eb12e1762d Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 29 Jul 2025 14:44:41 +0800 Subject: [PATCH 10/11] =?UTF-8?q?[8.1.0=5Fnew=5Fota]OTA2.0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E6=88=90=E5=8A=9F=E5=90=8E=E5=8F=91=E9=80=81=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E5=81=9C=E6=9C=8D=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo_core_function_devatools/ota/OTAUpgradeManager.kt | 6 ++++++ 1 file changed, 6 insertions(+) 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 6ec9755f15..ce3f647c35 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 @@ -524,8 +524,14 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, CallerHmiManager.showOTAResultDialog(isShow = true, result = false) versionTwoTimeoutNum = 0 handler.removeMessages(3) + CallerOTAManager.invokeOtaDownloadStatus(false) } if(otaStatus == "success"){ + //升级成功,自动执行优雅停服 + CallerAutoPilotControlManager.sendIpcPowerOff() + //当优雅停服完成、需要车辆下电的时候(比如当前是停服触发60s后),车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 + handler.sendEmptyMessageDelayed(2,60000) + CallerOTAManager.invokeOtaDownloadStatus(false) CallerHmiManager.showOTADownloadStatusDialog(false,emptyList()) CallerHmiManager.showOTAResultDialog(isShow = true, result = true) versionTwoTimeoutNum = 0 From 3c191c3770a9d6752039da4ca1b24881f2eb1b4c Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Tue, 29 Jul 2025 16:43:48 +0800 Subject: [PATCH 11/11] =?UTF-8?q?[8.2.0]=E5=BC=82=E5=B8=B8=E5=88=86?= =?UTF-8?q?=E7=BA=A7=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmi/ui/msgbox/DriverMsgBoxBubbleView.kt | 125 +++++++++++++----- .../function/hmi/ui/msgbox/MsgBoxToastView.kt | 123 ++++++++++++----- .../mogo/eagle/core/data/msgbox/MsgFmData.kt | 28 ++++ 3 files changed, 214 insertions(+), 62 deletions(-) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index 19db18b10e..3ac8d78be8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -8,25 +8,31 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.takeover.TAKE_OVER_REQUEST import com.mogo.eagle.core.function.api.autopilot.IMoGoNodeStateListener import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +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.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerNodeStateListenerManager import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener 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.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter import com.mogo.eagle.core.function.msgbox.MsgBoxConfig @@ -149,41 +155,98 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } else if (category == MsgCategory.FM_INFO) { CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if (FunctionBuildConfig.isTakeoverRemind) { - //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 + +// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) +// fmInfoMsg.fmInfoList?.forEach { faultInfo -> +// if (faultInfo.faultActionCount > 0) { +// faultInfo.faultActionList.forEach { actionCode -> +// //获取建议操作级别,得到建议操作级别最高的操作 +// if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { +// curFaultLevel = +// MsgFmData.FaultAction.getFaultLevel(actionCode) +// } +// } +// } +// } +// //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 +// if (curFaultLevel == 0) { +// //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 +// if (CallerAutoPilotStatusListenerManager.getState() == 2 +// || CallerAutoPilotStatusListenerManager.getState() == 7 +// ) { +// // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 +// // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 +// // if (hasNoneFSMNode()) { +// //语音提示 +// try { +// SoundPoolUtils.getSoundPool() +// .playSoundWithRedId(context, R.raw.weak_net_tips) +// } catch (e: Exception) { +// e.printStackTrace() +// } +// //展示消息 +// showData(msgBoxBean) +// //} +// } +// } + + /** + * 8.2.0需求:定义三种不同提示强度的异常提示交互 + * 不判断驾驶状态,发生相应故障时立即有相应的提醒 + * 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒 + * 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断 + * 除此以外不做其他提示频率限制 + * + * 一级:安全停车 + * FM_DP_EMERGENCY_STOP(就地紧急停车)、FM_DP_COMFORTABLE_STOP(立刻舒适停车)、FM_DP_PNC_CHOOSE_STOP(择机靠边停车) + * 交互:图像、TTS、消息盒子 + * + * 二级:降速行驶 + * FM_DP_SPEED_LIMIT3(三级降速)、FM_DP_SPEED_LIMIT2(二级降速)、FM_DP_SPEED_LIMIT1(一级降速) + * 交互:TTS、消息盒子 + * + * 三级:无操作 + * FM_DP_ONLY_WARNING(警示)、FM_DP_NO_ACTION(报告) + * ps:以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示 + */ val fmInfoMsg = msgBoxBean.bean as FMInfoMsg - var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) - fmInfoMsg.fmInfoList?.forEach { faultInfo -> - if (faultInfo.faultActionCount > 0) { - faultInfo.faultActionList.forEach { actionCode -> - //获取建议操作级别,得到建议操作级别最高的操作 - if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { - curFaultLevel = - MsgFmData.FaultAction.getFaultLevel(actionCode) - } - } - } - } - //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 - if (curFaultLevel == 0) { - //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 - if (CallerAutoPilotStatusListenerManager.getState() == 2 - || CallerAutoPilotStatusListenerManager.getState() == 7 - ) { - // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 - // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 - // if (hasNoneFSMNode()) { - //语音提示 - try { - SoundPoolUtils.getSoundPool() - .playSoundWithRedId(context, R.raw.weak_net_tips) - } catch (e: Exception) { - e.printStackTrace() - } - //展示消息 + when(MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)){ + //一级 + MsgFmData.LEVEL_ONE->{ + //接管图像提示、语音提示 + CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST) + CallerHmiManager.warningV2X( + EventTypeEnumNew.TAKE_OVER_EVENT.poiType, + EventTypeEnumNew.TAKE_OVER_EVENT.content, + "识别车辆故障,建议立即接管安全停车,查看操作建议", + object : IMoGoWarningStatusListener { + override fun onShow() { + CallerTakeOverManager.invokeTakeOverEvent(true) + } + + override fun onDismiss() { + CallerTakeOverManager.invokeTakeOverEvent(false) + } + },expireTime =3000L, isFromObu = false + ) + //展示消息盒子消息 showData(msgBoxBean) - //} + } + //二级 + MsgFmData.LEVEL_TWO->{ + //语音提示 + AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议") + //展示消息盒子消息 + showData(msgBoxBean) + } + //三级 + MsgFmData.LEVEL_THREE->{ + //在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息 } } + + } } else { if (msgBoxBean.sourceType == DataSourceType.SUMMARY) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt index 733f4e46fc..e57ec8c058 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt @@ -8,23 +8,29 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.takeover.TAKE_OVER_REQUEST import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerIpcConnectStateToastManager import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener 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.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MsgBoxToastAdapter import com.mogo.eagle.core.function.msgbox.MsgBoxConfig @@ -141,41 +147,96 @@ class MsgBoxToastView @JvmOverloads constructor( } else if (category == MsgCategory.FM_INFO) { CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if (FunctionBuildConfig.isTakeoverRemind) { - //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) +// fmInfoMsg.fmInfoList?.forEach { faultInfo -> +// if (faultInfo.faultActionCount > 0) { +// faultInfo.faultActionList.forEach { actionCode -> +// //获取建议操作级别,得到建议操作级别最高的操作 +// if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { +// curFaultLevel = +// MsgFmData.FaultAction.getFaultLevel(actionCode) +// } +// } +// } +// } +// //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 +// if (curFaultLevel == 0) { +// //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 +// if (CallerAutoPilotStatusListenerManager.getState() == 2 +// || CallerAutoPilotStatusListenerManager.getState() == 7 +// ) { +// // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 +// // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 +// // if (hasNoneFSMNode()) { +// //语音提示 +// try { +// SoundPoolUtils.getSoundPool() +// .playSoundWithRedId(context, R.raw.weak_net_tips) +// } catch (e: Exception) { +// e.printStackTrace() +// } +// //展示消息 +// showData(msgBoxBean) +// //} +// } +// } + + /** + * 8.2.0需求:定义三种不同提示强度的异常提示交互 + * 不判断驾驶状态,发生相应故障时立即有相应的提醒 + * 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒 + * 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断 + * 除此以外不做其他提示频率限制 + * + * 一级:安全停车 + * FM_DP_EMERGENCY_STOP(就地紧急停车)、FM_DP_COMFORTABLE_STOP(立刻舒适停车)、FM_DP_PNC_CHOOSE_STOP(择机靠边停车) + * 交互:图像、TTS、消息盒子 + * + * 二级:降速行驶 + * FM_DP_SPEED_LIMIT3(三级降速)、FM_DP_SPEED_LIMIT2(二级降速)、FM_DP_SPEED_LIMIT1(一级降速) + * 交互:TTS、消息盒子 + * + * 三级:无操作 + * FM_DP_ONLY_WARNING(警示)、FM_DP_NO_ACTION(报告) + * ps:以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示 + */ val fmInfoMsg = msgBoxBean.bean as FMInfoMsg - var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) - fmInfoMsg.fmInfoList?.forEach { faultInfo -> - if (faultInfo.faultActionCount > 0) { - faultInfo.faultActionList.forEach { actionCode -> - //获取建议操作级别,得到建议操作级别最高的操作 - if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { - curFaultLevel = - MsgFmData.FaultAction.getFaultLevel(actionCode) - } - } - } - } - //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 - if (curFaultLevel == 0) { - //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 - if (CallerAutoPilotStatusListenerManager.getState() == 2 - || CallerAutoPilotStatusListenerManager.getState() == 7 - ) { - // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 - // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 - // if (hasNoneFSMNode()) { - //语音提示 - try { - SoundPoolUtils.getSoundPool() - .playSoundWithRedId(context, R.raw.weak_net_tips) - } catch (e: Exception) { - e.printStackTrace() - } - //展示消息 + when(MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)){ + //一级 + MsgFmData.LEVEL_ONE->{ + //接管图像提示、语音提示 + CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST) + CallerHmiManager.warningV2X( + EventTypeEnumNew.TAKE_OVER_EVENT.poiType, + EventTypeEnumNew.TAKE_OVER_EVENT.content, + "识别车辆故障,建议立即接管安全停车,查看操作建议", + object : IMoGoWarningStatusListener { + override fun onShow() { + CallerTakeOverManager.invokeTakeOverEvent(true) + } + + override fun onDismiss() { + CallerTakeOverManager.invokeTakeOverEvent(false) + } + },expireTime =3000L, isFromObu = false + ) + //展示消息盒子消息 showData(msgBoxBean) - //} + } + //二级 + MsgFmData.LEVEL_TWO->{ + //语音提示 + AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议") + //展示消息盒子消息 + showData(msgBoxBean) + } + //三级 + MsgFmData.LEVEL_THREE->{ + //在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息 } } + } } else { if (msgBoxBean.sourceType == DataSourceType.SUMMARY) { diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt index 2b168ef74a..ee1b9ce418 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt @@ -163,6 +163,10 @@ class MsgFmData{ companion object{ + const val LEVEL_ONE = 1 //降级策略:安全停车 交互:一级 + const val LEVEL_TWO = 2 //降级策略:降速行驶 交互:二级 + const val LEVEL_THREE = 3 //降级策略:无操作 交互:三级 + @JvmStatic fun getFmPolicyName(policyCode: String?): String{ return when(policyCode){ @@ -177,6 +181,30 @@ class MsgFmData{ else -> "暂无" } } + + /** + * 获取异常分级 + * 鹰眼8.2.0版本需求:定义三种不同提示强度的异常提示交互 + * 一级交互:TTS、图像、消息盒子 + * 二级交互:TTS、消息盒子 + * 三级交互:消息盒子 + */ + @JvmStatic + fun getFmPolicyLevel(policyCode: String?): Int{ + return when(policyCode){ + "FM_DP_NO_ACTION" -> LEVEL_THREE + "FM_DP_ONLY_WARNING" -> LEVEL_THREE + "FM_DP_SPEED_LIMIT1" -> LEVEL_TWO + "FM_DP_SPEED_LIMIT2" -> LEVEL_TWO + "FM_DP_SPEED_LIMIT3" -> LEVEL_TWO + "FM_DP_PNC_CHOOSE_STOP" -> LEVEL_ONE + "FM_DP_COMFORTABLE_STOP" -> LEVEL_ONE + "FM_DP_EMERGENCY_STOP" -> LEVEL_ONE + else -> LEVEL_THREE + } + } + + } } \ No newline at end of file