Merge branch 'dev_robotaxi-d_241112_6.8.0' of gitlab.zhidaoauto.com:SCA/L4HA/AndroidApp/MoGoEagleEye into dev_robotaxi-d_241112_6.8.0

This commit is contained in:
xinfengkun
2024-11-21 18:04:46 +08:00
16 changed files with 245 additions and 50 deletions

View File

@@ -597,6 +597,11 @@ class DriverM1Model {
parameters.endLatLon =
AutopilotControlParameters.AutoPilotLonLat(mCurrentOrder?.wgs84Lat!!, mCurrentOrder?.wgs84Lon!!)
parameters.vehicleType = VEHICLE_TYPE
// TODO 这里需要增加传入 白名单点列表、黑名单点列表,顺序按照服务端传入顺序为准。
//parameters.wayLatLons
//parameters.blackLatLons
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine(
mCurrentOrder!!.lineId.toLong(), mCurrentOrder!!.lineName,

View File

@@ -1190,6 +1190,11 @@ object CharterPassengerModel {
parameters.endName = PinYinUtil.getPinYinHeadChar(orderInfo.siteName)
parameters.startLatLon = AutoPilotLonLat(startWgsLat, startWgsLon)
parameters.endLatLon = AutoPilotLonLat(endWgsLat, endWgsLon)
// TODO 这里需要增加传入 白名单点列表、黑名单点列表,顺序按照服务端传入顺序为准。
//parameters.wayLatLons
//parameters.blackLatLons
locusInfo?.let { locus ->
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = AutoPilotLine(

View File

@@ -4,4 +4,6 @@ import com.mogo.och.common.module.wigets.media.MediaItem
interface IMediaDispatch {
fun diapatchMedia(list :MutableList<MediaItem>)
fun setMediaPause(){}
fun setMediaResume(){}
}

View File

@@ -12,4 +12,18 @@ object MediaManager : CallerBase<IMediaDispatch>() {
}
}
fun setMediaResume(){
M_LISTENERS.forEach {
val listener = it.value
listener.setMediaResume()
}
}
fun setMediaPause(){
M_LISTENERS.forEach {
val listener = it.value
listener.setMediaPause()
}
}
}

View File

@@ -12,6 +12,7 @@ import com.mogo.och.common.module.R
import com.mogo.och.common.module.biz.media.IMediaDispatch
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.manager.download.DownloadManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.utils.RxUtils
import com.shuyu.gsyvideoplayer.GSYVideoManager
import io.reactivex.disposables.Disposable
@@ -113,6 +114,20 @@ class MediaPlayerFragment :
fisrtData = RxUtils.createSubscribe(3_000) {}
setHightPriorityMediaItem(list)
}
override fun setMediaPause() {
super.setMediaPause()
BizLoopManager.runInMainThread{
imageVideoRotationView.setPause()
}
}
override fun setMediaResume() {
super.setMediaResume()
BizLoopManager.runInMainThread {
imageVideoRotationView.setResume()
}
}
}
class MediaPlayerPresenter(view: MediaPlayerFragment?) :

View File

@@ -1,11 +1,19 @@
package com.mogo.och.shuttle.weaknet.passenger.ui
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import com.mogo.commons.mvp.MvpFragment
import com.mogo.eagle.core.utilcode.util.AppUtils
import com.mogo.och.common.module.biz.media.MediaManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.common.module.manager.transform.OchTransform
import com.mogo.och.common.module.manager.transform.OchTransformDispatch
import com.mogo.och.shuttle.weaknet.passenger.R
import com.mogo.och.shuttle.weaknet.passenger.presenter.PM2Presenter
import com.mogo.och.common.module.wigets.media.MediaPlayerFragment
import kotlinx.android.synthetic.main.shuttle_p_m2_fragment.tv_shuttle_b2_p_version
import kotlinx.android.synthetic.main.shuttle_p_m2_fragment.video_fragment
/**
@@ -19,6 +27,27 @@ class PM2BaseFragment :
private var hdMapFragment : PM2HPMapFragment? = null
private var mediaFragment : MediaPlayerFragment? = null
private val ochTransform = object : OchTransformDispatch{
override fun setVideoView(target: View?) {
super.setVideoView(target)
if(target!=null){
BizLoopManager.runInMainThread{
target.id = R.id.video_show
val params = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT)
video_fragment.addView(target,params)
MediaManager.setMediaPause()
}
}else{
BizLoopManager.runInMainThread{
findViewById<View>(R.id.video_show)?.let {
video_fragment.removeView(it)
MediaManager.setMediaResume()
}
}
}
}
}
override fun getLayoutId(): Int {
return R.layout.shuttle_p_m2_fragment
}
@@ -31,6 +60,12 @@ class PM2BaseFragment :
tv_shuttle_b2_p_version.text = "版本:${AppUtils.getAppVersionName()}"
//隐藏小地图
initFragment()
OchTransform.addListener(TAG,ochTransform)
}
override fun onDestroy() {
OchTransform.removeListener(TAG)
super.onDestroy()
}
/**

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="video_show" type="id" />
</resources>

View File

@@ -1013,6 +1013,11 @@ public class TaxiModel {
parameters.endName = PinYinUtil.getPinYinHeadChar(mCurrentOCHOrder.endSiteAddr); // 终点名称拼音首字母大写科学城C区三号门KXCCQSHM
parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon);
parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon);
// TODO 这里需要增加传入 白名单点列表、黑名单点列表,顺序按照服务端传入顺序为准。
//parameters.wayLatLons
//parameters.blackLatLons
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine(
mCurrentOCHOrder.lineId, mCurrentOCHOrder.lineName,

View File

@@ -161,6 +161,11 @@ object AutopilotManager : IOchAutopilotStatusListener {
parameters.startLatLon =
AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon)
parameters.endLatLon = AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon)
// TODO 这里需要增加传入 白名单点列表、黑名单点列表,顺序按照服务端传入顺序为准。
//parameters.wayLatLons
//parameters.blackLatLons
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine(
TaxiPassengerModel.currentOCHOrder!!.lineId,

View File

@@ -1288,6 +1288,11 @@ object TaxiTaskModel {
parameters.startLatLon =
AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon)
parameters.endLatLon = AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon)
// TODO 这里需要增加传入 白名单点列表、黑名单点列表,顺序按照服务端传入顺序为准。
//parameters.wayLatLons
//parameters.blackLatLons
if (parameters.autoPilotLine == null) {
parameters.autoPilotLine = AutopilotControlParameters.AutoPilotLine(
mCurrentTaskTrajectory!!.lineId,

View File

@@ -153,6 +153,11 @@ object AutopilotManager : IOchAutopilotStatusListener {
parameters.startLatLon =
AutopilotControlParameters.AutoPilotLonLat(startWgsLat, startWgsLon)
parameters.endLatLon = AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon)
// TODO 这里需要增加传入 白名单点列表、黑名单点列表,顺序按照服务端传入顺序为准。
//parameters.wayLatLons
//parameters.blackLatLons
if (parameters.autoPilotLine == null) {
if (TaxiPassengerModel.currentLineId != null
&& TaxiPassengerModel.currentTrajectoryInfo != null

View File

@@ -173,6 +173,7 @@ class ReportTypeView @JvmOverloads constructor(
reportTypeGroup.visibility = View.GONE
tvReportSuccess.visibility = View.GONE
tvOneClickReportTitle.text = String.format(resources.getString(R.string.identified_vehicle_malfunction),5)
hasReportOperate = false
oneClickTimer?.cancel()
oneClickTimer = object : CountDownTimer(5000, 1000) {
override fun onTick(count: Long) {
@@ -186,12 +187,14 @@ class ReportTypeView @JvmOverloads constructor(
if(!hasReportOperate){
ThreadUtils.runOnUiThread {
this@ReportTypeView.visibility = View.GONE
clickListener?.closeReportView()
}
}
}
}
oneClickTimer?.start()
//请求一键上报故障码
level = 1
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,level,0,4,1)
}

View File

@@ -1,7 +1,6 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.graphics.drawable.Drawable
import android.graphics.drawable.TransitionDrawable
import android.os.CountDownTimer
import android.text.TextUtils
@@ -14,8 +13,10 @@ import androidx.core.content.ContextCompat
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoColdStartStateListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerColdStartStateListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.util.FrameAnimatorContainerUtils
@@ -45,6 +46,8 @@ class ColdStartProcessView @JvmOverloads constructor(
const val TAG = "ColdStartProcessView"
const val LOAD_SSM_WAITING_TIME = 180000L //SSM加载超时等待时间
const val COLD_START_WAITING_TIME = 600000L //冷启动超时等待时间
const val COLD_START_SUCCESS_SHOW_TIME = 3000L //冷启动成功视图展示时长
const val COLD_START_SUCCESS_TICK_TIME = 500L //冷启动成功视图呼吸时长
}
private var ipcConnectStatus = false //连接域控状态,默认是未连接
@@ -62,6 +65,9 @@ class ColdStartProcessView @JvmOverloads constructor(
private var coldStartProcessNormalAnim: FrameAnimatorContainerUtils ?= null
private var coldStartProcessAbnormalAnim: FrameAnimatorContainerUtils ?= null
private var transition: TransitionDrawable ?= null
private var coldStartSuccessTimer: CountDownTimer?= null //冷启动成功动画倒计时
init {
LayoutInflater.from(context).inflate(R.layout.view_cold_start_process, this, true)
initView()
@@ -72,37 +78,17 @@ class ColdStartProcessView @JvmOverloads constructor(
coldStartProcessAbnormalAnim = FrameAnimatorContainerUtils(R.array.cold_start_process_abnormal,40,ivColdStartProcess)
val transition = TransitionDrawable(
transition = TransitionDrawable(
arrayOf(
ContextCompat.getDrawable(context, R.drawable.icon_cold_start_success_01), // 当前图片
ContextCompat.getDrawable(context, R.drawable.icon_cold_start_success_02) // 要渐变到的图片
)
)
ivColdStartProcess.setImageDrawable(transition)
transition.isCrossFadeEnabled = true
var tag = true
val testTimer = object: CountDownTimer(30000,500){
override fun onTick(millisUntilFinished: Long) {
ThreadUtils.runOnUiThread {
tag = if(tag){
transition.startTransition(500)
false
}else{
transition.reverseTransition(500)
true
}
}
}
transition?.isCrossFadeEnabled = true
override fun onFinish() {
ThreadUtils.runOnUiThread {
this@ColdStartProcessView.visibility = View.GONE
}
}
}
ivColdStartProcess.setOnClickListener {
testTimer.start()
CallerHmiManager.showColdStartWindow()
}
}
@@ -138,17 +124,10 @@ class ColdStartProcessView @JvmOverloads constructor(
) {
if(status == AdasConstants.IpcConnectionStatus.CONNECTED){
//域控连接成功
if(coldStartProcessAbnormalAnim?.isPlaying() == true){
coldStartProcessAbnormalAnim?.stop()
}
coldStartProcessNormalAnim?.start()
coldStartNormalView()
}else{
//域控连接失败
if(coldStartProcessNormalAnim?.isPlaying() == true){
coldStartProcessNormalAnim?.stop()
}
coldStartProcessAbnormalAnim?.start()
coldStartAbnormalView()
}
}
@@ -158,16 +137,14 @@ class ColdStartProcessView @JvmOverloads constructor(
* HQ、M1 MAP350开始弃用其他车型MAP360开始弃用
*/
override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo){
ThreadUtils.runOnUiThread{
//SSM连接成功
connectSSMSuccess()
//通过autoPilotReady判断冷启动是否成功
if(status.hasAutoPilotReady() && status.autoPilotReady && !coldStartStatus){
coldStartStatus = true
showColdStartSuccessView()
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
//SSM连接成功
coldStartNormalView()
//通过autoPilotReady判断冷启动是否成功
if(status.hasAutoPilotReady() && status.autoPilotReady && !coldStartStatus){
coldStartStatus = true
showColdStartSuccessView()
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
}
@@ -178,11 +155,35 @@ class ColdStartProcessView @JvmOverloads constructor(
* @param statusInf 数据
*/
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf){
//SSM连接成功
coldStartNormalView()
//版本兼容
if(parseVersion(true, statusInf.masterVersion) > 40600){
//主动查询冷启动状态
if(!newColdStart){
newColdStart = true
CallerAutoPilotControlManager.sendSsmFuncQueryColdStartState()
}
}else{
newColdStart = false
//通过autoPilotReady判断冷启动是否成功
Log.i(TAG,"statusInf.autoPilotReady="+statusInf.autoPilotReady)
if(statusInf.hasAutoPilotReady() && statusInf.autoPilotReady && !coldStartStatus){
coldStartStatus = true
showColdStartSuccessView()
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
}
}
/**
* 冷启动状态
* 冷启动状态变更上报以及查询状态
*
* @param token 唯一消息ID
* @param timestamp 消息发送时间 单位:毫秒
* @param isQuery 是否是查询 ture查询相应的结果 false表示状态变动域控主动推送
* @param coldStartState 数据 null表示 PadSsmMsg中的消息体为null
*/
override fun onColdStartState(
token: Long,
@@ -190,15 +191,93 @@ class ColdStartProcessView @JvmOverloads constructor(
isQuery: Boolean,
coldStartState: SsmInfo.ColdStartState?
) {
if(newColdStart){
coldStartState?.let{
Log.i(TAG,"节点自上报冷启动状态="+it.eventStatus)
ThreadUtils.runOnUiThread{
if(it.eventStatus == SsmInfo.CSState.COLD_START_READY){
if(!coldStartStatus){
//冷启动就绪
coldStartStatus = true
showColdStartSuccessView()
}
//记录冷启动成功时间
ColdStartConfig.setColdStartSuccessTime(System.currentTimeMillis())
}
if(it.eventStatus == SsmInfo.CSState.COLD_START_UNREADY || it.eventStatus == SsmInfo.CSState.COLD_START_TIMEOUT){
//展示冷启动失败视图
showColdStartFailView()
}
}
}
}
}
private fun connectSSMSuccess(){
/**
* 冷启动进行中,不存在异常项
*/
private fun coldStartNormalView(){
ThreadUtils.runOnUiThread {
if(coldStartProcessAbnormalAnim?.isPlaying() == true){
coldStartProcessAbnormalAnim?.stop()
}
if(coldStartProcessNormalAnim?.isPlaying() == false){
coldStartProcessNormalAnim?.start()
}
}
}
/**
* 冷启动进行中,存在异常项
*/
private fun coldStartAbnormalView(){
ThreadUtils.runOnUiThread {
if(coldStartProcessNormalAnim?.isPlaying() == true){
coldStartProcessNormalAnim?.stop()
}
if(coldStartProcessAbnormalAnim?.isPlaying() == false){
coldStartProcessAbnormalAnim?.start()
}
}
}
/**
* 冷启动成功视图
*/
private fun showColdStartSuccessView(){
ThreadUtils.runOnUiThread {
var label = true
coldStartSuccessTimer = object: CountDownTimer(COLD_START_SUCCESS_SHOW_TIME,COLD_START_SUCCESS_TICK_TIME){
override fun onTick(millisUntilFinished: Long) {
ThreadUtils.runOnUiThread {
label = if(label){
transition?.startTransition(500)
false
}else{
transition?.reverseTransition(500)
true
}
}
}
override fun onFinish() {
ThreadUtils.runOnUiThread {
this@ColdStartProcessView.visibility = View.GONE
}
}
}
coldStartSuccessTimer?.start()
}
}
/**
* 冷启动失败视图
*/
private fun showColdStartFailView(){
ThreadUtils.runOnUiThread {
}
}
private val pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+")

View File

@@ -43,12 +43,20 @@ fun AutopilotControlParameters.toRouteInfo(): MessagePad.RouteInfo {
endLoc.latitude = it.lat
endLoc.longitude = it.lon
}
// Routing算路白名单点赋值
this.wayLatLons?.forEach {
val locBuilder = MessagePad.Location.newBuilder()
locBuilder.latitude = it.lat
locBuilder.longitude = it.lon
routeInfo.addWayPoints(locBuilder.build())
}
// Routing算路黑名单点赋值
this.blackLatLons?.forEach {
val locBuilder = MessagePad.Location.newBuilder()
locBuilder.latitude = it.lat
locBuilder.longitude = it.lon
routeInfo.addBlackPoints(locBuilder.build())
}
if (this.routeID > 0) {
routeInfo.routeID = this.routeID
}
@@ -61,7 +69,7 @@ fun AutopilotControlParameters.toRouteInfo(): MessagePad.RouteInfo {
routeInfo.startLocation = startLoc.build()
routeInfo.endLocation = endLoc.build()
//20240523 用于表示判断是否是站点下单。默认false起点下单接管下单 true: 中间站点下单
// TODO 20240523 用于表示判断是否是站点下单。默认false起点下单接管下单 true: 中间站点下单
//routeInfo.isStation = false
val line = MessagePad.Line.newBuilder()
@@ -121,6 +129,7 @@ class AutopilotControlParameters {
@JvmField
var startLatLon: AutoPilotLonLat? = null
// Bus 需要将中间站点填充进去(运营平台完成此步骤)
@JvmField
var wayLatLons: List<AutoPilotLonLat>? = null // Routing 给算路引擎使用的经停点列表,不是真正的要停车

View File

@@ -57,6 +57,9 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider {
/**
* 发送 轨迹下载请求
*
* @param autoPilotLine 线路相关参数详情见PB message_pad.proto -> Line
* @param routeInfo 20240523 进行自动算路,务必下单时候携带自动驾驶路径信息,否则可不填!
*/
fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine, routeInfo: MessagePad.RouteInfo?)

View File

@@ -204,7 +204,7 @@ object CallerAutoPilotControlManager {
}
/**
* 发送 轨迹下载请求
* 发送 轨迹下载请求。带有Routing的参数让MAP进行离线算路。
*/
fun sendTrajectoryDownloadReq(autopilotControlParameters: AutopilotControlParameters) {
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
@@ -216,6 +216,7 @@ object CallerAutoPilotControlManager {
/**
* 发送 轨迹下载请求
* @param autoPilotLine 启动算路参数
*/
fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) {
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {