From c2317225867c5bbf18976776ab82de72259baab5 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Wed, 18 Jun 2025 19:12:26 +0800 Subject: [PATCH 1/2] =?UTF-8?q?[8.1.0]OTA=E5=8D=87=E7=BA=A7+=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=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 --- app/build.gradle | 1 + .../rviz/bean/TrajectoryInfoRes.kt | 57 ++ .../rviz/bean/TrajectoryLisRes.kt | 35 + .../rviz/bean/TrajectorySiteLRes.kt | 46 ++ .../rviz/bean/VehicleConfigData.kt | 101 +++ .../rviz/bean/VehicleType.java | 13 + .../rviz/dialog/SelectAutopilotLineDialog.kt | 205 +++++ .../dialog/adapter/AutopilotLineAdapter.kt | 54 ++ .../rviz/dialog/adapter/ConsoleAdapter.java | 76 ++ .../rviz/net/MisHost.kt | 31 + .../rviz/net/NetworkManager.java | 149 ++++ .../rviz/net/TrajectoryApiClient.kt | 135 ++++ .../rviz/net/TrajectoryApiService.kt | 58 ++ .../rviz/net/TrajectoryNetModel.kt | 350 +++++++++ .../rviz/net/api/TrajectoryApi.kt | 57 ++ .../rviz/ui/views/CheckAutopilotView.kt | 741 ++++++++++++++++++ .../rviz/ui/views/MoGoLoadingView.java | 65 ++ .../ros/TelematicsSubscriberEventKey.java | 280 +++++++ .../widgets/ros/TopicSubscriberEventKey.java | 57 ++ .../res/drawable-xhdpi/icon_line_delect.png | Bin 0 -> 915 bytes .../res/drawable-xhdpi/icon_line_search.png | Bin 0 -> 1369 bytes .../res/drawable-xhdpi/icon_speed_add.png | Bin 0 -> 1879 bytes .../res/drawable-xhdpi/icon_speed_reduce.png | Bin 0 -> 1597 bytes .../layout/dialog_select_autopilot_line.xml | 102 +++ .../main/res/layout/item_autopilot_line.xml | 11 + .../src/main/res/layout/item_console.xml | 26 + .../main/res/layout/view_check_autopilot.xml | 218 ++++++ .../src/main/res/values/color.xml | 4 + .../ota/OTAUpgradeManager.kt | 20 +- .../function/hmi/bone/tab/CarInfoTabView.kt | 17 +- .../core/function/hmi/ui/MoGoHmiProvider.kt | 5 +- .../hmi/ui/setting/DebugSettingView.kt | 9 + .../hmi/ui/tools/OTAPowerOffFinishDialog.kt | 3 + .../function/hmi/ui/tools/OTAUpgradeDialog.kt | 7 + .../main/res/layout/dialog_ota_upgrade.xml | 22 +- .../main/res/layout/view_debug_setting.xml | 17 +- .../api/hmi/warning/IMoGoHmiProvider.kt | 2 +- .../function/call/hmi/CallerHmiManager.kt | 4 +- 38 files changed, 2955 insertions(+), 23 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectoryInfoRes.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectoryLisRes.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectorySiteLRes.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/VehicleConfigData.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/VehicleType.java create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/adapter/AutopilotLineAdapter.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/adapter/ConsoleAdapter.java create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/NetworkManager.java create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryNetModel.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/api/TrajectoryApi.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/MoGoLoadingView.java create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TelematicsSubscriberEventKey.java create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TopicSubscriberEventKey.java create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_line_delect.png create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_line_search.png create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_speed_add.png create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_speed_reduce.png create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.xml create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml create mode 100644 core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml diff --git a/app/build.gradle b/app/build.gradle index 00ee8f07cc..4833ffcd72 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -208,6 +208,7 @@ dependencies { implementation project(':core:function-impl:mogo-core-function-startup') implementation project(':core:function-impl:mogo-core-function-devatools') + implementation project(':core:function-impl:mogo-core-function-devatools-rviz') implementation project(':core:function-impl:mogo-core-function-datacenter') implementation project(':core:function-impl:mogo-core-function-biz') implementation project(':core:function-impl:mogo-core-function-hmi') diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectoryInfoRes.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectoryInfoRes.kt new file mode 100644 index 0000000000..b0a0e84f00 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectoryInfoRes.kt @@ -0,0 +1,57 @@ +package com.zhjt.mogo_core_function_devatools.rviz.bean + +/*{ + "code":0, + "message":"success", + "msg":"success", + "result":{ + "trackContrail":{ + "csvFileUrl":"xxxxx.csv", + "csvFileMd5":"1018c022535df18448ab740af0b9c9a0", + "txtFileUrl":"xxxx.txt", + "txtFileMd5":"aea78906597cf97a0d61bc9918778c17", + "contrailSaveTime":1656468916000 +}, + "dbqpContrail":{ + "csvFileUrl":"xxxx.csv", + "csvFileMd5":"1018c022535df18448ab740af0b9c9a0", + "txtFileUrl":"xxxx.txt", + "txtFileMd5":"aea78906597cf97a0d61bc9918778c17", + "contrailSaveTime":1656468916000 +} +} +}*/ +data class TrajectoryInfoRes( + val code: Int, + val message: String, + val msg: String, + val result: TrajectoryInfo +) + +data class TrajectoryInfo( + val dbqpContrail: DbqpContrail, + val trackContrail: TrackContrail +) + +data class TrackContrail( + val contrailSaveTime: Long, + val csvFileMd5: String, + val csvFileUrl: String, + val txtFileMd5: String, + val txtFileUrl: String +) + +data class DbqpContrail( + val contrailSaveTime: Long, + val csvFileMd5: String, + val csvFileUrl: String, + val txtFileMd5: String, + val txtFileUrl: String +) + + +data class TrajectoryInfoReq( + val brand: String, + val carModel: String, + val lineId: Int +) \ 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/bean/TrajectoryLisRes.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectoryLisRes.kt new file mode 100644 index 0000000000..e42955f3b5 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectoryLisRes.kt @@ -0,0 +1,35 @@ +package com.zhjt.mogo_core_function_devatools.rviz.bean + +/*{ + "code":0, + "message":"success", + "msg":"success", + "result":[ + { + "lineId":89, + "lineName":"顺义Bus10KM路线" + }, + { + "lineId":90, + "lineName":"Bus鹰眼_13号路口起到终" + } + ] +}*/ +data class TrajectoryLisRes( + val code: Int, + val message: String, + val msg: String, + val result: List +) + +data class TrajectoryListInfo( + val lineId: Int, + val lineName: String +) + +class TrajectoryLisReq { + var name: String = "" + var page: Int = 0 + var pageSize: Int = 100 + var cityCode: String = "" +} \ 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/bean/TrajectorySiteLRes.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectorySiteLRes.kt new file mode 100644 index 0000000000..a41d63c48d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/TrajectorySiteLRes.kt @@ -0,0 +1,46 @@ +package com.zhjt.mogo_core_function_devatools.rviz.bean + +/*{ + "code":0, + "message":"success", + "msg":"success", + "result":[ + { + "siteId":47, + "seq":1, + "name":"石家庄市", + "description":"", + "lon":114.25118147313091, + "lat":38.123641911994746, + "wgs84Lon":115.0050379087139, + "wgs84Lat":38.12405426963943 + }, + { + "siteId":48, + "seq":2, + "name":"市政府", + "description":"市政府", + "wgs84Lon":115.0050379087139, + "wgs84Lat":38.12405426963943, + "lat":38.12405426963943 + "lat":38.12405426963943 + } + ] +}*/ +data class TrajectorySiteLRes( + val code: Int, + val message: String, + val msg: String, + val result: List +) + +data class TrajectorySiteInfo( + val description: String, + val lat: Double, + val lon: Double, + val wgs84Lat: Double, + val wgs84Lon: Double, + val name: String, + val seq: Int, + val siteId: Int +) \ 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/bean/VehicleConfigData.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/VehicleConfigData.kt new file mode 100644 index 0000000000..bad45a37a4 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/VehicleConfigData.kt @@ -0,0 +1,101 @@ +package com.zhjt.mogo_core_function_devatools.rviz.bean + +/** + * 车辆配置数据 + */ +object VehicleConfigData { + // plate:JL-金旅小巴、HQ-红旗、DF-东风,车牌号信息 + var plate = "" + + // brand:HQ-红旗 DF-东风 JINLV-金旅 FT-清扫车 KW-开沃 + var brand = "" + + // 车辆子类型:M1、M2 + var subtype = "" + + // 102 镜像版本名称 + var dockerName = "未知" + + // 当前机器上配置的所有 Docker 信息 + var dockerList: Map? = null + + // MAP 加载地图版本 + var dockerMapHDVersionName = "未知" + + // StartupConfigCache.json 文件不存在时候,使用命令获取文件MD5 + var scaliBratedSensorMD5 = "" + + /** + * 获取车辆平台类型 + * -1--未定义或者没获取到车辆类型,调用者需要处理异常,并提示用户重新尝试 + * 0--taxi, + * 1--bus, + * 2--sweeper + */ + fun getCarType(): VehicleType { + // brand:HQ-红旗 DF-东风 JINLV-金旅 FT-清扫车 KW-开沃 + // 处理Taxi + return if ( + brand.startsWith("DF") + or brand.startsWith("HQ") + ) { + VehicleType.TAXI + } + // 处理BUS:B1、M1、M2、KW + else if ( + brand.startsWith("JINLV") + or brand.startsWith("KW") + ) { + VehicleType.BUS + } + // 清扫车:FT、 + else if (brand.startsWith("FT")) { + VehicleType.SWEEPER + } + // 默认使用 + else { + VehicleType.TAXI + } + } + + /** + * 获取车辆品牌 + */ + fun getCarBrand(): String { + return if (brand.startsWith("DF")) { + "东风" + } else if (brand.startsWith("HQ")) { + "红旗" + } else if (brand.startsWith("JINLV") || brand.startsWith("JV") || brand.startsWith("JL")) { + "金旅" + } else if (brand.startsWith("KW")) { + "开沃" + } else if (brand.startsWith("FT")) { + "福田" + } else { + "金旅" + } + } + + /** + * 获取车辆品牌--类型 + */ + fun getCarModel(): String { + return if (plate.startsWith("DF")) { + "E70" + } else if (plate.startsWith("HQ")) { + "H9" + } else if (plate.startsWith("JV") || plate.startsWith("JL")) { + "金旅牌XML6606JEVY0" + } else if (plate.startsWith("KW")) { + "NJL6450ICEV" + } else if (plate.startsWith("FT")) { + "清扫车" + } else if (plate.startsWith("SW")) { + "清扫车" + } else { + "金旅牌XML6606JEVY0" + } + } + +} \ 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/bean/VehicleType.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/VehicleType.java new file mode 100644 index 0000000000..604e1c8e40 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/bean/VehicleType.java @@ -0,0 +1,13 @@ +package com.zhjt.mogo_core_function_devatools.rviz.bean; + +/** + * 车辆类型 + */ +public enum VehicleType { + // 出租车 + TAXI, + // 公交车 + BUS, + // 清扫车 + SWEEPER, +} 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 new file mode 100644 index 0000000000..9ae4f5d385 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/SelectAutopilotLineDialog.kt @@ -0,0 +1,205 @@ +package com.zhjt.mogo_core_function_devatools.rviz.dialog + +import android.app.Activity +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.WindowManager +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.Utils +import com.mogo.eagle.core.utilcode.util.WindowUtils +import com.zhjt.mogo_core_function_devatools.rviz.net.TrajectoryApiClient +import com.zhjt.mogo_core_function_devatools.rviz.R +import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryListInfo +import com.zhjt.mogo_core_function_devatools.rviz.bean.VehicleConfigData +import com.zhjt.mogo_core_function_devatools.rviz.dialog.adapter.AutopilotLineAdapter +import com.zhjt.mogo_core_function_devatools.rviz.net.NetworkCallback +import com.zhjt.mogo_core_function_devatools.rviz.ui.views.MoGoLoadingView +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel + +/** + * 自动驾驶路线选择提示窗 + */ +class SelectAutopilotLineDialog(context: Context) : Dialog(context), LifecycleOwner { + private val scopeQueryTrajectoryList = CoroutineScope(Dispatchers.Main) + private val mLifecycleRegistry = LifecycleRegistry(this) + + private var mActivity: Activity? = null + private var autopilotLineAdapter: AutopilotLineAdapter? = null + private var clickListener: ClickListener? = null + private var searchStr: String? = null + private var allLineList: ArrayList = ArrayList() //所有的路线 + private var selectLineList: ArrayList = ArrayList() //选择的路线 + + private lateinit var etSearch: EditText + private lateinit var rvLineList: RecyclerView + private lateinit var tvLoading: MoGoLoadingView + private lateinit var tvCancel: TextView + private lateinit var ivSearch: ImageView + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.dialog_select_autopilot_line) + setCanceledOnTouchOutside(false) + etSearch = findViewById(R.id.etSearch) + rvLineList = findViewById(R.id.rvLineList) + tvLoading = findViewById(R.id.tvLoading) + tvCancel = findViewById(R.id.tvCancel) + ivSearch = findViewById(R.id.ivSearch) + + autopilotLineAdapter = AutopilotLineAdapter() + autopilotLineAdapter?.setListener(object : AutopilotLineAdapter.SubClickListener { + override fun onClick(trajectoryListInfo: TrajectoryListInfo) { + etSearch.setText("") + clickListener?.onClick(trajectoryListInfo) + dismiss() + } + }) + val linearLayoutManager = LinearLayoutManager(Utils.getApp()) + rvLineList.layoutManager = linearLayoutManager + rvLineList.adapter = autopilotLineAdapter + 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)) + window?.attributes = params + window?.setBackgroundDrawable(null) + initEvent() + } + + fun showSelectLineDialog(activity: Activity) { + mActivity = activity +// if (activity.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { +// AutoSize.autoConvertDensity(activity, 1660f, true) +// } else { +// AutoSize.autoConvertDensity(activity, 960f, true) +// } + show() + } + + fun setSelectLineData(list: ArrayList) { + if (list.isNotEmpty()) { + autopilotLineAdapter?.setData(list) + allLineList = list + } + } + + private fun initEvent() { + setOnShowListener { + mLifecycleRegistry.currentState = Lifecycle.State.CREATED + mLifecycleRegistry.currentState = Lifecycle.State.STARTED + + tvLoading.show("数据加载中……") + + // 处理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 站点列表异常,请开启定位权限") +// } + + } + //取消 + tvCancel.setOnClickListener { + etSearch.setText("") + dismiss() + } + //搜索 + etSearch.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + + } + + override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) { + + } + + override fun afterTextChanged(str: Editable?) { + searchStr = str.toString() + if (searchStr.isNullOrBlank()) { + ivSearch.setImageResource(R.drawable.icon_line_search) + autopilotLineAdapter?.setData(allLineList) + } else { + ivSearch.setImageResource(R.drawable.icon_line_delect) + selectLineList.clear() + for (info in allLineList) { + if (info.lineName.contains(searchStr!!) || info.lineId.toString() + .contains(searchStr!!) + ) { + selectLineList.add(info) + } + } + autopilotLineAdapter?.setData(selectLineList) + } + + } + + }) + ivSearch.setOnClickListener { + if (searchStr != null && searchStr!!.isNotEmpty()) { + etSearch.setText("") + ivSearch.setImageResource(R.drawable.icon_line_search) + autopilotLineAdapter?.setData(allLineList) + } + } + } + + fun setListener(listener: ClickListener) { + clickListener = listener + } + + interface ClickListener { + fun onClick(info: TrajectoryListInfo) + } + + override fun dismiss() { + scopeQueryTrajectoryList.cancel() + mActivity = null + super.dismiss() + } + + override fun onDetachedFromWindow() { + mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED + scopeQueryTrajectoryList.cancel() + super.onDetachedFromWindow() + } + + override fun getLifecycle(): Lifecycle { + return lifecycle + } + + +} \ 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/dialog/adapter/AutopilotLineAdapter.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/adapter/AutopilotLineAdapter.kt new file mode 100644 index 0000000000..a358b82882 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/adapter/AutopilotLineAdapter.kt @@ -0,0 +1,54 @@ +package com.zhjt.mogo_core_function_devatools.rviz.dialog.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.zhjt.mogo_core_function_devatools.rviz.R +import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectoryListInfo + +/** + * 自动驾驶路线适配器 + */ +class AutopilotLineAdapter : RecyclerView.Adapter() { + + private var data: ArrayList? = null + private var subClickListener: SubClickListener? = null + + fun setData(list: ArrayList) { + data = list + notifyDataSetChanged() + } + + fun setListener(listener: SubClickListener) { + subClickListener = listener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AutopilotLineHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_autopilot_line, parent, false) + return AutopilotLineHolder(view) + } + + override fun getItemCount() = data?.size ?: 0 + + override fun onBindViewHolder(holder: AutopilotLineHolder, position: Int) { + data?.let { + val info = it[position] + holder.tvAutopilotLine.text = "${info.lineId}-${info.lineName}" + holder.tvAutopilotLine.setOnClickListener { + subClickListener?.onClick(info) + } + } + } + + class AutopilotLineHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var tvAutopilotLine: TextView = itemView.findViewById(R.id.tvAutopilotLine) + } + + interface SubClickListener { + fun onClick(trajectoryListInfo: TrajectoryListInfo) + } + +} \ 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/dialog/adapter/ConsoleAdapter.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/adapter/ConsoleAdapter.java new file mode 100644 index 0000000000..3c96846e38 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/dialog/adapter/ConsoleAdapter.java @@ -0,0 +1,76 @@ +package com.zhjt.mogo_core_function_devatools.rviz.dialog.adapter; + +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.eagle.core.data.deva.report.ReportEntity; +import com.zhjt.mogo_core_function_devatools.rviz.R; + +import java.util.List; + + +/** + * @author XuXinChao + * @description 状态监控-控制台适配器 + * @since: 2022/7/26 + */ +public class ConsoleAdapter extends RecyclerView.Adapter { + + private List data; + + private static final String RESULT_AUTOPILOT_DISABLE = "RESULT_AUTOPILOT_DISABLE"; + private static final String RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED"; + private static final String RESULT_REMOTEPILOT_DISABLE = "RESULT_REMOTEPILOT_DISABLE"; + + public void setData(List data) { + if (data != null && data.size() > 0) { + this.data = data; + notifyDataSetChanged(); + } + } + + @NonNull + @Override + public ConsoleHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { +// AutoSizeCompat.autoConvertDensityOfGlobal(parent.getContext().getResources()); + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_console, parent, false); + return new ConsoleHolder(view); + } + + @SuppressLint("SetTextI18n") + @Override + public void onBindViewHolder(@NonNull ConsoleHolder holder, int position) { + ReportEntity reportEntity = data.get(position); + holder.tvConsoleContent.setText("Time:" + reportEntity.getTime() + "\nCode:" + reportEntity.getCode() + "\nMsg:" + reportEntity.getMsg()); + if (RESULT_AUTOPILOT_DISABLE.equals(reportEntity.getCode()) + || RESULT_AUTOPILOT_SYSTEM_UNSTARTED.equals(reportEntity.getCode()) + || RESULT_REMOTEPILOT_DISABLE.equals(reportEntity.getCode())) { + holder.tvConsoleContent.setTextColor(Color.RED); + } else { + holder.tvConsoleContent.setTextColor(Color.WHITE); + } + } + + @Override + public int getItemCount() { + return data != null ? data.size() : 0; + } + + public static class ConsoleHolder extends RecyclerView.ViewHolder { + + private TextView tvConsoleContent; + + public ConsoleHolder(@NonNull View itemView) { + super(itemView); + tvConsoleContent = itemView.findViewById(R.id.tvConsoleContent); + } + } + +} 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 new file mode 100644 index 0000000000..957293edbb --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/MisHost.kt @@ -0,0 +1,31 @@ +package com.zhjt.mogo_core_function_devatools.rviz.net + +import com.mogo.commons.debug.DebugConfig +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 LOGIN_HOST_QA = + "https://carlife-test.zhidaohulian.com/qa/eagle/login/index.html?deviceId=" + private const val LOGIN_HOST_RELEASE = + "https://carlife-test.zhidaohulian.com/eagle/login/index.html?deviceId=" + + fun getHost(): String { + return if (DebugConfig.getNetMode() == DebugConfig.NET_MODE_DEV || DebugConfig.getNetMode() == DebugConfig.NET_MODE_QA) { + HOST_QA + } else { + HOST_RELEASE + } + } + + fun getLoginURL(): String { + return if (DebugConfig.getNetMode() == DebugConfig.NET_MODE_DEV || DebugConfig.getNetMode() == DebugConfig.NET_MODE_QA) { + LOGIN_HOST_QA + } else { + LOGIN_HOST_RELEASE + } + } + +} \ 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/net/NetworkManager.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/NetworkManager.java new file mode 100644 index 0000000000..16ba24c9ec --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/NetworkManager.java @@ -0,0 +1,149 @@ +package com.zhjt.mogo_core_function_devatools.rviz.net; + +import android.util.Log; + +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.OnLifecycleEvent; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; +import io.reactivex.schedulers.Schedulers; +import okhttp3.OkHttpClient; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.converter.scalars.ScalarsConverterFactory; + +/** + * 网络请求工具 + */ +public class NetworkManager implements LifecycleObserver { + private static final String TAG = "NetworkManager"; + private static final int DEFAULT_TIMEOUT = 10; + + private static NetworkManager instance; + private final Retrofit.Builder retrofit; + private final Map serviceMap; + private final Map ownerDisposableMap; + private final CompositeDisposable compositeDisposable; + + private NetworkManager() { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); + + retrofit = new Retrofit.Builder() + .client(builder.build()) + .addConverterFactory(GsonConverterFactory.create()) + .addConverterFactory(ScalarsConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()); + + serviceMap = new HashMap<>(); + ownerDisposableMap = new HashMap<>(); + compositeDisposable = new CompositeDisposable(); + } + + public static synchronized NetworkManager getInstance() { + if (instance == null) { + instance = new NetworkManager(); + } + return instance; + } + + /** + * 创建网络请求 + * + * @param serviceClass API服务 + * @param baseUrl 请求地址 + * @param + * @return + */ + public T createService(Class serviceClass, String baseUrl) { + if (serviceMap.containsKey(baseUrl)) { + return (T) serviceMap.get(baseUrl); + } else { + T service = retrofit.baseUrl(baseUrl).build().create(serviceClass); + serviceMap.put(baseUrl, service); + return service; + } + } + + /** + * 发送网络请求 + * + * @param observable + * @param owner 发送网络请求的 LifecycleOwner + * @param callback 回调 + * @param + */ + public void sendRequest(Observable observable, + final LifecycleOwner owner, + final NetworkCallback callback) { + // 在工作线程执行网络请求 + Disposable disposable = observable.subscribeOn(Schedulers.io()) + // 切换到主线程回调 + .observeOn(AndroidSchedulers.mainThread()) + // 回调 + .subscribe(new Consumer() { + @Override + public void accept(T t) { + if (callback != null) { + callback.onSuccess(t); + } + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) { + if (callback != null) { + callback.onError(throwable.getMessage()); + } + } + }); + + if (owner != null) { + owner.getLifecycle().addObserver(this); + ownerDisposableMap.put(owner, disposable); + compositeDisposable.add(disposable); + } + } + + /** + * 取消所有网络请求 + */ + public void cancelAllRequests() { + compositeDisposable.clear(); + } + + // 绑定生命周期,跟随发起网络请求的地方生命周期自动销毁 + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + public void onDestroy(LifecycleOwner owner) { + Log.d(TAG, "onDestroy: owner=" + owner); + owner.getLifecycle().removeObserver(this); + ownerDisposableMap.remove(owner); + } + + /** + * 网络请求回调 + * + * @param + */ + public interface NetworkCallback { + // 请求成功回调 + void onSuccess(T response); + + /** + * 异常回调 + * + * @param throwable 异常信息 + */ + void onError(String throwable); + } +} \ 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/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 new file mode 100644 index 0000000000..584d18a470 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiClient.kt @@ -0,0 +1,135 @@ +package com.zhjt.mogo_core_function_devatools.rviz.net + +import android.util.Log +import androidx.lifecycle.LifecycleOwner +import com.mogo.module.common.net.mis.trajectory.net.TrajectoryApiService +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 + + +object TrajectoryApiClient { + private val TAG = "TrajectoryApiClient" + + private val baseUrl = MisHost.getHost() + 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) +// } +// } +// ) +// } + +} 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 new file mode 100644 index 0000000000..8539593853 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryApiService.kt @@ -0,0 +1,58 @@ +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 io.reactivex.Observable +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Query + +interface TrajectoryApiService { + /** + * 查询 Bus 有轨迹的QA线路列表 + * @param deviceId deviceId + */ + @POST("/eagleEye-mis/line/qa/bus/list") + fun queryBusTrajectoryList(@Body reqBody: TrajectoryLisReq): Observable>> + + /** + * 查询 Taxi 有轨迹的QA线路列表 + * @param deviceId deviceId + */ + @POST("/eagleEye-mis/line/qa/taxi/list") + fun queryTaxiTrajectoryList(@Body reqBody: TrajectoryLisReq): Observable>> + + /** + * 查询 Bus 线路对应的站点 + * @param lineId 线路ID + */ + @GET("/eagleEye-mis/line/query/bus/site") + fun queryBusSiteList(@Query("lineId") lineId: Int): Observable>> + + /** + * 查询 Taxi 线路对应的站点 + * @param lineId 线路ID + */ + @GET("/eagleEye-mis/line/query/taxi/site") + fun queryTaxiSiteList(@Query("lineId") lineId: Int): Observable>> + + + /** + * 查询 Bus 线路对应的轨迹 + */ + @POST("/eagleEye-mis/line/query/bus/contrail") + fun queryBusTrajectoryInfo(@Body reqBody: TrajectoryInfoReq): Observable> + + + /** + * 查询 Taxi 线路对应的轨迹 + */ + @POST("/eagleEye-mis/line/query/taxi/contrail") + fun queryTaxiTrajectoryInfo(@Body reqBody: TrajectoryInfoReq): Observable> +} diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryNetModel.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryNetModel.kt new file mode 100644 index 0000000000..ec70db80e3 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/TrajectoryNetModel.kt @@ -0,0 +1,350 @@ +package com.mogo.module.common.net.mis.trajectory.net + +import android.util.Log +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.MisHost +import com.zhjt.mogo_core_function_devatools.rviz.net.MoGoRetrofitFactory +import com.zhjt.mogo_core_function_devatools.rviz.net.NetworkCallback +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.async +import kotlinx.coroutines.launch +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +object TrajectoryNetModel { + private val TAG = "TrajectoryNetModel" + private val coroutineScopeMap = HashMap() + + private fun getNetWorkApi(baseUrl: String = MisHost.getHost()): TrajectoryApi { + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(TrajectoryApi::class.java) + } + + + /** + * 查询 Bus 有轨迹的QA线路列表 + */ + fun queryBusTrajectoryList( + scope: CoroutineScope, + cityCode: String, + callback: NetworkCallback> + ) { + + val reqBody = TrajectoryLisReq() + reqBody.page = 1 + reqBody.pageSize = 1000 + reqBody.cityCode = cityCode + + val call = getNetWorkApi().queryBusTrajectoryList(reqBody) + + coroutineScopeMap[scope]?.cancel() + val newJob = scope.async { + call.enqueue(object : Callback>> { + override fun onResponse( + call: Call>>, + response: Response>> + ) { + Log.d(TAG, "查询 Bus 有轨迹的QA线路列表:" + response.body().toString()) + scope.launch { + response.body()?.let { responseBody -> + if (responseBody.code == 0) { + responseBody.result?.let { result -> + callback.onSuccess(result) + } ?: let { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } else { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } ?: let { + callback.onError("网络异常") + } + } + } + + override fun onFailure( + call: Call>>, + t: Throwable + ) { + Log.e(TAG, "网络异常") + scope.launch { callback.onError("网络异常") } + } + }) + } + coroutineScopeMap[scope] = newJob + + scope.coroutineContext[Job]?.invokeOnCompletion { + coroutineScopeMap.remove(scope) + } + + } + + /** + * 查询 Taxi 有轨迹的QA线路列表 + */ + fun queryTaxiTrajectoryList( + scope: CoroutineScope, + cityCode: String, + callback: NetworkCallback> + ) { + + val reqBody = TrajectoryLisReq() + reqBody.page = 1 + reqBody.pageSize = 1000 + reqBody.cityCode = cityCode + + val call = getNetWorkApi().queryTaxiTrajectoryList(reqBody) + + coroutineScopeMap[scope]?.cancel() + val newJob = scope.async { + call.enqueue(object : Callback>> { + override fun onResponse( + call: Call>>, + response: Response>> + ) { + Log.d(TAG, "查询 Taxi 有轨迹的QA线路列表:" + response.body().toString()) + scope.launch { + response.body()?.let { responseBody -> + if (responseBody.code == 0) { + responseBody.result?.let { result -> + callback.onSuccess(result) + } ?: let { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } else { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } ?: let { + callback.onError("网络异常") + } + } + } + + override fun onFailure( + call: Call>>, + t: Throwable + ) { + Log.e(TAG, "网络异常:") + scope.launch { callback.onError("网络异常") } + } + }) + } + coroutineScopeMap[scope] = newJob + + scope.coroutineContext[Job]?.invokeOnCompletion { + coroutineScopeMap.remove(scope) + } + } + + /** + * 查询 Bus 线路对应的站点 + */ + fun queryBusSiteList( + scope: CoroutineScope, + lineId: Int, + callback: NetworkCallback> + ) { + val call = getNetWorkApi().queryBusSiteList(lineId) + + coroutineScopeMap[scope]?.cancel() + val newJob = scope.async { + call.enqueue(object : Callback>> { + override fun onResponse( + call: Call>>, + response: Response>> + ) { + Log.d(TAG, "查询 Bus 有轨迹的QA线路列表:" + response.body().toString()) + scope.launch { + response.body()?.let { responseBody -> + if (responseBody.code == 0) { + responseBody.result?.let { result -> + callback.onSuccess(result) + } ?: let { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } else { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } ?: let { + callback.onError("网络异常") + } + } + } + + override fun onFailure( + call: Call>>, + t: Throwable + ) { + Log.e(TAG, "网络异常:") + scope.launch { callback.onError("网络异常") } + } + }) + } + coroutineScopeMap[scope] = newJob + + scope.coroutineContext[Job]?.invokeOnCompletion { + coroutineScopeMap.remove(scope) + } + } + + /** + * 查询 Taxi 线路对应的站点 + */ + fun queryTaxiSiteList( + scope: CoroutineScope, + lineId: Int, + callback: NetworkCallback> + ) { + + val call = getNetWorkApi().queryTaxiSiteList(lineId) + + coroutineScopeMap[scope]?.cancel() + val newJob = scope.async { + call.enqueue(object : Callback>> { + override fun onResponse( + call: Call>>, + response: Response>> + ) { + Log.d(TAG, "查询 Taxi 有轨迹的QA线路列表:" + response.body().toString()) + scope.launch { + response.body()?.let { responseBody -> + if (responseBody.code == 0) { + responseBody.result?.let { result -> + callback.onSuccess(result) + } ?: let { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } else { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } ?: let { + callback.onError("网络异常") + } + } + } + + override fun onFailure( + call: Call>>, + t: Throwable + ) { + Log.e(TAG, "网络异常:") + scope.launch { callback.onError("网络异常") } + } + }) + } + coroutineScopeMap[scope] = newJob + + scope.coroutineContext[Job]?.invokeOnCompletion { + coroutineScopeMap.remove(scope) + } + } + + /** + * 查询 Bus 线路对应的轨迹 + */ + fun queryBusTrajectoryInfo( + scope: CoroutineScope, + reqBody: TrajectoryInfoReq, + callback: NetworkCallback + ) { + + val call = getNetWorkApi().queryBusTrajectoryInfo(reqBody) + + coroutineScopeMap[scope]?.cancel() + val newJob = scope.async { + call.enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + Log.d(TAG, "查询 Bus 有轨迹的QA线路列表:" + response.body().toString()) + scope.launch { + response.body()?.let { responseBody -> + if (responseBody.code == 0) { + responseBody.result?.let { result -> + callback.onSuccess(result) + } ?: let { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } else { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } ?: let { + callback.onError("网络异常") + } + } + } + + override fun onFailure( + call: Call>, + t: Throwable + ) { + Log.e(TAG, "网络异常:") + scope.launch { callback.onError("网络异常") } + } + }) + } + coroutineScopeMap[scope] = newJob + + scope.coroutineContext[Job]?.invokeOnCompletion { + coroutineScopeMap.remove(scope) + } + } + + /** + * 查询 Taxi 线路对应的轨迹 + */ + fun queryTaxiTrajectoryInfo( + scope: CoroutineScope, + reqBody: TrajectoryInfoReq, + callback: NetworkCallback + ) { + val call = getNetWorkApi().queryTaxiTrajectoryInfo(reqBody) + + coroutineScopeMap[scope]?.cancel() + val newJob = scope.async { + call.enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + Log.d(TAG, "查询 Taxi 有轨迹的QA线路列表:" + response.body().toString()) + response.body()?.let { responseBody -> + if (responseBody.code == 0) { + responseBody.result?.let { result -> + callback.onSuccess(result) + } ?: let { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } else { + callback.onError("msg=${responseBody.msg},code=${responseBody.code}") + } + } ?: let { + callback.onError("网络异常") + } + } + + override fun onFailure( + call: Call>, + t: Throwable + ) { + Log.e(TAG, "网络异常:") + scope.launch { callback.onError("网络异常") } + } + }) + } + coroutineScopeMap[scope] = newJob + + scope.coroutineContext[Job]?.invokeOnCompletion { + coroutineScopeMap.remove(scope) + } + } + +} \ 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/net/api/TrajectoryApi.kt b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/api/TrajectoryApi.kt new file mode 100644 index 0000000000..d7487fc19c --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/net/api/TrajectoryApi.kt @@ -0,0 +1,57 @@ +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 retrofit2.Call +import retrofit2.http.* + +interface TrajectoryApi { + + /** + * 查询 Bus 有轨迹的QA线路列表 + * @param deviceId deviceId + */ + @POST("/eagleEye-mis/line/qa/bus/list") + fun queryBusTrajectoryList(@Body reqBody: TrajectoryLisReq): Call>> + + /** + * 查询 Taxi 有轨迹的QA线路列表 + * @param deviceId deviceId + */ + @POST("/eagleEye-mis/line/qa/taxi/list") + fun queryTaxiTrajectoryList(@Body reqBody: TrajectoryLisReq): Call>> + + /** + * 查询 Bus 线路对应的站点 + * @param lineId 线路ID + */ + @GET("/eagleEye-mis/line/query/bus/site") + fun queryBusSiteList(@Query("lineId") lineId: Int): Call>> + + /** + * 查询 Taxi 线路对应的站点 + * @param lineId 线路ID + */ + @GET("/eagleEye-mis/line/query/taxi/site") + fun queryTaxiSiteList(@Query("lineId") lineId: Int): Call>> + + + /** + * 查询 Bus 线路对应的轨迹 + */ + @POST("/eagleEye-mis/line/query/bus/contrail") + fun queryBusTrajectoryInfo(@Body reqBody: TrajectoryInfoReq): Call> + + + /** + * 查询 Taxi 线路对应的轨迹 + */ + @POST("/eagleEye-mis/line/query/taxi/contrail") + fun queryTaxiTrajectoryInfo(@Body reqBody: TrajectoryInfoReq): Call> + + +} \ 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 new file mode 100644 index 0000000000..71c16da4fe --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/CheckAutopilotView.kt @@ -0,0 +1,741 @@ +package com.zhjt.mogo_core_function_devatools.rviz.ui.views + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.widget.Button +import android.widget.ImageView +import android.widget.TextView +import android.widget.ToggleButton +import androidx.appcompat.widget.AppCompatEditText +import androidx.appcompat.widget.AppCompatTextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.RecyclerView +import chassis.Chassis +import chassis.VehicleStateOuterClass +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 +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.zhjt.mogo_core_function_devatools.rviz.R +import com.zhjt.mogo_core_function_devatools.rviz.bean.TrackContrail +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.TrajectoryListInfo +import com.zhjt.mogo_core_function_devatools.rviz.bean.TrajectorySiteInfo +import com.zhjt.mogo_core_function_devatools.rviz.bean.VehicleConfigData +import com.zhjt.mogo_core_function_devatools.rviz.bean.VehicleType +import com.zhjt.mogo_core_function_devatools.rviz.common.coroutines.FlowBus +import com.zhjt.mogo_core_function_devatools.rviz.dialog.SelectAutopilotLineDialog +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.widgets.ros.TelematicsSubscriberEventKey +import com.zhjt.mogo_core_function_devatools.rviz.widgets.ros.TopicSubscriberEventKey +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import mogo.telematics.pad.MessagePad +import mogo_msg.MogoReportMsg +import java.util.LinkedList + +class CheckAutopilotView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), LifecycleOwner { + + companion object { + const val TAG = "CheckAutopilotView" + } + + +// 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 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())) { +// btnControlAutoPilot.isChecked = true +// Log.d(TAG, "自动驾驶命令下发成功") +// ToastUtils.showShort("自动驾驶命令下发成功") +// } else { +// btnControlAutoPilot.isChecked = false +// 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} 站点详情异常,异常原因:网络异常" +// ) +// 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 getLifecycle(): Lifecycle { + return lifecycle + } + +} \ 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/MoGoLoadingView.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/MoGoLoadingView.java new file mode 100644 index 0000000000..1242f02cdb --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/ui/views/MoGoLoadingView.java @@ -0,0 +1,65 @@ +package com.zhjt.mogo_core_function_devatools.rviz.ui.views; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; + +import com.zhjt.mogo_core_function_devatools.rviz.R; + +/** + * 加载进度View + */ +public class MoGoLoadingView extends LinearLayout { + + private Context context; + private ProgressBar progressBar; + private ImageView placeholderMap; + private TextView textView; + + public MoGoLoadingView(Context context) { + this(context, null); + } + + public MoGoLoadingView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public MoGoLoadingView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.context = context; + setOrientation(LinearLayout.VERTICAL); + setGravity(Gravity.CENTER); + + // 创建ProgressBar + progressBar = new ProgressBar(context); + addView(progressBar); + + // 创建TextView + textView = new TextView(context); + textView.setTextSize(30f); + textView.setTextColor(getResources().getColor(R.color.white)); + LayoutParams params = new LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + params.setMargins(0, 16, 0, 0); // 设置文字的上边距 + textView.setLayoutParams(params); + addView(textView); + } + + public void setText(String text) { + textView.setText(text); + } + + public void show(String text) { + setVisibility(VISIBLE); + textView.setText(text); + } + + public void hide() { + setVisibility(GONE); + } +} diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TelematicsSubscriberEventKey.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TelematicsSubscriberEventKey.java new file mode 100644 index 0000000000..345bcbdb86 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TelematicsSubscriberEventKey.java @@ -0,0 +1,280 @@ +package com.zhjt.mogo_core_function_devatools.rviz.widgets.ros; + +/** + * 通过LiveEventBus订阅的消息key + * + * @author mogoauto + */ +public interface TelematicsSubscriberEventKey { + + /** + * 感知物体 + */ + String Subscribe_Tracked_Objects = "Telematics_Tracked_Objects"; + + /** + * 工控机日志监控 + */ + String Subscribe_Mogo_Report_Message = "Telematics_Mogo_Report_Message"; + + /** + * 感知红绿灯 + */ + String Subscribe_Traffic_Lights = "Telematics_TrafficLights"; + + /** + * 车前引导线 + */ + String Subscribe_Trajectory = "Telematics_Trajectory"; + + /** + * 他车轨迹预测 + */ + String Subscribe_Prediction_Objects = "Telematics_PredictionObjects"; + + /** + * 过滤后的点云数据 + */ + String Subscribe_PointCloud = "Telematics_PointCloud"; + + /** + * planning障碍物 + */ + String Subscribe_Planning_Objects = "Telematics_PlanningObjects"; + + /** + * 数据采集结果 + */ + String Subscribe_Record_Panel = "Telematics_RecordPanel"; + + /** + * 报警信息 + * 暂时保留,目前没有使用 + */ + String Subscribe_Warn = "Telematics_Warn"; + + /** + * 到站提醒 自动驾驶站点 + */ + String Subscribe_Arrival_Notification = "Telematics_ArrivalNotification"; + + String Arrival_Notification = "Arrival_Notification"; + + /** + * 工控机数据错误 + */ + String Subscribe_Error = "Telematics_Error"; + + /** + * 车机基础信息应答 + */ + String Subscribe_CarConfig_Resp = "Telematics_CarConfigResp"; + + /** + * 自动驾驶状态 + */ + String Subscribe_Autopilot_State = "Telematics_AutopilotState"; + + /** + * 工控机健康状态查询应答 + */ + String Subscribe_System_Status_Info = "Telematics_SystemStatusInfo"; + + /** + * 自车定位信息 + */ + String Subscribe_Gnss_Info = "Telematics_GnssInfo"; + + /** + * 自车状态(底盘),车灯等。 + */ + String Subscribe_Vehicle_State = "Telematics_VehicleState"; + /** + * 自车状态(底盘),车灯等。 + */ + String Subscribe_ChassisStates_State = "Telematics_ChassisStates"; + + /** + * DebugInfo + */ + String Subscribe_DebugInfo = "Telematics_DebugInfo"; + + /** + * 自动驾驶路径应答 + */ + String Subscribe_Global_Path_Resp = "Telematics_GlobalPathResp"; + + /** + * planning决策状态, 透传 + */ + String Subscribe_Planning_Action_Msg = "Telematics_PlanningActionMsg"; + + /** + * 是否有能力启动自动驾驶 + */ + String Subscribe_Autopilot_Ability = "Telematics_AutopilotAbility"; + + /** + * 启动自动驾驶状态统计 + */ + String Subscribe_Autopilot_Statistics = "Telematics_AutopilotStatistics"; + + /** + * 数据采集配置应答 + */ + String Subscribe_Record_Data_Config = "Telematics_RecordDataConfig"; + + /** + * 启动自动驾驶调用结果数组 + * enterResult[0]===true-进入自动驾驶,false-未进入自动驾驶 + * enterResult[1]===具体原因 + */ + String Control_Enter_Autopilot_Result = "Telematics_ControlEnterAutopilotResult"; + + /** + * 退出自动驾驶调用结果数组 + * enterResult[0]===true-退出自动驾驶,false-未退出自动驾驶 + * enterResult[1]===具体原因 + */ + String Control_Out_Autopilot_Result = "Telematics_ControlOutAutopilotResult"; + + /** + * 向工控机发送红绿灯数据 + */ + String Control_Traffic_Light_Result = "Telematics_ControlTrafficLightResult"; + + /** + * 向工控机发送红绿灯数据 + */ + String Control_Trajectory_Download_Result = "Telematics_ControlTrajectoryDownloadResult"; + + /** + * 向工控机发送 录制开始Bag包请求 + */ + String Control_Start_Record_Package_Result = "Telematics_ControlStartRecordPackageResult"; + /** + * 向工控机发送 录制结束Bag包请求 + */ + String Control_Stop_Record_Package_Result = "Telematics_ControlStartRecordPackageResult"; + + /** + * 向工控机发送 向左变道 请求 + */ + String Control_Operator_Change_Lane_Left_Result = "Telematics_ControlOperatorChangeLaneLeftResult"; + + /** + * 向工控机发送 向右变道 请求 + */ + String Control_Operator_Change_Lane_Right_Result = "Telematics_ControlOperatorChangeLaneRightResult"; + + /** + * 向工控机发送 设置加速度 请求 + */ + String Control_Operator_Set_Accelerated_Speed_Result = "Telematics_ControlOperatorSetAcceleratedSpeedResult"; + + /** + * 向工控机发送 鸣笛 请求 + */ + String Control_Operator_Set_Horn_Result = "Telematics_ControlOperatorSetHornResult"; + + /** + * 向工控机发送 所有节点重启命令 请求 + */ + String Control_Ipc_Reboot_Result = "Telematics_ControlIpcRebootResult"; + + /** + * 向工控机发送 办公室调试使用,强制开启自动驾驶,将 status,pilotMode,control_pilotMode,强追设置为 1 请求 + */ + String Control_Auto_Pilot_Mode_Result = "Telematics_ControlAutoPilotModeResult"; + + /** + * 向工控机发送 发生行程相关 请求 + */ + String Set_Trip_Info_Result = "Telematics_SetTripInfoResult"; + + /** + * 向工控机发送 设置自动驾驶最大速度 请求 + */ + String Set_Speed_Limit_Result = "Telematics_SetSpeedLimitResult"; + + /** + * 向工控机发送 设置工控机演示模式(美化模式)开启、关闭 请求 + */ + String Set_Demo_Mode_Result = "Telematics_SetDemoModeResult"; + + /** + * 向工控机发送 雨天模式 开启、关闭 请求 + */ + String Set_Rain_Mode_Result = "Telematics_SetRainModeResult"; + + /** + * 向工控机发送 绕障类功能开关 开启、关闭 请求 + */ + String Set_Detouring_Mode_Result = "Telematics_SetDetouringModeResult"; + + /** + * 向工控机发送 主动查询工控机的各topic状态 请求 + */ + String Get_Ros_Topic_Status_Query_Result = "Telematics_GetRosTopicStatusQueryResult"; + + /** + * 向工控机发送 获取数据采集录制模式配置列表 请求 + */ + String Get_Bad_Case_Config_Result = "Telematics_GetBadCaseConfigResult"; + + /** + * 向工控机发送 请求工控机基础配置信息 请求 + */ + String Get_Car_Config_Result = "Telematics_GetCarConfigResult"; + + /** + * 向工控机发送 获取全局路径 请求 + */ + String Get_Global_Path_Result = "Telematics_GetGlobalPathResult"; + + /** + * 向工控机发送 获取协议版本 请求 + */ + String Get_Protocol_Version_Result = "Telematics_GetProtocolVersionResult"; + + /** + * 向工控机发送 获取工控机上报数据result 请求 + */ + String Get_Report_Result_Desc_Result = "Telematics_GetReportResultDescResult"; + + /** + * 向工控机发送 获取工控机上报数据action 请求 + */ + String Get_Report_Action_Desc_Result = "Telematics_GetReportActionDescResult"; + + + /** + * 相机标定检查视频30 1Hz + */ + String Camera_Calib_Check_Data30 = "Camera_Calib_Check_Data30"; + /** + * 相机标定检查视频60 1Hz + */ + String Camera_Calib_Check_Data60 = "Camera_Calib_Check_Data60"; + /** + * 相机标定检查视频120前 1Hz + */ + String Camera_Calib_Check_Data120Front = "Camera_Calib_Check_Data120Front"; + /** + * 相机标定检查视频120后 1Hz + */ + String Camera_Calib_Check_Data120Back = "Camera_Calib_Check_Data120Back"; + /** + * 相机标定检查视频120左 1Hz + */ + String Camera_Calib_Check_Data120Left = "Camera_Calib_Check_Data120Left"; + /** + * 相机标定检查视频120右 1Hz + */ + String Camera_Calib_Check_Data120Right = "Camera_Calib_Check_Data120Right"; + + /** + *电源盒协议接口 + */ + String Power_Supply_Unit = "Power_Supply_Unit"; +} diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TopicSubscriberEventKey.java b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TopicSubscriberEventKey.java new file mode 100644 index 0000000000..30cc410ae9 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/java/com/zhjt/mogo_core_function_devatools/rviz/widgets/ros/TopicSubscriberEventKey.java @@ -0,0 +1,57 @@ +package com.zhjt.mogo_core_function_devatools.rviz.widgets.ros; + +/** + * 通过LiveEventBus订阅的消息key + */ +public interface TopicSubscriberEventKey { + // 红绿灯 + String HAD_MAP_TRAFFIC_LIGHTS_SUBSCRIBER = "HadMapTrafficLightsSubscriber"; + // 自车GPS/TRK位置数据 + String LOCALIZATION_GLOBAL_SUBSCRIBER = "LocalizationGlobalSubscriber"; + //RTK检测 /sensor/gnss/gps_fix + String GPS_FIX_SUBSCRIBER = "GpsFixSubscriber"; + // 自车底盘信息 + String LOCALIZATION_ODOMETRY_SUBSCRIBER = "LocalizationOdometrySubscriber"; + + // 图像识别 + String PERCEPTION_OBJECT_DETECTION_IMAGE_SUBSCRIBER = "PerceptionObjectDetectionImageSubscriber"; + // PB格式的点云数据 + String PERCEPTION_POINT_CLOUD_PB_SUBSCRIBER = "PerceptionPointCloudPbSubscriber"; + // 激光雷达+图像标定融合Image数据 + String SIG_IMAGE_SUBSCRIBER = "SignImageSubscriber"; + // H264 视频流 + String SIG_H264_IMAGE_SUBSCRIBER = "SIG_H264_IMAGE_SUBSCRIBER"; + // 规划控制画的车道线、引导线 + String PLANNING_CONTROL_SUBSCRIBER = "PlanningControlSubscriber"; + // ROS数据格式的点云数据 + String SENSOR_POINT_CLOUD2_SUBSCRIBER = "SensorPointCloud2Subscriber"; + // 全局地图 + String TELEMATICS_GLOBAL_DISPLAY_SUBSCRIBER = "TelematicsGlobalDisplaySubscriber"; + // 底盘状态信息 + String VEHICLE_STATE_SUBSCRIBER = "VehicleStateSubscriber"; + // 融合感知TXT数据 + String PERCEPTION_TEXT_SUBSCRIBER = "PerceptionTextSubscriber"; + // 融合感知框数据 + String PERCEPTION_BOX_SUBSCRIBER = "PerceptionBoxSubscriber"; + // 用户交互选中到命名空间 + String PERCEPTION_BOX_SUBSCRIBER_SHOW = "PERCEPTION_BOX_SUBSCRIBER_SHOW"; + // Marker的分类命名空间 + String PERCEPTION_BOX_NAME_SPACE_CHANGE = "PERCEPTION_BOX_NAME_SPACE_CHANGE"; + + + // 系统日志--错误日志&错误日志 + String REPORT_MSG_SUBSCRIBER = "REPORT_MSG_SUBSCRIBER"; + + + // 公用的取消注册监听,配合传入的String参数区分具体是谁 + String COMMON_UN_SUBSCRIBER = "COMMON_UN_SUBSCRIBER"; + + // Topic HZ + String TOPIC_HZ_SUBSCRIBER = "TOPIC_HZ_SUBSCRIBER"; + + // Node Health + String NODE_HEALTH_SUBSCRIBER = "NODE_HEALTH_SUBSCRIBER"; + + // System cmd + String SYSTEM_CMS_SUBSCRIBER = "SYSTEM_CMS_SUBSCRIBER"; +} diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_line_delect.png b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_line_delect.png new file mode 100644 index 0000000000000000000000000000000000000000..7b11122e9a2504332c9212cf199f38ac8771a48e GIT binary patch literal 915 zcmV;E18n?>P)Px&O-V#SRCr$P-F;5uFc1ZB=Vr^vb~zbvGOvshH7YF~JM;0LJ(c(aNb1S^b(~g; zo2}#nDuE5Enk=Ry2-u4tK@tQk0kCqiLlOim0kCqiLlOim0kCqiL)bxTt$#`>?Wb(p z_7CiMAj&ysR7&~Ww(V0|SXYPCS{uOM)04Ns-lT)Au-$`<+F`#*QF=k@gHRJ?59J9) z`>!}7G05JAA5UK8;sIyvl3y^|A-_wfcQHtN)>>-=`96PSr`!^Ffnf^LFrIZuS8LAF zDViAHZ9Fh6%_lC=nQDAnYhn7^WbsD3KWEAZ#en7%m_zC7*HTq zC`=e|AlfKw7?2=ZD2y1eAXiaXF`z+4QJ68{L3&ZxF(^Q!D5aFIyVYH7*YiWXM&o`* z&)>VRe)lZyJeJ_9``=2Vz@X`nBk4gD8VouR;q*l}O`Qv-nX(3^FRIQsj*k`OetGtz z^9SWZR5}pBTiY`Z9SRjlC&mFog+c=|h(U)!0V2S7Z{LGdPx)6G=otRCr$PoojO4APj}g%G$21&B~gr%pIlX4sj3&(95>+Cz%^Rus+U_u&*I) z@#882$yIBjFTSeVk(Xo>I#Ha~5WL zbIgGp5PomlmIF?2eSOO}_&BBXXZ1i9`{&h9)8|DD@GK^B#2L&Imo?|beXU#$saZ!1@01z2#`U0%0Y(!EmcX!d7(If>Wo?> zxB|ltWIz=V{ACC&4?NmJf#U`WD-a?K^@}IA3ljb>>mY0m?vYf3GE`S17AM_AA23Z6>H&-M*%QbaICJ zg{=5?M=h$?G6ke@0q*hz6;$h*G^?*+Ag$h%QW`!UHDDUsHB_%w5)TE?leDD(HK3?e zUZX&;B(Bm}DG23pJC&n&J|P2XsN*&;PSsbfoENvQ5g;{n+zv(o1$$&5suB{AhB`zW zr(sc@o0GNML82<50(q1=2-YRm5xYPzbzHr~rK%69y2MmM0rE(7SgE85vHw_I+201qvkW>MM4w7?(Ef83&^9Z ztC}rp*j5#YW)ic=2eaoyY>U-3Mu4!(b2czm`ym}w1xW428taLzg1T~E1PE(K#S{`i zD&zvlN_Q68x02XZ6jHlY@W=t-nQN`m;vBJKmK8t{g;@dlHU{DB1wwA3a#*DFWpfWq zAprzeh^TvnWew`e%Cbaz!C(wrZ5}{e;n+4SATcnEfuS=gI0FK2u%5rU$2ubQAO7zx zL>}6)#%1JgFU%j({g%oV15Ir+0)+LZ>*xb2wgC_|2%fexdq4$2(0YdKDd4TPXg#!R zDJ1epK}f@{;B=!vV4p|Y7GhVd`J)M>VO#8txPom-4+wJ%dS8?a+xnkRtM7_PRGl+G z0Oq4qqGeZI%WBxxW5y(!>YxIt*%s`}IzsiBM=ai}B#pcquL|F~;?hL3F-pkQyM-Y&tn-c^^VtV+8kSytWwsWxs`by?2lFbbqK-Rmv#iIr8628OlD=jM~o zU>#1aq8w64VO`k#ifRq#E|a}cPabo%yOh!w5$NZO5xmjRWD>#F@)Jv zRj*?jNT(Eb4}~z_V#!zy$`X*PLLtmZS`(ZKlw}~Dk-SMS!|ZEN6(&$vfDo!LQ!oP{ z@>Jtya}l!wAzIigzeq2zG63SsY^s(MM6&}Kgi^v;UN@>(S7c;Ot7>krf+7N>u&|kx zb;<=@KA*e1ZY!kpUIZOJKCk9RT{9#fvN>L|fFcT{Pz(Gyx&qGZ(1Nlbxnk0WA`WCx zEtKGnY(oZ79#j*G8juqhO~tS*ou>sw9Z03;f$wwM*=N-R=i*$PMFWZ{5Cjf}bY2`B+%0fJ}(FD%OnMv+tCkv81PM(;|8Wm!`?oj-sC5N8o^)|^mC0C5%p bXU+KskRvpbHu;zyNSF{)zqi~S7 zD}`m;B(`Z{p^Z^0S8VbUDtDcGZs-1c|GM{&&+~bn&-e43^PK08=X-6huh$Y?j4lKM zSppCVerl$wk%EA$V=OWesU|4h&&wTBCNlbWW72^K%j|Kh~{^T8W=So z5Lhl00#h^eyOyi*yz?68z6AlXuFNNbvg!3gMfhn_Pxc(uxZ;_W$rayGwWUTQD_)?mu7FgCfyDVi!%w) zpJK80m|6C^MT{P*k^FvKk|kReT|9tVOemntUhIzfwD3aK-MvYeH6zkhlm}~c*mIld zgm0*Qv}7P{a~Ztw22TX~{;E_I zj4k!4of{KwD5>oLF8J6cCGx@uHQ~kvLp6eJO*V${Ek!-Ao;7|jt{-etgjqw4HxNRc zI5W%(Lpu@D+cHsCmvrL--}&Q>Ql#TmUIJoTL4Wtw)+`5guSxHk>)mZH8o!N~O57x+ z@23{*ZPyA4PChoToo;KW8t|z;K|QdWSeysaj;uy4&q z#`(UOl_2W5mA9^W!`%ku==t~sh;O9DikS98t&D9xEj#ppnK!)TmIX?4$J{a2E!Hcf z;8-e>kR4;%mXqagfFz?}$^(DtgIHo-I_tQYRGefiWD$`d8vPiG>%DYyeLU}~;AaRB zA>%zawc&D=$<5E&F3PkJv_tvH)ndD;n_HU-L8oIY?K0AL(Sx_>y z@U48S$ycRzwsbm_KEZVX<&3A{M=DZ!R-_%Kt&xVCNdp`mz^4;~UXS?9iRjr=@hkOG zdCL4M??;N+vdCDc)2dD)#zC1GjRo)}+$-23tTMBj#p8B&HnLvoN0AN_C7ofXDa0^D zz2ycR^|WKPEzVIh_~uH`p&HXCeQguP5vJYDr;U^BYnBDm=*`u8gBHuk{*4|5$u$Tv z|8x158M&1Cyl)Ke@e|=wLsBgR)h~TH&Z$cO(OlLyWcp`!Hnw? zJW1o4I6t$4lHSkZeST6_+!@rLDWXho7Xrz9{Ka3*TU~R?=Fevbj>UH0K61AIA*Ey0 zr>9>ITyd-mKOKA&qphRr^An^D-VKY)v6gDn)-cya+Ayw*g~mWUqH4eq@5k4XcJ9P= zLn;QyZvUoO>?9_O;~!m~`g?WBdSm}sqV$JcuDT!UYb#Z^UkXJ4Qx*Y%1gKZ_xt6F3w@D?w4UKUEshR`;2{R)X=ogxIT{h z;zS=MIkfbc%N3q*t*`-(T?YF^ZE4puFiA^r2X~R>ss_d3YMNDDX~j0qIBNF=Ie+>1 zjl#lyhEqnOd0Qr~^$)`5#vXQmKn7fWL}2a8Bkm>j&mzE~?hnR{0vnxsk3mAS_q%nX zt_BMmZT>(j<>Kvl^P((IJZKt2q}eJZbtG?6Yuy&m z&btmvUX5!x!+NkY@RDZwg1aAJHf$%?b^%v4PqfHQv~|4Jo~wsXXK1L~=WBPM;qWsF zm(Aq&qrsw{%Fw)+<<68*7eL+>_%KRQZmBW!&NFOSb$Ku2^%K!{jPDu4p&%n2<1~An zu8*PPo|iUTE$#%_JC>ZQ7f{HWM&hewB3e|4R}jYxJco?1ZEchE11b~pR>2JNpd#e^ Orv`ZV63W~|;{F6FL2)hs literal 0 HcmV?d00001 diff --git a/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_speed_reduce.png b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/drawable-xhdpi/icon_speed_reduce.png new file mode 100644 index 0000000000000000000000000000000000000000..905094d4617be6873bf42d12e01dfb7225bcd3db GIT binary patch literal 1597 zcmc&!YdF&j82_)yT#nmHvdHB)IjFSGIN_8w!&Zj0rKW}DwhD!sL{^mJ+HyoAYsqao zoa8JasiVzYvLSM5k2SYiO>wMgVrRbe{d_s+!|(mQm*4xm&+|Ud`)2z4dh6-HbN~R* z!(z|@YNn`>qot{~sk#}uY68Uvc%y*2UbA=V03Ci98-c?C_G(`X0A)}Bja7*nFf{-G z%mM*mHG@`jtTo@N6c+fKpR+3b;m#Zm0M=Gv(MWtENLGrBG9zs4X!}@!B3qO9L-W(D zU#1!9*iRSI5Blyivf`F>gdl~72hyHbR1FbzvhD~E&ROb|v8pzg50_MErt`A#N%eo; zTnL%aY+l;a*4P~Cv883qrj+6SMG$^fBst^P>y$Zv1*{xg8iIzO4S2yN$7jD6xr$R4dHqKHlb6kd z+AK`cIxXP*&XBpGnCu2syNhr`KYHq!X}$9I8s@rz3h~H9ejAuUPxcp{Jfz|oggGvL ziR>*Cbq2#6oXz>^1ps3dbBzyy$5{#y_p0R^Fu5MLY=5O?p&oE%w_qsrPvb89>6@(D z2xHES3dzL4BC>g01m;sHLV)x%>a1=7*^wY$EZtP7@UX;9ZYSWiokve-BH>q2yH_O?j4xT!pGMTv+#n}y4sGN){&YlQBL6Y}v z?@i3FYk5f2mLJG>6Vnr3laE$znmYSbfR*Cn`k4I}IRTLA>Rax^Bn))JNSD9d`#UZ2)rm|F@`r zGkK%Wf<)(xNeEww0e%n#@+mA@uLxatElSBr$`5fyE{AA^Lu@wKR zb$CZ01V&GCx<%jwl7*3RwY_ALi;$MkR7S-~W~_LP%~Gyc)9Pv1f0kS93WqUoupFmr zXk1s<`=EF8+N5>5u_Yt7+(%L#9rttQzqq7_VN3j~790+?h`(<&@DL{-i&^iwepJJb z(@H#l>R3d`b2DV-k=t%CebIHOkjwu7OD&|S literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000..716d097698 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/dialog_select_autopilot_line.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000000..889bf9af4b --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_autopilot_line.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/item_console.xml b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml new file mode 100644 index 0000000000..e064003f1d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/item_console.xml @@ -0,0 +1,26 @@ + + + + + + + \ 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 new file mode 100644 index 0000000000..a25781430d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools-rviz/src/main/res/layout/view_check_autopilot.xml @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +