From 05582f4415e1f1dde4833c5b0c680a6f6d3edd12 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Fri, 20 Jun 2025 10:40:56 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[8.1.0]OTA=E5=8D=87=E7=BA=A7+=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E8=B0=83=E8=AF=95=E9=9D=A2=E6=9D=BF=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=A9=BE=E9=A9=B6=E6=A3=80=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../build.gradle | 2 + .../src/main/AndroidManifest.xml | 10 + .../rviz/dialog/SelectAutopilotLineDialog.kt | 51 +- .../rviz/net/MisHost.kt | 2 +- .../rviz/net/TrajectoryApiClient.kt | 228 +-- .../rviz/net/TrajectoryApiService.kt | 3 +- .../rviz/ui/activity/AutopilotCheckAct.kt | 16 + .../rviz/ui/views/CheckAutopilotView.kt | 1300 ++++++++--------- .../rviz/utils/PinYinUtil.java | 31 + .../layout/dialog_select_autopilot_line.xml | 14 +- .../main/res/layout/item_autopilot_line.xml | 2 +- .../src/main/res/layout/item_console.xml | 6 +- .../res/layout/layout_autopilot_check.xml | 11 + .../main/res/layout/view_check_autopilot.xml | 65 +- .../hmi/ui/setting/DebugSettingView.kt | 3 +- .../main/res/layout/dialog_ota_upgrade.xml | 164 ++- .../main/res/layout/view_debug_setting.xml | 1 + 17 files changed, 985 insertions(+), 924 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/activity/AutopilotCheckAct.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/utils/PinYinUtil.java create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/layout_autopilot_check.xml diff --git a/core/function-impl/mogo-core-function-devatools-rviz/build.gradle b/core/function-impl/mogo-core-function-devatools-rviz/build.gradle index cd6be6e0b5..19d058e590 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/build.gradle +++ b/core/function-impl/mogo-core-function-devatools-rviz/build.gradle @@ -88,5 +88,7 @@ dependencies { implementation("org.connectbot:jbcrypt:1.0.2") //----------------SSH end--------------------- implementation 'org.conscrypt:conscrypt-android:2.5.2' + + implementation 'com.belerweb:pinyin4j:2.5.1' } diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml index 7d1e9d6a3e..d8a81d16c5 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/AndroidManifest.xml @@ -22,6 +22,16 @@ android:theme="@style/Theme.AppCompat.Light.NoActionBar" android:windowSoftInputMode="adjustPan" /> + + diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt index 9ae4f5d385..6407cbcabd 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt @@ -75,8 +75,8 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw val divider = DividerItemDecoration(context, linearLayoutManager.orientation) rvLineList.addItemDecoration(divider) val params: WindowManager.LayoutParams = window!!.attributes - params.width = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_280)) - params.height = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_250)) + params.width = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_1200)) + params.height = WindowUtils.dip2px(context,context.resources.getDimension(R.dimen.dp_1000)) window?.attributes = params window?.setBackgroundDrawable(null) initEvent() @@ -108,28 +108,28 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw // 处理Taxi // 处理BUS包含:JV、KW、FT、SW -// CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode?.let { -// TrajectoryApiClient.queryTrajectoryList( -// this, -// VehicleConfigData.getCarType().name, -// it, -// object : -// NetworkCallback> { -// override fun onSuccess(data: ArrayList) { -// setSelectLineData(data) -// tvLoading.hide() -// } -// -// override fun onError(msg: String) { -// ToastUtils.showLong("获取 Bus 站点列表异常,异常原因:${msg}") -// tvLoading.show("获取 Bus 站点列表异常") -// } -// } -// ) -// } ?: let { -// ToastUtils.showLong("获取 Bus 站点列表异常,获取当前未知失败,请开启定位权限") -// tvLoading.show("获取 Bus 站点列表异常,请开启定位权限") -// } + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode?.let { + TrajectoryApiClient.queryTrajectoryList( + this, + VehicleConfigData.getCarType().name, + it, + object : + NetworkCallback> { + override fun onSuccess(data: ArrayList) { + setSelectLineData(data) + tvLoading.hide() + } + + override fun onError(msg: String) { + ToastUtils.showLong("获取 Bus 站点列表异常,异常原因:${msg}") + tvLoading.show("获取 Bus 站点列表异常") + } + } + ) + } ?: let { + ToastUtils.showLong("获取 Bus 站点列表异常,获取当前未知失败,请开启定位权限") + tvLoading.show("获取 Bus 站点列表异常,请开启定位权限") + } } //取消 @@ -186,6 +186,7 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw } override fun dismiss() { + mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED scopeQueryTrajectoryList.cancel() mActivity = null super.dismiss() @@ -198,7 +199,7 @@ class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOw } override fun getLifecycle(): Lifecycle { - return lifecycle + return mLifecycleRegistry } diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt index 957293edbb..51f2142473 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt @@ -5,7 +5,7 @@ import com.mogo.eagle.core.data.EnvConfig object MisHost { private const val HOST_QA = "https://eagle-qa.zhidaozhixing.com/" - private const val HOST_RELEASE = "https://eagle-mis-v6.zhidaozhixing.com/" + private const val HOST_RELEASE = "https://eagle-mis.zhidaozhixing.com/" private const val LOGIN_HOST_QA = "https://carlife-test.zhidaohulian.com/qa/eagle/login/index.html?deviceId=" diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt index 584d18a470..38e9079bf7 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt @@ -17,119 +17,119 @@ object TrajectoryApiClient { private val apiService: TrajectoryApiService = NetworkManager.getInstance().createService(TrajectoryApiService::class.java, baseUrl) -// /** -// * 查询 Bus&Taxi 有轨迹的QA线路列表 -// */ -// fun queryTrajectoryList( -// owner: LifecycleOwner, -// carType: String, -// cityCode: String, -// callback: NetworkCallback> -// ) { -// val reqBody = TrajectoryLisReq() -// reqBody.page = 1 -// reqBody.pageSize = 1000 -// reqBody.cityCode = cityCode -// -// val observable = if (carType == "TAXI") { -// apiService.queryTaxiTrajectoryList(reqBody) -// } else { -// apiService.queryBusTrajectoryList(reqBody) -// } -// -// NetworkManager.getInstance() -// .sendRequest( -// observable, -// owner, -// object : -// NetworkManager.NetworkCallback>> { -// override fun onSuccess(response: BaseResponse>?) { -// Log.d(TAG, "查询 $carType 有轨迹的QA线路列表:$response") -// // 处理网络请求成功的响应 -// response?.result?.let { callback.onSuccess(it) } -// } -// -// override fun onError(throwable: String) { -// Log.e(TAG, "查询 $carType 有轨迹的QA线路列表:$throwable") -// // 处理网络请求失败的情况 -// callback.onError(throwable) -// } -// } -// ) -// } -// -// -// /** -// * 查询 Bus&Taxi 线路对应的站点 -// */ -// fun querySiteList( -// owner: LifecycleOwner, -// carType: String, -// lineId: Int, -// callback: NetworkCallback> -// ) { -// val observable = if (carType == "TAXI") { -// apiService.queryTaxiSiteList(lineId) -// } else { -// apiService.queryBusSiteList(lineId) -// } -// -// NetworkManager.getInstance() -// .sendRequest( -// observable, -// owner, -// object : -// NetworkManager.NetworkCallback>> { -// override fun onSuccess(response: BaseResponse>?) { -// Log.d(TAG, "查询 $carType 线路对应的站点:$response") -// // 处理网络请求成功的响应 -// response?.result?.let { callback.onSuccess(it) } -// } -// -// override fun onError(throwable: String) { -// Log.e(TAG, "查询 $carType 线路对应的站点:$throwable") -// // 处理网络请求失败的情况 -// callback.onError(throwable) -// } -// } -// ) -// } -// -// /** -// * 查询 Bus&Taxi 线路对应的轨迹 -// */ -// fun queryTrajectoryInfo( -// owner: LifecycleOwner, -// carType: String, -// reqBody: TrajectoryInfoReq, -// callback: NetworkCallback -// ) { -// -// val observable = if (carType == "TAXI") { -// apiService.queryTaxiTrajectoryInfo(reqBody) -// } else { -// apiService.queryBusTrajectoryInfo(reqBody) -// } -// -// NetworkManager.getInstance() -// .sendRequest( -// observable, -// owner, -// object : -// NetworkManager.NetworkCallback> { -// override fun onSuccess(response: BaseResponse?) { -// Log.d(TAG, "查询 $carType 线路对应的轨迹:$response") -// // 处理网络请求成功的响应 -// response?.result?.let { callback.onSuccess(it) } -// } -// -// override fun onError(throwable: String) { -// Log.e(TAG, "查询 $carType 线路对应的轨迹:$throwable") -// // 处理网络请求失败的情况 -// callback.onError(throwable) -// } -// } -// ) -// } + /** + * 查询 Bus&Taxi 有轨迹的QA线路列表 + */ + fun queryTrajectoryList( + owner: LifecycleOwner, + carType: String, + cityCode: String, + callback: NetworkCallback> + ) { + val reqBody = TrajectoryLisReq() + reqBody.page = 1 + reqBody.pageSize = 1000 + reqBody.cityCode = cityCode + + val observable = if (carType == "TAXI") { + apiService.queryTaxiTrajectoryList(reqBody) + } else { + apiService.queryBusTrajectoryList(reqBody) + } + + NetworkManager.getInstance() + .sendRequest( + observable, + owner, + object : + NetworkManager.NetworkCallback>> { + override fun onSuccess(response: BaseResponse>?) { + Log.d(TAG, "查询 $carType 有轨迹的QA线路列表:$response") + // 处理网络请求成功的响应 + response?.result?.let { callback.onSuccess(it) } + } + + override fun onError(throwable: String) { + Log.e(TAG, "查询 $carType 有轨迹的QA线路列表:$throwable") + // 处理网络请求失败的情况 + callback.onError(throwable) + } + } + ) + } + + + /** + * 查询 Bus&Taxi 线路对应的站点 + */ + fun querySiteList( + owner: LifecycleOwner, + carType: String, + lineId: Int, + callback: NetworkCallback> + ) { + val observable = if (carType == "TAXI") { + apiService.queryTaxiSiteList(lineId) + } else { + apiService.queryBusSiteList(lineId) + } + + NetworkManager.getInstance() + .sendRequest( + observable, + owner, + object : + NetworkManager.NetworkCallback>> { + override fun onSuccess(response: BaseResponse>?) { + Log.d(TAG, "查询 $carType 线路对应的站点:$response") + // 处理网络请求成功的响应 + response?.result?.let { callback.onSuccess(it) } + } + + override fun onError(throwable: String) { + Log.e(TAG, "查询 $carType 线路对应的站点:$throwable") + // 处理网络请求失败的情况 + callback.onError(throwable) + } + } + ) + } + + /** + * 查询 Bus&Taxi 线路对应的轨迹 + */ + fun queryTrajectoryInfo( + owner: LifecycleOwner, + carType: String, + reqBody: TrajectoryInfoReq, + callback: NetworkCallback + ) { + + val observable = if (carType == "TAXI") { + apiService.queryTaxiTrajectoryInfo(reqBody) + } else { + apiService.queryBusTrajectoryInfo(reqBody) + } + + NetworkManager.getInstance() + .sendRequest( + observable, + owner, + object : + NetworkManager.NetworkCallback> { + override fun onSuccess(response: BaseResponse?) { + Log.d(TAG, "查询 $carType 线路对应的轨迹:$response") + // 处理网络请求成功的响应 + response?.result?.let { callback.onSuccess(it) } + } + + override fun onError(throwable: String) { + Log.e(TAG, "查询 $carType 线路对应的轨迹:$throwable") + // 处理网络请求失败的情况 + callback.onError(throwable) + } + } + ) + } } diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt index 8539593853..51ab7c1cd3 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt @@ -1,12 +1,11 @@ package com.mogo.module.common.net.mis.trajectory.net - -import com.mogo.eagle.core.data.BaseResponse import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryInfo import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryInfoReq import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryLisReq import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryListInfo import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectorySiteInfo +import com.zhjt.mogo_core_function_devatools.rviz.net.BaseResponse import io.reactivex.Observable import retrofit2.http.Body import retrofit2.http.GET diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/activity/AutopilotCheckAct.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/activity/AutopilotCheckAct.kt new file mode 100644 index 0000000000..fd67ac96d6 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/activity/AutopilotCheckAct.kt @@ -0,0 +1,16 @@ +package com.zhjt.mogo_core_function_devatools.rviz.ui.activity + +import android.os.Bundle +import com.zhjt.mogo_core_function_devatools.rviz.R +import com.zhjt.mogo_core_function_devatools.rviz.common.base.BaseActivity +import kotlinx.android.synthetic.main.layout_autopilot_check.viewCheckAutopilot + +class AutopilotCheckAct: BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?){ + super.onCreate(savedInstanceState) + setContentView(R.layout.layout_autopilot_check) + viewCheckAutopilot.setActivity(this) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt index 71c16da4fe..cbee28f7a8 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt @@ -21,6 +21,7 @@ import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import chassis.Chassis import chassis.VehicleStateOuterClass +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.utilcode.util.ThreadUtils @@ -39,10 +40,12 @@ import com.zhjt.mogo_core_function_devatools.rviz.dialog.SelectAutopilotLineDial import com.zhjt.mogo_core_function_devatools.rviz.dialog.adapter.ConsoleAdapter import com.zhjt.mogo_core_function_devatools.rviz.net.NetworkCallback import com.zhjt.mogo_core_function_devatools.rviz.net.TrajectoryApiClient +import com.zhjt.mogo_core_function_devatools.rviz.utils.PinYinUtil import com.zhjt.mogo_core_function_devatools.rviz.widgets.ros.TelematicsSubscriberEventKey import com.zhjt.mogo_core_function_devatools.rviz.widgets.ros.TopicSubscriberEventKey import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg import java.util.LinkedList @@ -58,430 +61,432 @@ class CheckAutopilotView @JvmOverloads constructor( } -// private val scopeUploadReportInfo = CoroutineScope(Dispatchers.Main) -// -// private val mLifecycleRegistry = LifecycleRegistry(this) -// private var reportMsgInfoSubscriber: CommSubscriber? = -// null -// private var reportMsgErrorSubscriber: CommSubscriber? = -// null -// -// // 当前选择的自动驾驶路线信息 -// var mTrajectoryListInfo: TrajectoryListInfo? = null -// var mTrajectorySiteInfo: List? = null -// var mTrajectoryInfo: TrajectoryInfo? = null -// -// private var selectAutopilotLineDialog: SelectAutopilotLineDialog? = null -// private var mActivity: Activity? = null -// -// -// /** -// * 传给自动驾驶 -// * 1、先下载轨迹信息 -// * @see TelematicsControlApi.sendTrajectoryDownloadReq -// * 2、再启动自动驾驶 -// * @see TelematicsControlApi.requestEnterAutoPilot -// */ -// val mTrajectoryLine = MessagePad.Line.newBuilder() -// -// private val consoleAdapter = -// ConsoleAdapter()//控制台适配器 -// private val consoleList = LinkedList() -// -// private var trajectoryListInfo: TrajectoryListInfo? = null -// -// private var currentAutopilotStatus: Int = 0 //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中,7:平行驾驶中 -// -// @Volatile -// private var speedLimit: Int = 1 -// -// //Warning -// // 自动驾驶效果受影响: -// // 自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 -// //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 -// private val RESULT_AUTOPILOT_INFERIOR = "RESULT_AUTOPILOT_INFERIOR" -// -// // 存在不确定因素 -// // 一般为过渡状态,存在不确定因素,有可能对自动驾驶有微弱影响,需要在pad端显示为黄色告警。 -// //如果偶尔上报该result可忽略,如果频繁上报需联系人员进行排查。 目前仅有RTK无法确认状态事件 -// private val RESULT_SHOW_WARNING = "RESULT_SHOW_WARNING" -// -// // 远程驾驶效果受影响 -// // 远程驾驶部分功能受影响。例如网络高延迟 -// private val RESULT_REMOTEPILOT_INFERIOR = "RESULT_REMOTEPILOT_INFERIOR" -// -// //Error -// // 无法启动自动驾驶 -// private val RESULT_AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE" -// -// // 自动驾驶系统启动失败 -// // 自动驾驶系统启动过程中出错,pad可能无法连接,云端监控可能无法上报 -// private val RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED" -// -// // 自动驾驶效果受影响 -// //自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 -// //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 -// private val RESULT_REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE" -// -// /** -// * 获取控制台上报数据列表 -// */ -// fun getConsoleList(): List { -// return consoleList -// } -// -// fun getTrajectoryListInfo(): TrajectoryListInfo? { -// return trajectoryListInfo -// } -// -// fun getTrackContrail(): TrackContrail? { -// return mTrajectoryInfo?.trackContrail -// } -// -// fun setActivity(activity: Activity) { -// mActivity = activity -// } -// -// // 订阅工控机日志 -// private val consoleObserver: Observer = -// Observer { mogoReportMessage: MogoReportMsg.MogoReportMessage -> -// if (consoleList.size > 1000) { -// consoleList.removeLast() -// } -// if (mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_INFERIOR) -// || mogoReportMessage.resultList.contains(RESULT_SHOW_WARNING) -// || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_INFERIOR) -// || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_DISABLE) -// || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) -// || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_DISABLE) -// ) { -// // 处理底盘超时 -//// if ( -//// !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_DISABLE) -//// || !mogoReportMessage.resultList.equals(RESULT_REMOTEPILOT_INFERIOR) -//// || !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_INFERIOR) -//// ) { -//// btnControlAutoPilot.isChecked = false -//// Log.e(TAG, "进入自动驾驶--失败") -//// } -// -// consoleList.addFirst( -// ReportEntity( -// TimeUtils.getNowString(), -// mogoReportMessage.code, -// mogoReportMessage.msg -// ) -// ) -// } -// if (consoleList.size > 0) { -// consoleAdapter.setData(consoleList) -// } -// } -// -// //订阅到站 -// private val arrivalObserver: Observer = Observer { -// it.let { -// Log.i("arrivalObserver", "CheckAuto页面收到到站回调") -// Log.i("arrivalObserver", "latitude=" + it.endLocation.latitude) -// Log.i("arrivalObserver", "longitude=" + it.endLocation.longitude) -// //取消自动驾驶 -// CallerAutoPilotControlManager.cancelAutoPilot() -// //吐司提示 -// ToastUtils.showShort("您已到达站点") -// } -// } -// -// //订阅工控机日志监控 -// private val reportObserver: Observer = Observer { -// it.let { -// //掉自驾 -// when (it.code) { -// "EMAP_EXIT_AUTOPILOT_FOR_PLANNING",//因planning掉帧强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_LOCATION",//因location掉帧强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS",//因底盘消息掉帧强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_DISTANCE",//因planning起点距离当前过远强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_BRAKE",//制动踏板干预而强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_ACCEL",//加速踏板干预而强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_STEER",//方向盘干预而强退自动驾驶 -// "EXIT_AUTOPILOT_FOR_GEAR_SWITCH",//档位切换干预而强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_NO_RESPONSE",//底盘不响应请求而强退自动驾驶 -// "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_UNKNOWN",//底盘退出原因未知而强退自动驾驶 -// "IRECORDER_TASK_AUTO"//自动录包任务创建 -// -> { -// //当司机或外界原因导致自动驾驶退出,需要在页面将状态同步显示出来,并将按钮设置为「启动自动驾驶」 -// ThreadUtils.runOnUiThread { -// ToastUtils.showShort("自动驾驶退出") -// btnControlAutoPilot.isEnabled = true -// btnControlAutoPilot.isChecked = false -// } + private val scopeUploadReportInfo = CoroutineScope(Dispatchers.Main) + + private val mLifecycleRegistry = LifecycleRegistry(this) + + + // 当前选择的自动驾驶路线信息 + var mTrajectoryListInfo: TrajectoryListInfo? = null + var mTrajectorySiteInfo: List? = null + var mTrajectoryInfo: TrajectoryInfo? = null + + private var selectAutopilotLineDialog: SelectAutopilotLineDialog? = null + private var mActivity: Activity? = null + + + /** + * 传给自动驾驶 + * 1、先下载轨迹信息 + * @see TelematicsControlApi.sendTrajectoryDownloadReq + * 2、再启动自动驾驶 + * @see TelematicsControlApi.requestEnterAutoPilot + */ + val mTrajectoryLine = MessagePad.Line.newBuilder() + + private val consoleAdapter = + ConsoleAdapter()//控制台适配器 + private val consoleList = LinkedList() + + private var trajectoryListInfo: TrajectoryListInfo? = null + + private var currentAutopilotStatus: Int = 0 //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中,7:平行驾驶中 + + @Volatile + private var speedLimit: Int = 1 + + //Warning + // 自动驾驶效果受影响: + // 自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 + //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 + private val RESULT_AUTOPILOT_INFERIOR = "RESULT_AUTOPILOT_INFERIOR" + + // 存在不确定因素 + // 一般为过渡状态,存在不确定因素,有可能对自动驾驶有微弱影响,需要在pad端显示为黄色告警。 + //如果偶尔上报该result可忽略,如果频繁上报需联系人员进行排查。 目前仅有RTK无法确认状态事件 + private val RESULT_SHOW_WARNING = "RESULT_SHOW_WARNING" + + // 远程驾驶效果受影响 + // 远程驾驶部分功能受影响。例如网络高延迟 + private val RESULT_REMOTEPILOT_INFERIOR = "RESULT_REMOTEPILOT_INFERIOR" + + //Error + // 无法启动自动驾驶 + private val RESULT_AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE" + + // 自动驾驶系统启动失败 + // 自动驾驶系统启动过程中出错,pad可能无法连接,云端监控可能无法上报 + private val RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED" + + // 自动驾驶效果受影响 + //自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。 + //例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。 + private val RESULT_REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE" + + /** + * 获取控制台上报数据列表 + */ + fun getConsoleList(): List { + return consoleList + } + + fun getTrajectoryListInfo(): TrajectoryListInfo? { + return trajectoryListInfo + } + + fun getTrackContrail(): TrackContrail? { + return mTrajectoryInfo?.trackContrail + } + + fun setActivity(activity: Activity) { + mActivity = activity + } + + // 订阅工控机日志 + private val consoleObserver: Observer = + Observer { mogoReportMessage: MogoReportMsg.MogoReportMessage -> + if (consoleList.size > 1000) { + consoleList.removeLast() + } + if (mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_INFERIOR) + || mogoReportMessage.resultList.contains(RESULT_SHOW_WARNING) + || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_INFERIOR) + || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_DISABLE) + || mogoReportMessage.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) + || mogoReportMessage.resultList.contains(RESULT_REMOTEPILOT_DISABLE) + ) { + // 处理底盘超时 +// if ( +// !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_DISABLE) +// || !mogoReportMessage.resultList.equals(RESULT_REMOTEPILOT_INFERIOR) +// || !mogoReportMessage.resultList.equals(RESULT_AUTOPILOT_INFERIOR) +// ) { +// btnControlAutoPilot.isChecked = false +// Log.e(TAG, "进入自动驾驶--失败") // } -// } -// } -// } -// -// //自动驾驶状态 -// private val autopilotStateObserver: Observer = Observer { -// it.let { -// if (currentAutopilotStatus != it.state) { -// currentAutopilotStatus = it.state -// ThreadUtils.runOnUiThread { -// when (it.state) { -// 0 -> { -// btnAutoPilotStatus.text = "不可自驾" -// } -// -// 1 -> { -// btnAutoPilotStatus.text = "可自动驾驶" -// } -// -// 2 -> { -// btnAutoPilotStatus.text = "自动驾驶中" -// } -// -// 7 -> { -// btnAutoPilotStatus.text = "平行驾驶中" -// } -// } -// } -// } -// } -// } -// -// //车机基础信息应答 -// private val carConfigObserver: Observer = Observer { -// it.let { -// ThreadUtils.runOnUiThread { -// speedLimit = (it.speedLimit * 3.6).toInt() -// etInputSpeed.setText(speedLimit.toString()) -// } -// } -// } -// -// //自车状态(底盘),车灯、转向灯等 -// private val vehicleStateObserver: Observer = Observer { -// ThreadUtils.runOnUiThread { -// when (it.gear) { -// Chassis.GearPosition.GEAR_P -> { -// tvGearP.setTextColor(ContextCompat.getColor(context, R.color.white)) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// -// Chassis.GearPosition.GEAR_R -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor(ContextCompat.getColor(context, R.color.white)) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// -// Chassis.GearPosition.GEAR_N -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor(ContextCompat.getColor(context, R.color.white)) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// -// Chassis.GearPosition.GEAR_D -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor(ContextCompat.getColor(context, R.color.white)) -// } -// -// else -> { -// tvGearP.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearR.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearN.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// tvGearD.setTextColor( -// ContextCompat.getColor( -// context, -// R.color.p_default_txt_color -// ) -// ) -// } -// } -// } -// } -// -// init { -// LayoutInflater.from(context).inflate(R.layout.view_check_autopilot, this, true) -// initView(context, attrs!!) -// mLifecycleRegistry.currentState = Lifecycle.State.CREATED -// } -// -// private lateinit var tvAutoDriveLineSelect: TextView -// private lateinit var tvSpeedTitle: TextView -// private lateinit var ivSpeedReduce: ImageView -// private lateinit var etInputSpeed: AppCompatEditText -// private lateinit var ivSpeedAdd: ImageView -// private lateinit var tvSureModify: AppCompatTextView -// private lateinit var tvGearP: TextView -// private lateinit var tvGearR: TextView -// private lateinit var tvGearN: TextView -// private lateinit var tvGearD: TextView -// private lateinit var btnAutoPilotStatus: Button -// private lateinit var btnControlAutoPilot: ToggleButton -// private lateinit var rvReportConsole: RecyclerView -// -// -// private fun initView(context: Context, attrs: AttributeSet) { -// tvAutoDriveLineSelect = findViewById(R.id.tvAutoDriveLineSelect) -// tvSpeedTitle = findViewById(R.id.tvSpeedTitle) -// ivSpeedReduce = findViewById(R.id.ivSpeedReduce) -// etInputSpeed = findViewById(R.id.etInputSpeed) -// ivSpeedAdd = findViewById(R.id.ivSpeedAdd) -// tvSureModify = findViewById(R.id.tvSureModify) -// tvGearP = findViewById(R.id.tvGearP) -// tvGearR = findViewById(R.id.tvGearR) -// tvGearN = findViewById(R.id.tvGearN) -// tvGearD = findViewById(R.id.tvGearD) -// btnAutoPilotStatus = findViewById(R.id.btnAutoPilotStatus) -// btnControlAutoPilot = findViewById(R.id.btnControlAutoPilot) -// rvReportConsole = findViewById(R.id.rvReportConsole) -// -// -// -// -// initSpeedView() -// consoleAdapter.setData(consoleList) -// rvReportConsole.adapter = consoleAdapter -// initAutopilotLineData() -// -// // 启动自动驾驶 -// btnControlAutoPilot.setOnClickListener { -// if (currentAutopilotStatus != 0) { -// if (currentAutopilotStatus != 2) { -// mTrajectoryListInfo?.let { trajectoryListInfo -> -// mTrajectorySiteInfo?.let { trajectorySiteInfo -> -// if (trajectorySiteInfo.isEmpty()) { -// if (btnControlAutoPilot.isChecked) { -// ToastUtils.showShort("该路线缺少站点信息") -// } -// btnControlAutoPilot.isChecked = false -// return@setOnClickListener -// } -// val routeInfo = MessagePad.RouteInfo.newBuilder() -// routeInfo.routeID = trajectoryListInfo.lineId -// routeInfo.routeName = trajectoryListInfo.lineName -// -// routeInfo.vehicleType = -// if (VehicleConfigData.getCarType() == VehicleType.TAXI) { -// 9 -// } else { -// 10 -// } -// routeInfo.isSpeakVoice = false -// -// val startSite = trajectorySiteInfo[0] -// val endSite = trajectorySiteInfo[trajectorySiteInfo.size - 1] -// -// routeInfo.startName = -// PinYinUtil.getPinYinHeadChar(startSite.name) // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) -// routeInfo.endName = -// PinYinUtil.getPinYinHeadChar(endSite.name) // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) -// -// val startLoc = routeInfo.startLocationBuilder -// startLoc.latitude = startSite.wgs84Lat -// startLoc.longitude = startSite.wgs84Lon -// -// val endLoc = routeInfo.endLocationBuilder -// endLoc.latitude = endSite.wgs84Lat -// endLoc.longitude = endSite.wgs84Lon -// -// routeInfo.startLocation = startLoc.build() -// routeInfo.endLocation = endLoc.build() -// -// //传入站点列表 -// for(site in trajectorySiteInfo){ -// val locBuilder = MessagePad.Location.newBuilder() -// locBuilder.latitude = site.wgs84Lat -// locBuilder.longitude = site.wgs84Lon -// routeInfo.addWayPoints(locBuilder.build()) -// } -// -// // 初始化选择的自动驾驶路线信息 -// routeInfo.line = initTrajectoryLine(trajectoryListInfo) -// -// // 模拟强制进入 -// //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(true)) { -// // 启动自动驾驶 -// if (TelematicsControlApi.instance.requestEnterAutoPilot(routeInfo.build())) { + + consoleList.addFirst( + ReportEntity( + TimeUtils.getNowString(), + mogoReportMessage.src, + mogoReportMessage.level, + mogoReportMessage.msg, + mogoReportMessage.code, + mogoReportMessage.resultList, + mogoReportMessage.actionsList, + true + ) + ) + } + if (consoleList.size > 0) { + consoleAdapter.setData(consoleList) + } + } + + //订阅到站 + private val arrivalObserver: Observer = Observer { + it.let { + Log.i("arrivalObserver", "CheckAuto页面收到到站回调") + Log.i("arrivalObserver", "latitude=" + it.endLocation.latitude) + Log.i("arrivalObserver", "longitude=" + it.endLocation.longitude) + //取消自动驾驶 + CallerAutoPilotControlManager.cancelAutoPilot() + //吐司提示 + ToastUtils.showShort("您已到达站点") + } + } + + //订阅工控机日志监控 + private val reportObserver: Observer = Observer { + it.let { + //掉自驾 + when (it.code) { + "EMAP_EXIT_AUTOPILOT_FOR_PLANNING",//因planning掉帧强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_LOCATION",//因location掉帧强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS",//因底盘消息掉帧强退自动驾驶 + "EXIT_AUTOPILOT_FOR_DISTANCE",//因planning起点距离当前过远强退自动驾驶 + "EXIT_AUTOPILOT_FOR_BRAKE",//制动踏板干预而强退自动驾驶 + "EXIT_AUTOPILOT_FOR_ACCEL",//加速踏板干预而强退自动驾驶 + "EXIT_AUTOPILOT_FOR_STEER",//方向盘干预而强退自动驾驶 + "EXIT_AUTOPILOT_FOR_GEAR_SWITCH",//档位切换干预而强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_NO_RESPONSE",//底盘不响应请求而强退自动驾驶 + "EMAP_EXIT_AUTOPILOT_FOR_CHASSIS_UNKNOWN",//底盘退出原因未知而强退自动驾驶 + "IRECORDER_TASK_AUTO"//自动录包任务创建 + -> { + //当司机或外界原因导致自动驾驶退出,需要在页面将状态同步显示出来,并将按钮设置为「启动自动驾驶」 + ThreadUtils.runOnUiThread { + ToastUtils.showShort("自动驾驶退出") + btnControlAutoPilot.isEnabled = true + btnControlAutoPilot.isChecked = false + } + } + } + } + } + + //自动驾驶状态 + private val autopilotStateObserver: Observer = Observer { + it.let { + if (currentAutopilotStatus != it.state) { + currentAutopilotStatus = it.state + ThreadUtils.runOnUiThread { + when (it.state) { + 0 -> { + btnAutoPilotStatus.text = "不可自驾" + } + + 1 -> { + btnAutoPilotStatus.text = "可自动驾驶" + } + + 2 -> { + btnAutoPilotStatus.text = "自动驾驶中" + } + + 7 -> { + btnAutoPilotStatus.text = "平行驾驶中" + } + } + } + } + } + } + + //车机基础信息应答 + private val carConfigObserver: Observer = Observer { + it.let { + ThreadUtils.runOnUiThread { + speedLimit = (it.speedLimit * 3.6).toInt() + etInputSpeed.setText(speedLimit.toString()) + } + } + } + + //自车状态(底盘),车灯、转向灯等 + private val vehicleStateObserver: Observer = Observer { + ThreadUtils.runOnUiThread { + when (it.gear) { + Chassis.GearPosition.GEAR_P -> { + tvGearP.setTextColor(ContextCompat.getColor(context, R.color.white)) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + + Chassis.GearPosition.GEAR_R -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor(ContextCompat.getColor(context, R.color.white)) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + + Chassis.GearPosition.GEAR_N -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor(ContextCompat.getColor(context, R.color.white)) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + + Chassis.GearPosition.GEAR_D -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor(ContextCompat.getColor(context, R.color.white)) + } + + else -> { + tvGearP.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearR.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearN.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + tvGearD.setTextColor( + ContextCompat.getColor( + context, + R.color.p_default_txt_color + ) + ) + } + } + } + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_check_autopilot, this, true) + initView(context, attrs!!) + mLifecycleRegistry.currentState = Lifecycle.State.CREATED + } + + private lateinit var tvAutoDriveLineSelect: TextView + private lateinit var tvSpeedTitle: TextView + private lateinit var ivSpeedReduce: ImageView + private lateinit var etInputSpeed: AppCompatEditText + private lateinit var ivSpeedAdd: ImageView + private lateinit var tvSureModify: AppCompatTextView + private lateinit var tvGearP: TextView + private lateinit var tvGearR: TextView + private lateinit var tvGearN: TextView + private lateinit var tvGearD: TextView + private lateinit var btnAutoPilotStatus: Button + private lateinit var btnControlAutoPilot: ToggleButton + private lateinit var rvReportConsole: RecyclerView + + + private fun initView(context: Context, attrs: AttributeSet) { + tvAutoDriveLineSelect = findViewById(R.id.tvAutoDriveLineSelect) + tvSpeedTitle = findViewById(R.id.tvSpeedTitle) + ivSpeedReduce = findViewById(R.id.ivSpeedReduce) + etInputSpeed = findViewById(R.id.etInputSpeed) + ivSpeedAdd = findViewById(R.id.ivSpeedAdd) + tvSureModify = findViewById(R.id.tvSureModify) + tvGearP = findViewById(R.id.tvGearP) + tvGearR = findViewById(R.id.tvGearR) + tvGearN = findViewById(R.id.tvGearN) + tvGearD = findViewById(R.id.tvGearD) + btnAutoPilotStatus = findViewById(R.id.btnAutoPilotStatus) + btnControlAutoPilot = findViewById(R.id.btnControlAutoPilot) + rvReportConsole = findViewById(R.id.rvReportConsole) + + + + +// initSpeedView() TODO + consoleAdapter.setData(consoleList) + rvReportConsole.adapter = consoleAdapter + initAutopilotLineData() + + // 启动自动驾驶 + btnControlAutoPilot.setOnClickListener { + if (currentAutopilotStatus != 0) { + if (currentAutopilotStatus != 2) { + mTrajectoryListInfo?.let { trajectoryListInfo -> + mTrajectorySiteInfo?.let { trajectorySiteInfo -> + if (trajectorySiteInfo.isEmpty()) { + if (btnControlAutoPilot.isChecked) { + ToastUtils.showShort("该路线缺少站点信息") + } + btnControlAutoPilot.isChecked = false + return@setOnClickListener + } + val routeInfo = MessagePad.RouteInfo.newBuilder() + routeInfo.routeID = trajectoryListInfo.lineId + routeInfo.routeName = trajectoryListInfo.lineName + + routeInfo.vehicleType = + if (VehicleConfigData.getCarType() == VehicleType.TAXI) { + 9 + } else { + 10 + } + routeInfo.isSpeakVoice = false + + val startSite = trajectorySiteInfo[0] + val endSite = trajectorySiteInfo[trajectorySiteInfo.size - 1] + + routeInfo.startName = + PinYinUtil.getPinYinHeadChar(startSite.name) // 起点名称拼音首字母大写:科学城B区2号门(KXCBQ2HM) + routeInfo.endName = + PinYinUtil.getPinYinHeadChar(endSite.name) // 终点名称拼音首字母大写:科学城C区三号门(KXCCQSHM) + + val startLoc = routeInfo.startLocationBuilder + startLoc.latitude = startSite.wgs84Lat + startLoc.longitude = startSite.wgs84Lon + + val endLoc = routeInfo.endLocationBuilder + endLoc.latitude = endSite.wgs84Lat + endLoc.longitude = endSite.wgs84Lon + + routeInfo.startLocation = startLoc.build() + routeInfo.endLocation = endLoc.build() + + //传入站点列表 + for(site in trajectorySiteInfo){ + val locBuilder = MessagePad.Location.newBuilder() + locBuilder.latitude = site.wgs84Lat + locBuilder.longitude = site.wgs84Lon + routeInfo.addWayPoints(locBuilder.build()) + } + + // 初始化选择的自动驾驶路线信息 + routeInfo.line = initTrajectoryLine(trajectoryListInfo) + + // 模拟强制进入 + //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(true)) { + // 启动自动驾驶 TODO +// if (CallerAutoPilotControlManager.startAutoPilot(currentAutopilot)) { // btnControlAutoPilot.isChecked = true // Log.d(TAG, "自动驾驶命令下发成功") // ToastUtils.showShort("自动驾驶命令下发成功") @@ -490,252 +495,215 @@ class CheckAutopilotView @JvmOverloads constructor( // Log.e(TAG, "自动驾驶命令下发失败") // ToastUtils.showShort("自动驾驶命令下发失败") // } -// } ?: let { -// btnControlAutoPilot.isChecked = false -// Log.e(TAG, "进入自动驾驶--失败") -// Log.e(TAG, "站点信息异常,请选择要测试的驾驶路线!!!") -// ToastUtils.showShort("进入自动驾驶--失败") -// } -// } ?: let { -// btnControlAutoPilot.isChecked = false -// Log.e(TAG, "进入自动驾驶--失败") -// Log.e(TAG, "未选择自动驾驶路线,请选择要测试的驾驶路线!!!") -// ToastUtils.showShort("进入自动驾驶--失败") -// } -// } else { -// // 模拟强制退出 -// //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(false)) { -// // 正常流程退出自动驾驶 -// CallerAutoPilotControlManager.cancelAutoPilot() -// } -// } else { -// btnControlAutoPilot.isChecked = false -// ToastUtils.showShort("车辆未就绪,请稍后再试") -// } -// } -// -// } -// -// /** -// * 自动驾驶车速设置 -// */ -// //TODO -// -// /** -// * 初始化轨迹信息 -// */ -// private fun initTrajectoryLine(trajectoryListInfo: TrajectoryListInfo): MessagePad.Line { -// // 给自动驾驶用于进行循迹路线加载 -// mTrajectoryInfo?.trackContrail?.let { -// mTrajectoryLine.lineId = trajectoryListInfo.lineId.toLong() -// mTrajectoryLine.lineName =trajectoryListInfo.lineName -// mTrajectoryLine.trajMd5 = it.csvFileMd5 -// mTrajectoryLine.trajUrl = it.csvFileUrl -// mTrajectoryLine.stopMd5 = it.txtFileMd5 -// mTrajectoryLine.stopUrl = it.txtFileUrl -// mTrajectoryLine.timestamp = it.contrailSaveTime -// mTrajectoryLine.vehicleModel = -// VehicleConfigData.getCarBrand() + VehicleConfigData.getCarModel() -// } ?: let { -// btnControlAutoPilot.isChecked = false -// Log.e(TAG, "循迹路线未配置! 请登录运营管理平台配置!") -// ToastUtils.showShort("循迹路线未配置!请登录运营管理平台配置!") -// } -// mTrajectoryInfo?.dbqpContrail?.let { -// mTrajectoryLine.trajUrlDpqp = it.csvFileUrl -// mTrajectoryLine.trajMd5Dpqp = it.csvFileMd5 -// mTrajectoryLine.stopUrlDpqp = it.txtFileUrl -// mTrajectoryLine.stopMd5Dpqp = it.txtFileMd5 -// mTrajectoryLine.timestampDpqp = it.contrailSaveTime -// } ?: let { -// Log.e(TAG, "dbqp路线未配置!请登录运营管理平台配置!") -// //ToastUtils.show("dbqp路线未配置!请登录运营管理平台配置!") -// } -// -// return mTrajectoryLine.build() -// } -// -// /** -// * 初始化路线选择器 -// */ -// private fun initAutopilotLineData() { -// // 循迹路线选择 -// tvAutoDriveLineSelect.setOnClickListener { -// //弹出路线选择弹窗 -// if (selectAutopilotLineDialog == null) { -// selectAutopilotLineDialog = SelectAutopilotLineDialog(context) -// } -// mActivity?.let { activity -> -// selectAutopilotLineDialog?.setListener(object : -// SelectAutopilotLineDialog.ClickListener { -// override fun onClick(info: TrajectoryListInfo) { -// Log.d(TAG, "选中路线:${info}") -// info.let { -// mTrajectoryListInfo = it -// tvAutoDriveLineSelect.text = it.lineName -// checkAutoLine(it) -// } -// } -// }) -// selectAutopilotLineDialog?.showSelectLineDialog(activity) -// } -// } -// } -// -// /** -// * 调用接口获取选中的路线信息 -// */ -// private fun checkAutoLine(trajectoryListInfo: TrajectoryListInfo) { -// val trajectoryInfoReq = TrajectoryInfoReq( -// VehicleConfigData.getCarBrand(), -// VehicleConfigData.getCarModel(), -// trajectoryListInfo.lineId -// ) -// Log.d( -// TAG, -// "调用接口获取选中的路线信息 checkAutoLine,trajectoryInfoReq:${trajectoryInfoReq}" -// ) -// // 处理Taxi -// // 处理BUS包含:JV、KW、FT、SW -// TrajectoryApiClient.querySiteList( -// this, -// VehicleConfigData.getCarType().name, -// trajectoryListInfo.lineId, -// object : NetworkCallback> { -// override fun onSuccess(data: ArrayList) { -// mTrajectorySiteInfo = data -// if (data.size > 0) { -// btnControlAutoPilot.isEnabled = true -// } else { -// btnControlAutoPilot.isEnabled = false -// ToastUtils.showShort("该路线缺少站点信息") -// } -// } -// -// override fun onError(msg: String) { -// Log.e( -// TAG, -// "获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常" + } ?: let { + btnControlAutoPilot.isChecked = false + Log.e(TAG, "进入自动驾驶--失败") + Log.e(TAG, "站点信息异常,请选择要测试的驾驶路线!!!") + ToastUtils.showShort("进入自动驾驶--失败") + } + } ?: let { + btnControlAutoPilot.isChecked = false + Log.e(TAG, "进入自动驾驶--失败") + Log.e(TAG, "未选择自动驾驶路线,请选择要测试的驾驶路线!!!") + ToastUtils.showShort("进入自动驾驶--失败") + } + } else { + // 模拟强制退出 + //if (TelematicsControlApi.instance.requestEnterAutoPilotSimulate(false)) { + // 正常流程退出自动驾驶 + CallerAutoPilotControlManager.cancelAutoPilot() + } + } else { + btnControlAutoPilot.isChecked = false + ToastUtils.showShort("车辆未就绪,请稍后再试") + } + } + + } + + /** + * 自动驾驶车速设置 + */ + //TODO + + /** + * 初始化轨迹信息 + */ + private fun initTrajectoryLine(trajectoryListInfo: TrajectoryListInfo): MessagePad.Line { + // 给自动驾驶用于进行循迹路线加载 + mTrajectoryInfo?.trackContrail?.let { + mTrajectoryLine.lineId = trajectoryListInfo.lineId.toLong() + mTrajectoryLine.lineName =trajectoryListInfo.lineName + mTrajectoryLine.trajMd5 = it.csvFileMd5 + mTrajectoryLine.trajUrl = it.csvFileUrl + mTrajectoryLine.stopMd5 = it.txtFileMd5 + mTrajectoryLine.stopUrl = it.txtFileUrl + mTrajectoryLine.timestamp = it.contrailSaveTime + mTrajectoryLine.vehicleModel = + VehicleConfigData.getCarBrand() + VehicleConfigData.getCarModel() + } ?: let { + btnControlAutoPilot.isChecked = false + Log.e(TAG, "循迹路线未配置! 请登录运营管理平台配置!") + ToastUtils.showShort("循迹路线未配置!请登录运营管理平台配置!") + } + mTrajectoryInfo?.dbqpContrail?.let { + mTrajectoryLine.trajUrlDpqp = it.csvFileUrl + mTrajectoryLine.trajMd5Dpqp = it.csvFileMd5 + mTrajectoryLine.stopUrlDpqp = it.txtFileUrl + mTrajectoryLine.stopMd5Dpqp = it.txtFileMd5 + mTrajectoryLine.timestampDpqp = it.contrailSaveTime + } ?: let { + Log.e(TAG, "dbqp路线未配置!请登录运营管理平台配置!") + //ToastUtils.show("dbqp路线未配置!请登录运营管理平台配置!") + } + + return mTrajectoryLine.build() + } + + /** + * 初始化路线选择器 + */ + private fun initAutopilotLineData() { + // 循迹路线选择 + tvAutoDriveLineSelect.setOnClickListener { + //弹出路线选择弹窗 + if (selectAutopilotLineDialog == null) { + selectAutopilotLineDialog = SelectAutopilotLineDialog(context) + } + mActivity?.let { activity -> + selectAutopilotLineDialog?.setListener(object : + SelectAutopilotLineDialog.ClickListener { + override fun onClick(info: TrajectoryListInfo) { + Log.d(TAG, "选中路线:${info}") + info.let { + mTrajectoryListInfo = it + tvAutoDriveLineSelect.text = it.lineName + checkAutoLine(it) + } + } + }) + selectAutopilotLineDialog?.showSelectLineDialog(activity) + } + } + } + + /** + * 调用接口获取选中的路线信息 + */ + private fun checkAutoLine(trajectoryListInfo: TrajectoryListInfo) { + val trajectoryInfoReq = TrajectoryInfoReq( + VehicleConfigData.getCarBrand(), + VehicleConfigData.getCarModel(), + trajectoryListInfo.lineId + ) + Log.d( + TAG, + "调用接口获取选中的路线信息 checkAutoLine,trajectoryInfoReq:${trajectoryInfoReq}" + ) + // 处理Taxi + // 处理BUS包含:JV、KW、FT、SW + TrajectoryApiClient.querySiteList( + this, + VehicleConfigData.getCarType().name, + trajectoryListInfo.lineId, + object : NetworkCallback> { + override fun onSuccess(data: ArrayList) { + mTrajectorySiteInfo = data + if (data.size > 0) { + btnControlAutoPilot.isEnabled = true + } else { + btnControlAutoPilot.isEnabled = false + ToastUtils.showShort("该路线缺少站点信息") + } + } + + override fun onError(msg: String) { + Log.e( + TAG, + "获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常" + ) + ToastUtils.showShort("获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常") + } + } + ) + TrajectoryApiClient.queryTrajectoryInfo( + this, + VehicleConfigData.getCarType().name, + trajectoryInfoReq, + object : NetworkCallback { + override fun onSuccess(data: TrajectoryInfo) { + mTrajectoryInfo = data + + // 先发给自动驾驶下载路线 TODO +// CallerAutoPilotControlManager.sendTrajectoryDownloadReq( +// mAutoPilotLine // ) -// ToastUtils.showShort("获取 ${VehicleConfigData.getCarType().name} 站点详情异常,异常原因:网络异常") -// } -// } -// ) -// TrajectoryApiClient.queryTrajectoryInfo( -// this, -// VehicleConfigData.getCarType().name, -// trajectoryInfoReq, -// object : NetworkCallback { -// override fun onSuccess(data: TrajectoryInfo) { -// mTrajectoryInfo = data -// -// // 先发给自动驾驶下载路线 -// TelematicsControlApi.instance.sendTrajectoryDownloadReq( -// initTrajectoryLine( -// trajectoryListInfo -// ) -// ) -// } -// -// override fun onError(msg: String) { -// Log.e( -// TAG, -// "查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常" -// ) -// ToastUtils.showShort("查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常") -// } -// } -// ) -// } -// -// -// override fun onAttachedToWindow() { -// super.onAttachedToWindow() -// mLifecycleRegistry.currentState = Lifecycle.State.STARTED -// postDelayed({ -// //订阅工控机异常上报 -// reportMsgInfoSubscriber = -// CommSubscriber( -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgInfo.topicPath, -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgInfo.msgType, -// MogoReportMsg.MogoReportMessage.parser(), -// TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER -// ) -// TopicSubscriberServiceManager.instance.addTopicSubscriber( -// reportMsgInfoSubscriber!!.getTopicPath(), -// reportMsgInfoSubscriber!! -// ) -// -// reportMsgErrorSubscriber = -// CommSubscriber( -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgError.topicPath, -// ConfigFactory.getInstance().topicConfig.autopilotInfoReportMsgError.msgType, -// MogoReportMsg.MogoReportMessage.parser(), -// TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER -// ) -// TopicSubscriberServiceManager.instance.addTopicSubscriber( -// reportMsgErrorSubscriber!!.getTopicPath(), -// reportMsgErrorSubscriber!! -// ) -// }, 2000) -// -// // 订阅数据 -// FlowBus.with(TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER) -// .register(this) { -// consoleObserver.onChanged(it) -// } -// -// //订阅到站提醒 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Arrival_Notification) -// .register(this) { -// arrivalObserver.onChanged(it) -// } -// -// //订阅工控机日志监控 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Mogo_Report_Message) -// .register(this) { -// reportObserver.onChanged(it) -// } -// -// //订阅自动驾驶状态 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Autopilot_State) -// .register(this) { -// autopilotStateObserver.onChanged(it) -// } -// -// //订阅车机基础信息 -// FlowBus.withStick(TelematicsSubscriberEventKey.Subscribe_CarConfig_Resp) -// .register(this) { -// carConfigObserver.onChanged(it) -// } -// -// //订阅自车状态(底盘),车灯、转向灯等 -// FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Vehicle_State) -// .register(this) { -// vehicleStateObserver.onChanged(it) -// } -// } -// -// override fun onDetachedFromWindow() { -// super.onDetachedFromWindow() -// scopeUploadReportInfo.cancel() -// -// mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED -// -// reportMsgInfoSubscriber?.let { -// TopicSubscriberServiceManager.instance.removeTopicSubscriber( -// reportMsgInfoSubscriber!!.getTopicPath(), -// ) -// } -// reportMsgErrorSubscriber?.let { -// TopicSubscriberServiceManager.instance.removeTopicSubscriber( -// reportMsgErrorSubscriber!!.getTopicPath(), -// ) -// } -// } + } + + override fun onError(msg: String) { + Log.e( + TAG, + "查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常" + ) + ToastUtils.showShort("查询 ${VehicleConfigData.getCarType().name} 线路对应的轨迹 异常,异常原因:网络异常") + } + } + ) + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + mLifecycleRegistry.currentState = Lifecycle.State.STARTED + //订阅工控机异常上报 TODO + + //reportMsgErrorSubscriber TODO + + // 订阅数据 + FlowBus.with(TopicSubscriberEventKey.REPORT_MSG_SUBSCRIBER) + .register(this) { + consoleObserver.onChanged(it) + } + + //订阅到站提醒 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Arrival_Notification) + .register(this) { + arrivalObserver.onChanged(it) + } + + //订阅工控机日志监控 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Mogo_Report_Message) + .register(this) { + reportObserver.onChanged(it) + } + + //订阅自动驾驶状态 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Autopilot_State) + .register(this) { + autopilotStateObserver.onChanged(it) + } + + //订阅车机基础信息 + FlowBus.withStick(TelematicsSubscriberEventKey.Subscribe_CarConfig_Resp) + .register(this) { + carConfigObserver.onChanged(it) + } + + //订阅自车状态(底盘),车灯、转向灯等 + FlowBus.with(TelematicsSubscriberEventKey.Subscribe_Vehicle_State) + .register(this) { + vehicleStateObserver.onChanged(it) + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + scopeUploadReportInfo.cancel() + mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED + } override fun getLifecycle(): Lifecycle { - return lifecycle + return mLifecycleRegistry } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/utils/PinYinUtil.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/utils/PinYinUtil.java new file mode 100644 index 0000000000..264c1c28c8 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/utils/PinYinUtil.java @@ -0,0 +1,31 @@ +package com.zhjt.mogo_core_function_devatools.rviz.utils; + +import net.sourceforge.pinyin4j.PinyinHelper; + +/** + * @author: wangmingjun + * @date: 2021/11/26 + */ +public class PinYinUtil { + /** + * 得到中文字符串首字母 + * @param str 需要转化的中文字符串 + * @return 大写首字母缩写的字符串 + */ + public static String getPinYinHeadChar(String str) { + str = str.replaceAll("[\\p{P}‘’“”|+=¥$<>^~~]", ""); + StringBuilder convert = new StringBuilder(); + for (int j = 0; j < str.length(); j++) { + char word = str.charAt(j); + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); + if (pinyinArray != null) { + convert.append(pinyinArray[0].charAt(0)); + } else { + if (!"".equals(String.valueOf(word).trim())){ + convert.append(word); + } + } + } + return convert.toString().trim().toUpperCase(); + } +} diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml index 716d097698..fef58e1458 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml @@ -9,10 +9,10 @@ android:id="@+id/tvSelectLineTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="@dimen/dp_15" + android:layout_margin="@dimen/dp_30" android:text="请选择自动驾驶路线" android:textColor="#FFFFFFFF" - android:textSize="@dimen/sp_18" + android:textSize="@dimen/sp_36" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -33,8 +33,8 @@ diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml index 889bf9af4b..5ddb6a64a7 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/white" - android:textSize="@dimen/sp_16" + android:textSize="@dimen/sp_32" android:gravity="center_horizontal" android:padding="@dimen/dp_10" > diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml index e064003f1d..a92461ce8c 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml @@ -14,13 +14,13 @@ android:layout_marginEnd="@dimen/dp_5" android:gravity="start" android:textColor="@color/white" - android:textSize="@dimen/sp_12" + android:textSize="@dimen/sp_30" tools:text="ReportMsg" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/layout_autopilot_check.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/layout_autopilot_check.xml new file mode 100644 index 0000000000..04293193ab --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/layout_autopilot_check.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml index a25781430d..2f9b4e1eb8 100644 --- a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml @@ -17,12 +17,12 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toTopOf="@id/ivSpeedReduce" android:text="请选择自动驾驶路线" - android:padding="@dimen/dp_5" - android:textSize="@dimen/sp_18" + android:padding="@dimen/dp_10" + android:textSize="@dimen/sp_36" android:textColor="@color/white" android:gravity="center_horizontal" - android:layout_margin="@dimen/dp_10" + android:layout_margin="@dimen/dp_20" /> + android:layout_marginStart="@dimen/dp_20" />