Merge remote-tracking branch 'origin/dev_robotaxi-d-app-module_270_220510_2.7.0' into dev_robotaxi-d-app-module_270_220510_2.7.0

# Conflicts:
#	core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/MapFragment.java
This commit is contained in:
donghongyu
2022-05-20 17:55:57 +08:00
36 changed files with 816 additions and 388 deletions

View File

@@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.autopilot
import android.Manifest.permission
import android.content.Context
import android.util.Log
import androidx.annotation.RequiresPermission
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
@@ -27,8 +28,8 @@ import com.mogo.eagle.core.function.autopilot.adapter.MoGoHandAdasMsgManager
import com.mogo.eagle.core.function.autopilot.server.AsyncDataToAutopilotServer
import com.mogo.eagle.core.function.autopilot.telematic.IMsgHandler
import com.mogo.eagle.core.function.autopilot.telematic.TeleMsgHandler
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
@@ -37,10 +38,10 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.telematic.MogoProtocolMsg
import com.mogo.telematic.MogoProtocolMsg.*
import com.mogo.telematic.MogoProtocolMsg.NORMAL_DATA
import com.mogo.telematic.MogoProtocolMsg.SYNC_MODE_STATUS
import com.mogo.telematic.NSDNettyManager
import com.mogo.telematic.client.listener.NettyClientListener
import com.mogo.telematic.client.status.ConnectState
import com.mogo.telematic.server.netty.NettyServerListener
import com.mogo.telematic.server.netty.NettyTcpServer
import com.zhidao.support.adas.high.AdasManager
@@ -116,7 +117,6 @@ class MoGoAutopilotProvider :
}
override fun onReceiveClientSign(channel: Channel?, sn: String?) {
// CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo("", sn)
}
}, MoGoAiCloudClientConfig.getInstance().sn)
} else {
@@ -321,18 +321,6 @@ class MoGoAutopilotProvider :
}
}
/**
* 工控机升级确认
*/
override fun setIPCUpgradeAffirm() {
}
/**
* 工控机升级取消
*/
override fun setIPCUpgradeCancel() {
}
/**
* 演示模式(美化模式)
* isEnable = true 开启
@@ -446,6 +434,8 @@ class MoGoAutopilotProvider :
override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) {
// 乘客屏才监听
AppConfigInfo.plateNumber = carConfigResp.plateNumber
Log.d("liyz", "onAutopilotCarConfig 乘客屏Mac地址为 = ${carConfigResp.macAddress}")
CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为${carConfigResp.macAddress}")
}

View File

@@ -107,7 +107,7 @@ public class MoGoHandAdasMsgManager implements
@Override
public void onAutopilotCarConfig(@NotNull MessagePad.CarConfigResp carConfigResp) {
if (carConfigResp != null && !TextUtils.isEmpty(carConfigResp.getMacAddress())) { //TODO 这里判断
if (carConfigResp != null && !TextUtils.isEmpty(carConfigResp.getMacAddress())) {
Log.d("liyz", "司机端 onAutopilotCarConfig ---" + carConfigResp.getMacAddress());
CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfigResp.getMacAddress(), MoGoAiCloudClientConfig.getInstance().getSn());
}

View File

@@ -1,11 +1,15 @@
package com.mogo.eagle.core.function.autopilot.telematic
import android.util.Log
import com.google.protobuf.TextFormat
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager.setDemoMode
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ToastUtils
@@ -17,6 +21,7 @@ import com.zhidao.support.adas.high.chain.AdasChain
import com.zhjt.service.chain.ChainLog
import com.zhjt.service.chain.TracingConstants
import io.netty.channel.Channel
import mogo.telematics.pad.MessagePad
class TeleMsgHandler : IMsgHandler {
@@ -28,9 +33,6 @@ class TeleMsgHandler : IMsgHandler {
@Volatile
private var wrTimeStamp = 0L
@Volatile
private var hasQueryCarConfig = false
override fun handleMsgFromServer(msg: MogoProtocolMsg?, channel: Channel?) {
msg?.let {
when (it.protocolType) {
@@ -53,13 +55,13 @@ class TeleMsgHandler : IMsgHandler {
}
setDemoMode(FunctionBuildConfig.isDemoMode)
}
MogoProtocolMsg.REQ_CAR_NUMBER -> {
AppConfigInfo.plateNumber = String(msg.body)
invokeNettyConnResult("司机屏发送给乘客屏车牌号为:${AppConfigInfo.plateNumber}")
}
MogoProtocolMsg.REQ_MAC_ADDRESS -> {
val macAddress = String(msg.body)
invokeNettyConnResult("司机屏发送给乘客屏Mac地址为:$macAddress")
val carConfig = MessagePad.CarConfigResp.parseFrom(msg.body)
AppConfigInfo.plateNumber = carConfig.plateNumber
AppConfigInfo.iPCMacAddress = carConfig.macAddress
invokeNettyConnResult("司机屏发送给乘客屏配置信息为:${TextFormat.printer().escapingNonAscii(false).printToString(carConfig)}")
Log.d("liyz", "TeleMsgHandler macAddress = " + carConfig.macAddress)
CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfig.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
}
else -> {
}
@@ -70,31 +72,18 @@ class TeleMsgHandler : IMsgHandler {
override fun handleMsgFromClient(msg: MogoProtocolMsg?, channel: Channel?) {
msg?.let {
when (it.protocolType) {
MogoProtocolMsg.REQ_CAR_NUMBER -> {
if (!AppConfigInfo.plateNumber.isNullOrEmpty()) {
val platNumberArray = AppConfigInfo.plateNumber!!.toByteArray()
NSDNettyManager.getInstance().sendMsgToSpecifiedClient(
MogoProtocolMsg(
MogoProtocolMsg.REQ_CAR_NUMBER,
platNumberArray.size, platNumberArray
), channel
) {
invokeNettyConnResult("司机屏发送车牌号到乘客屏是否成功:${it.isSuccess}")
}
} else {
queryCarConfig()
}
}
MogoProtocolMsg.REQ_MAC_ADDRESS -> {
if (!AppConfigInfo.iPCMacAddress.isNullOrEmpty()) {
val macAddressArray = AppConfigInfo.iPCMacAddress!!.toByteArray()
val carConfig = AdasManager.getInstance().carConfig
if (carConfig != null) {
val configArray = carConfig.toByteArray()
NSDNettyManager.getInstance().sendMsgToSpecifiedClient(
MogoProtocolMsg(
MogoProtocolMsg.REQ_MAC_ADDRESS,
macAddressArray.size, macAddressArray
configArray.size, configArray
), channel
) {
invokeNettyConnResult("司机屏发送Mac地址到乘客屏是否成功:${it.isSuccess}")
invokeNettyConnResult("司机屏发送配置信息到乘客屏是否成功:${it.isSuccess}")
}
} else {
queryCarConfig()
@@ -107,11 +96,8 @@ class TeleMsgHandler : IMsgHandler {
}
private fun queryCarConfig() {
if (!hasQueryCarConfig) {
hasQueryCarConfig = true
invokeNettyConnResult("乘客屏请求司机屏向工控机查询配置信息")
CallerAutoPilotManager.getCarConfig()
}
invokeNettyConnResult("乘客屏请求司机屏向工控机查询配置信息")
CallerAutoPilotManager.getCarConfig()
}
override fun handleClientConn2Server(channel: Channel?) {
@@ -139,21 +125,17 @@ class TeleMsgHandler : IMsgHandler {
ToastUtils.showShort("连接司机屏成功!")
invokeNettyConnResult("乘客屏连接司机屏成功")
val byteArray = byteArrayOf(0)
NSDNettyManager.getInstance().sendMogoProtocolMsgToServer(
MogoProtocolMsg(MogoProtocolMsg.REQ_CAR_NUMBER, byteArray.size, byteArray)
) {
invokeNettyConnResult("乘客屏请求车牌号数据发送是否成功:${it}")
}
NSDNettyManager.getInstance().sendMogoProtocolMsgToServer(
MogoProtocolMsg(MogoProtocolMsg.REQ_MAC_ADDRESS, byteArray.size, byteArray)
) {
invokeNettyConnResult("乘客屏请求MAC地址数据发送是否成功:${it}")
invokeNettyConnResult("乘客屏请求配置信息的数据发送是否成功:${it}")
}
}
ConnectState.STATUS_CONNECT_CLOSED -> {// 由于重连机制会回调多次
if (isFirstDisc) {
isFirstDisc = false
AppConfigInfo.plateNumber = ""
AppConfigInfo.iPCMacAddress = ""
ToastUtils.showLong("断开和司机屏的连接!")
invokeNettyConnResult("断开和司机屏的连接!")
}

View File

@@ -16,6 +16,8 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* @author lixiaopeng
@@ -56,26 +58,64 @@ public class BindingcarProvider implements IMoGoBindingcarProvider {
public void getBindingcarInfo(String macAddress, String widevineIDWithMd5) {
mAddress = macAddress;
mWidevineIDWithMd5 = widevineIDWithMd5;
long currentHour = System.currentTimeMillis() / (1000 * 60);
long oldHour = SharedPrefsMgr.getInstance(mContext).getLong("type", 0);
Log.d("liyz", "getBindingcarInfo ------ mAddress = " + mAddress + "--mWidevineIDWithMd5 = " + mWidevineIDWithMd5 + "--getScreenType() = " + getScreenType());
//如果5分钟内频繁调需要拦截业务导致的会多次请求工控机信息 TODO
//司机屏
if (HmiBuildConfig.isShowSnBindingView && getScreenType() == 1) {
Log.d("liyz", "getBindingcarInfo -----间隔时间 = " + (currentHour - oldHour));
if (currentHour - oldHour > 5) {
SharedPrefsMgr.getInstance(mContext).putLong("type", System.currentTimeMillis() / (1000 * 60));
BindingcarNetWorkManager.getInstance().getBindingcarInfo(mContext, macAddress, mWidevineIDWithMd5, getScreenType());
}
if (getScreenType() == 1) { //司机屏
driverScreen(macAddress, widevineIDWithMd5);
} else if (getScreenType() == 2) { //乘客屏
passengerScreen(macAddress, widevineIDWithMd5);
}
}
/**
* 确认升级工控机docker版本
* @param images docker列表
* @param padSn SN
* @param releaseId 任务ID
*/
@Override
public void upgradeConfirm(List<String> images, String padSn, String releaseId) {
IPCUpgradeManager.Companion.getINSTANCE().upgradeConfirm(images, padSn, releaseId);
}
/**
* 获取新工控机docker版本
* @param padSn SN
* @param dockerVersion 当前工控机版本
*/
@Override
public void queryContainers(String padSn,String dockerVersion) {
IPCUpgradeManager.Companion.getINSTANCE().queryContainers(padSn,dockerVersion);
}
@Override
public void modifyCarInfo(BindingcarCallBack callBack) {
BindingcarNetWorkManager.getInstance().modifyBindingcar(mAddress, mWidevineIDWithMd5, callBack, getScreenType());
}
private void driverScreen(String macAddress, String widevineIDWithMd5) {
long currentHour = System.currentTimeMillis() / (1000 * 60);
long oldHour = SharedPrefsMgr.getInstance(mContext).getLong("typeDriver", 0);
//如果5分钟内频繁调需要拦截业务导致的会多次请求工控机信息
if (HmiBuildConfig.isShowSnBindingView) {
Log.d("liyz", "driverScreen -----间隔时间 = " + (currentHour - oldHour) + "-- macAddress = " + macAddress + "--widevineIDWithMd5 = " + widevineIDWithMd5 + "--getScreenType() = " + getScreenType());
if (currentHour - oldHour > 5) {
SharedPrefsMgr.getInstance(mContext).putLong("typeDriver", System.currentTimeMillis() / (1000 * 60));
BindingcarNetWorkManager.getInstance().getBindingcarInfo(mContext, macAddress, widevineIDWithMd5, getScreenType());
}
}
}
private void passengerScreen(String macAddress, String widevineIDWithMd5) {
long currentHour = System.currentTimeMillis() / (1000 * 60);
long oldHour = SharedPrefsMgr.getInstance(mContext).getLong("typePassenger", 0);
//如果5分钟内频繁调需要拦截业务导致的会多次请求工控机信息
if (HmiBuildConfig.isShowSnBindingView) {
Log.d("liyz", "passengerScreen --间隔时间 = " + (currentHour - oldHour) + "-- mAddress = " + macAddress + "--mWidevineIDWithMd5 = " + widevineIDWithMd5 + "--getScreenType() = " + getScreenType());
if (currentHour - oldHour > 5) {
SharedPrefsMgr.getInstance(mContext).putLong("typePassenger", System.currentTimeMillis() / (1000 * 60));
BindingcarNetWorkManager.getInstance().getBindingcarInfo(mContext, macAddress, widevineIDWithMd5, getScreenType());
}
}
}
private int getScreenType() {
int screenType = -1;

View File

@@ -4,10 +4,17 @@ import android.content.Context
import android.util.Log
import com.mogo.aicloud.services.socket.IMogoOnMessageListener
import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingCarListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.ipcupgrade.network.IPCUpgradeNetWorkModel
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.GsonUtils
import org.json.JSONObject
/**
* @author XuXinChao
@@ -26,6 +33,11 @@ class IPCUpgradeManager: IMogoOnMessageListener<IPCUpgradeStateInfo> ,
}
private var mContext: Context? = null
private val ipcUpgradeNetWorkModel = IPCUpgradeNetWorkModel()
private var autopilotStatus: Int? = null //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中
private var hasIPCUpgradeTask = false //是否有工控机升级任务,默认没有该任务
private var ipcUpgradeStateInfoTask: IPCUpgradeStateInfo?=null
fun initServer(context: Context){
mContext = context
@@ -40,8 +52,32 @@ class IPCUpgradeManager: IMogoOnMessageListener<IPCUpgradeStateInfo> ,
return IPCUpgradeStateInfo::class.java
}
override fun onMsgReceived(obj: IPCUpgradeStateInfo?) {
override fun onMsgReceived(ipcUpgradeStateInfo: IPCUpgradeStateInfo?) {
CallerLogger.i(TAG,"IPCUpgradeManager received msg${ipcUpgradeStateInfo}")
ipcUpgradeStateInfo?.let {
if(it.status.isEmpty() || it.status == "0"){
if(autopilotStatus == 2){
//当前处于自动驾驶状态时,不弹窗提示,结束自动驾驶时弹窗
hasIPCUpgradeTask = true
ipcUpgradeStateInfoTask=it
}else{
var releaseId=""
if(it.releaseId!=null){
releaseId = it.releaseId.toString()
}
//弹窗提示,确认是否进行工控机升级
CallerHmiManager.showAdUpgradeDialog(
it.images,
MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn,
releaseId)
}
}else{
//更新下载or升级状态
CallerHmiManager.showAdUpgradeStatus(it)
}
}
}
/**
@@ -49,7 +85,62 @@ class IPCUpgradeManager: IMogoOnMessageListener<IPCUpgradeStateInfo> ,
* @param autoPilotStatusInfo 状态信息
*/
override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
autopilotStatus = autoPilotStatusInfo.state
//有升级任务,且不处于自动驾驶状态,进行升级提示
if(hasIPCUpgradeTask && autopilotStatus!=2){
ipcUpgradeStateInfoTask?.let {
var releaseId=""
if(it.releaseId!=null){
releaseId = it.releaseId.toString()
}
CallerHmiManager.showAdUpgradeDialog(
it.images,
MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn,
releaseId)
//将升级任务置为false
hasIPCUpgradeTask = false
}
}
}
/**
* 确认升级工控机docker版本
* @param images docker列表
* @param padSn SN
* @param releaseId 任务ID
*/
fun upgradeConfirm(images: List<String>,padSn: String,releaseId: String){
ipcUpgradeNetWorkModel.upgradeConfirm(images,padSn,releaseId,
onSuccess = {
},
onError = {
})
}
/**
* 获取新工控机docker版本
* @param padSn SN
* @param dockerVersion 当前工控机版本
*/
fun queryContainers(padSn: String,dockerVersion: String){
ipcUpgradeNetWorkModel.queryContainers(padSn,
onSuccess = {
val jsonObject = JSONObject(it)
val images = jsonObject.getJSONArray("images")
val dockerList = ArrayList<String>()
for(i in 0 until images.length()){
if(!i.toString().contains(dockerVersion)){
dockerList.add(images[i].toString())
}
}
//将数组结果回调
CallerBindingCarListenerManager.invokeQueryContainersResponse(dockerList)
},
onError = {
})
}
fun destroy(){

View File

@@ -0,0 +1,35 @@
package com.mogo.eagle.core.function.ipcupgrade.network
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.Response
import okhttp3.RequestBody
import retrofit2.http.*
/**
* @author XuXinChao
* @description 工控机升级网络请求接口
* @since: 2022/5/17
*/
interface IPCUpgradeApiService {
/**
* 确认升级工控机docker版本
* @param imageName docker域名
* @param imageVersion docker版本
* @param padSn SN
* @param releaseId 任务ID
*/
@Headers(
"Content-Type:application/json",
"Accept: application/json"
)
@POST("/api/pushServer/confirm")
suspend fun upgradeConfirm(@Body requestBody: RequestBody): BaseResponse<Any>
/**
* 获取新工控机docker版本
* @param padSn SN
*/
@GET("/api/pushServer/queryContainers")
suspend fun queryContainers(@Query("padSn") padSn: String): Response<Any>
}

View File

@@ -0,0 +1,95 @@
package com.mogo.eagle.core.function.ipcupgrade.network
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.Response
import com.mogo.eagle.core.function.ipcupgrade.network.UpgradeHostConst.Companion.getBaseUrl
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.apiCall
import com.mogo.eagle.core.network.apiResponseCall
import com.mogo.eagle.core.network.request
import com.mogo.eagle.core.utilcode.util.GsonUtils
import okhttp3.MediaType
import okhttp3.RequestBody
import org.json.JSONArray
import org.json.JSONObject
/**
* @author XuXinChao
* @description 工控机升级网络请求
* @since: 2022/5/17
*/
class IPCUpgradeNetWorkModel {
private fun getNetWorkApi(baseUrl: String =getBaseUrl()): IPCUpgradeApiService{
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl)
.create(IPCUpgradeApiService::class.java)
}
/**
* 确认升级工控机docker版本
* @param images docker列表
* @param padSn SN
* @param releaseId 任务ID
*/
fun upgradeConfirm(images: List<String>,padSn: String,releaseId: String,
onSuccess: ((String) -> Unit),onError: ((String) -> Unit)){
request<BaseResponse<Any?>> {
val requestJson = JSONObject()
val imagesJsonArray = JSONArray()
images.iterator().forEach {
imagesJsonArray.put(it)
}
requestJson.put("images",imagesJsonArray)
requestJson.put("padSn",padSn)
requestJson.put("releaseId",releaseId)
val requestBody:RequestBody= RequestBody.create(
MediaType.parse("application/json; charset=utf-8"),
requestJson.toString()
)
loader{
apiCall{
getNetWorkApi(getBaseUrl()).upgradeConfirm(requestBody)
}
}
onSuccess{
onSuccess.invoke("")
}
onError {
onError.invoke("")
}
}
}
/**
* 获取新工控机docker版本
* @param padSn SN
*/
fun queryContainers(padSn: String,onSuccess: ((String) -> Unit),onError: ((String) -> Unit)){
request<Response<Any?>>{
loader {
apiResponseCall{
getNetWorkApi(getBaseUrl()).queryContainers(padSn)
}
}
onSuccess{
if(it.msg == "success"){
onSuccess.invoke(GsonUtils.toJson(it.data))
}else{
onError.invoke("query Containers fail")
}
}
onError {
if(it.message!=null){
onError.invoke(it.message!!)
}
}
}
}
}

View File

@@ -0,0 +1,28 @@
package com.mogo.eagle.core.function.ipcupgrade.network
import com.mogo.commons.debug.DebugConfig
/**
* @author XuXinChao
* @description 工控机升级域名管理
* @since: 2022/5/17
*/
class UpgradeHostConst {
companion object{
private const val HOST_DEV = "http://mysunflower-qa.zhidaoauto.com"
private const val HOST_RELEASE = "http://mysunflower-qa.zhidaoauto.com"
fun getBaseUrl(): String {
return when (DebugConfig.getNetMode()) {
DebugConfig.NET_MODE_DEV -> HOST_DEV
DebugConfig.NET_MODE_QA -> HOST_DEV
DebugConfig.NET_MODE_DEMO -> HOST_RELEASE
DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE
else -> HOST_RELEASE
}
}
}
}

View File

@@ -5,7 +5,6 @@ import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import mogo_msg.MogoReportMsg

View File

@@ -14,6 +14,7 @@ import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
@@ -49,6 +50,7 @@ import com.mogo.eagle.core.function.hmi.ui.notice.NoticeNormalBannerView
import com.mogo.eagle.core.function.hmi.ui.setting.DebugSettingView
import com.mogo.eagle.core.function.hmi.ui.setting.IPCReportWindow
import com.mogo.eagle.core.function.hmi.ui.setting.ReportListFloatWindow
import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog
import com.mogo.eagle.core.function.hmi.ui.tools.AutoPilotAndCheckView
import com.mogo.eagle.core.function.hmi.ui.widget.V2XNotificationView
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@@ -116,6 +118,7 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
private var reportListFloatWindow: ReportListFloatWindow?=null
private var ipcReportWindow: IPCReportWindow?=null
private var adUpgradeDialog: AdUpgradeDialog?=null
override fun vipIdentification(visible: Boolean) {
ThreadUtils.runOnUiThread {
@@ -229,9 +232,15 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
ThreadUtils.runOnUiThread{
if(ipcReportWindow==null){
ipcReportWindow= activity?.let { IPCReportWindow(it) }
ipcReportWindow?.showFloatWindow()
ipcReportWindow?.setClickListener(object: IPCReportWindow.ClickListener{
override fun closeWindow() {
ipcReportWindow?.hideFloatWindow()
ipcReportWindow =null
}
})
AIAssist.getInstance(AbsMogoApplication.getApp()).speakTTSVoice("")
}
ipcReportWindow?.showFloatWindow()
ipcReportWindow?.refreshData(reportList)
}
}
@@ -957,6 +966,26 @@ class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
}
override fun showAdUpgradeDialog(
images: List<String>,
padSn: String,
releaseId: String
) {
ThreadUtils.runOnUiThread{
if(adUpgradeDialog == null){
adUpgradeDialog = AdUpgradeDialog(requireContext(),images, padSn, releaseId)
}
adUpgradeDialog?.showUpgradeDialog()
}
}
override fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo) {
ThreadUtils.runOnUiThread{
toolsView?.showAdUpgradeStatus(ipcUpgradeStateInfo)
}
}
override fun setTurnLightFunction(isOpen: Boolean) {
HmiBuildConfig.isShowTurnLightView = isOpen
}

View File

@@ -4,6 +4,7 @@ import android.app.Activity
import android.graphics.PixelFormat
import android.util.DisplayMetrics
import android.view.*
import android.widget.ImageView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.data.report.ReportEntity
@@ -21,6 +22,7 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
private var mWindowParams: WindowManager.LayoutParams? = null
private var mWindowManager: WindowManager? = null
private lateinit var rvIPCReport: RecyclerView
private lateinit var ivIpcClose: ImageView
private var ipcReportAdapter: IPCReportAdapter?=null
private lateinit var mFloatLayout: View
@@ -31,6 +33,8 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
private var mInScreenX = 0f
private var mInScreenY = 0f
private var clickListener: ClickListener? = null
init {
initFloatWindow();
}
@@ -39,20 +43,25 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_ipc_report, null) as View
mFloatLayout.setOnTouchListener(this)
rvIPCReport= mFloatLayout.findViewById(R.id.rv_ipc_report)
ivIpcClose = mFloatLayout.findViewById(R.id.iv_ipc_close)
mWindowParams = WindowManager.LayoutParams()
mWindowManager = mActivity.windowManager
mWindowParams?.let {
it.format = PixelFormat.RGBA_8888
it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
it.gravity = Gravity.START or Gravity.TOP
it.width = 800
it.height = 1000
it.width = 600
it.height = 800
it.alpha = 0.9f
}
ipcReportAdapter = IPCReportAdapter()
rvIPCReport.layoutManager = LinearLayoutManager(mActivity,
LinearLayoutManager.VERTICAL,false)
rvIPCReport.adapter = ipcReportAdapter
ivIpcClose.setOnClickListener {
clickListener?.closeWindow()
}
}
fun refreshData(data:List<ReportEntity>){
@@ -122,5 +131,13 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
return sbar
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
interface ClickListener {
fun closeWindow()
}
}

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.hmi.ui.tools
import android.content.Context
import android.widget.TextView
import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.module.common.dialog.BaseFloatDialog
@@ -11,27 +12,38 @@ import com.mogo.module.common.dialog.BaseFloatDialog
* @description 工控机确认升级对话框
* @since: 2022/1/13
*/
class AdUpgradeDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver {
class AdUpgradeDialog(context: Context,images: List<String>,padSn: String,releaseId: String)
: BaseFloatDialog(context), LifecycleObserver {
private var upgradeConfirm : TextView? = null
private var upgradeCancel : TextView? = null
private var clickListener: ClickListener? = null
private var images: List<String>?=null
private var imageVersion: String?=null
private var padSn: String?=null
private var releaseId: String?=null
init {
setContentView(R.layout.dialog_ad_upgrade)
setCanceledOnTouchOutside(true)
setCanceledOnTouchOutside(false)
upgradeConfirm=findViewById(R.id.tv_upgrade_confirm)
upgradeCancel=findViewById(R.id.tv_upgrade_cancel)
upgradeConfirm?.setOnClickListener{
clickListener?.confirm()
//确认升级
CallerBindingcarManager.getBindingcarProvider().upgradeConfirm(images, padSn, releaseId)
dismiss()
}
upgradeCancel?.setOnClickListener {
clickListener?.cancel()
dismiss()
}
this.images = images
this.padSn = padSn
this.releaseId = releaseId
}
fun setClickListener(clickListener: ClickListener) {

View File

@@ -5,17 +5,21 @@ import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.utils.KeyBoardUtil
import com.mogo.eagle.core.utilcode.kotlin.onClick
@@ -139,6 +143,7 @@ class AutoPilotAndCheckView @JvmOverloads constructor(
// val speed = "30"
// etInputSpeed.setText(speed)
// etInputSpeed.setSelection(speed.length)
}
fun setClickListener(clickListener: ClickListener) {
@@ -161,34 +166,12 @@ class AutoPilotAndCheckView @JvmOverloads constructor(
}
}
/**
* 展示工控机下载、升级状态信息
* @param upgradeMode 升级模式(提示升级、静默升级)
* @param downloadStatus 下载状态
* @param currentProgress 当前已经下载包体大小
* @param totalProgress 下载包体总大小
* @param downloadVersion 下载版本
* @param upgradeStatus 升级状态
*/
fun showAdUpgradeStatus(
upgradeMode: Int,
downloadStatus: Int,
currentProgress: Int,
totalProgress: Int,
downloadVersion: String,
upgradeStatus: Int
) {
systemVersionView?.showAdUpgradeStatus(
upgradeMode,
downloadStatus,
currentProgress,
totalProgress,
downloadVersion,
upgradeStatus
)
checkSystemView?.setAdUpgradeStatus(downloadStatus, upgradeStatus)
fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo){
systemVersionView?.showAdUpgradeStatus(ipcUpgradeStateInfo)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
@@ -219,6 +202,9 @@ class AutoPilotAndCheckView @JvmOverloads constructor(
speedLimit = carConfigResp.speedLimit
tvAcceleration.text = "加速度 ${carConfigResp.maxAcceleration} m/s²"
etInputSpeed.setText((carConfigResp.speedLimit * 3.6).toInt().toString())
AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号
AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址
AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本
}
}
}

View File

@@ -6,7 +6,6 @@ import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.autopilot.AdUpgradeStateHelper
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
@@ -33,8 +32,8 @@ class CheckSystemView @JvmOverloads constructor(
private var autopilotStatus: Int? = null //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中
private var dockerRebootDialog: DockerRebootDialog? = null
private var downloadStatus: Int = -1 //下载状态
private var upgradeStatus: Int = -1 //升级状态
private var downloadStatus: String = "" //下载状态
private var upgradeStatus: String = "" //升级状态
init {
LayoutInflater.from(context).inflate(R.layout.view_check_system, this, true)
@@ -55,14 +54,18 @@ class CheckSystemView @JvmOverloads constructor(
if (autopilotStatus == 2) {
//当前处于自动驾驶状态不可进行重启Toast提示
ToastUtils.showShort("请先退出自动驾驶状态")
} else if (AdUpgradeStateHelper.showCannotReboot(
downloadStatus,
upgradeStatus
)
) {
//当工控机处于下载或者升级状态,需要先进行升级
ToastUtils.showShort("请先完成新自动驾驶系统的下载/升级")
} else {
}
// else if (AdUpgradeStateHelper.showCannotReboot(
// downloadStatus,
// upgradeStatus
// )
// ) {
// //当工控机处于下载或者升级状态,需要先进行升级
// ToastUtils.showShort("请先完成新自动驾驶系统的下载/升级")
// }
else {
//确认重启
CallerLogger.d("$M_HMI$TAG", "reboot confirm")
CallerAutoPilotManager.setIPCReboot()
@@ -80,7 +83,7 @@ class CheckSystemView @JvmOverloads constructor(
}
}
fun setAdUpgradeStatus(downloadStatus: Int, upgradeStatus: Int) {
fun setAdUpgradeStatus(downloadStatus: String, upgradeStatus: String) {
this.downloadStatus = downloadStatus
this.upgradeStatus = upgradeStatus
}

View File

@@ -5,22 +5,24 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.autopilot.AdUpgradeStateHelper
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingCarListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingCarListenerManager
import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog
import com.mogo.eagle.core.utilcode.util.AppUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.view_system_version.view.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
/**
* @author XuXinChao
@@ -31,7 +33,7 @@ class SystemVersionView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener,IMoGoBindingCarListener {
companion object {
const val TAG = "SystemVersionView"
@@ -40,15 +42,13 @@ class SystemVersionView @JvmOverloads constructor(
private var connectStatus = false
private var dockerVersion: String? = null //工控机版本
private var autopilotStatus: Int? = null //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中
private var adUpgradeDialog: AdUpgradeDialog? = null
private var upgradeMode: Int = -1 //升级模式
private var downloadStatus: Int = -1 //下载状态
private var currentProgress: Int = -1 //当前已下载包体大小
private var ipcUpgradeStateInfo: IPCUpgradeStateInfo?=null
private var needQueryContainers: Boolean = false
private var dockerList: List<String>?=null
private var previousProgress: Int = -1 //前一秒的下载进度,用于计算下载剩余时间
private var totalProgress: Int = -1 //包体大小
private var downloadVersion: String? = null //工控机docker版本
private var upgradeStatus: Int = -1 //升级状态
private var currentProgress: Int = -1 //当前已下载包体大小
init {
LayoutInflater.from(context).inflate(R.layout.view_system_version, this, true)
@@ -67,62 +67,46 @@ class SystemVersionView @JvmOverloads constructor(
//工控机版本视图点击事件
ivAdVersion.setOnClickListener {
CallerLogger.i("$M_HMI$$TAG", "ad version view clicked")
CallerLogger.i(
"$M_HMI$$TAG",
"upgradeMode=$upgradeMode , downloadStatus=$downloadStatus , upgradeStatus=$upgradeStatus"
)
if (AdUpgradeStateHelper.isDownloading(downloadStatus)) {
//点击Toast提示下载剩余时间
ToastUtils.showShort(
"预计" + AdUpgradeStateHelper.getRemainingTime(
totalProgress,
previousProgress,
currentProgress
) + "下载完成"
)
} else if (AdUpgradeStateHelper.getUpgradeStatus()) {
//工控机状态为“升级中”
ToastUtils.showShort("新版本升级中预计5分钟升级完成")
} else if (AdUpgradeStateHelper.isUpgradeFailed(upgradeStatus)) {
//如果升级失败则Toast提示升级失败请联系运维人员
ToastUtils.showShort("升级失败,请联系运维人员")
} else if (AdUpgradeStateHelper.isHintUpgradeMode(upgradeMode) && AdUpgradeStateHelper.isDownloadFinish(
downloadStatus,
upgradeStatus
)
) {
//如果升级模式为“提示升级”,并且下载状态为已经下载完成,点击弹出升级确认弹窗
if (adUpgradeDialog == null) {
adUpgradeDialog = AdUpgradeDialog(context)
adUpgradeDialog?.setClickListener(object : AdUpgradeDialog.ClickListener {
override fun confirm() {
if (autopilotStatus == 2) {
//当前处于自动驾驶状态不可进行升级Toast提示
ToastUtils.showShort("升级前请先退出自动驾驶模式")
} else {
//确认升级
CallerLogger.i("$M_HMI$$TAG", "upgrade confirm")
//设置当前状态为“升级中”
AdUpgradeStateHelper.setUpgradeStatus(true)
//TODO
CallerAutoPilotManager.setIPCUpgradeAffirm()
//将角标设为升级中
ivAdStatus?.setImageResource(R.drawable.icon_upgrading)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
}
override fun cancel() {
//取消升级
CallerLogger.i("$M_HMI$$TAG", "upgrade cancel")
//取消升级命令不下发
// CallerAutoPilotManager.setIPCUpgradeCancel()
}
})
if(AdUpgradeStateHelper.isUpgradeableStatus()){
if(autopilotStatus == 2){
//当前处于自动驾驶状态不可进行升级Toast提示
ToastUtils.showShort("升级前请先退出自动驾驶模式")
}else{
dockerList?.let {
//弹窗提示,确认是否进行工控机升级
CallerHmiManager.showAdUpgradeDialog(it,
MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn,
""
)
}
}
adUpgradeDialog?.showUpgradeDialog()
}
ipcUpgradeStateInfo?.let {
when {
AdUpgradeStateHelper.isDownloading(it.status) -> {
//下载中点击Toast提示下载剩余时间
ToastUtils.showShort(
"预计" + AdUpgradeStateHelper.getRemainingTime(
it.progress.progressDetail.total,
previousProgress,
currentProgress
) + "下载完成"
)
}
AdUpgradeStateHelper.isUpgrading(it.status) -> {
//工控机状态为“升级中”
ToastUtils.showShort("新版本升级中预计5分钟升级完成")
}
AdUpgradeStateHelper.isUpgradeFailed(it.status) -> {
//如果升级失败则Toast提示升级失败请联系运维人员
ToastUtils.showShort("升级失败,请联系运维人员")
}
AdUpgradeStateHelper.isUpgradeSuccess(it.status) -> {
//升级成功
ToastUtils.showLong("已是最新版本")
}
}
}
}
@@ -131,117 +115,76 @@ class SystemVersionView @JvmOverloads constructor(
/**
* 设置工控机下载、升级状态信息
* @param upgradeMode 升级模式(提示升级、静默升级)
* @param downloadStatus 下载状态
* @param currentProgress 当前已经下载包体大小
* @param totalProgress 下载包体总大小
* @param downloadVersion 下载版本
* @param upgradeStatus 升级状态
*/
fun setAdUpgradeInfo(
upgradeMode: Int, downloadStatus: Int, currentProgress: Int, totalProgress: Int,
downloadVersion: String, upgradeStatus: Int
) {
this.upgradeMode = upgradeMode
this.downloadStatus = downloadStatus
private fun setAdUpgradeInfo(ipcUpgradeStateInfo: IPCUpgradeStateInfo) {
this.previousProgress = this.currentProgress
this.currentProgress = currentProgress
this.totalProgress = totalProgress
this.downloadVersion = downloadVersion
this.upgradeStatus = upgradeStatus
this.currentProgress = ipcUpgradeStateInfo.progress.progressDetail.current
this.ipcUpgradeStateInfo = ipcUpgradeStateInfo
}
/**
* 展示工控机下载、升级状态信息
* @param upgradeMode 升级模式(提示升级、静默升级)
* @param downloadStatus 下载状态
* @param currentProgress 当前已经下载包体大小
* @param totalProgress 下载包体总大小
* @param downloadVersion 下载版本
* @param upgradeStatus 升级状态
*
*/
fun showAdUpgradeStatus(
upgradeMode: Int,
downloadStatus: Int,
currentProgress: Int,
totalProgress: Int,
downloadVersion: String,
upgradeStatus: Int
) {
GlobalScope.launch(Dispatchers.Main) {
//设置工控机下载、升级状态信息
setAdUpgradeInfo(
upgradeMode,
downloadStatus,
currentProgress,
totalProgress,
downloadVersion,
upgradeStatus
)
if (AdUpgradeStateHelper.isDownloading(downloadStatus)) {
//正在下载,展示“下载中”角标,展示进度条,并设置当前下载进度
ivAdStatus?.setImageResource(R.drawable.icon_downloading)
adCircularProgressView?.let {
it.visibility = View.VISIBLE
CallerLogger.i(
"$M_HMI$$TAG",
"下载中=currentProgress=$currentProgress , totalProgress=$totalProgress , downloadProgress=" + AdUpgradeStateHelper.downloadProgress(
currentProgress,
totalProgress
)
)
it.setProgress(
AdUpgradeStateHelper.downloadProgress(
currentProgress,
totalProgress
)
)
}
} else if (AdUpgradeStateHelper.isDownloadFinish(downloadStatus, upgradeStatus)) {
//下载完成处于可升级状态展示“可升级”角标将AD背景变为蓝色并隐藏下载进度条(当状态为“升级中”时,不进行设置(存在升级命令已下发,但工控机未立即升级现象))
if (!AdUpgradeStateHelper.getUpgradeStatus()) {
ivAdStatus?.setImageResource(R.drawable.icon_upgradeable)
ivAdVersion?.setBackgroundResource(R.drawable.version_upgradeable_background)
adCircularProgressView?.visibility = View.GONE
if (AdUpgradeStateHelper.isQuietUpgradeMode(upgradeMode)) {
//如果升级模式为“静默升级”,则下载完成后,调用升级命令进行升级
CallerAutoPilotManager.setIPCUpgradeAffirm()
AdUpgradeStateHelper.setUpgradeStatus(true)
fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo){
ThreadUtils.runOnUiThread{
setAdUpgradeInfo(ipcUpgradeStateInfo)
AdUpgradeStateHelper.setUpgradeableStatus(false)
ipcUpgradeStateInfo.status.let {status->
when {
AdUpgradeStateHelper.isDownloading(status) -> {
//正在下载,展示“下载中”角标,展示进度条,并设置当前下载进度
ivAdStatus?.setImageResource(R.drawable.icon_downloading)
adCircularProgressView?.let {adCircularProgressView->
adCircularProgressView.visibility = View.VISIBLE
CallerLogger.i(
"$M_HMI$$TAG", "showAdUpgradeStatus status=$status"
)
adCircularProgressView.setProgress(
AdUpgradeStateHelper.downloadProgress(
ipcUpgradeStateInfo.progress.progressDetail.current,
ipcUpgradeStateInfo.progress.progressDetail.total
)
)
}
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
AdUpgradeStateHelper.isDownloadFailed(status) -> {
//下载失败,将状态设为“最新版”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_latest_version)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
AdUpgradeStateHelper.isUpgrading(status) ->{
//升级中,将状态设为“升级中”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_upgrading)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
AdUpgradeStateHelper.isUpgradeSuccess(status) -> {
//升级成功,将状态设为“最新版”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_latest_version)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
AdUpgradeStateHelper.isUpgradeFailed(status) -> {
//升级失败,将状态设为“升级失败”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_upgrade_failed)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
else -> {
//其他状态,均显示“最新版”,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_latest_version)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
}
} else if (AdUpgradeStateHelper.isDownloadFailed(downloadStatus)) {
//下载失败,将状态设为“最新版”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_latest_version)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
} else if (AdUpgradeStateHelper.isUpgradeSuccess(upgradeStatus)) {
//升级成功,将状态设为“最新版”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_latest_version)
adCircularProgressView?.visibility = View.GONE
AdUpgradeStateHelper.setUpgradeStatus(false)
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
} else if (AdUpgradeStateHelper.isUpgradeFailed(upgradeStatus)) {
//升级失败,将状态设为“升级失败”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_upgrade_failed)
adCircularProgressView?.visibility = View.GONE
AdUpgradeStateHelper.setUpgradeStatus(false)
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
} else {
//其他状态,均显示“最新版”,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_latest_version)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
}
}
}
/**
* 展示当前鹰眼版本
*/
@@ -271,6 +214,8 @@ class SystemVersionView @JvmOverloads constructor(
return
}
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerBindingCarListenerManager.registerDevaToolsLogCatchListener(TAG,this)
needQueryContainers = true
}
override fun onDetachedFromWindow() {
@@ -279,6 +224,8 @@ class SystemVersionView @JvmOverloads constructor(
return
}
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerBindingCarListenerManager.unRegisterDevaToolsLogCatchListener(TAG)
needQueryContainers = false
}
override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
@@ -289,6 +236,13 @@ class SystemVersionView @JvmOverloads constructor(
"$M_HMI$TAG",
"onAutopilotStatusResponse connectStatus=$connectStatus , dockerVersion=$dockerVersion , autopilotStatus=$autopilotStatus"
)
if(needQueryContainers && !AdUpgradeStateHelper.isUpgradeableStatus()){
dockerVersion?.let {
//查询是否有新的工控机docker版本
CallerBindingcarManager.getBindingcarProvider().queryContainers(MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn,dockerVersion)
needQueryContainers = false
}
}
setViewStatus()
}
@@ -296,4 +250,21 @@ class SystemVersionView @JvmOverloads constructor(
showCurrentAdVersion()
}
override fun queryContainersResponse(dockerList: List<String>) {
this.dockerList = dockerList
if(dockerList.isNotEmpty()){
//有更新任务,将状态设为“可升级”角标,并隐藏进度条
ivAdStatus?.setImageResource(R.drawable.icon_upgradeable)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_upgradeable_background)
AdUpgradeStateHelper.setUpgradeableStatus(true)
}else{
ToastUtils.showLong("已是最新版本")
ivAdStatus?.setImageResource(R.drawable.icon_latest_version)
adCircularProgressView?.visibility = View.GONE
ivAdVersion?.setBackgroundResource(R.drawable.version_latest_background)
AdUpgradeStateHelper.setUpgradeableStatus(false)
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 B

View File

@@ -39,7 +39,7 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--Vie车辆标志-->
<!--Vip车辆标志-->
<com.mogo.eagle.core.function.hmi.ui.widget.VipIdentificationView
android:id="@+id/flVipIdentificationView"
android:layout_width="@dimen/module_vip_width"
@@ -77,7 +77,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/hmi_traffic_light_layout_margin_top"
android:layout_marginRight="@dimen/hmi_traffic_light_layout_margin_right"
android:layout_marginEnd="@dimen/hmi_traffic_light_layout_margin_right"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

View File

@@ -10,6 +10,11 @@
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@color/color_FFFFFF"
android:textSize="14sp"
android:text="@string/ipc_report_time"
android:layout_marginTop="10dp"
android:layout_marginStart="10dp"
/>
<TextView
@@ -18,6 +23,10 @@
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/tvReportTimeTitle"
android:textColor="@color/color_FFFFFF"
android:textSize="14sp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
/>
<TextView
@@ -26,15 +35,24 @@
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvReportTimeTitle"
android:textColor="@color/color_FFFFFF"
android:textSize="14sp"
android:text="@string/ipc_report_type"
android:layout_marginTop="10dp"
android:layout_marginStart="10dp"
/>
<TextView
android:id="@+id/tvReportResultContent"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/tvReportResultTitle"
app:layout_constraintLeft_toRightOf="@id/tvReportResultTitle"
app:layout_constraintRight_toRightOf="parent"
android:textColor="@color/color_FF0006"
android:textSize="14sp"
android:minLines="1"
android:layout_marginEnd="10dp"
/>
<TextView
@@ -43,15 +61,24 @@
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvReportResultContent"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="@color/color_FFFFFF"
android:textSize="14sp"
android:text="@string/ipc_report_msg"
android:layout_marginTop="10dp"
android:layout_marginStart="10dp"
/>
<TextView
android:id="@+id/tvReportMsgContent"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/tvReportMsgTitle"
app:layout_constraintLeft_toRightOf="@id/tvReportMsgTitle"
app:layout_constraintRight_toRightOf="parent"
android:minLines="1"
android:textColor="@color/color_FF0006"
android:textSize="14sp"
android:layout_marginEnd="10dp"
/>
<TextView
@@ -60,15 +87,24 @@
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvReportMsgContent"
android:textColor="@color/color_FFFFFF"
android:textSize="14sp"
android:text="@string/ipc_report_action"
android:layout_marginTop="10dp"
android:layout_marginStart="10dp"
/>
<TextView
android:id="@+id/tvReportActionContent"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/tvReportActionTitle"
app:layout_constraintLeft_toRightOf="@id/tvReportActionTitle"
app:layout_constraintRight_toRightOf="parent"
android:minLines="1"
android:textColor="@color/color_FFFFFF"
android:textSize="14sp"
android:layout_marginEnd="10dp"
/>
<View
@@ -76,6 +112,9 @@
android:layout_height="1dp"
android:background="#F0F0F0"
app:layout_constraintTop_toBottomOf="@id/tvReportActionContent"
android:textColor="@color/color_FFFFFF"
android:textSize="14sp"
android:layout_marginTop="5dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,17 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="840px"
android:layout_height="584px"
android:layout_width="500px"
android:layout_height="350px"
android:orientation="vertical">
<ImageView
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/icon_drag"
android:padding="15dp"
android:layout_gravity="center_horizontal"
/>
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_ipc_drag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_drag"
android:padding="10dp"
android:layout_gravity="center_horizontal"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<ImageView
android:id="@+id/iv_ipc_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_report_close"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/iv_ipc_drag"
app:layout_constraintBottom_toBottomOf="@id/iv_ipc_drag"
android:padding="10dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<com.mogo.eagle.core.widget.RoundConstraintLayout
android:layout_width="match_parent"

View File

@@ -42,7 +42,7 @@
<dimen name="hmi_traffic_light_layout_height">154px</dimen>
<dimen name="hmi_traffic_light_layout_corner">60px</dimen>
<dimen name="hmi_traffic_light_layout_margin_right">40px</dimen>
<dimen name="hmi_traffic_light_layout_margin_top">23px</dimen>
<dimen name="hmi_traffic_light_layout_margin_top">28px</dimen>
<dimen name="hmi_traffic_light_bg_width">210px</dimen>
<dimen name="hmi_traffic_light_bg_height">120px</dimen>
<dimen name="hmi_traffic_light_bg_margin_left">15px</dimen>

View File

@@ -48,7 +48,7 @@
<dimen name="hmi_traffic_light_layout_height">154px</dimen>
<dimen name="hmi_traffic_light_layout_corner">60px</dimen>
<dimen name="hmi_traffic_light_layout_margin_right">40px</dimen>
<dimen name="hmi_traffic_light_layout_margin_top">23px</dimen>
<dimen name="hmi_traffic_light_layout_margin_top">28px</dimen>
<dimen name="hmi_traffic_light_bg_width">210px</dimen>
<dimen name="hmi_traffic_light_bg_height">120px</dimen>
<dimen name="hmi_traffic_light_bg_margin_left">15px</dimen>

View File

@@ -39,9 +39,15 @@
<string name="confirm">确认</string>
<string name="cancel">稍后升级</string>
<string name="ipc_report_time">时间:</string>
<string name="ipc_report_type">类型:</string>
<string name="ipc_report_msg">原因:</string>
<string name="ipc_report_action">建议操作:</string>
<!--绑定车机-->
<string name="bindingcar_title">绑定车机</string>
<string name="modify_binding_car">是否修改车机绑定?</string>
<string name="to_binding_car">是否绑定车机?</string>
</resources>

View File

@@ -57,7 +57,9 @@ public class MapFragment extends MvpFragment<MapView, MapPresenter>
@Override
public void stepInVrMode(boolean isDayMode) {
try {
mMogoMapView.getMap().getUIController().stepInVrMode(isDayMode);
if (mMogoMapView != null && mMogoMapView.getMap() != null && mMogoMapView.getMap().getUIController() != null) {
mMogoMapView.getMap().getUIController().stepInVrMode(isDayMode);
}
} catch (Exception e) {
e.printStackTrace();
}
@@ -198,7 +200,7 @@ public class MapFragment extends MvpFragment<MapView, MapPresenter>
@Override
public void changeMaoViewAngle(int type) {
if (mMogoMapView != null) {
if (mMogoMapView != null && mMogoMapView.getMap() != null && mMogoMapView.getMap().getUIController() != null) {
mMogoMapView.getMap().getUIController().changeMapViewAngle(type);
} else {
CallerLogger.INSTANCE.e(M_MAP + TAG, "mMogoMapView is null");
@@ -207,7 +209,7 @@ public class MapFragment extends MvpFragment<MapView, MapPresenter>
@Override
public void changeCurrentIcon(int iconId) {
if (mMogoMapView != null) {
if (mMogoMapView != null && mMogoMapView.getMap() != null && mMogoMapView.getMap().getUIController() != null) {
mMogoMapView.getMap().getUIController().changeCurrentIcon(iconId);
} else {
CallerLogger.INSTANCE.e(M_MAP + TAG, "mMogoMapView is null");
@@ -227,8 +229,8 @@ public class MapFragment extends MvpFragment<MapView, MapPresenter>
@Override
public void setMapDAngle(int mode) {
if (mMogoMapView != null) {
float angle = getSightModeAngle(mode);
float angle = getSightModeAngle(mode);
if (mMogoMapView != null && mMogoMapView.getMap() != null && mMogoMapView.getMap().getUIController() != null) {
mMogoMapView.getMap().getUIController().setMapDAngle(angle);
} else {
CallerLogger.INSTANCE.e(M_MAP + TAG, "mMogoMapView is null");
@@ -255,12 +257,12 @@ public class MapFragment extends MvpFragment<MapView, MapPresenter>
@Nullable
@Override
public CenterLine getCenterLineInfo(double lon, double lat, float angle) {
if (mMogoMapView != null) {
if (mMogoMapView != null && mMogoMapView.getMap() != null && mMogoMapView.getMap().getUIController() != null) {
return mMogoMapView.getMap().getUIController().getCenterLineInfo(lon, lat, angle);
} else {
CallerLogger.INSTANCE.e(M_MAP + TAG, "mMogoMapView is null");
return new CenterLine(); //上层使用应该判空
}
return null;
}
@Override