Merge branch 'dev_arch_opt_3.0' into dev_robosweeper-d_app-module_221230_1.1.0

# Conflicts:
#	OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java
#	OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperOrderModel.java
#	OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperLimitingVelocityView.java
#	OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/SweeperTrafficDataView.java
#	OCH/mogo-och-sweeper/src/main/res/drawable/sweeper_list_left_top_line.xml
#	app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt
#	core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt
#	core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml
This commit is contained in:
donghongyu
2023-01-30 11:58:56 +08:00
234 changed files with 8199 additions and 4568 deletions

View File

@@ -10,6 +10,11 @@ import com.mogo.eagle.function.biz.dispatch.DispatchAutoPilotManager.Companion.d
import com.mogo.eagle.function.biz.monitoring.CronTaskManager.Companion.cronTaskManager
import com.mogo.eagle.function.biz.notice.NoticeSocketManager.Companion.noticeSocketManager
import com.mogo.eagle.function.biz.notice.network.NoticeNetWorkManager
import com.mogo.eagle.function.biz.v2x.speedlimit.SpeedLimitDataManager
import com.mogo.eagle.function.biz.v2x.speedlimit.SpeedLimitDispatcher
import com.mogo.eagle.function.biz.v2x.trafficlight.core.MogoTrafficLightManager
import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightDispatcher
import com.mogo.eagle.function.biz.v2x.vip.VipCarManager
@Route(path = MogoServicePaths.PATH_FUNC_BIZ)
class FuncBizProvider : IMoGoFuncBizProvider {
@@ -21,6 +26,13 @@ class FuncBizProvider : IMoGoFuncBizProvider {
noticeSocketManager.init(context)
dispatchAutoPilotManager.init(context)
cronTaskManager.startCronTask()
MogoTrafficLightManager.INSTANCE.initServer(context)
TrafficLightDispatcher.INSTANCE.initServer(context) //todo 红绿灯中心模块放入dataCenter
VipCarManager.INSTANCE.initServer(context)
SpeedLimitDataManager.getInstance().start()
SpeedLimitDispatcher.INSTANCE.initLimit(context)
// RedLightWarningManager.INSTANCE.listenTrafficLight()
}
override fun feedBackNoticeTraffic(infoId: String, sn: String, accept: Int) {
@@ -62,5 +74,9 @@ class FuncBizProvider : IMoGoFuncBizProvider {
noticeSocketManager.release()
dispatchAutoPilotManager.release()
cronTaskManager.release()
VipCarManager.INSTANCE.destroy()
TrafficLightDispatcher.INSTANCE.destroy()
// RedLightWarningManager.INSTANCE.onDestroy()
}
}

View File

@@ -30,7 +30,7 @@ class DispatchServiceModel private constructor() {
}
private var mAdasApiService: IDispatchAdasApiService =
MoGoRetrofitFactory.getInstance(HostConst.DATA_SERVICE_HOST).create(
MoGoRetrofitFactory.getInstance(HostConst.getEagleHost()).create(
IDispatchAdasApiService::class.java
)

View File

@@ -14,7 +14,7 @@ interface IDispatchAdasApiService {
* @return [BaseData]
*/
@FormUrlEncoded
@POST("/dataService/autoDriver/receiveCarPreSetPath")
@POST("eagle-eye-dns/eagle-eye-dns/dataService/autoDriver/receiveCarPreSetPath")
fun uploadAutopilotRoute(@FieldMap parameters: Map<String, Any>): Observable<BaseData>
/**
@@ -24,7 +24,7 @@ interface IDispatchAdasApiService {
* @return [BaseData]
*/
@FormUrlEncoded
@POST("/dataService/autoDriver/receiverDestSiteResult")
@POST("eagle-eye-dns/dataService/autoDriver/receiverDestSiteResult")
fun uploadDispatchResult(@FieldMap parameters: MutableMap<String, Any>): Observable<BaseData>
/**
@@ -34,6 +34,6 @@ interface IDispatchAdasApiService {
* @return [BaseData]
*/
@FormUrlEncoded
@POST("/dataService/autoDriver/receiveAutopilotState")
@POST("eagle-eye-dns/dataService/autoDriver/receiveAutopilotState")
fun uploadAutopilotState(@FieldMap parameters: MutableMap<String, Any>): Observable<BaseData>
}

View File

@@ -7,12 +7,12 @@ import com.mogo.commons.constants.HostConst
import com.mogo.commons.utils.RetryWithDelay
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.camera.ReqLiveCarBean
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ20ListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.function.biz.monitoring.net.ICameraListServices
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MONITOR
import com.mogo.eagle.function.biz.monitoring.net.ICameraListServices
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -90,8 +90,8 @@ class CronTaskManager {
* 请求路口一定范围内的设备信息(包含:摄像头、灯)
*/
private fun requestDeviceList() {
CallerMapLocationListenerManager.getCurrentLocation()?.let { location ->
disposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
CallerChassisLocationGCJ20ListenerManager.getChassisLocationGCJ02()?.let { location ->
disposable = MoGoRetrofitFactory.getInstance(HostConst.getEagleHost())
.create(ICameraListServices::class.java)
.getDeviceList(location.longitude, location.latitude, 500)
.subscribeOn(Schedulers.io())
@@ -124,8 +124,8 @@ class CronTaskManager {
}
private fun requestCarCameraList() {
CallerMapLocationListenerManager.getCurrentLocation()?.let { location ->
carDisposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
CallerChassisLocationGCJ20ListenerManager.getChassisLocationGCJ02()?.let { location ->
carDisposable = MoGoRetrofitFactory.getInstance(HostConst.getEagleHost())
.create(ICameraListServices::class.java)
.getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude))
.subscribeOn(Schedulers.io())
@@ -193,7 +193,7 @@ class CronTaskManager {
streamDisposable?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
streamDisposable = MoGoRetrofitFactory.getInstance(HostConst.getEagleHost())
.create(ICameraListServices::class.java)
.reqOpenCameraStream(cameraIp)
.subscribeOn(Schedulers.io())
@@ -222,7 +222,7 @@ class CronTaskManager {
streamDisposable2?.let {
if (!it.isDisposed) it.dispose()
}
streamDisposable2 = MoGoRetrofitFactory.getInstance(HostConst.CITY_HOST)
streamDisposable2 = MoGoRetrofitFactory.getInstance(HostConst.getEagleHost())
.create(ICameraListServices::class.java)
.reqOpenCameraStreamWithRetry(cameraIp)
.flatMap {

View File

@@ -9,21 +9,21 @@ interface ICameraListServices {
@GET("/yycp-smartTransportationAiCloud-service/eagle/device/list")
fun getCameraList(@Query("roadId") roadId: String?): Single<CameraListInfo?>
@POST("/yycp-launcherSnapshot/car/queryLiveCarByLocal")
@POST("eagle-eye-dns/yycp-launcherSnapshot/car/queryLiveCarByLocal")
fun getCarCameraList(@Body reqBody: ReqLiveCarBean): Single<LiveCarCameraInfo?>
@GET("/openStream/{cameraIp}")
fun openCameraStream(@Path("cameraIp") cameraIp: String): Single<CameraStreamEntity>
@GET("/camera-stream/stream/camera/openStream")
@GET("eagle-eye-dns/camera-stream/stream/camera/openStream")
fun reqOpenCameraStream(@Query("ip") cameraIp: String): Single<OpenCameraStreamEntity>
@GET("/mec-etl-server/crossing/geo/device")
@GET("eagle-eye-dns/mec-etl-server/crossing/geo/device")
fun getDeviceList(
@Query("lon") lon: Double, @Query("lat") lat: Double,
@Query("radiusMeter") radiusMeter: Int
): Single<CameraListInfo?>
@GET("/camera-stream/stream/camera/openStream")
@GET("eagle-eye-dns/camera-stream/stream/camera/openStream")
fun reqOpenCameraStreamWithRetry(@Query("ip") cameraIp: String): Observable<OpenCameraStreamEntity>
}

View File

@@ -27,7 +27,7 @@ public interface INoticeApiService {
* @return {@link NoticeTrafficStyleInfo}
*/
@Headers("Content-Type:application/json;charset=UTF-8")
@POST("/deva/accidentInfoManage/queryMyAccidentHandleInfo/server/v1")
@POST("eagle-eye-dns/deva/accidentInfoManage/queryMyAccidentHandleInfo/server/v1")
Observable<NoticeTrafficStyleInfo> getAccidentInfo(@Body RequestBody requestBody);
/**
@@ -36,7 +36,7 @@ public interface INoticeApiService {
* @param accidentParameters 请求数据(infoID事故ID;sn;status接受状态 0否 1是)
* @return {@link BaseData}
*/
@GET("/deva/accidentInfoManage/policeUpdateTroubleStatus")
@GET("eagle-eye-dns/deva/accidentInfoManage/policeUpdateTroubleStatus")
Observable<BaseData> sendAcceptStatus(@QueryMap Map<String, String> accidentParameters);
/**

View File

@@ -5,6 +5,7 @@ import android.util.ArrayMap;
import com.mogo.cloud.network.NetConstants;
import com.mogo.cloud.network.RetrofitFactory;
import com.mogo.cloud.passport.MoGoAiCloudClient;
import com.mogo.commons.constants.HostConst;
import com.mogo.eagle.core.data.BaseData;
import com.mogo.eagle.core.data.notice.NoticeNormalDetail;
import com.mogo.eagle.core.data.notice.NoticeRequest;
@@ -34,7 +35,7 @@ public class NoticeNetWorkManager {
private final INoticeApiService mNoticeApiService;
private NoticeNetWorkManager() {
mNoticeApiService = RetrofitFactory.INSTANCE.getInstance(NetConstants.DEVA_HOST)
mNoticeApiService = RetrofitFactory.INSTANCE.getInstance(HostConst.getEagleHost())
.create(INoticeApiService.class);
}

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.redlightwarning
package com.mogo.eagle.function.biz.v2x.redlightwarning
import android.util.Log
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP
@@ -16,16 +16,15 @@ import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.api.vip.IMoGoVipSetListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ20ListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager
import com.mogo.eagle.core.function.v2x.trafficlight.core.MogoTrafficLightManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import com.mogo.eagle.core.utilcode.util.LocationUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.function.biz.v2x.trafficlight.core.MogoTrafficLightManager
import com.zhjt.service_biz.BizConfig
import mogo.telematics.pad.MessagePad
import kotlin.math.abs
@@ -275,7 +274,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener,
fun onDestroy() {
CallVipSetListenerManager.removeListener(TAG)
CallerTrafficLightListenerManager.removeListener(TAG)
CallerMapLocationListenerManager.removeListener(TAG, false)
CallerChassisLocationGCJ20ListenerManager.removeListener(TAG)
}
override fun onChassisLocationGCJ02(gnssInfo: MessagePad.GnssInfo?) {

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.speedlimit;
package com.mogo.eagle.function.biz.v2x.speedlimit;
import static com.mogo.eagle.core.data.config.HmiBuildConfig.isShowObuLimitSpeedView;
import static com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.BIZ_SLW;
@@ -61,15 +61,16 @@ public class SpeedLimitDataManager implements IMoGoChassisLocationGCJ02Listener
@BizConfig(biz = V2I, dependentBizNode = "", bizNode = BIZ_SLW)
private void getSpeedLimit() {
if (!isShowObuLimitSpeedView) {
// if (!isShowObuLimitSpeedView) {
int speedLimit = CallerMapUIServiceManager.INSTANCE.getMapUIController().getLimitSpeed(mLocation.getLongitude(), mLocation.getLatitude(), (float) mLocation.getHeading());
UiThreadHandler.post(() -> {
if (speedLimit > 0) {
CallerHmiManager.INSTANCE.showLimitingVelocity(speedLimit);
// CallerHmiManager.INSTANCE.showLimitingVelocity(speedLimit, 1);
CallLimitingVelocityListenerManager.INSTANCE.invokeOnLimitingVelocityChange(speedLimit);
}
});
}
// }
}
}

View File

@@ -0,0 +1,70 @@
package com.mogo.eagle.function.biz.v2x.speedlimit
import android.content.Context
import com.mogo.eagle.core.function.api.v2x.LimitingVelocityListener
import com.mogo.eagle.core.function.api.v2x.ObuLimitingSpeedListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
import com.mogo.eagle.core.function.call.v2x.CallLimitingVelocityListenerManager
import com.mogo.eagle.core.function.call.v2x.CallObuLimitingSpeedListenerManager
/**
* @author lixiaopeng
* @description 对多个限速进行调度maprsu ...
* @since: 2023/1/12
*/
class SpeedLimitDispatcher : LimitingVelocityListener, ObuLimitingSpeedListener {
companion object {
const val TAG = "SpeedLimitDispatcher"
val INSTANCE: SpeedLimitDispatcher by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
SpeedLimitDispatcher()
}
}
private var mContext: Context? = null
//是否有AI获取红绿灯灯态
private var hasObuStatus: Boolean = false
fun initLimit(context: Context) {
mContext = context
//注册监听MAP的限速
CallLimitingVelocityListenerManager.addListener(TAG, this)
//注册监听OBU的限速
CallObuLimitingSpeedListenerManager.addListener(TAG, this)
}
/**
* 地图限速数据
*/
override fun onLimitingVelocityChange(limitingVelocity: Int) {
// CallerHmiManager.disableLimitingVelocity()
if (!hasObuStatus) {
CallerHmiManager.showLimitingVelocity(limitingVelocity, 1)
}
}
/**
* obu限速
*/
override fun onObuLimitingSpeedChange(limitingSpeed: Int) {
// CallerHmiManager.disableLimitingVelocity()
if (limitingSpeed > 0) {
hasObuStatus = true
CallerHmiManager.showLimitingVelocity(limitingSpeed, 2)
} else {
hasObuStatus = false
CallerHmiManager.disableLimitingVelocity()
}
}
fun destroy() {
//取消注册监听AI云获取红绿灯状态
CallerTrafficLightListenerManager.removeListener(TAG)
//取消注册监听工控机感知红绿灯
CallerAutopilotIdentifyListenerManager.removeListener(TAG)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.trafficlight
package com.mogo.eagle.function.biz.v2x.trafficlight
import com.mogo.eagle.core.data.trafficlight.*
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.trafficlight.core
package com.mogo.eagle.function.biz.v2x.trafficlight.core
import android.content.Context
import android.os.Handler
@@ -8,12 +8,12 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Liste
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ20ListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
import com.mogo.eagle.core.function.v2x.trafficlight.TrafficLightHMIManager
import com.mogo.eagle.core.function.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_LOOP_SEARCH_CROSS_ROAD
import com.mogo.eagle.core.function.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_LOOP_SEARCH_TRAFFIC_LIGHT
import com.mogo.eagle.core.function.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_STOP_SEARCH_CROSS_ROAD
import com.mogo.eagle.core.function.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_STOP_SEARCH_TRAFFIC_LIGHT
import com.mogo.eagle.core.function.v2x.trafficlight.network.TrafficLightNetWorkModel
import com.mogo.eagle.function.biz.v2x.trafficlight.TrafficLightHMIManager
import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_LOOP_SEARCH_CROSS_ROAD
import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_LOOP_SEARCH_TRAFFIC_LIGHT
import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_STOP_SEARCH_CROSS_ROAD
import com.mogo.eagle.function.biz.v2x.trafficlight.core.TrafficLightThreadHandler.Companion.MSG_WHAT_STOP_SEARCH_TRAFFIC_LIGHT
import com.mogo.eagle.function.biz.v2x.trafficlight.network.TrafficLightNetWorkModel
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import mogo.telematics.pad.MessagePad

View File

@@ -0,0 +1,166 @@
package com.mogo.eagle.function.biz.v2x.trafficlight.core
import android.content.Context
import android.os.Handler
import com.mogo.eagle.core.data.trafficlight.TrafficLightResult
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener
import com.mogo.eagle.core.function.api.obu.IMoGoObuTrafficLightListener
import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.obu.CallerObuTrafficLightListenerManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
import com.mogo.eagle.function.biz.v2x.trafficlight.TrafficLightHMIManager
import perception.TrafficLightOuterClass
import perception.TrafficLightOuterClass.TrafficLight
/**
* @author XuXinChao
* @description 对多个红绿灯信号来源进行统一调度AI云、工控机
* @since: 2022/4/28
*/
class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLightListener,
IMoGoObuTrafficLightListener {
companion object {
const val TAG = "TrafficLightDispatcher"
val INSTANCE: TrafficLightDispatcher by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
TrafficLightDispatcher()
}
}
private var mContext: Context? = null
//是否有AI获取红绿灯灯态
private var hasAiLightStatus: Boolean = false
//obu数据
private var hasObuLightStatus: Boolean = false
fun initServer(context: Context) {
mContext = context
//注册监听AI云获取红绿灯状态
CallerTrafficLightListenerManager.addListener(TAG, this)
//注册监听AI云进入路口
CallerTrafficLightListenerManager.addListener(TAG, this)
//注册监听红绿灯请求失败
CallerTrafficLightListenerManager.addListener(TAG, this)
//注册监听工控机感知红绿灯
CallerAutopilotIdentifyListenerManager.addListener(TAG, this)
//obu红绿灯数据
CallerObuTrafficLightListenerManager.addListener(TAG, this)
}
/**
* 工控机感知红绿灯
* @param trafficLights 感知红绿灯
*/
override fun onAutopilotPerceptionTrafficLight(trafficLights: TrafficLightOuterClass.TrafficLights?) {
if (!hasObuLightStatus) {
if (!hasAiLightStatus) {
trafficLights?.let { it ->
var light: TrafficLight? = null
if (it.hasStraight()) {
light = it.straight
} else if (it.hasLeft()) {
light = it.left
} else if (it.hasRight()) {
light = it.right
} else if (it.hasUTurn()) {
light = it.uTurn
}
if (light == null) {
//隐藏红绿灯显示
TrafficLightHMIManager.INSTANCE.hideTrafficLight()
} else {
when (light.state) {
TrafficLightOuterClass.LightState.STATE_RED -> {
//红灯
CallerHmiManager.showWarningTrafficLight(1, 2)
CallerHmiManager.changeCountdownGreen(0)
}
TrafficLightOuterClass.LightState.STATE_YELLOW -> {
//黄灯
CallerHmiManager.showWarningTrafficLight(2, 2)
CallerHmiManager.changeCountdownGreen(0)
}
TrafficLightOuterClass.LightState.STATE_GREEN -> {
//绿灯
CallerHmiManager.showWarningTrafficLight(3, 2)
CallerHmiManager.changeCountdownGreen(0)
}
TrafficLightOuterClass.LightState.STATE_OFF -> {
//黑灯,隐藏红绿灯显示
TrafficLightHMIManager.INSTANCE.hideTrafficLight()
}
else -> {}
}
}
}
}
}
}
/**
* AI云获取红绿灯状态
*/
override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) {
if (!hasObuLightStatus) {
TrafficLightHMIManager.INSTANCE.updateTrafficLight(trafficLightResult)
hasAiLightStatus = true
}
}
/**
* 车辆进入路口回调
* @param enter true:进入路口false:离开路口
*/
override fun onEnterCrossRoad(enter: Boolean) {
if (!enter) {
Handler().postDelayed({
hasAiLightStatus = false
hasObuLightStatus = false
}, 5000)
CallerTrafficLightListenerManager.resetTrafficLightData()
//如果没有OBU灯态则进行隐藏如果有OBU灯态则交由OBU管理
if(!hasObuLightStatus){
TrafficLightHMIManager.INSTANCE.hideTrafficLight()
}
}
}
/**
* 红绿灯接口请求失败
*/
override fun onTrafficRequestError() {
hasAiLightStatus = false
CallerTrafficLightListenerManager.resetTrafficLightData()
if(!hasObuLightStatus){
if (TrafficLightHMIManager.INSTANCE.isWarningTrafficLightShow()) {
TrafficLightHMIManager.INSTANCE.hideTrafficLight()
}
}
}
/**
* obu 红绿灯数据
*/
override fun onObuTrafficLight(light: Int) {
super.onObuTrafficLight(light)
hasObuLightStatus = true
CallerHmiManager.showWarningTrafficLight(light, 3)
}
fun destroy() {
//取消注册监听AI云获取红绿灯状态
CallerTrafficLightListenerManager.removeListener(TAG)
//取消注册监听工控机感知红绿灯
CallerAutopilotIdentifyListenerManager.removeListener(TAG)
//取消注册监听红绿灯请求失败
CallerTrafficLightListenerManager.removeListener(TAG)
//取消注册监听AI云进入路口
CallerTrafficLightListenerManager.removeListener(TAG)
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.trafficlight.core
package com.mogo.eagle.function.biz.v2x.trafficlight.core
import android.os.Handler
import android.os.Looper

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.trafficlight.network
package com.mogo.eagle.function.biz.v2x.trafficlight.network
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.trafficlight.RoadIDResult

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.trafficlight.network
package com.mogo.eagle.function.biz.v2x.trafficlight.network
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseResponse

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.vip
package com.mogo.eagle.function.biz.v2x.vip
import android.content.Context
import android.os.Handler
@@ -21,17 +21,17 @@ import com.mogo.eagle.core.data.trafficlight.isRed
import com.mogo.eagle.core.data.v2x.VipMessage
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager
import com.mogo.eagle.core.function.v2x.trafficlight.core.MogoTrafficLightManager
import com.mogo.eagle.core.function.v2x.vip.network.VipNetWorkModel
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.eagle.function.biz.v2x.trafficlight.core.MogoTrafficLightManager
import com.mogo.eagle.function.biz.v2x.vip.network.VipNetWorkModel
import com.zhjt.service_biz.BizConfig
class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListener,
@@ -156,7 +156,6 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
MSG_WHAT_VIP_CANCEL,
cancelDelayTime - System.currentTimeMillis()
)
CallerHmiManager.vipIdentification(true)
CallVipSetListenerManager.invokeVipSetStatus(true)
CallerTrafficLightListenerManager.addListener(TAG, this)
}
@@ -167,7 +166,6 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
handler.removeMessages(MSG_WHAT_VIP_CANCEL)
}
resetConditions()
CallerHmiManager.vipIdentification(false)
CallVipSetListenerManager.invokeVipSetStatus(false)
CallerTrafficLightListenerManager.removeListener(TAG)
}
@@ -197,9 +195,9 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
fun turnLight(controlTime: Int) {
if (result == null || mContext == null) return
val mogoLocation = CallerMapLocationListenerManager.getCurrentLocation()
val mogoLocation = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
if (mogoLocation != null) {
val bearing = mogoLocation.bearing.toDouble()
val bearing = mogoLocation.heading
CallerLogger.d("$M_V2X$TAG", "-- turnLight -- ")
MogoTrafficLightManager.INSTANCE.turnLightToGreen(
result!!.lightId, result!!.crossId, bearing, controlTime,

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.vip.network
package com.mogo.eagle.function.biz.v2x.vip.network
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.v2x.VipRequest

View File

@@ -1,4 +1,4 @@
package com.mogo.eagle.core.function.v2x.vip.network
package com.mogo.eagle.function.biz.v2x.vip.network
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseResponse

View File

@@ -15,7 +15,7 @@ import com.mogo.eagle.core.function.api.chat.biz.IMCallType.CALL_TYPE_DEFAULT
import com.mogo.eagle.core.function.api.chat.biz.IMCallType.CALL_TYPE_VEHICLE_TEAM
import com.mogo.eagle.core.function.api.chat.biz.IMCallType.CALL_TYPE_VOICE
import com.mogo.eagle.core.function.api.chat.biz.IMType.*
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ20ListenerManager
import com.mogo.eagle.core.function.chat.facade.analytics.ChatAnalyticsFacade
import com.mogo.eagle.core.function.chat.facade.audio.AudioFocusFacade
import com.mogo.eagle.core.function.chat.facade.bridge.BridgeApi
@@ -581,7 +581,7 @@ object MoGoChatFacade: IMoGoChatFacade {
}
//告之服务器给发送方下发接收通话消息
try {
val location = CallerMapLocationListenerManager.getCurrentLocation()
val location = CallerChassisLocationGCJ20ListenerManager.getChassisLocationGCJ02()
val response = serverApi.requestConnectStatus(ConnectStatusParam(MoGoAiCloudClientConfig.getInstance().sn, sn, roomId, PUSH_MSG_AGREE_ENTER, CALL_TYPE_VOICE.type).also {
it.nickName = mySelf.get().name
it.headImgUrl = mySelf.get().icon
@@ -812,7 +812,7 @@ object MoGoChatFacade: IMoGoChatFacade {
}
val response = serverApi.inviteJoinVehicleTeam(CallRequestParam().also {
val user = mySelf.get()
val location = CallerMapLocationListenerManager.getCurrentLocation()
val location = CallerChassisLocationGCJ20ListenerManager.getChassisLocationGCJ02()
it.snSender = mySn
it.snReceiver = sn
it.nickName = user.name
@@ -958,7 +958,7 @@ object MoGoChatFacade: IMoGoChatFacade {
}
//告之服务器给发送方下发接收通话消息
try {
val location = CallerMapLocationListenerManager.getCurrentLocation()
val location = CallerChassisLocationGCJ20ListenerManager.getChassisLocationGCJ02()
val response = serverApi.requestConnectStatus(ConnectStatusParam(MoGoAiCloudClientConfig.getInstance().sn, sn, roomId, PUSH_MSG_AGREE_ENTER, CALL_TYPE_VEHICLE_TEAM.type).also {
it.nickName = mySelf.get().name
it.headImgUrl = mySelf.get().icon

View File

@@ -3,13 +3,12 @@ package com.mogo.eagle.core.function.chat.facade.net
import com.google.gson.Gson
import com.google.gson.JsonObject
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.constants.HostConst
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.chat.UserInfo
import com.mogo.eagle.core.function.api.chat.biz.ChatConsts
import com.mogo.eagle.core.function.api.chat.biz.IMCallType.CALL_TYPE_VOICE
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.function.chat.facade.consts.ChatHttp
import com.mogo.eagle.core.function.chat.facade.consts.ChatHttp.Companion.getConfig
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ20ListenerManager
import com.mogo.eagle.core.function.chat.facade.net.bean.*
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
@@ -33,7 +32,7 @@ internal class ChatServiceModel {
val sns = arrayListOf(sn)
val requestData = SnArrayRequestBody().also { it.sns = sns }
return apiCall {
getNetWorkApi(getConfig())?.queryUserInfoBySnS(requestData)
getNetWorkApi()?.queryUserInfoBySnS(requestData)
?: throw IllegalStateException("apis is null.")
}.let { itx ->
if (itx.code != 0 && itx.code != 200) {
@@ -70,7 +69,7 @@ internal class ChatServiceModel {
val map = hashMapOf<String, String>()
val sn = MoGoAiCloudClientConfig.getInstance().sn
val location = CallerMapLocationListenerManager.getCurrentLocation()
val location = CallerChassisLocationGCJ20ListenerManager.getChassisLocationGCJ02()
if (location != null) {
params.lon = location.longitude
params.lat = location.latitude
@@ -104,7 +103,7 @@ internal class ChatServiceModel {
suspend fun requestRoomInfo(param: CallRequestParam): BaseResponse<RoomInfo> {
val map = hashMapOf<String, String>()
val location = CallerMapLocationListenerManager.getCurrentLocation()
val location = CallerChassisLocationGCJ20ListenerManager.getChassisLocationGCJ02()
if (location != null) {
param.lat = location.latitude
param.lon = location.longitude
@@ -120,7 +119,7 @@ internal class ChatServiceModel {
return call.invoke()
}
private fun getNetWorkApi(baseUrl: String = ChatHttp.getBaseUrl()): HttpApi? {
private fun getNetWorkApi(baseUrl: String = HostConst.getEagleHost()): HttpApi? {
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl).create(HttpApi::class.java)
}
}
@@ -128,7 +127,7 @@ internal class ChatServiceModel {
internal interface HttpApi {
@FormUrlEncoded
@POST("/yycp-chat-service/car/voiceRoom/no/operate/v1")
@POST("eagle-eye-dns/yycp-chat-service/car/voiceRoom/no/operate/v1")
suspend fun requestConnectStatus(
@Query("sn") sn: String,
@FieldMap connectStatus: Map<String, String>
@@ -136,24 +135,24 @@ internal interface HttpApi {
//邀请加入车队
@FormUrlEncoded
@POST("/yycp-chat-service/car/chat/no/inviteJoinTeam/v1")
@POST("eagle-eye-dns/yycp-chat-service/car/chat/no/inviteJoinTeam/v1")
suspend fun inviteJoinVehicleTeam(@FieldMap inviteVehicleTeam: Map<String, String>): BaseResponse<Any>
//车队状态同步
@FormUrlEncoded
@POST("/yycp-chat-service/car/chat/no/operateTeamRoom/v1")
@POST("eagle-eye-dns/yycp-chat-service/car/chat/no/operateTeamRoom/v1")
suspend fun requestVehicleTeamConnectStatus(@FieldMap connectStatus: Map<String, String>): BaseResponse<Any>
//查询用户是否在线
@FormUrlEncoded
@POST("/yycp-chat-service/car/queryOnLineBySn/v1")
@POST("eagle-eye-dns/yycp-chat-service/car/queryOnLineBySn/v1")
suspend fun isOnLine(@FieldMap onLine: Map<String, String>): BaseResponse<OnLineStatus>
@POST("/yycp-realtimeLocations/realTimeLocationServer/queryRsAncCarAndUserInfoBySns")
@POST("eagle-eye-dns/yycp-realtimeLocations/realTimeLocationServer/queryRsAncCarAndUserInfoBySns")
suspend fun queryUserInfoBySnS(@Body body: SnArrayRequestBody): BaseResponse<JsonObject>
//语音房间信息原路径dataService
@FormUrlEncoded
@POST("/yycp-chat-service/car/sender/no/createRoom/v1")
@POST("eagle-eye-dns/yycp-chat-service/car/sender/no/createRoom/v1")
suspend fun requestRoomInfo(@FieldMap roomInfo: Map<String, String>): BaseResponse<RoomInfo>
}

View File

@@ -51,6 +51,8 @@ import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListener
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager.invokeAutopilotRotting
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningTrajectoryListenerManager.invokeAutopilotTrajectory
import com.mogo.eagle.core.function.call.autopilot.CallerStartAutopilotFailedListenerManager.invokeStartAutopilotFailed
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.obucombine.CallerObuDcCombineListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.zhidao.support.adas.high.AdasManager
@@ -63,6 +65,7 @@ import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD
import function_state_management.FunctionStates
import mogo.telematics.pad.MessagePad
import mogo.telematics.pad.MessagePad.TrackedObject
import mogo.v2x.ObuWarningEvent
import mogo_msg.MogoReportMsg
import perception.TrafficLightOuterClass
import planning.RoboSweeperTaskIndexOuterClass
@@ -524,6 +527,16 @@ class MoGoAdasListenerImpl : OnAdasListener {
}
}
/**
* OBU预警事件
*
* @param header 头
* @param obuWarningData 数据
*/
override fun onObuWarningData(header: MessagePad.Header?, obuWarningData: ObuWarningEvent.ObuWarningData?) {
CallerObuDcCombineListenerManager.invokeObuDcData(obuWarningData)
}
/**
* 重构后的功能状态
*

View File

@@ -3,7 +3,6 @@ package com.mogo.eagle.core.function.msgbox
import android.content.Context
import android.os.Looper
import com.mogo.eagle.core.data.msgbox.*
import com.mogo.eagle.core.data.notice.NoticeNormalData
import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager
import com.mogo.eagle.core.function.msgbox.db.MsgBoxDb

View File

@@ -11,10 +11,19 @@ import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.RecordBagMsg
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.utilcode.util.*
import com.zhjt.mogo_core_function_devatools.badcase.biz.*
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
@@ -27,7 +36,7 @@ import record_cache.RecordPanelOuterClass
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit
internal object BadCaseManager : LifecycleEventObserver {
internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener {
const val TAG = "BadCase"
@@ -96,6 +105,8 @@ internal object BadCaseManager : LifecycleEventObserver {
* 主动采集BadCase
*/
fun initBadCase(view: View) {
CallerAutopilotRecordListenerManager.addListener(TAG, this)
val activity = view.context as? FragmentActivity
?: throw IllegalStateException("please ensure context is FragmentActivity.")
view.setOnClickListener {
@@ -193,24 +204,62 @@ internal object BadCaseManager : LifecycleEventObserver {
}
}
override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
super.onAutopilotRecordResult(recordPanel)
CallerLogger.d("$M_DEVA$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}")
if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) {
if (recordPanel.stat == 100 || recordPanel.stat == 101) {
//成功结束录制
TipToast.shortTip(
"${
TimeUtils.millis2String(
System.currentTimeMillis(),
TimeUtils.getHourMinSecondFormat()
)
} bag录制成功"
)
}
if (recordPanel.stat == 200) {
//录制失败
TipToast.shortTip(
"${
TimeUtils.millis2String(
System.currentTimeMillis(),
TimeUtils.getHourMinSecondFormat()
)
} bag录制失败"
)
}
return
}
//在工控机taxi2.3.0版本和Bus2.4.0版本上不支持被动录包,不进行被动录包的弹窗
BadCaseConfig.dockerVersion?.let {
if (it.contains("taxi") && it.contains("2.3.0")) {
return
}
if (it.contains("bus") && it.contains("2.4.0")) {
return
}
}
//处于非美化模式下弹窗是地图数据采集任务时即type=2时不弹窗
if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type != 2) {
//只在司机屏生效,乘客屏不生效
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.RECORD, RecordBagMsg(
recordPanel.key, recordPanel.stat, recordPanel.id,
recordPanel.type, recordPanel.filename, recordPanel.note
)
)
)
}
}
}
override fun onStateChanged(source: LifecycleOwner, event: Event) {
}
}
internal fun RecordPanelOuterClass.RecordPanel.toRecord(): AutoPilotRecord =
AutoPilotRecord().also {
it.id = this.id
it.stat = this.stat
it.key = this.key.toString()
it.note = this.note
it.type = this.type
it.total = this.totalSize
it.fileName = this.filename
it.duration = this.duration.toDouble()
it.diskFree = this.diskFree
it.consumed = false
}

View File

@@ -373,6 +373,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel")
ThreadUtils.runOnUiThread {
if (recordKey == null) {
recordKey = recordPanel.key.toString()

View File

@@ -1,20 +0,0 @@
package com.zhjt.mogo_core_function_devatools.badcase.consts
import com.mogo.commons.debug.DebugConfig
internal object BadCaseHost {
private const val HOST_DEV = "http://dzt-test.zhidaozhixing.com/"
private const val HOST_RELEASE = "http://dzt.zhidaozhixing.com/"
fun getHost(): String{
return when (DebugConfig.getNetMode()) {
DebugConfig.NET_MODE_DEV -> HOST_DEV
DebugConfig.NET_MODE_QA -> HOST_DEV
DebugConfig.NET_MODE_DEMO -> HOST_RELEASE
DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE
else -> HOST_RELEASE
}
}
}

View File

@@ -1,12 +1,12 @@
package com.zhjt.mogo_core_function_devatools.badcase.repository.net
import com.mogo.commons.constants.HostConst
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseApi
import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.UploadResult
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseHost
import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.BadCaseResponse.Reason
import kotlinx.coroutines.withContext
import kotlin.coroutines.coroutineContext
@@ -16,7 +16,7 @@ internal class BadCaseNetModel {
suspend fun get(channel: String?, result: MutableList<Reason>, pageNo: Int) {
try {
MoGoRetrofitFactory
.getInstance(BadCaseHost.getHost())
.getInstance(HostConst.getEagleHost())
.create(BadCaseApi::class.java)
.get(channel ?: "", pageNo)
.takeIf {
@@ -42,7 +42,7 @@ internal class BadCaseNetModel {
suspend fun upload(map: Map<String, String>): UploadResult? = try {
CallerLogger.d("$M_DEVA${BadCaseManager.TAG}", "upload_params:$map")
MoGoRetrofitFactory
.getInstance(BadCaseHost.getHost())
.getInstance(HostConst.getEagleHost() )
.create(BadCaseApi::class.java)
.post(map)
.takeIf {

View File

@@ -57,7 +57,7 @@ class V2XLimitingVelocityBroadcastReceiver : BroadcastReceiver() {
* @param limitingVelocitySpeed 限速速度
*/
private fun dispatchShowWaring(limitingVelocitySpeed: Int) {
CallerHmiManager.showLimitingVelocity(limitingVelocitySpeed)
CallerHmiManager.showLimitingVelocity(limitingVelocitySpeed, 1)
}
/**

View File

@@ -76,7 +76,7 @@ class V2XWarningBroadcastReceiver : BroadcastReceiver() {
tag: String?
) {
if (EventTypeEnum.TYPE_USECASE_ID_IVP.poiType == v2xType.toString()) {
CallerHmiManager.showLimitingVelocity(1)
CallerHmiManager.showLimitingVelocity(1, 1)
}
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-V2XWarningBR", "alertContent或ttsContent为空!")

View File

@@ -8,8 +8,8 @@ import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
/**
@@ -18,8 +18,24 @@ import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
*/
class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver {
companion object{
private const val TAG = "BindingCarDialog"
companion object {
private const val TAG = "ModifyBindingCarDialog"
private var modifyBindingCarDialog: ModifyBindingCarDialog? = null
fun show(context: Context?) {
context?.let {
if (modifyBindingCarDialog == null) {
modifyBindingCarDialog = ModifyBindingCarDialog(it)
}
modifyBindingCarDialog?.let { dialog ->
if (dialog.isShowing) {
return
}
dialog.show()
}
}
}
}
private var confirmTv: TextView? = null
@@ -58,7 +74,7 @@ class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifec
* 修改绑定车机
*/
private fun modifyBindingCar() {
CallerDevaToolsManager.modifyCarInfo{
CallerDevaToolsManager.modifyCarInfo {
if (it.code == 200) {
TipToast.shortTip("修改绑定成功")
} else {
@@ -70,6 +86,7 @@ class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifec
override fun dismiss() {
super.dismiss()
modifyBindingCarDialog = null
MogoStatusManager.getInstance().unregisterStatusChangedListener(
TAG,
StatusDescriptor.MAIN_PAGE_IS_BACKGROUND,
@@ -77,12 +94,4 @@ class ModifyBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifec
)
}
fun showModifyBindingCarDialog() {
if (isShowing) {
return
}
show()
}
}

View File

@@ -8,28 +8,45 @@ import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.mogo.toast.TipToast
/**
* @brief 绑定车辆对话框
* @author lixiaopeng
*/
class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver{
class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver {
companion object{
companion object {
private const val TAG = "ToBindingCarDialog"
private var toBindingCarDialog: ToBindingCarDialog? = null
fun show(context: Context?) {
context?.let {
if (toBindingCarDialog == null) {
toBindingCarDialog = ToBindingCarDialog(it)
}
toBindingCarDialog?.let { dialog ->
if (dialog.isShowing) {
return
}
dialog.show()
}
}
}
}
private var confirmTv: TextView? = null
private var cancelTv: TextView? = null
private val statusChangedListenerForCheckNotice = IMogoStatusChangedListener { descriptor, isTrue ->
if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND && isTrue) {
dismiss()
private val statusChangedListenerForCheckNotice =
IMogoStatusChangedListener { descriptor, isTrue ->
if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND && isTrue) {
dismiss()
}
}
}
init {
setContentView(R.layout.dialog_to_bindingcar)
@@ -57,7 +74,7 @@ class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifecycle
* 修改绑定车机
*/
private fun toBindingCar() {
CallerDevaToolsManager.modifyCarInfo{
CallerDevaToolsManager.modifyCarInfo {
if (it.code == 200) {
TipToast.shortTip("绑定成功")
} else {
@@ -69,6 +86,7 @@ class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifecycle
override fun dismiss() {
super.dismiss()
toBindingCarDialog = null
MogoStatusManager.getInstance().unregisterStatusChangedListener(
TAG,
StatusDescriptor.MAIN_PAGE_IS_BACKGROUND,
@@ -76,12 +94,4 @@ class ToBindingCarDialog(context: Context) : BaseFloatDialog(context), Lifecycle
)
}
fun showToBindingCarDialog() {
if (isShowing) {
return
}
show()
}
}

View File

@@ -15,15 +15,40 @@ import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
*/
class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver {
private val TAG = "UpgradeAppDialog"
companion object{
private const val TAG = "UpgradeAppDialog"
private var upgradeAppDialog: UpgradeAppDialog? = null
fun show(context: Context?,
name: String,
url: String,
title: String,
content: String,
installType: String) {
context?.let {
if (upgradeAppDialog == null) {
upgradeAppDialog = UpgradeAppDialog(it)
}
upgradeAppDialog?.let { dialog ->
if (dialog.isShowing) {
return
}
dialog.showUpgradeAppDialog(name, url, title, content, installType)
}
}
}
}
private var confirmTv: TextView? = null
private var cancleTv: TextView? = null
private var cancelTv: TextView? = null
private var upgradeTitleTv: TextView? = null
private var upgradeContentTv: TextView? = null
private var verticalLineView: View? = null
private var confirmForceTv: TextView? = null
private var tag: String? = null
private var downloarUrl: String? = null
private var downloadUrl: String? = null
init {
setContentView(R.layout.dialog_upgrade_app)
@@ -32,7 +57,7 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb
upgradeTitleTv = findViewById(R.id.tv_upgrade_title)
upgradeContentTv = findViewById(R.id.tv_upgrade_content)
confirmTv = findViewById(R.id.tv_upgrade_confirm)
cancleTv = findViewById(R.id.tv_upgrade_cancel)
cancelTv = findViewById(R.id.tv_upgrade_cancel)
verticalLineView = findViewById(R.id.view_vertical_line)
confirmForceTv = findViewById(R.id.tv_upgrade_confirm_force)
@@ -40,7 +65,7 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb
downloadApp()
}
cancleTv?.setOnClickListener {
cancelTv?.setOnClickListener {
dismiss()
}
@@ -55,13 +80,14 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb
*/
fun downloadApp() {
ToastUtils.showLong("开始下载APK,稍后可前往downloads文件夹查看,通知栏查看下载进度")
tag?.let { downloarUrl?.let { it1 -> CallerDevaToolsManager.downLoadPackage(it, it1) } }
tag?.let { downloadUrl?.let { it1 -> CallerDevaToolsManager.downLoadPackage(it, it1) } }
dismiss()
}
override fun dismiss() {
super.dismiss()
upgradeAppDialog = null
}
// 升级类型 1:提示升级 2:静默升级 3:强制升级
@@ -72,29 +98,29 @@ class UpgradeAppDialog(context: Context) : BaseFloatDialog(context), LifecycleOb
content: String,
installType: String
) {
if (isShowing) {
return
}
tag = name
downloarUrl = url
downloadUrl = url
upgradeTitleTv?.text = title
upgradeContentTv?.text = content
if (installType.equals("1")) {
confirmForceTv?.visibility = View.GONE
confirmTv?.visibility = View.VISIBLE
cancleTv?.visibility = View.VISIBLE
verticalLineView?.visibility = View.VISIBLE
} else if (installType.equals("3")) {
confirmTv?.visibility = View.GONE
cancleTv?.visibility = View.GONE
verticalLineView?.visibility = View.GONE
when (installType) {
"1" -> {
confirmForceTv?.visibility = View.GONE
confirmTv?.visibility = View.VISIBLE
cancelTv?.visibility = View.VISIBLE
verticalLineView?.visibility = View.VISIBLE
}
"3" -> {
confirmTv?.visibility = View.GONE
cancelTv?.visibility = View.GONE
verticalLineView?.visibility = View.GONE
confirmForceTv?.visibility = View.VISIBLE
} else if (installType.equals("2")) {
//静默安装
confirmForceTv?.visibility = View.VISIBLE
}
"2" -> {
//静默安装
}
}
show()
}

View File

@@ -9,11 +9,11 @@ import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.data.map.Infrastructure
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.widget.media.video.SimpleVideoPlayer
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.model.VideoOptionModel
@@ -30,7 +30,25 @@ import tv.danmaku.ijk.media.player.IjkMediaPlayer
*/
class RoadVideoDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver {
private val TAG = "RoadVideoDialog"
companion object {
private const val TAG = "RoadVideoDialog"
private var roadVideoDialog: RoadVideoDialog? = null
fun show(context: Context?, infList: List<Infrastructure>) {
context?.let {
if (roadVideoDialog == null) {
roadVideoDialog = RoadVideoDialog(it)
}
roadVideoDialog?.let { dialog ->
if(dialog.isShowing){
return
}
dialog.show(infList)
}
}
}
}
private val gsyVideoOptionBuilder by lazy {
GSYVideoOptionBuilder()
@@ -150,6 +168,7 @@ class RoadVideoDialog(context: Context) : BaseFloatDialog(context), LifecycleObs
private fun stopLive() {
try {
GSYVideoManager.releaseAllVideos()
roadVideoDialog = null
} catch (e: Exception) {
e.printStackTrace()
}

View File

@@ -37,6 +37,9 @@ public class DispatchDialogManager {
}
public void showDialog(DispatchAdasAutoPilotLocReceiverBean msgData) {
if(isShowing()){
return;
}
if (msgData == null) {
return;
}

View File

@@ -10,15 +10,15 @@ import androidx.lifecycle.LifecycleObserver
import com.mogo.commons.module.status.IMogoStatusChangedListener
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.data.notice.NoticeNormalData
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.BitmapHelper
import com.mogo.eagle.core.widget.media.video.NoticeSimpleVideoPlayer
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
@@ -28,9 +28,28 @@ import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
* @brief 点击查看对话框
* @author lixiaopeng
*/
class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver{
class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleObserver {
companion object {
private const val TAG = "NoticeCheckDialog"
private var pushCheckDialog: NoticeCheckDialog? = null
fun show(context: Context?, normalData: NoticeNormalData) {
context?.let {
if (pushCheckDialog == null) {
pushCheckDialog = NoticeCheckDialog(it)
}
pushCheckDialog?.let { dialog ->
if (dialog.isShowing) {
return
}
dialog.showCheckDialog(normalData)
}
}
}
}
private val TAG = "NoticeCheckDialog"
private var pushCheckClose: ImageView? = null
private var pushCheckTitle: TextView? = null
private var pushCheckContent: TextView? = null
@@ -42,11 +61,12 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
private var mVideoUrl: String = ""
private var playErrorImageView: ImageView? = null
private var connectTextView: TextView? = null
private val statusChangedListenerForCheckNotice = IMogoStatusChangedListener { descriptor, isTrue ->
if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND && isTrue) {
dismiss()
private val statusChangedListenerForCheckNotice =
IMogoStatusChangedListener { descriptor, isTrue ->
if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND && isTrue) {
dismiss()
}
}
}
init {
setContentView(R.layout.notice_dialog_check_with_accessory)
@@ -92,13 +112,21 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
playVideo(mVideoUrl)
}
MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.MAIN_PAGE_IS_BACKGROUND, statusChangedListenerForCheckNotice)
MogoStatusManager.getInstance().registerStatusChangedListener(
TAG,
StatusDescriptor.MAIN_PAGE_IS_BACKGROUND,
statusChangedListenerForCheckNotice
)
}
override fun dismiss() {
super.dismiss()
MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.MAIN_PAGE_IS_BACKGROUND, statusChangedListenerForCheckNotice)
pushCheckDialog = null
MogoStatusManager.getInstance().unregisterStatusChangedListener(
TAG,
StatusDescriptor.MAIN_PAGE_IS_BACKGROUND,
statusChangedListenerForCheckNotice
)
stopLive()
}
@@ -106,10 +134,6 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
* 展示详情页面
*/
fun showCheckDialog(noticeNormal: NoticeNormalData) {
if (isShowing || noticeNormal == null) {
return
}
if (noticeNormal.title.isBlank() || noticeNormal.content.isBlank()) {
return
}
@@ -148,7 +172,7 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
private fun playVideo(videoUrl: String) {
try {
gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false).setPlayTag(TAG)
.build(pushVideo)
.build(pushVideo)
pushVideo!!.startButton.performClick()
playImageView!!.visibility = View.GONE
thumbnailImageView!!.visibility = View.GONE
@@ -187,11 +211,11 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
/**
* 播放结束后
*/
private fun complete(firstbitmap: Bitmap, path: String) {
private fun complete(firstBitmap: Bitmap, path: String) {
playImageView!!.visibility = View.VISIBLE
playImageView!!.setImageResource(R.drawable.notice_video_play)
thumbnailImageView!!.visibility = View.VISIBLE
GlideApp.with(context).load(firstbitmap).optionalTransform(
GlideApp.with(context).load(firstBitmap).optionalTransform(
GlideRoundedCornersTransform(
20f,
GlideRoundedCornersTransform.CornerType.ALL
@@ -201,7 +225,7 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
}
private fun startVideoCallBack(path: String) {
Thread(Runnable {
Thread {
val firstBitmap = BitmapHelper.getVideoThumbnail(path) /*获取第一帧图*/
pushVideo!!.setVideoAllCallBack(object : VideoAllCallBack {
override fun onAutoComplete(url: String, vararg objects: Any) {
@@ -214,15 +238,15 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
}
override fun onClickStop(url: String, vararg objects: Any) {
CallerLogger.d(M_HMI + TAG, "onClickStop")
CallerLogger.d(M_HMI + TAG, "onClickStop")
}
override fun onStartPrepared(url: String, vararg objects: Any) {
CallerLogger.d(M_HMI + TAG, "onStartPrepared")
CallerLogger.d(M_HMI + TAG, "onStartPrepared")
}
override fun onPlayError(url: String, vararg objects: Any) {
CallerLogger.d(M_HMI + TAG, "onPlayError")
CallerLogger.d(M_HMI + TAG, "onPlayError")
pushImageView?.visibility = View.GONE
pushVideo?.visibility = View.GONE
playImageView!!.visibility = View.GONE
@@ -249,10 +273,10 @@ class NoticeCheckDialog(context: Context) : BaseFloatDialog(context), LifecycleO
override fun onClickStartThumb(url: String, vararg objects: Any) {}
override fun onClickBlank(url: String, vararg objects: Any) {}
override fun onClickBlankFullscreen(url: String, vararg objects: Any) {
CallerLogger.d(M_HMI + TAG, "onClickBlankFullscreen")
CallerLogger.d(M_HMI + TAG, "onClickBlankFullscreen")
}
})
}).start()
}.start()
}

View File

@@ -1,451 +0,0 @@
package com.mogo.eagle.core.function.hmi.ui.notice.traffic;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleObserver;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import com.mogo.cloud.commons.utils.CoordinateUtils;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.module.status.IMogoStatusChangedListener;
import com.mogo.commons.module.status.MogoStatusManager;
import com.mogo.commons.module.status.StatusDescriptor;
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters;
import com.mogo.eagle.core.data.notice.NoticeTrafficStyleInfo;
import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData;
import com.mogo.eagle.core.data.notice.NoticeValue;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager;
import com.mogo.eagle.core.function.hmi.R;
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp;
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform;
import com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.BitmapHelper;
import com.mogo.eagle.core.utilcode.util.DateTimeUtils;
import com.mogo.eagle.core.widget.media.video.NoticeSimpleSmallVideoPlayer;
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack;
import com.shuyu.gsyvideoplayer.utils.NetworkUtils;
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView;
import java.util.ArrayList;
/**
* @author liujing
* @description 交警事故详情弹框
* http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=66917475 根据infoId获取事故详情
* @since: 10/26/21
*/
public class NoticeTrafficDialog extends BaseFloatDialog implements LifecycleObserver {
private String TAG = "AINotice";
private Context mContext;
private RecyclerView mRecyclerView;
private NoticeSimpleSmallVideoPlayer mVideoPlayer;
private NoticeTrafficStylePushData mPushData;
private ImageView close;
private ImageView playImageView;
private MogoImageView thumbnailImage;
private final GSYVideoOptionBuilder gsyVideoOptionBuilder = new GSYVideoOptionBuilder();
private TextView accept;//接受
private TextView refuse;//拒绝
private TextView connect;//连接
private NoticeTrafficAdapter adapter;
private final ArrayList<NoticeValue> dataArrayList = new ArrayList<>();
private NoticeTrafficStyleInfo.NoticeTrafficAccountInfo mTrafficStyleInfo;
public NoticeTrafficDialog(@NonNull Context context, NoticeTrafficStylePushData pushData) {
super(context);
mContext = context;
mPushData = pushData;
initView();
}
public NoticeTrafficDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
public void initView() {
setContentView(R.layout.notice_dialog_traffic_police);
setCanceledOnTouchOutside(true);
playerShow();//视频播放器及接操作按钮
recyclerVie();//详情信息列表
MogoStatusManager.getInstance().registerStatusChangedListener(M_HMI + TAG, StatusDescriptor.MAIN_PAGE_IS_BACKGROUND, statusChangedListenerForNotice);
}
/**
* 根据推送消息渲染顶部图片/视频
* type 0图片 1视频
*/
private void playerShow() {
mVideoPlayer = findViewById(R.id.video_player);
thumbnailImage = findViewById(R.id.thumbnail_image);
playImageView = this.findViewById(R.id.start_for_traffic);
playImageView.setOnClickListener(v -> startLive());
close = findViewById(R.id.notice_traffic_dialog_close);
close.setOnClickListener(v -> {
releasePlayer();
dismiss();
});
accept = findViewById(R.id.accept_traffic);
refuse = findViewById(R.id.refuse_traffic);
connect = findViewById(R.id.notice_connect);
accept.setOnClickListener(v -> feedBackTraffic(1));
refuse.setOnClickListener(v -> feedBackTraffic(0));
//重新连接
connect.setOnClickListener(v -> {
netWorkStatus();
startLive();
requestTrafficInfo();
});
requestTrafficInfo();
netWorkStatus();
if (mPushData.getType() == 1) {
startLive();
} else {
GlideApp.with(mContext).load(mPushData.getPoiImgUrl()).optionalTransform(new GlideRoundedCornersTransform
(20f, GlideRoundedCornersTransform.CornerType.ALL)).into(thumbnailImage);
mVideoPlayer.setVisibility(View.INVISIBLE);
playImageView.setVisibility(View.INVISIBLE);
thumbnailImage.setVisibility(View.VISIBLE);
}
mVideoPlayer.setOnClickListener(v -> {
if (mVideoPlayer.getCurrentState() == GSYVideoView.CURRENT_STATE_PAUSE) {/*播放中*/
resume();
} else {
pause();
}
});
}
private void recyclerVie() {
//网格绘制
try {
mRecyclerView = findViewById(R.id.traffic_info_recyclerView);
//网格布局
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(staggeredGridLayoutManager);
NoticeTrafficInfoGridItemDivider gridLayoutDivider = new NoticeTrafficInfoGridItemDivider(1,
(mContext.getResources().getColor(R.color.notice_check_dialog_bg_color)));
mRecyclerView.addItemDecoration(gridLayoutDivider);
} catch (Exception e) {
e.printStackTrace();
}
adapter = new NoticeTrafficAdapter(mContext, dataArrayList);
mRecyclerView.setAdapter(adapter);
}
/**
* @param i 是否接受交通事故任务
* 0不接收 1接受 发起自动驾驶任务,显示引导线
*/
private void feedBackTraffic(int i) {
CallerFuncBizManager.getBizProvider().feedBackNoticeTraffic(mPushData.getInfoId(), MoGoAiCloudClientConfig.getInstance().getSn(), i);
if (i == 1) {
startAutoPilot();
}
dismiss();
}
/**
* 开启自动驾驶
*/
private void startAutoPilot() {
if (mTrafficStyleInfo != null) {
AutopilotControlParameters parameters = new AutopilotControlParameters();
parameters.isSpeakVoice = false;
parameters.vehicleType = 10;
//云平台使用的是火星坐标,自动驾驶需要wgs84
double[] gcj02 = CoordinateUtils.transformGcj02toWgs84(mTrafficStyleInfo.getLat(), mTrafficStyleInfo.getLon());
parameters.startLatLon = new AutopilotControlParameters.AutoPilotLonLat
(CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat(),
CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon());
parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat
(gcj02[0], gcj02[1]);
CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters);
}
}
/**
* 暂停
*/
private void pause() {
playImageView.setVisibility(View.VISIBLE);
thumbnailImage.setVisibility(View.GONE);
playImageView.setOnClickListener(v -> mVideoPlayer.onVideoResume());
thumbnailImage.setOnClickListener(v -> mVideoPlayer.onVideoResume());
}
/**
* 继续
*/
private void resume() {
playImageView.setImageResource(R.drawable.notice_video_pause);
playImageView.setVisibility(View.GONE);
thumbnailImage.setVisibility(View.GONE);
}
/**
* 播放结束后
*/
private void complete(Bitmap firstbitmap) {
thumbnailImage.setVisibility(View.VISIBLE);
// thumbnailImage.setImageBitmap(firstbitmap);
GlideApp.with(mContext).load(firstbitmap).optionalTransform(new GlideRoundedCornersTransform
(20f, GlideRoundedCornersTransform.CornerType.ALL)).into(thumbnailImage);
playImageView.setImageResource(R.drawable.notice_video_play);
playImageView.setVisibility(View.VISIBLE);
playImageView.setOnClickListener(v -> startLive());
thumbnailImage.setOnClickListener(v -> startLive());
}
/**
* 视频播放
*/
private void startLive() {
if (mPushData != null) {
try {
CallerLogger.INSTANCE.d(M_HMI + TAG, "交警事故开始播放视频startLive");
String videoUrl = mPushData.getPoiImgUrl();
gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false).setPlayTag("NoticeTrafficDialog")
.build(mVideoPlayer);
mVideoPlayer.getStartButton().performClick();
liveCallBack();
} catch (Exception e) {
e.printStackTrace();
}
}
if (dataArrayList.size() == 0) {
requestTrafficInfo();
}
}
private void liveCallBack() {
new Thread(() -> {
Bitmap firstBitmap = BitmapHelper.getVideoThumbnail(mPushData.getPoiImgUrl());/*获取第一帧图*/
mVideoPlayer.setVideoAllCallBack(new VideoAllCallBack() {
@Override
public void onAutoComplete(String url, Object... objects) {
complete(firstBitmap);
}
@Override
public void onClickResume(String url, Object... objects) {
thumbnailImage.setVisibility(View.GONE);
playImageView.setVisibility(View.GONE);
}
@Override
public void onClickStop(String url, Object... objects) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onClickStop");
}
@Override
public void onStartPrepared(String url, Object... objects) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onStartPrepared");
}
@Override
public void onPrepared(String url, Object... objects) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onPrepared");
thumbnailImage.setVisibility(View.GONE);
playImageView.setVisibility(View.GONE);
connect.setVisibility(View.GONE);
}
@Override
public void onClickStartIcon(String url, Object... objects) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onClickStartIcon");
}
@Override
public void onClickStartError(String url, Object... objects) {
CallerLogger.INSTANCE.e(M_HMI + TAG, "onClickStartError");
}
@Override
public void onClickStopFullscreen(String url, Object... objects) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onClickStopFullscreen");
}
@Override
public void onClickResumeFullscreen(String url, Object... objects) {
}
@Override
public void onClickSeekbar(String url, Object... objects) {
}
@Override
public void onClickSeekbarFullscreen(String url, Object... objects) {
}
@Override
public void onEnterFullscreen(String url, Object... objects) {
}
@Override
public void onQuitFullscreen(String url, Object... objects) {
}
@Override
public void onQuitSmallWidget(String url, Object... objects) {
}
@Override
public void onEnterSmallWidget(String url, Object... objects) {
}
@Override
public void onTouchScreenSeekVolume(String url, Object... objects) {
}
@Override
public void onTouchScreenSeekPosition(String url, Object... objects) {
}
@Override
public void onTouchScreenSeekLight(String url, Object... objects) {
}
@Override
public void onPlayError(String url, Object... objects) {
thumbnailImage.setVisibility(View.VISIBLE);
connect.setVisibility(View.VISIBLE);
CallerLogger.INSTANCE.d(M_HMI + TAG, "onPlayError");
}
@Override
public void onClickStartThumb(String url, Object... objects) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onClickStartThumb");
}
@Override
public void onClickBlank(String url, Object... objects) {
}
@Override
public void onClickBlankFullscreen(String url, Object... objects) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onClickBlankFullscreen");
}
});
}).start();
}
/**
* 获取交通事故详情
*/
private void requestTrafficInfo() {
CallerLogger.INSTANCE.d(M_HMI + TAG, "requestTrafficInfo");
CallerFuncBizManager.getBizProvider().requestAccidentInfo(mPushData.getInfoId(), MoGoAiCloudClientConfig.getInstance().getSn(), trafficInfo -> {
CallerLogger.INSTANCE.d(M_HMI + TAG, "交通事故详情::" + trafficInfo);
mTrafficStyleInfo = trafficInfo.getResult().getAccidentInfo();
infoRefresh(mTrafficStyleInfo);
});
}
private void infoRefresh(NoticeTrafficStyleInfo.NoticeTrafficAccountInfo info) {
if (dataArrayList.size() > 0) {
dataArrayList.clear();
}
NoticeValue laiYuan = new NoticeValue();
laiYuan.setKey("事故来源:");
laiYuan.setValue(info.getUploadType());
dataArrayList.add(laiYuan);
NoticeValue cTime = new NoticeValue();
cTime.setKey("事故时间:");
cTime.setValue(DateTimeUtils.getTimeText(info.getDataCreateTime(), DateTimeUtils.MM_Yue_dd_Ri_HH_mm));
dataArrayList.add(cTime);
NoticeValue hTime = new NoticeValue();
hTime.setKey("处理时间:");
hTime.setValue(DateTimeUtils.getTimeText(info.getDataHandleTime(), DateTimeUtils.MM_Yue_dd_Ri_HH_mm));
dataArrayList.add(hTime);
NoticeValue reason = new NoticeValue();
reason.setKey("事故原因:");
reason.setValue(info.getReason());
dataArrayList.add(reason);
NoticeValue status = new NoticeValue();
status.setKey("处理状态:");
if (info.getOperaStatus().equals("1")) {
status.setValue("待处理");
} else {
status.setValue("已处理");
}
dataArrayList.add(status);
NoticeValue location = new NoticeValue();
location.setKey("事故地点:");
location.setValue(info.getUploadAddress());
dataArrayList.add(location);
NoticeValue style = new NoticeValue();
style.setKey("事故等级:");
style.setValue(info.getTroubleTypeName());
dataArrayList.add(style);
adapter.setData(dataArrayList);
adapter.notifyDataSetChanged();
}
/**
* 判断网络状态
*/
private void netWorkStatus() {
if (NetworkUtils.isAvailable(getContext())) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "网络可用");
thumbnailImage.setVisibility(View.GONE);
connect.setVisibility(View.GONE);
thumbnailImage.setBackgroundResource(R.drawable.notice_traffic_placeholder);
} else {
thumbnailImage.setVisibility(View.VISIBLE);
thumbnailImage.setBackgroundResource(R.drawable.notice_unsuccess_traffic);
connect.setVisibility(View.VISIBLE);
}
}
public void cancel() {
}
private void releasePlayer() {
try {
GSYVideoManager.releaseAllVideos();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void dismiss() {
super.dismiss();
CallerLogger.INSTANCE.d(M_HMI + TAG, "trafficDialog dismiss");
MogoStatusManager.getInstance().unregisterStatusChangedListener(M_HMI + TAG, StatusDescriptor.MAIN_PAGE_IS_BACKGROUND, statusChangedListenerForNotice);
releasePlayer();
}
private final IMogoStatusChangedListener statusChangedListenerForNotice = (descriptor, isTrue) -> {
if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND && isTrue) {
CallerLogger.INSTANCE.d(M_HMI + TAG, "onStatusChanged==MAIN_PAGE_IS_BACKGROUND");
dismiss();
}
};
}

View File

@@ -0,0 +1,445 @@
package com.mogo.eagle.core.function.hmi.ui.notice.traffic
import android.content.Context
import android.graphics.Bitmap
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import androidx.lifecycle.LifecycleObserver
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import com.mogo.cloud.commons.utils.CoordinateUtils
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.module.status.IMogoStatusChangedListener
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.module.status.StatusDescriptor
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat
import com.mogo.eagle.core.data.notice.NoticeTrafficStyleInfo
import com.mogo.eagle.core.data.notice.NoticeTrafficStyleInfo.NoticeTrafficAccountInfo
import com.mogo.eagle.core.data.notice.NoticeTrafficStylePushData
import com.mogo.eagle.core.data.notice.NoticeValue
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager.startAutoPilot
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getCurWgs84Lat
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getCurWgs84Lon
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager.bizProvider
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.BitmapHelper
import com.mogo.eagle.core.utilcode.util.DateTimeUtils
import com.mogo.eagle.core.widget.media.video.NoticeSimpleSmallVideoPlayer
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
import com.shuyu.gsyvideoplayer.utils.NetworkUtils
import com.shuyu.gsyvideoplayer.video.base.GSYVideoView
/**
* @author liujing
* @description 交警事故详情弹框
* http://wiki.zhidaohulian.com/pages/viewpage.action?pageId=66917475 根据infoId获取事故详情
* @since: 10/26/21
*/
class NoticeTrafficDialog : BaseFloatDialog, LifecycleObserver {
companion object {
private const val TAG = "AINotice"
private var noticeTrafficDialog: NoticeTrafficDialog? = null
fun show(context: Context?, trafficStylePushData: NoticeTrafficStylePushData) {
context?.let {
if (noticeTrafficDialog == null) {
noticeTrafficDialog = NoticeTrafficDialog(it, trafficStylePushData)
}
noticeTrafficDialog?.let { dialog ->
if (dialog.isShowing) {
return
}
dialog.show()
}
}
}
}
private var mContext: Context? = null
private var mRecyclerView: RecyclerView? = null
private var mVideoPlayer: NoticeSimpleSmallVideoPlayer? = null
private var mPushData: NoticeTrafficStylePushData? = null
private var close: ImageView? = null
private var playImageView: ImageView? = null
private var thumbnailImage: MogoImageView? = null
private val gsyVideoOptionBuilder = GSYVideoOptionBuilder()
private var accept: TextView? = null//接受
private var refuse: TextView? = null//拒绝
private var connect: TextView? = null//连接
private var adapter: NoticeTrafficAdapter? = null
private val dataArrayList = ArrayList<NoticeValue?>()
private var mTrafficStyleInfo: NoticeTrafficAccountInfo? = null
constructor(context: Context, pushData: NoticeTrafficStylePushData?) : super(context) {
mContext = context
mPushData = pushData
initView()
}
fun initView() {
setContentView(R.layout.notice_dialog_traffic_police)
setCanceledOnTouchOutside(true)
playerShow() //视频播放器及接操作按钮
recyclerVie() //详情信息列表
MogoStatusManager.getInstance().registerStatusChangedListener(
SceneConstant.M_HMI + TAG,
StatusDescriptor.MAIN_PAGE_IS_BACKGROUND,
statusChangedListenerForNotice
)
}
/**
* 根据推送消息渲染顶部图片/视频
* type 0图片 1视频
*/
private fun playerShow() {
mVideoPlayer = findViewById(R.id.video_player)
thumbnailImage = findViewById(R.id.thumbnail_image)
playImageView = findViewById(R.id.start_for_traffic)
close = findViewById(R.id.notice_traffic_dialog_close)
accept = findViewById(R.id.accept_traffic)
refuse = findViewById(R.id.refuse_traffic)
connect = findViewById(R.id.notice_connect)
playImageView?.setOnClickListener { startLive() }
close?.setOnClickListener {
releasePlayer()
dismiss()
}
accept?.setOnClickListener { feedBackTraffic(1) }
refuse?.setOnClickListener { feedBackTraffic(0) }
//重新连接
connect?.setOnClickListener {
netWorkStatus()
startLive()
requestTrafficInfo()
}
requestTrafficInfo()
netWorkStatus()
if (mPushData!!.type == 1) {
startLive()
} else {
GlideApp.with(mContext!!).load(mPushData!!.poiImgUrl).optionalTransform(
GlideRoundedCornersTransform(
20f,
GlideRoundedCornersTransform.CornerType.ALL
)
).into(thumbnailImage!!)
mVideoPlayer?.visibility = View.INVISIBLE
playImageView?.visibility = View.INVISIBLE
thumbnailImage?.visibility = View.VISIBLE
}
mVideoPlayer?.setOnClickListener {
if (mVideoPlayer!!.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { /*播放中*/
resume()
} else {
pause()
}
}
}
private fun recyclerVie() {
//网格绘制
try {
mRecyclerView = findViewById(R.id.traffic_info_recyclerView)
//网格布局
val staggeredGridLayoutManager =
StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
mRecyclerView?.layoutManager = staggeredGridLayoutManager
val gridLayoutDivider = NoticeTrafficInfoGridItemDivider(
1,
mContext!!.resources.getColor(R.color.notice_check_dialog_bg_color)
)
mRecyclerView?.addItemDecoration(gridLayoutDivider)
} catch (e: Exception) {
e.printStackTrace()
}
adapter = NoticeTrafficAdapter(mContext!!, dataArrayList)
mRecyclerView!!.adapter = adapter
}
/**
* @param i 是否接受交通事故任务
* 0不接收 1接受 发起自动驾驶任务,显示引导线
*/
private fun feedBackTraffic(i: Int) {
bizProvider.feedBackNoticeTraffic(
mPushData!!.infoId,
MoGoAiCloudClientConfig.getInstance().sn,
i
)
if (i == 1) {
startAutoPilot()
}
dismiss()
}
/**
* 开启自动驾驶
*/
private fun startAutoPilot() {
if (mTrafficStyleInfo != null) {
val parameters = AutopilotControlParameters()
parameters.isSpeakVoice = false
parameters.vehicleType = 10
//云平台使用的是火星坐标,自动驾驶需要wgs84
val gcj02 = CoordinateUtils.transformGcj02toWgs84(
mTrafficStyleInfo!!.lat, mTrafficStyleInfo!!.lon
)
parameters.startLatLon = AutoPilotLonLat(
getCurWgs84Lat(),
getCurWgs84Lon()
)
parameters.endLatLon = AutoPilotLonLat(gcj02[0], gcj02[1])
startAutoPilot(parameters)
}
}
/**
* 暂停
*/
private fun pause() {
playImageView!!.visibility = View.VISIBLE
thumbnailImage!!.visibility = View.GONE
playImageView!!.setOnClickListener { v: View? -> mVideoPlayer!!.onVideoResume() }
thumbnailImage!!.setOnClickListener { v: View? -> mVideoPlayer!!.onVideoResume() }
}
/**
* 继续
*/
private fun resume() {
playImageView!!.setImageResource(R.drawable.notice_video_pause)
playImageView!!.visibility = View.GONE
thumbnailImage!!.visibility = View.GONE
}
/**
* 播放结束后
*/
private fun complete(firstBitmap: Bitmap) {
thumbnailImage!!.visibility = View.VISIBLE
GlideApp.with(mContext!!).load(firstBitmap).optionalTransform(
GlideRoundedCornersTransform(
20f,
GlideRoundedCornersTransform.CornerType.ALL
)
).into(
thumbnailImage!!
)
playImageView!!.setImageResource(R.drawable.notice_video_play)
playImageView!!.visibility = View.VISIBLE
playImageView!!.setOnClickListener { v: View? -> startLive() }
thumbnailImage!!.setOnClickListener { v: View? -> startLive() }
}
/**
* 视频播放
*/
private fun startLive() {
if (mPushData != null) {
try {
d(SceneConstant.M_HMI + TAG, "交警事故开始播放视频startLive")
val videoUrl = mPushData!!.poiImgUrl
gsyVideoOptionBuilder.setUrl(videoUrl).setCacheWithPlay(false)
.setPlayTag("NoticeTrafficDialog")
.build(mVideoPlayer)
mVideoPlayer!!.startButton.performClick()
liveCallBack()
} catch (e: Exception) {
e.printStackTrace()
}
}
if (dataArrayList.size == 0) {
requestTrafficInfo()
}
}
private fun liveCallBack() {
Thread {
val firstBitmap = BitmapHelper.getVideoThumbnail(mPushData!!.poiImgUrl) /*获取第一帧图*/
mVideoPlayer!!.setVideoAllCallBack(object : VideoAllCallBack {
override fun onAutoComplete(url: String, vararg objects: Any) {
complete(firstBitmap)
}
override fun onClickResume(url: String, vararg objects: Any) {
thumbnailImage!!.visibility = View.GONE
playImageView!!.visibility = View.GONE
}
override fun onClickStop(url: String, vararg objects: Any) {
d(SceneConstant.M_HMI + TAG, "onClickStop")
}
override fun onStartPrepared(url: String, vararg objects: Any) {
d(SceneConstant.M_HMI + TAG, "onStartPrepared")
}
override fun onPrepared(url: String, vararg objects: Any) {
d(SceneConstant.M_HMI + TAG, "onPrepared")
thumbnailImage!!.visibility = View.GONE
playImageView!!.visibility = View.GONE
connect!!.visibility = View.GONE
}
override fun onClickStartIcon(url: String, vararg objects: Any) {
d(SceneConstant.M_HMI + TAG, "onClickStartIcon")
}
override fun onClickStartError(url: String, vararg objects: Any) {
e(SceneConstant.M_HMI + TAG, "onClickStartError")
}
override fun onClickStopFullscreen(url: String, vararg objects: Any) {
d(SceneConstant.M_HMI + TAG, "onClickStopFullscreen")
}
override fun onClickResumeFullscreen(url: String, vararg objects: Any) {}
override fun onClickSeekbar(url: String, vararg objects: Any) {}
override fun onClickSeekbarFullscreen(url: String, vararg objects: Any) {}
override fun onEnterFullscreen(url: String, vararg objects: Any) {}
override fun onQuitFullscreen(url: String, vararg objects: Any) {}
override fun onQuitSmallWidget(url: String, vararg objects: Any) {}
override fun onEnterSmallWidget(url: String, vararg objects: Any) {}
override fun onTouchScreenSeekVolume(url: String, vararg objects: Any) {}
override fun onTouchScreenSeekPosition(url: String, vararg objects: Any) {}
override fun onTouchScreenSeekLight(url: String, vararg objects: Any) {}
override fun onPlayError(url: String, vararg objects: Any) {
thumbnailImage!!.visibility = View.VISIBLE
connect!!.visibility = View.VISIBLE
d(SceneConstant.M_HMI + TAG, "onPlayError")
}
override fun onClickStartThumb(url: String, vararg objects: Any) {
d(SceneConstant.M_HMI + TAG, "onClickStartThumb")
}
override fun onClickBlank(url: String, vararg objects: Any) {}
override fun onClickBlankFullscreen(url: String, vararg objects: Any) {
d(SceneConstant.M_HMI + TAG, "onClickBlankFullscreen")
}
})
}.start()
}
/**
* 获取交通事故详情
*/
private fun requestTrafficInfo() {
d(SceneConstant.M_HMI + TAG, "requestTrafficInfo")
bizProvider.requestAccidentInfo(
mPushData!!.infoId,
MoGoAiCloudClientConfig.getInstance().sn
) { trafficInfo: NoticeTrafficStyleInfo ->
d(SceneConstant.M_HMI + TAG, "交通事故详情::$trafficInfo")
mTrafficStyleInfo = trafficInfo.getResult().accidentInfo
infoRefresh(mTrafficStyleInfo)
}
}
private fun infoRefresh(info: NoticeTrafficAccountInfo?) {
if (dataArrayList.size > 0) {
dataArrayList.clear()
}
val laiYuan = NoticeValue()
laiYuan.key = "事故来源:"
laiYuan.value = info!!.uploadType
dataArrayList.add(laiYuan)
val cTime = NoticeValue()
cTime.key = "事故时间:"
cTime.value = DateTimeUtils.getTimeText(
info.dataCreateTime,
DateTimeUtils.MM_Yue_dd_Ri_HH_mm
)
dataArrayList.add(cTime)
val hTime = NoticeValue()
hTime.key = "处理时间:"
hTime.value = DateTimeUtils.getTimeText(
info.dataHandleTime,
DateTimeUtils.MM_Yue_dd_Ri_HH_mm
)
dataArrayList.add(hTime)
val reason = NoticeValue()
reason.key = "事故原因:"
reason.value = info.reason
dataArrayList.add(reason)
val status = NoticeValue()
status.key = "处理状态:"
if (info.operaStatus == "1") {
status.value = "待处理"
} else {
status.value = "已处理"
}
dataArrayList.add(status)
val location = NoticeValue()
location.key = "事故地点:"
location.value = info.uploadAddress
dataArrayList.add(location)
val style = NoticeValue()
style.key = "事故等级:"
style.value = info.troubleTypeName
dataArrayList.add(style)
adapter!!.setData(dataArrayList)
adapter!!.notifyDataSetChanged()
}
/**
* 判断网络状态
*/
private fun netWorkStatus() {
if (NetworkUtils.isAvailable(context)) {
d(SceneConstant.M_HMI + TAG, "网络可用")
thumbnailImage!!.visibility = View.GONE
connect!!.visibility = View.GONE
thumbnailImage!!.setBackgroundResource(R.drawable.notice_traffic_placeholder)
} else {
thumbnailImage!!.visibility = View.VISIBLE
thumbnailImage!!.setBackgroundResource(R.drawable.notice_unsuccess_traffic)
connect!!.visibility = View.VISIBLE
}
}
override fun cancel() {}
private fun releasePlayer() {
try {
GSYVideoManager.releaseAllVideos()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun dismiss() {
super.dismiss()
d(SceneConstant.M_HMI + TAG, "trafficDialog dismiss")
noticeTrafficDialog = null
MogoStatusManager.getInstance().unregisterStatusChangedListener(
SceneConstant.M_HMI + TAG,
StatusDescriptor.MAIN_PAGE_IS_BACKGROUND,
statusChangedListenerForNotice
)
releasePlayer()
}
private val statusChangedListenerForNotice =
IMogoStatusChangedListener { descriptor: StatusDescriptor, isTrue: Boolean ->
if (descriptor == StatusDescriptor.MAIN_PAGE_IS_BACKGROUND && isTrue) {
d(SceneConstant.M_HMI + TAG, "onStatusChanged==MAIN_PAGE_IS_BACKGROUND")
dismiss()
}
}
}

View File

@@ -0,0 +1,117 @@
package com.mogo.eagle.core.function.hmi.ui.setting
import android.animation.Animator
import android.content.Context
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.view.animation.OvershootInterpolator
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig
import com.mogo.eagle.core.data.enums.SidePattern
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.hmi.notification.WarningFloat
import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator
import com.mogo.eagle.core.function.hmi.ui.camera.CameraListView
import com.zhjt.service_biz.BizConfig
class CameraLiveView private constructor() {
companion object {
val cameraLiveView by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
CameraLiveView()
}
}
// 超视距、路侧、前车直播
private var cameraListView: CameraListView? = null
private var cameraViewFloat: WarningFloat.Builder? = null
@BizConfig(FuncBizConfig.V2I, "", FuncBizConfig.BIZ_RTS)
fun showCameraList(
context: Context?,
cameraList: List<CameraEntity>?,
liveStatus: ((Boolean) -> Unit)
) {
context?.let {
if (cameraViewFloat == null) {
if (cameraListView == null) {
cameraListView = CameraListView(it)
cameraListView!!.updateCameraData(cameraList)
}
cameraListView!!.setClickListener(object : CameraListView.ClickListener {
override fun onClose(v: View) {
// Builder和cameraListView都置空
dismissFloatView()
// 丢弃开启摄像头推流请求同时monitor回调hmi的startRoadCameraLive()
// 也做了cameraListView的非空判断
CallerFuncBizManager.bizProvider.closeCameraLive()
}
override fun onShowLive(isShow: Boolean) {
liveStatus.invoke(isShow)
}
override fun refreshCameraList() {
cameraListView?.refreshCameraList(CallerFuncBizManager.bizProvider.getCameraList)
}
})
cameraViewFloat = WarningFloat.with(it)
.setTag("CameraListFloat")
.setLayout(cameraListView!!)
.setSidePattern(SidePattern.RIGHT)
.setGravity(Gravity.RIGHT, -40, 255)
.setImmersionStatusBar(true)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onDismiss() {
cameraViewFloat = null
cameraListView = null
liveStatus.invoke(false)
}
})
.show()
} else {
cameraViewFloat?.show()
}
}
}
fun startRoadCameraLive(flvUrl: String) {
cameraListView?.startRoadCameraLive(flvUrl)
}
fun showNoSignView() {
cameraListView?.showNoSignal()
}
private fun dismissFloatView() {
cameraViewFloat?.let {
WarningFloat.dismiss(it.config.floatTag, false)
cameraViewFloat = null
cameraListView = null
}
}
}

View File

@@ -52,7 +52,6 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManage
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerHDMapManager
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.map.CallerSmpManager
import com.mogo.eagle.core.function.call.obu.CallerOBUManager
@@ -89,7 +88,9 @@ import kotlin.collections.component3
import kotlin.collections.component4
import kotlin.collections.set
import kotlin.math.abs
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
/**
* @author xiaoyuzhou
@@ -97,7 +98,7 @@ import kotlin.math.abs
* 调试使用的设置页面,这里只作为调试使用
* 展示 本机、网络、工控机、OBU等状态信息支持设置IP等参数进行调试
*/
class DebugSettingView @JvmOverloads constructor(
internal class DebugSettingView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
@@ -196,8 +197,6 @@ class DebugSettingView @JvmOverloads constructor(
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
// 添加 ADAS车辆状态&定位 监听
CallerChassisLocationWGS84ListenerManager.addListener(TAG, this)
// 添加 地图样式改变 监听
CallerMapLocationListenerManager.addListener(TAG, this, false)
// 添加 域控制器感知数据 监听
CallerAutopilotIdentifyListenerManager.addListener(TAG, this)
// 添加 规划路径相关回调 监听
@@ -224,7 +223,7 @@ class DebugSettingView @JvmOverloads constructor(
logInfoView!!.onEnterForeground()
}
// 开启定时查询速度
Timer().schedule(timerTaskRefresh, Date(), 100)
Timer().schedule(timerTaskRefresh, Date(), 300)
if (AppConfigInfo.isConnectAutopilot && (AppConfigInfo.plateNumber.isNullOrEmpty() || AppConfigInfo.iPCMacAddress.isNullOrEmpty())) {
//查询工控机基础配置信息
CallerAutoPilotManager.getCarConfig()
@@ -240,7 +239,7 @@ class DebugSettingView @JvmOverloads constructor(
// 移除 ADAS车辆状态&定位 监听
CallerChassisLocationWGS84ListenerManager.removeListener(TAG)
// 移除 地图样式改变 监听
CallerMapLocationListenerManager.removeListener(TAG, false)
CallerChassisLocationGCJ20ListenerManager.removeListener(TAG)
// 移除 域控制器感知数据 监听
CallerAutopilotIdentifyListenerManager.removeListener(TAG)
// 移除 规划路径相关回调 监听
@@ -1695,10 +1694,10 @@ class DebugSettingView @JvmOverloads constructor(
}"
)
tvAutopilotInfo.text = GsonUtils.toJson(mAutoPilotStatusInfo)
tvIpcInfo.text = GsonUtils.toJson(mAutoPilotStatusInfo)
tvIpcInfoKey.text = GsonUtils.toJson(mAutoPilotStatusInfo)
val autopilotJson = GsonUtils.toJson(mAutoPilotStatusInfo)
tvAutopilotInfo.text = autopilotJson
tvIpcInfo.text = autopilotJson
tvIpcInfoKey.text = autopilotJson
tvCarInfo.text =
"GPS时间${(mGnssInfo?.satelliteTime?.times(1000))?.toLong()}\n" +
@@ -1743,18 +1742,20 @@ class DebugSettingView @JvmOverloads constructor(
* OBU状态回调
*/
override fun onObuStatusResponse(obuStatusInfo: ObuStatusInfo) {
tvObuInfo.text = GsonUtils.toJson(obuStatusInfo)
lifecycleOwner.lifecycleScope.launch {
tvObuInfo.text = GsonUtils.toJson(obuStatusInfo)
AppConfigInfo.obuSdkVersion = obuStatusInfo.obuSdkVersion
AppConfigInfo.isConnectObu = obuStatusInfo.obuStatus
AppConfigInfo.obuSdkVersion = obuStatusInfo.obuSdkVersion
AppConfigInfo.isConnectObu = obuStatusInfo.obuStatus
if (obuStatusInfo.obuStatus) {
obuConnectStatus = true
}
//OBU断开连接提示异常
if (obuConnectStatus && !obuStatusInfo.obuStatus) {
obuConnectStatus = false
toastMsg("OBU连接状态异常")
if (obuStatusInfo.obuStatus) {
obuConnectStatus = true
}
//OBU断开连接提示异常
if (obuConnectStatus && !obuStatusInfo.obuStatus) {
obuConnectStatus = false
toastMsg("OBU连接状态异常")
}
}
}

View File

@@ -1,6 +1,7 @@
package com.mogo.eagle.core.function.hmi.ui.setting
import android.app.Activity
import android.content.Context
import android.graphics.PixelFormat
import android.util.DisplayMetrics
import android.view.*
@@ -12,14 +13,36 @@ import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.toast.ResourcesHelper.getDrawable
import com.mogo.eagle.core.utilcode.util.BarUtils
import java.lang.reflect.Field
import com.mogo.eagle.core.utilcode.util.SoundUtils
/**
* @author XuXinChao
* @description 工控机异常节点上报
* @since: 2022/5/12
*/
class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener {
companion object {
private const val TAG = "IPCReportWindow"
private var ipcReportWindow: IPCReportWindow? = null
fun show(
context: Context?,
errorReportList: ArrayList<ReportEntity>,
warningReportList: ArrayList<ReportEntity>,
reportLevel: Int
) {
context?.let {
if (ipcReportWindow == null) {
ipcReportWindow = IPCReportWindow(it as Activity)
SoundUtils.playRing(it)
}
ipcReportWindow?.showFloatWindow()
ipcReportWindow?.refreshData(errorReportList, warningReportList, reportLevel)
}
}
}
private var mActivity: Activity = activity
private var mWindowParams: WindowManager.LayoutParams? = null
@@ -28,7 +51,7 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
private lateinit var ivIpcClose: ImageView
private lateinit var tvIpcErrorTab: TextView
private lateinit var tvIpcWarningTab: TextView
private var ipcReportAdapter: IPCReportAdapter?=null
private var ipcReportAdapter: IPCReportAdapter? = null
private lateinit var mFloatLayout: View
private var mInViewX = 0f
@@ -38,8 +61,6 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
private var mInScreenX = 0f
private var mInScreenY = 0f
private var clickListener: ClickListener? = null
private var ipcErrorReportList: List<ReportEntity>? = null //错误上报列表
private var ipcWarningReportList: List<ReportEntity>? = null//警告上报列表
@@ -47,10 +68,11 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
initFloatWindow();
}
private fun initFloatWindow(){
mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_ipc_report, null) as View
private fun initFloatWindow() {
mFloatLayout =
LayoutInflater.from(mActivity).inflate(R.layout.view_ipc_report, null) as View
mFloatLayout.setOnTouchListener(this)
rvIPCReport= mFloatLayout.findViewById(R.id.rv_ipc_report)
rvIPCReport = mFloatLayout.findViewById(R.id.rv_ipc_report)
ivIpcClose = mFloatLayout.findViewById(R.id.iv_ipc_close)
tvIpcErrorTab = mFloatLayout.findViewById(R.id.tv_ipc_error_tab)
tvIpcWarningTab = mFloatLayout.findViewById(R.id.tv_ipc_warning_tab)
@@ -65,35 +87,43 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
it.alpha = 1.0f
}
ipcReportAdapter = IPCReportAdapter()
rvIPCReport.layoutManager = WrapContentLinearLayoutManager(mActivity,
LinearLayoutManager.VERTICAL,false)
rvIPCReport.layoutManager = WrapContentLinearLayoutManager(
mActivity,
LinearLayoutManager.VERTICAL, false
)
rvIPCReport.adapter = ipcReportAdapter
//关闭按钮
ivIpcClose.setOnClickListener {
clickListener?.closeWindow()
hideFloatWindow()
}
//错误列表
tvIpcErrorTab.setOnClickListener {
tvIpcErrorTab.background = getDrawable(mActivity,R.drawable.ipc_error_tab_normal_bg)
tvIpcWarningTab.background = getDrawable(mActivity,R.drawable.ipc_warning_tab_normal_bg)
tvIpcErrorTab.background = getDrawable(mActivity, R.drawable.ipc_error_tab_normal_bg)
tvIpcWarningTab.background =
getDrawable(mActivity, R.drawable.ipc_warning_tab_normal_bg)
ipcReportAdapter?.setData(ipcErrorReportList)
ipcReportAdapter?.notifyDataSetChanged()
}
//预警列表
tvIpcWarningTab.setOnClickListener {
tvIpcErrorTab.background = getDrawable(mActivity,R.drawable.ipc_error_tab_select_bg)
tvIpcWarningTab.background = getDrawable(mActivity,R.drawable.ipc_warning_tab_select_bg)
tvIpcErrorTab.background = getDrawable(mActivity, R.drawable.ipc_error_tab_select_bg)
tvIpcWarningTab.background =
getDrawable(mActivity, R.drawable.ipc_warning_tab_select_bg)
ipcReportAdapter?.setData(ipcWarningReportList)
ipcReportAdapter?.notifyDataSetChanged()
}
}
fun refreshData(errorReportList:List<ReportEntity>,warningReportList:List<ReportEntity>,reportLevel: Int){
if(reportLevel == 1){
fun refreshData(
errorReportList: List<ReportEntity>,
warningReportList: List<ReportEntity>,
reportLevel: Int
) {
if (reportLevel == 1) {
ipcReportAdapter?.setData(errorReportList)
ipcErrorReportList = errorReportList
}else{
} else {
ipcReportAdapter?.setData(warningReportList)
ipcWarningReportList = warningReportList
}
@@ -135,22 +165,16 @@ class IPCReportWindow constructor(activity: Activity) : View.OnTouchListener{
mWindowManager!!.defaultDisplay.getMetrics(metrics)
mWindowParams!!.x = metrics.widthPixels
// mWindowParams!!.y = metrics.heightPixels / 2 - BarUtils.getStatusBarHeight()
mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-100
mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight() - 100
mWindowManager!!.addView(mFloatLayout, mWindowParams)
}
}
fun hideFloatWindow() {
if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout)
private fun hideFloatWindow() {
if (mFloatLayout.parent != null) {
mWindowManager!!.removeView(mFloatLayout)
}
ipcReportWindow = null
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
interface ClickListener {
fun closeWindow()
}
}

View File

@@ -29,7 +29,7 @@ import java.util.*
/**
* SOP设置窗口
*/
class SOPSettingView @JvmOverloads constructor(
internal class SOPSettingView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
@@ -78,6 +78,7 @@ class SOPSettingView @JvmOverloads constructor(
/**
* obu弱势交通控制
*/
tbObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView
tbObuWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked ->
if (!isChecked) { //默认开启
CallerHmiManager.setObuWeaknessTraffic(true)
@@ -89,6 +90,7 @@ class SOPSettingView @JvmOverloads constructor(
/**
* 云端弱势交通控制
*/
tbCloudWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowCloudWeaknessTrafficView
tbCloudWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) { //默认关闭
CallerHmiManager.setCloudWeaknessTraffic(true)

View File

@@ -0,0 +1,80 @@
package com.mogo.eagle.core.function.hmi.ui.setting
import android.animation.Animator
import android.content.Context
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.view.animation.OvershootInterpolator
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.enums.SidePattern
import com.mogo.eagle.core.function.hmi.notification.WarningFloat
import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import me.jessyan.autosize.utils.AutoSizeUtils
class SopView private constructor(){
companion object{
val sopView by lazy(LazyThreadSafetyMode.SYNCHRONIZED){
SopView()
}
}
//SOPSettingView
private var mSOPSettingViewFloat: WarningFloat.Builder? = null
private var mSOPSettingView: SOPSettingView? = null
fun toggle(context: Context?, gravity: Int = Gravity.RIGHT, sidePattern: SidePattern = SidePattern.RIGHT) {
context?.let {
if (mSOPSettingViewFloat != null) {
WarningFloat.dismiss(mSOPSettingViewFloat!!.config.floatTag, false)
mSOPSettingViewFloat = null
mSOPSettingView = null
} else {
if (mSOPSettingView == null) {
mSOPSettingView = SOPSettingView(it)
}
// var side = SidePattern.RIGHT
// var gravity = Gravity.RIGHT
// //调试窗默认靠右显示Bus的乘客端右端有视图覆盖调试窗靠左显示
// if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) &&
// AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
// ) {
// side = SidePattern.LEFT
// gravity = Gravity.LEFT
// }
mSOPSettingViewFloat = WarningFloat.with(it)
.setTag("mSOPSettingView")
.setLayout(mSOPSettingView!!)
.setSidePattern(sidePattern)
.setGravity(gravity, offsetY = 70)
.setImmersionStatusBar(true)
.setWindowWidth(AutoSizeUtils.dp2px(context, 800f))
.setWindowHeight(AutoSizeUtils.dp2px(context, 1100f))
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
}
}
}
}

View File

@@ -0,0 +1,124 @@
package com.mogo.eagle.core.function.hmi.ui.setting
import android.animation.Animator
import android.app.Activity
import android.content.Context
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.view.animation.OvershootInterpolator
import com.mogo.eagle.core.data.enums.SidePattern
import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.hmi.notification.WarningFloat
import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator
import com.mogo.eagle.core.utilcode.util.TimeUtils
import me.jessyan.autosize.utils.AutoSizeUtils
import mogo_msg.MogoReportMsg
class ToggleDebugView private constructor() : IMoGoAutopilotStatusListener {
companion object {
val toggleDebugView by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
ToggleDebugView()
}
}
// DebugSettingView
private var mDebugSettingViewFloat: WarningFloat.Builder? = null
private var mDebugSettingView: DebugSettingView? = null
//工控机节点上报列表
private val reportList = arrayListOf<ReportEntity>()
//工控机上报列表悬浮窗
private var reportListFloatWindow: ReportListFloatWindow? = null
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
super.onAutopilotGuardian(guardianInfo)
guardianInfo?.let {
if (reportList.size > 49) {
reportList.removeLast()
}
reportList.add(
0,
ReportEntity(
TimeUtils.millis2String(System.currentTimeMillis()),
it.src, it.level, it.msg, it.code, it.resultList, it.actionsList
)
)
reportListFloatWindow?.refreshData(reportList)
}
}
/**
* 开关DebugView
*/
fun toggle(context: Context, gravity: Int = Gravity.RIGHT, sidePattern: SidePattern = SidePattern.RIGHT) {
if (mDebugSettingViewFloat != null) {
dismiss()
} else {
if (mDebugSettingView == null) {
mDebugSettingView = DebugSettingView(context)
mDebugSettingView?.reportInit(reportList)
mDebugSettingView?.setClickListener(object : DebugSettingView.ClickListener {
override fun showReportListWindow(show: Boolean) {
if (show) {
//打开工控机上报列表
reportListFloatWindow =
ReportListFloatWindow(context.applicationContext as Activity)
reportListFloatWindow?.showFloatWindow()
reportListFloatWindow?.refreshData(reportList)
} else {
//关闭工控机上报列表
reportListFloatWindow?.hideFloatWindow()
}
}
})
}
mDebugSettingViewFloat = WarningFloat.with(context)
.setTag("DebugSettingView")
.setLayout(mDebugSettingView!!)
.setSidePattern(sidePattern)
.setGravity(gravity, offsetY = 70)
.setImmersionStatusBar(true)
.setWindowHeight(AutoSizeUtils.dp2px(context, 1100f))
.setWindowWidth(AutoSizeUtils.dp2px(context, 800f))
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
}
}
private fun dismiss() {
mDebugSettingViewFloat?.let {
WarningFloat.dismiss(it.config.floatTag, false)
mDebugSettingViewFloat = null
mDebugSettingView = null
//关闭工控机上报列表
reportListFloatWindow?.hideFloatWindow()
reportListFloatWindow = null
}
}
}

View File

@@ -0,0 +1,121 @@
package com.mogo.eagle.core.function.hmi.ui.setting
import android.animation.Animator
import android.content.Context
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.view.animation.OvershootInterpolator
import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.data.enums.SidePattern
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.notification.WarningFloat
import com.mogo.eagle.core.function.hmi.notification.anim.DefaultAnimator
import com.mogo.eagle.core.function.hmi.ui.setting.SopView.Companion.sopView
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView.Companion.toggleDebugView
import com.mogo.eagle.core.function.hmi.ui.tools.AutoPilotAndCheckView
import com.mogo.eagle.core.utilcode.util.ToastUtils
class ToolsView private constructor() {
companion object {
val toolsView by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
ToolsView()
}
}
private var toolsView: AutoPilotAndCheckView? = null
// 检测、自动驾驶速度设置
private var toolsViewFloat: WarningFloat.Builder? = null
fun showToolsFloat(context: Context?) {
context?.let {
if (toolsViewFloat == null) {
if (toolsView == null) {
toolsView = AutoPilotAndCheckView(it)
toolsView!!.setClickListener(object : AutoPilotAndCheckView.ClickListener {
override fun onClose(v: View) {
dismissToolsFloatView()
}
override fun showDebugPanelView() {
toggleDebugView.toggle(it)
}
override fun showFeedbackView() {
dismissToolsFloatView()
CallerDevaToolsManager.showFeedbackView(it)
}
override fun showSOPSettingView() {
sopView.toggle(it)
}
})
}
toolsViewFloat = WarningFloat.with(it)
.setTag("ToolsViewFloat")
.setLayout(toolsView!!)
.setSidePattern(SidePattern.LEFT)
.setGravity(Gravity.LEFT)
.setImmersionStatusBar(true)
.setWindowHeight(WindowManager.LayoutParams.MATCH_PARENT)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: WindowManager.LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onDismiss() {
toolsViewFloat = null
toolsView = null
}
})
.show()
} else {
toolsViewFloat?.show()
}
}
}
fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo){
toolsView?.showAdUpgradeStatus(ipcUpgradeStateInfo)
ipcUpgradeStateInfo.status.let {
if (AdUpgradeStateHelper.isUpgradeSuccess(it)) {
ToastUtils.showLong("升级成功")
AdUpgradeStateHelper.setConfirmUpgrade(false)
}
}
}
private fun dismissToolsFloatView() {
toolsViewFloat?.let {
WarningFloat.dismiss(it.config.floatTag, false)
toolsViewFloat = null
toolsView = null
}
}
fun dismiss() {
dismissToolsFloatView()
}
}

View File

@@ -0,0 +1,39 @@
package com.mogo.eagle.core.function.hmi.ui.switch
import android.content.Context
import android.util.AttributeSet
import android.view.View
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
class DemoModeHiddenSwitch(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
setOnClickListener {
//只在司机端设置美化模式开关功能
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
//单次查询,是否有行程信息(订单进行中时点击不生效),autopilotControlParameters为null代表不处于自动驾驶状态下
if (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().autopilotControlParameters == null) {
FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode
context?.let {
CallerHmiManager.updateStatusBarLeftView(
FunctionBuildConfig.isDemoMode,
"demoMode",
DemoModeView(it)
)
}
CallerAutoPilotManager.setDemoMode(FunctionBuildConfig.isDemoMode)
if (!FunctionBuildConfig.isDemoMode) {
//关闭美化模式时,通知工控机
CallerAutoPilotManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode)
}
}
}
}
}
}

View File

@@ -3,16 +3,85 @@ package com.mogo.eagle.core.function.hmi.ui.takeover
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.enums.EventTypeEnum
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.zhidao.support.adas.high.common.MogoReport
import mogo_msg.MogoReportMsg
class TakeOverView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotStatusListener {
companion object {
const val TAG = "TakeOverView"
}
init {
LayoutInflater.from(context).inflate(R.layout.view_take_over, this, true)
}
private var takeOver = false
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
}
/**
* 工控机监控节点上报
*/
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
super.onAutopilotGuardian(guardianInfo)
ThreadUtils.runOnUiThread {
guardianInfo?.let {
if (FunctionBuildConfig.isDemoMode) {
return@let
}
if (takeOver) {
return@let
}
when (it.code) {
MogoReport.Code.Error.EMAP.EXIT_AUTOPILOT_FOR_PLANNING,
MogoReport.Code.Error.EMAP.EXIT_AUTOPILOT_FOR_LOCATION,
MogoReport.Code.Error.EMAP.EXIT_AUTOPILOT_FOR_CHASSIS,
MogoReport.Code.Error.EMAP.EXIT_AUTOPILOT_FOR_DISTANCE -> {
CallerHmiManager.warningV2X(
EventTypeEnum.TAKE_OVER_EVENT.poiType,
EventTypeEnum.TAKE_OVER_EVENT.content,
EventTypeEnum.TAKE_OVER_EVENT.tts,
EventTypeEnum.TAKE_OVER_EVENT.poiType,
object : IMoGoWarningStatusListener {
override fun onShow() {
takeOver = true
visibility = View.VISIBLE
}
override fun onDismiss() {
takeOver = false
visibility = View.GONE
}
},
true,
6000L
)
}
}
}
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerAutoPilotStatusListenerManager.removeListener(TAG)
}
}

View File

@@ -3,55 +3,79 @@ package com.mogo.eagle.core.function.hmi.ui.tools
import android.content.Context
import android.widget.TextView
import androidx.lifecycle.LifecycleObserver
import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog
import com.mogo.eagle.core.utilcode.util.ToastUtils
/**
* @author XuXinChao
* @description 工控机确认升级对话框
* @since: 2022/1/13
*/
class AdUpgradeDialog(context: Context,images: List<String>,padSn: String,releaseId: String)
: BaseFloatDialog(context), LifecycleObserver {
class AdUpgradeDialog(context: Context, images: List<String>, padSn: String, releaseId: String) :
BaseFloatDialog(context), LifecycleObserver {
private var upgradeConfirm : TextView? = null
private var upgradeCancel : TextView? = null
companion object {
private var adUpgradeDialog: AdUpgradeDialog? = null
fun show(context: Context?, images: List<String>, padSn: String, releaseId: String) {
context?.let {
if (adUpgradeDialog == null) {
adUpgradeDialog = AdUpgradeDialog(it, images, padSn, releaseId)
}
adUpgradeDialog?.let { dialog ->
if (dialog.isShowing) {
return
}
dialog.show()
}
}
}
}
private var upgradeConfirm: TextView? = null
private var upgradeCancel: TextView? = null
private var clickListener: ClickListener? = null
private var images: List<String>?=null
private var padSn: String?=null
private var releaseId: String?=null
private var images: List<String>? = null
private var padSn: String? = null
private var releaseId: String? = null
init {
setContentView(R.layout.dialog_ad_upgrade)
setCanceledOnTouchOutside(false)
upgradeConfirm=findViewById(R.id.tv_upgrade_confirm)
upgradeCancel=findViewById(R.id.tv_upgrade_cancel)
upgradeConfirm = findViewById(R.id.tv_upgrade_confirm)
upgradeCancel = findViewById(R.id.tv_upgrade_cancel)
upgradeConfirm?.setOnClickListener{
clickListener?.confirm()
}
upgradeCancel?.setOnClickListener {
clickListener?.cancel()
}
this.images = images
this.padSn = padSn
this.releaseId = releaseId
upgradeConfirm?.setOnClickListener {
//确认升级
CallerDevaToolsManager.upgradeConfirm(images, padSn, releaseId)
AdUpgradeStateHelper.setConfirmUpgrade(true)
ToastUtils.showLong("最新版本下载中...")
dismiss()
}
upgradeCancel?.setOnClickListener {
dismiss()
}
}
override fun dismiss() {
super.dismiss()
adUpgradeDialog = null
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
fun showUpgradeDialog(){
if(isShowing){
return
}
show()
}
interface ClickListener{
interface ClickListener {
fun confirm()
fun cancel()
}

View File

@@ -37,7 +37,7 @@ import kotlin.system.exitProcess
* @author ChenFufeng
* 设置自动驾驶速度和检测页入口
*/
class AutoPilotAndCheckView @JvmOverloads constructor(
internal class AutoPilotAndCheckView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
@@ -165,7 +165,7 @@ class AutoPilotAndCheckView @JvmOverloads constructor(
MsgBoxConfig.setUserRecord(0)
}
actvLoginout.visibility = View.VISIBLE
CallerHmiManager.setBusOperationView(toolBusOperationView)
toolBusOperationView.showBusOperation()
// TODO 这里判断方式可以替换为使用 AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)等进行替换
when (DebugConfig.getProductFlavor()) {
@@ -199,7 +199,6 @@ class AutoPilotAndCheckView @JvmOverloads constructor(
systemVersionView?.showAdUpgradeStatus(ipcUpgradeStateInfo)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)

View File

@@ -4,9 +4,9 @@ import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.LinearLayout
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.temp.EventLogout
import com.mogo.eagle.core.function.api.hmi.view.IOchBusView
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@@ -23,7 +23,7 @@ class BusOperationView @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0)
: IOchBusView(context, attrs, defStyleAttr) {
: LinearLayout(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true)
@@ -47,15 +47,11 @@ class BusOperationView @JvmOverloads constructor(
}
}
override fun showBusOperation() {
fun showBusOperation() {
ochBusOperationStatus.visibility = View.VISIBLE
initPersonalIcon()
}
override fun changerOperationStatus(isOut: Boolean) {
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
context?.let {

View File

@@ -1,42 +0,0 @@
package com.mogo.eagle.core.function.hmi.ui.tools
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import com.mogo.eagle.core.function.hmi.R
/**
* @author lixiaopeng
* 蒙层view
*/
class MaskView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(
context,
attrs,
defStyleAttr
) {
private val TAG = "MaskView"
init {
LayoutInflater.from(context).inflate(R.layout.view_mask, this, true)
initView()
}
companion object {
private var speedLimit: Double = 0.0
}
@SuppressLint("ClickableViewAccessibility")
private fun initView() {
// background = ColorDrawable(Color.parseColor("#F0151D41"))
}
}

View File

@@ -0,0 +1,35 @@
package com.mogo.eagle.core.function.hmi.ui.tools
import android.content.Context
import android.util.AttributeSet
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.ToolsView_TAG
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView
class ToolsImageView(context: Context, attrs: AttributeSet?) :
androidx.appcompat.widget.AppCompatImageView(context, attrs), IViewControlListener {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
setBackgroundResource(R.drawable.module_ext_check)
setImageResource(R.drawable.icon_tools_nor)
scaleType = ScaleType.CENTER
setOnClickListener{
toolsView.showToolsFloat(context)
}
CallerHmiViewControlListenerManager.addListener(ToolsView_TAG, this)
}
override fun visible(v: Int) {
super.visible(v)
visibility = v
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerHmiViewControlListenerManager.removeListener(ToolsView_TAG)
}
}

View File

@@ -8,11 +8,14 @@ import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.AutoPilotStatusView_TAG
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getCurWgs84Lat
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getCurWgs84Lon
import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
@@ -25,18 +28,21 @@ import kotlinx.android.synthetic.main.view_autopilot_status.view.*
* @date 2021/9/22 3:59 下午
* 自动驾驶状态按钮
*/
class AutoPilotStatusView @JvmOverloads constructor(
class AutoPilotStatusView constructor(
context: Context,
attrs: AttributeSet
) : ConstraintLayout(context, attrs),
View.OnClickListener,
IMoGoAutopilotStatusListener {
IMoGoAutopilotStatusListener, IViewControlListener {
private val TAG = "AutopilotStatusView"
companion object {
const val TAG = "AutopilotStatusView"
}
private var mAutopilotStatus: Int = 0
init {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
initView(context)
}
@@ -51,18 +57,22 @@ class AutoPilotStatusView @JvmOverloads constructor(
setOnClickListener(this)
// 自动驾驶状态监听
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerHmiViewControlListenerManager.addListener(AutoPilotStatusView_TAG, this)
CallerLogger.d("$M_HMI$TAG", "autopilotStatus: $mAutopilotStatus")
setAutoPilotStatus(mAutopilotStatus)
}
override fun visible(v: Int) {
super.visible(v)
visibility = v
}
override fun onClick(v: View?) {
when (mAutopilotStatus) {
0 -> {// 不可自动驾驶adas与工控机没有链接或工控机异常
CallerLogger.e("$M_HMI$TAG", "不可自动驾驶adas与工控机没有链接或工控机异常请检查")
ToastUtils.showShort("不可自动驾驶adas与工控机没有链接或工控机异常请检查")
// TODO 这里临时触发自动驾驶能力,测试功过这里删除
//CallerHmiListenerManager.invokeCheckAutoPilotBtnListener(true)
}
1 -> {// 可自动驾驶,目前处于人工干预状态
CallerHmiListenerManager.invokeCheckAutoPilotBtnListener(true)
@@ -85,7 +95,7 @@ class AutoPilotStatusView @JvmOverloads constructor(
currentAutopilot.endName = "HYJC"
currentAutopilot.isSpeakVoice = false
currentAutopilot.startLatLon =
AutopilotControlParameters.AutoPilotLonLat(getCurWgs84Lat(),getCurWgs84Lon())
AutopilotControlParameters.AutoPilotLonLat(getCurWgs84Lat(), getCurWgs84Lon())
currentAutopilot.endLatLon =
AutopilotControlParameters.AutoPilotLonLat(26.819716071924688, 112.57715442110867)
currentAutopilot.vehicleType = 10
@@ -126,4 +136,10 @@ class AutoPilotStatusView @JvmOverloads constructor(
setAutoPilotStatus(autoPilotStatusInfo.state)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerHmiViewControlListenerManager.removeListener(AutoPilotStatusView_TAG)
}
}

View File

@@ -0,0 +1,43 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.CameraView_TAG
import com.mogo.eagle.core.function.call.biz.CallerFuncBizManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView
class CameraView(context: Context, attrs: AttributeSet?) :
androidx.appcompat.widget.AppCompatImageView(context, attrs), IViewControlListener {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
setBackgroundResource(R.drawable.icon_camera_nor)
setOnClickListener {
cameraLiveView.showCameraList(
context,
CallerFuncBizManager.bizProvider.getCameraList
) { liveStatus ->
if (liveStatus) {
setBackgroundResource(R.drawable.icon_camera_selected)
} else {
setBackgroundResource(R.drawable.icon_camera_nor)
}
}
}
CallerHmiViewControlListenerManager.addListener(CameraView_TAG, this)
}
override fun visible(v: Int) {
super.visible(v)
visibility = v
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerHmiViewControlListenerManager.removeListener(CameraView_TAG)
}
}

View File

@@ -20,8 +20,8 @@ class LimitingVelocityView @JvmOverloads constructor(
LayoutInflater.from(context).inflate(R.layout.view_limiting_speed_vr, this, true)
}
override fun updateLimitingSpeed(limitingSpeed: Int) {
super.updateLimitingSpeed(limitingSpeed)
override fun updateLimitingSpeed(limitingSpeed: Int, limitSource: Int) {
super.updateLimitingSpeed(limitingSpeed, limitSource)
tvLimitingVelocity.text = "$limitingSpeed"
}
}

View File

@@ -5,6 +5,9 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.PerspectiveSwitchView_TAG
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.hmi.R
import com.mogo.map.uicontroller.VisualAngleMode
@@ -19,12 +22,20 @@ class PerspectiveSwitchView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr), View.OnClickListener {
) : FrameLayout(context, attrs, defStyleAttr), View.OnClickListener, IViewControlListener{
init {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
LayoutInflater.from(context).inflate(R.layout.view_perspective_switch, this, true)
setBackgroundResource(R.drawable.module_switch_map_bg)
setOnClickListener(this)
CallerHmiViewControlListenerManager.addListener(PerspectiveSwitchView_TAG,this)
}
override fun visible(v: Int) {
super.visible(v)
visibility = v
}
override fun onClick(v: View?) {
@@ -41,4 +52,10 @@ class PerspectiveSwitchView @JvmOverloads constructor(
}
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerHmiViewControlListenerManager.removeListener(PerspectiveSwitchView_TAG)
}
}

View File

@@ -8,7 +8,10 @@ import android.widget.ImageView
import android.widget.TextView
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.TrafficLightView_TAG
import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
@@ -20,7 +23,7 @@ class SingleTrafficLightView @JvmOverloads constructor(
context: Context?,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : IViewTrafficLight(context, attrs, defStyleAttr) {
) : IViewTrafficLight(context, attrs, defStyleAttr), IViewControlListener {
private var mLightIconIV: ImageView? = null
private var mLightIconBG: ImageView? = null
private var mLightTimeTV: GradientTextView? = null
@@ -28,17 +31,26 @@ class SingleTrafficLightView @JvmOverloads constructor(
private var mLightSourceDivider: View? = null
private var mCurrentLightId = 0
init {
init(context)
}
private fun init(context: Context?) {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
LayoutInflater.from(context).inflate(R.layout.hmi_view_traffic_light, this, true)
mLightIconIV = findViewById(R.id.hmi_traffic_light_iv)
mLightIconBG = findViewById(R.id.hmi_traffic_light_bg)
mLightTimeTV = findViewById(R.id.hmi_traffic_light_time_tv)
mLightSourceTV = findViewById(R.id.hmi_traffic_light_source)
mLightSourceDivider = findViewById(R.id.hmi_traffic_light_divider)
CallerHmiViewControlListenerManager.addListener(TrafficLightView_TAG, this)
}
override fun visible(v: Int) {
super.visible(v)
visibility = v
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerHmiViewControlListenerManager.removeListener(TrafficLightView_TAG)
}
/**
@@ -47,11 +59,11 @@ class SingleTrafficLightView @JvmOverloads constructor(
* @param checkLightId 0-都是默认1-红2-黄3-绿
* @param lightSource 1:云端下发2:自车感知
*/
override fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) {
super.showWarningTrafficLight(checkLightId,lightSource)
override fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) {
super.showWarningTrafficLight(checkLightId, lightSource)
mCurrentLightId = checkLightId
if(!HmiBuildConfig.isShowTrafficLightView){
updateTrafficLightIcon(checkLightId,lightSource)
if (!HmiBuildConfig.isShowTrafficLightView) {
updateTrafficLightIcon(checkLightId, lightSource)
}
}
@@ -70,24 +82,28 @@ class SingleTrafficLightView @JvmOverloads constructor(
super.disableCountdown()
UiThreadHandler.post {
// 小巴车的司机端需要展示红绿灯信号来源
if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)){
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
) {
val lp = this.layoutParams as MarginLayoutParams
lp.width = context.resources.getDimension(R.dimen.dp_325).toInt()
this.layoutParams = lp
mLightSourceTV!!.visibility = VISIBLE
mLightSourceDivider!!.visibility = VISIBLE
mLightTimeTV!!.visibility = GONE
mLightSourceTV!!.setPadding(0,0,75,0)
mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.dp_310).toInt()
}else{
mLightSourceTV!!.setPadding(0, 0, 75, 0)
mLightIconBG!!.layoutParams.width =
context.resources.getDimension(R.dimen.dp_310).toInt()
} else {
val lp = this.layoutParams as MarginLayoutParams
lp.width = context.resources.getDimension(R.dimen.hmi_traffic_light_icon_size).toInt()
lp.width =
context.resources.getDimension(R.dimen.hmi_traffic_light_icon_size).toInt()
this.layoutParams = lp
mLightTimeTV!!.visibility = GONE
mLightSourceDivider!!.visibility = View.GONE
mLightSourceTV!!.visibility = View.GONE
mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.dp_124).toInt()
mLightIconBG!!.layoutParams.width =
context.resources.getDimension(R.dimen.dp_124).toInt()
}
}
}
@@ -176,7 +192,7 @@ class SingleTrafficLightView @JvmOverloads constructor(
* @param lightId 0-都是默认1-红2-黄3-绿
* @param lightSource 1:云端下发2:自车感知
*/
private fun updateTrafficLightIcon(lightId: Int,lightSource: Int) {
private fun updateTrafficLightIcon(lightId: Int, lightSource: Int) {
UiThreadHandler.post {
when (lightId) {
1 -> {
@@ -193,7 +209,7 @@ class SingleTrafficLightView @JvmOverloads constructor(
}
else -> this@SingleTrafficLightView.visibility = GONE
}
when(lightSource){
when (lightSource) {
1 -> {
mLightSourceTV!!.text = "云端下发"
}
@@ -207,26 +223,31 @@ class SingleTrafficLightView @JvmOverloads constructor(
}
}
private fun resetView(){
private fun resetView() {
// 小巴车的司机端需要展示红绿灯信号来源
if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)){
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
) {
val lp = this.layoutParams as MarginLayoutParams
lp.width = context.resources.getDimension(R.dimen.hmi_traffic_light_bus_layout_width).toInt()
lp.width =
context.resources.getDimension(R.dimen.hmi_traffic_light_bus_layout_width).toInt()
this.layoutParams = lp
mLightTimeTV!!.visibility = View.VISIBLE
mLightSourceDivider!!.visibility = View.VISIBLE
mLightSourceTV!!.visibility = View.VISIBLE
mLightSourceTV!!.setPadding(0,0,0,0)
mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.hmi_traffic_light_bus_bg_width).toInt()
}else{
mLightSourceTV!!.setPadding(0, 0, 0, 0)
mLightIconBG!!.layoutParams.width =
context.resources.getDimension(R.dimen.hmi_traffic_light_bus_bg_width).toInt()
} else {
val lp = this.layoutParams as MarginLayoutParams
lp.width = context.resources.getDimension(R.dimen.hmi_traffic_light_layout_width).toInt()
lp.width =
context.resources.getDimension(R.dimen.hmi_traffic_light_layout_width).toInt()
this.layoutParams = lp
mLightTimeTV!!.visibility = View.VISIBLE
mLightSourceDivider!!.visibility = View.GONE
mLightSourceTV!!.visibility = View.GONE
mLightIconBG!!.layoutParams.width = context.resources.getDimension(R.dimen.hmi_traffic_light_bg_width).toInt()
mLightIconBG!!.layoutParams.width =
context.resources.getDimension(R.dimen.hmi_traffic_light_bg_width).toInt()
}
}

View File

@@ -178,7 +178,7 @@ public class SpeedChartView extends View {
setAnimation(lastAngle, currentAngle, 1000);
lastAngle = currentAngle;
//重新绘制
postInvalidate();
invalidate();
}
}

View File

@@ -6,8 +6,11 @@ import android.util.AttributeSet
import android.view.Gravity
import android.widget.FrameLayout
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.SpeedPanelView_TAG
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ20ListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
@@ -22,7 +25,7 @@ class SpeedPanelView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : FrameLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener {
) : FrameLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener,IViewControlListener {
companion object {
const val TAG = "SpeedPanelView"
@@ -38,7 +41,6 @@ class SpeedPanelView @JvmOverloads constructor(
}
init {
initEvent()
setBackgroundResource(R.drawable.yi_biao_pan_bg_nor)
mContext = context
mSpeedChartView = SpeedChartView(context)
@@ -52,17 +54,13 @@ class SpeedPanelView @JvmOverloads constructor(
addView(mSpeedChartView)
}
private fun initEvent() {
setOnLongClickListener {
CallerHmiManager.toggleDebugView()
false
}
}
private var timerTask: TimerTask? = null
override fun onAttachedToWindow() {
super.onAttachedToWindow() // 注册位置回调
super.onAttachedToWindow()
// 注册view控制显示隐藏监听
CallerHmiViewControlListenerManager.addListener(SpeedPanelView_TAG,this)
// 注册位置回调
CallerChassisLocationGCJ20ListenerManager.addListener(TAG, this)
// 开启定时查询速度
timerTask?.cancel()
@@ -82,7 +80,7 @@ class SpeedPanelView @JvmOverloads constructor(
}
}
this.timerTask = task
timer.schedule(task, Date(), 100)
timer.schedule(task, Date(), 200)
}
override fun onChassisLocationGCJ02(gnssInfo: MessagePad.GnssInfo?) {
@@ -91,9 +89,15 @@ class SpeedPanelView @JvmOverloads constructor(
}
}
override fun visible(v: Int) {
super.visible(v)
visibility = v
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
// 解除注册
CallerHmiViewControlListenerManager.removeListener(SpeedPanelView_TAG)
CallerChassisLocationGCJ20ListenerManager.removeListener(TAG)
try {
timerTask?.cancel()

View File

@@ -1,18 +1,19 @@
package com.mogo.eagle.core.function.hmi.ui.widget
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.*
import android.widget.*
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.LinearLayout
import com.mogo.eagle.core.data.mofang.MfConstants
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener
import com.mogo.eagle.core.function.call.devatools.*
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.eagle.core.utilcode.util.ScreenUtils
import kotlinx.android.synthetic.main.view_status_bar.view.*
import java.util.concurrent.CopyOnWriteArrayList
@@ -20,7 +21,7 @@ class StatusBarView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr), IMoGoSkinModeChangeListener {
) : LinearLayout(context, attrs, defStyleAttr), IMoGoSkinModeChangeListener, IViewControlListener {
companion object {
const val TAG = "StatusBarView"
@@ -37,17 +38,19 @@ class StatusBarView @JvmOverloads constructor(
override fun onAttachedToWindow() {
super.onAttachedToWindow()
viewStatusBarRight.addView(BatteryGroupView(this.context))
//将状态窗口中的状态移到状态栏上
CallerDevaToolsManager.showStatusBar(context, status_container)
// 添加换肤监听
CallerSkinModeListenerManager.addListener(TAG, this)
var isBluetoothConnect = SharedPrefsMgr.getInstance(context).getBoolean(MfConstants.BLUETOOTH_STATUS, false)
val isBluetoothConnect =
SharedPrefsMgr.getInstance(context).getBoolean(MfConstants.BLUETOOTH_STATUS, false)
if (isBluetoothConnect) {
updateMfStatus("MoFangManager", true)
}
//添加view控制
CallerHmiViewControlListenerManager.addListener(TAG,this)
// 添加换肤监听
CallerSkinModeListenerManager.addListener(TAG, this)
//将状态窗口中的状态移到状态栏上
CallerDevaToolsManager.showStatusBar(context, status_container)
}
override fun onSkinModeChange(skinMode: Int) {
@@ -57,15 +60,13 @@ class StatusBarView @JvmOverloads constructor(
}
}
fun setStatusBarDarkOrLight(light: Boolean) {
if (light) {
setTextColor(resources.getColor(R.color.color_2C2E30))
} else {
setTextColor(resources.getColor(R.color.color_FFFFFF))
}
override fun setStatusBarDarkOrLight(light: Boolean) = if (light) {
setTextColor(resources.getColor(R.color.color_2C2E30))
} else {
setTextColor(resources.getColor(R.color.color_FFFFFF))
}
fun updateRightView(insert: Boolean, tag: String, viewGroup: ViewGroup) {
override fun updateStatusBarRightView(insert: Boolean, tag: String, viewGroup: ViewGroup) {
if (insert) {
rightViewList.add(0, tag)
viewStatusBarRight.addView(viewGroup, 0)
@@ -79,7 +80,7 @@ class StatusBarView @JvmOverloads constructor(
}
}
fun updateLeftView(insert: Boolean, tag: String, viewGroup: ViewGroup) {
override fun updateStatusBarLeftView(insert: Boolean, tag: String, viewGroup: ViewGroup) {
if (insert) {
leftViewList.add(0, tag)
viewStatusBarLeft.addView(viewGroup, 0)
@@ -93,7 +94,8 @@ class StatusBarView @JvmOverloads constructor(
}
}
fun updateProgressView(insert: Boolean, tag: String, progress: Int) {
@SuppressLint("SetTextI18n")
override fun updateStatusBarDownloadView(insert: Boolean, tag: String, progress: Int) {
if (insert) {
viewProgressTv.visibility = VISIBLE
viewProgressTv.text = "$progress%"
@@ -102,7 +104,7 @@ class StatusBarView @JvmOverloads constructor(
}
}
fun updateMfStatus(tag: String, status: Boolean) {
override fun updateMfStatus(tag: String, status: Boolean) {
if (status) {
viewMofangStatus.setImageResource(R.drawable.icon_bluetooth_p)
} else {
@@ -117,6 +119,7 @@ class StatusBarView @JvmOverloads constructor(
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerHmiViewControlListenerManager.removeListener(TAG)
CallerSkinModeListenerManager.removeListener(TAG)
CallerDevaToolsManager.hideStatusBar()
}

View File

@@ -25,7 +25,6 @@ class V2XNotificationView @JvmOverloads constructor(
defStyleAttr: Int = 0
) : IViewNotification(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.notification_v2x_msg_vr, this, true)
// 设置View的出场位置

View File

@@ -3,49 +3,71 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.vip.IMoGoVipSetListener
import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.view_vip_identification.view.*
import com.mogo.eagle.core.utilcode.util.ThreadUtils
/**
* VIP标识控件
*/
class VipIdentificationView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
class VipIdentificationView : ConstraintLayout, IMoGoVipSetListener {
init {
companion object {
const val TAG = "VipIdentificationView"
}
constructor(context: Context, attributeSet: AttributeSet) : this(context, attributeSet, 0) {
}
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
) {
init(attributeSet, defStyleAttr)
}
private var marginStart: Float = 0.0f
private var marginTop: Float = 0.0f
private fun init(attrs: AttributeSet, defStyleAttr: Int) {
LayoutInflater.from(context).inflate(R.layout.view_vip_identification, this, true)
val a = context.obtainStyledAttributes(
attrs,
R.styleable.VipIdentificationView,
defStyleAttr,
0
)
marginStart = a.getDimension(R.styleable.VipIdentificationView_marginStart, 0.0f)
marginTop = a.getDimension(R.styleable.VipIdentificationView_marginTop, 0.0f)
a.recycle()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val lp = this.layoutParams as LayoutParams
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left_bus_passenger).toInt()
lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top_passenger).toInt()
} else if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left_taxi_passenger).toInt()
lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top_passenger).toInt()
} else {
lp.marginStart = resources.getDimension(R.dimen.module_vip_margin_left).toInt()
lp.topMargin = resources.getDimension(R.dimen.module_vip_margin_top).toInt()
}
lp.marginStart = marginStart.toInt()
lp.topMargin = marginTop.toInt()
this.layoutParams = lp
invalidate()
CallVipSetListenerManager.addListener(TAG, this)
}
fun setVipIdentificationVisible(visible: Boolean) {
UiThreadHandler.post {
ivVipIdentification.visibility = visibility
override fun onVipSet(status: Boolean) {
ThreadUtils.runOnUiThread {
visibility = if (status) {
View.VISIBLE
} else {
View.GONE
}
}
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallVipSetListenerManager.removeListener(TAG)
}
}

View File

@@ -39,6 +39,7 @@ import com.mogo.eagle.core.data.config.HdMapBuildConfig;
import com.mogo.eagle.core.data.constants.MoGoFragmentPaths;
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager;
import com.mogo.eagle.core.function.hmi.R;
import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView;
@@ -137,7 +138,7 @@ public class MainActivity extends MvpActivity<MainView, MainPresenter> implement
View statusBarView = decorView.findViewWithTag("status_bar");
if (statusBarView == null) {
statusBarView = new StatusBarView(this);
statusBarView = getStatusBarView();
statusBarView.setTag("status_bar");
}
FrameLayout.LayoutParams statusBarLP =
@@ -147,6 +148,14 @@ public class MainActivity extends MvpActivity<MainView, MainPresenter> implement
decorView.addView(statusBarView, statusBarLP);
}
/**
* 修改statusBar 重写实现,需要继承 StatusBarViewxml中基础系统控件不要修改其id拿来即用
* @return StatusBarView
*/
protected StatusBarView getStatusBarView(){
return new StatusBarView(this);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -163,6 +172,9 @@ public class MainActivity extends MvpActivity<MainView, MainPresenter> implement
DisplayEffectsHelper.getInstance().init(clSpecialEffect);
mPresenter.checkPermission(this);
// 同步AppInfo Config信息
CallerDevaToolsManager.INSTANCE.syncConfig();
}
private void calculateStartTime() {

View File

@@ -122,7 +122,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
}).start();
}
// TODO 李小鹏 这里需要将逻辑抽离出去,单独使用更新服务控制
private void upgradeProgressListener() {
final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
// builder.setSmallIcon(R.mipmap.icon1001);//todo emArrow 更换图标,去除地图下载图标的依赖关系
@@ -213,13 +212,13 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_V2X_OBU_MOGO, "IMoGoObuProvider"));
// BIZ
MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_FUNC_BIZ, "IMoGoNoticeProvider"));
// 车聊聊IM
// todo 后置 车聊聊IM
MogoModulePaths.addModuleFunctionServer(new MogoModule(ChatConsts.CHAT_PROVIDER_PATH, ChatConsts.CHAT_MODULE_NAME));
// V2X 模块
MogoModulePaths.addBaseModule(new MogoModule(MogoServicePaths.PATH_V2X_MODULE, "V2XProvider"));
// 司机身份专属模块
// 司机身份专属
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
// 地图数据收集模块
// todo 后置 地图数据收集模块
MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_MAP_DATA_COLLECT_PROVIDER, "MoGoMapDataCollector"));
}
CallerLogger.INSTANCE.i(M_HMI + TAG, "App launch timer cost " + (System.currentTimeMillis() - start) + "ms");

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- <corners android:radius="@dimen/module_mogo_och_autopilot_status_bg_corner" />-->
<gradient
android:startColor="#323C6F"
android:endColor="#323C6F"
android:angle="315"
/>
<size
android:width="120dp"
android:height="120dp"
/>
</shape>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:width="112dp"
android:height="112dp"
android:drawable="@drawable/bg_operation_status_bg" />
<item
android:width="80dp"
android:height="80dp"
android:gravity="center">
<bitmap android:src="@drawable/toggle_setting_btn_bg" />
</item>
</layer-list>

View File

@@ -6,14 +6,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/viewShowDebugView"
android:layout_width="@dimen/dp_400"
android:layout_height="@dimen/dp_100"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<!--V2X预警红色边框-->
<com.mogo.eagle.core.function.hmi.ui.widget.V2XWarningView
android:id="@+id/flV2XWarningView"
@@ -28,26 +20,15 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="72dp">
<!--脉速表-->
<com.mogo.eagle.core.function.hmi.ui.widget.SpeedPanelView
android:id="@+id/viewSpeedChart"
android:layout_width="@dimen/module_ext_speed_width"
android:layout_height="@dimen/module_ext_speed_height"
android:layout_marginLeft="@dimen/module_mogo_autopilot_status_margin_left"
android:layout_marginTop="@dimen/module_ext_arcView_top"
android:elevation="@dimen/dp_10"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--Vip车辆标志-->
<com.mogo.eagle.core.function.hmi.ui.widget.VipIdentificationView
android:id="@+id/flVipIdentificationView"
android:layout_width="@dimen/module_vip_width"
android:layout_height="@dimen/module_vip_height"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--接管提示-->
<com.mogo.eagle.core.function.hmi.ui.takeover.TakeOverView
android:id="@+id/clTakeOverView"
android:layout_width="@dimen/hmi_take_over_request_width"
@@ -58,40 +39,6 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--自动驾驶按钮及状态-->
<com.mogo.eagle.core.function.hmi.ui.widget.AutoPilotStatusView
android:id="@+id/viewAutopilotStatus"
android:layout_width="@dimen/module_mogo_autopilot_status_bg_width"
android:layout_height="@dimen/module_mogo_autopilot_status_bg_height"
android:layout_marginTop="@dimen/module_mogo_autopilot_status_margin_top"
android:elevation="@dimen/dp_10"
app:layout_constraintLeft_toLeftOf="@+id/viewSpeedChart"
app:layout_constraintTop_toBottomOf="@+id/viewSpeedChart"
app:layout_goneMarginStart="@dimen/module_mogo_autopilot_status_margin_left" />
<!--超视距-->
<ImageView
android:id="@+id/ivCameraIcon"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginTop="45dp"
android:layout_marginEnd="40dp"
android:background="@drawable/icon_camera_nor"
app:layout_constraintRight_toLeftOf="@id/viewTrafficLightVr"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<!--红绿灯-->
<com.mogo.eagle.core.function.hmi.ui.widget.SingleTrafficLightView
android:id="@+id/viewTrafficLightVr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:layout_marginTop="@dimen/hmi_traffic_light_layout_margin_top"
android:layout_marginEnd="@dimen/hmi_traffic_light_layout_margin_right"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--地图视角切换-->
<com.mogo.eagle.core.function.hmi.ui.widget.PerspectiveSwitchView
android:id="@+id/viewPerspectiveSwitch"
@@ -103,65 +50,15 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<View
<!--隐藏态下的 美化模式按钮-->
<com.mogo.eagle.core.function.hmi.ui.switch.DemoModeHiddenSwitch
android:id="@+id/viewDemoModeSwitch"
android:layout_width="120dp"
android:layout_height="100dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="40dp"
android:layout_marginBottom="200dp"
/>
<!--工具箱-->
<ImageView
android:id="@+id/ivToolsIcon"
android:layout_width="@dimen/module_hmi_check_size"
android:layout_height="@dimen/module_hmi_check_size"
android:layout_marginLeft="25dp"
android:layout_marginBottom="40dp"
android:background="@drawable/module_ext_check"
android:elevation="@dimen/dp_10"
android:scaleType="center"
android:src="@drawable/icon_tools_nor"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/viewPerspectiveSwitch"
app:layout_goneMarginStart="50dp" />
<!--问题反馈-->
<ImageView
android:id="@+id/ivBadCaseTools"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginStart="50dp"
android:layout_marginBottom="40dp"
android:src="@drawable/bad_case_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/ivToolsIcon" />
<ImageView
android:id="@+id/ivAiCollectTools"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginStart="50dp"
android:layout_marginBottom="40dp"
android:src="@drawable/ai_collect_selector"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/ivBadCaseTools" />
<View
android:id="@+id/viewUpgradeTips"
android:layout_width="22dp"
android:layout_height="22dp"
android:background="@drawable/version_upgrade_tips_background"
android:translationZ="30dp"
android:visibility="gone"
app:layout_constraintCircle="@id/ivToolsIcon"
app:layout_constraintCircleAngle="45"
app:layout_constraintCircleRadius="60dp"
tools:ignore="MissingConstraints" />
app:layout_constraintStart_toStartOf="parent" />
<!--限速牌子-->
<com.mogo.eagle.core.function.hmi.ui.widget.LimitingVelocityView
@@ -178,24 +75,43 @@
android:textSize="60dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ivCameraIcon"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginEnd="40dp"
app:layout_goneMarginTop="40dp"
tools:visibility="gone" />
<!-- todo 需要放入使用方 -->
<!-- app:layout_constraintTop_toBottomOf="@+id/ivCameraIcon"-->
<!--限速来源-->
<TextView
android:id="@+id/tvLimitingSource"
android:layout_width="120dp"
android:layout_height="35dp"
android:gravity="center"
android:text=""
android:textColor="@color/color_FFFFFF"
android:textSize="@dimen/dp_30"
android:textStyle="bold"
android:layout_marginEnd="40dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity" />
<!--消息盒子司机端选择入口-->
<CheckBox
android:id="@+id/cbMsgBoxDriver"
android:layout_width="150dp"
android:layout_height="150dp"
app:layout_constraintTop_toBottomOf="@+id/ivCameraIcon"
app:layout_constraintRight_toLeftOf="@id/viewLimitingVelocity"
android:layout_marginEnd="25dp"
android:layout_marginTop="15dp"
android:button="@null"
android:layout_marginEnd="25dp"
android:background="@drawable/selector_msg_box"
android:button="@null"
android:visibility="gone"
/>
app:layout_constraintRight_toLeftOf="@id/viewLimitingVelocity"
app:layout_constraintTop_toTopOf="parent"/>
<!-- todo 需要放入使用方 , view先gone掉方便重组 -->
<!-- app:layout_constraintTop_toBottomOf="@+id/ivCameraIcon" />-->
<!--司机端消息提示-->
<View
android:id="@+id/MsgBoxTipView"
@@ -203,26 +119,24 @@
android:layout_height="8dp"
android:background="@drawable/version_upgrade_tips_background"
android:translationZ="30dp"
android:visibility="gone"
app:layout_constraintCircle="@id/cbMsgBoxDriver"
app:layout_constraintCircleAngle="40"
app:layout_constraintCircleRadius="32dp"
tools:ignore="MissingConstraints"
android:visibility="gone"
/>
tools:ignore="MissingConstraints" />
<!--消息盒子乘客端选择入口-->
<CheckBox
android:id="@+id/cbMsgBoxPassenger"
android:layout_width="100dp"
android:layout_height="100dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginStart="320dp"
android:layout_marginBottom="50dp"
android:button="@null"
android:background="@drawable/selector_msg_box_p"
android:button="@null"
android:visibility="gone"
/>
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
<!--乘客端消息提示-->
<View
@@ -231,54 +145,49 @@
android:layout_height="15dp"
android:background="@drawable/version_upgrade_tips_background"
android:translationZ="30dp"
android:visibility="gone"
app:layout_constraintCircle="@id/cbMsgBoxPassenger"
app:layout_constraintCircleAngle="40"
app:layout_constraintCircleRadius="50dp"
tools:ignore="MissingConstraints"
android:visibility="gone"
/>
tools:ignore="MissingConstraints" />
<com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxListView
android:id="@+id/viewDriverMsgBoxList"
android:layout_width="864px"
android:layout_height="746px"
app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginEnd="40dp"
android:visibility="gone"
/>
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver" />
<com.mogo.eagle.core.function.hmi.ui.msgbox.DriverMsgBoxBubbleView
android:id="@+id/viewDriverMsgBoxBubble"
android:layout_width="864px"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginEnd="40dp"
android:visibility="gone"
/>
android:visibility="visible"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver" />
<com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView
android:id="@+id/viewPassengerMsgBoxBubble"
android:layout_width="650px"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/cbMsgBoxPassenger"
app:layout_constraintLeft_toLeftOf="@id/cbMsgBoxPassenger"
app:layout_constraintRight_toRightOf="@id/cbMsgBoxPassenger"
android:layout_marginBottom="20dp"
android:visibility="gone"
/>
app:layout_constraintBottom_toTopOf="@id/cbMsgBoxPassenger"
app:layout_constraintLeft_toLeftOf="@id/cbMsgBoxPassenger"
app:layout_constraintRight_toRightOf="@id/cbMsgBoxPassenger" />
<com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxListView
android:id="@+id/viewPassengerMsgBoxList"
android:layout_width="650px"
android:layout_height="750px"
app:layout_constraintBottom_toTopOf="@id/cbMsgBoxPassenger"
app:layout_constraintLeft_toLeftOf="@id/cbMsgBoxPassenger"
app:layout_constraintRight_toRightOf="@id/cbMsgBoxPassenger"
android:layout_marginBottom="20dp"
android:visibility="gone"
/>
app:layout_constraintBottom_toTopOf="@id/cbMsgBoxPassenger"
app:layout_constraintLeft_toLeftOf="@id/cbMsgBoxPassenger"
app:layout_constraintRight_toRightOf="@id/cbMsgBoxPassenger" />
<!--左右转向灯-->
<com.mogo.eagle.core.function.hmi.ui.turnlight.TurnLightViewStatus
@@ -300,6 +209,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--pnc行为决策-->
<com.mogo.eagle.core.function.hmi.ui.pnc.PncActionsView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -328,8 +238,4 @@
app:layout_goneMarginTop="30dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
<!-- app:layout_constraintEnd_toEndOf="parent"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="#00000000"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/ivWaringIcon"
android:layout_width="132dp"
android:layout_height="132dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -50,8 +50,8 @@
</declare-styleable>
<declare-styleable name="TapPositionView">
<attr name="defaultColor" format="color"/> <!--档位默认色值-->
<attr name="selectColor" format="color"/> <!--当前档位色值-->
<attr name="defaultColor" format="color" /> <!--档位默认色值-->
<attr name="selectColor" format="color" /> <!--当前档位色值-->
</declare-styleable>
<style name="BaseFloatDialogStyle" parent="@android:style/Theme.Dialog">
@@ -68,4 +68,10 @@
<item name="android:topDark">@android:color/transparent</item>
<item name="android:borderlessButtonStyle">@android:color/transparent</item>
</style>
<declare-styleable name="VipIdentificationView">
<attr name="marginStart" format="dimension" />
<attr name="marginTop" format="dimension" />
</declare-styleable>
</resources>

View File

@@ -6,22 +6,28 @@ import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.cloud.passport.IMoGoTokenCallback
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.api.map.collect.IMoGoMapDataCollectProvider
import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.zhidaoauto.map.operational.open.GatherApi
import com.zhidaoauto.map.operational.open.GatherParams
import com.zhidaoauto.map.operational.open.abs.OnTaskListener
import record_cache.RecordPanelOuterClass
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.CopyOnWriteArrayList
import java.util.concurrent.atomic.AtomicReference
@Route(path = MogoServicePaths.PATH_MAP_DATA_COLLECT_PROVIDER)
class MoGoMapDataCollectProvider : IMoGoMapDataCollectProvider, OnTaskListener, IMoGoMapLocationListener, IMoGoTokenCallback {
class MoGoMapDataCollectProvider : IMoGoMapDataCollectProvider, OnTaskListener, IMoGoMapLocationListener, IMoGoTokenCallback,
IMoGoAutopilotRecordListener {
companion object {
const val TAG = "MoGoMapDataCollect"
@@ -39,13 +45,16 @@ class MoGoMapDataCollectProvider : IMoGoMapDataCollectProvider, OnTaskListener,
ConcurrentHashMap()
}
override val functionName: String = "$M_MAP$TAG"
override val functionName: String = TAG
@Volatile
private var hasInit = false
override fun init(context: Context?) {
CallerMapLocationListenerManager.addListener(functionName, this, false)
CallerMapLocationListenerManager.addListener(TAG, this, false)
CallerAutopilotRecordListenerManager.addListener(TAG, this)
executor.set(context?.let {
GatherApi.also { itx ->
itx.init(it,
@@ -64,13 +73,27 @@ class MoGoMapDataCollectProvider : IMoGoMapDataCollectProvider, OnTaskListener,
}
override fun onDestroy() {
CallerMapLocationListenerManager.removeListener("$M_MAP$TAG", false)
CallerLogger.d("$M_MAP$TAG", "--------- onDestroy --------")
CallerMapLocationListenerManager.removeListener(TAG, false)
CallerAutopilotRecordListenerManager.removeListener(TAG)
executor.get()?.setOnTaskListener(null)
listeners.clear()
map.clear()
}
override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
super.onAutopilotRecordResult(recordPanel)
CallerLogger.d("$M_MAP$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}")
if (!FunctionBuildConfig.isDemoMode && recordPanel.type == 2 && (
recordPanel.stat == 101 || //工控机采集完成-被动完成
recordPanel.stat == 100 || //工控机采集完成-主动完成
recordPanel.stat == 102 || //工控机达到最大采集时长
recordPanel.stat == 103) //工控机磁盘满了
) {
finish(recordPanel.id, recordPanel.stat, "", recordPanel.filename ?: "", recordPanel.note ?: "")
}
}
override fun registerOnMapCollectTaskListener(listener: IMoGoMapDataCollectProvider.OnMapCollectCmdListener?) {
CallerLogger.d("$M_MAP$TAG", "--------- registerOnMapCollectTaskListener --------")
listener ?: return

View File

@@ -7,13 +7,11 @@ import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.function.api.map.IMogoMapService;
import com.mogo.eagle.core.function.api.map.marker.IMogoMarkerService;
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager;
import com.mogo.map.MogoLocationClient;
import com.mogo.map.MogoMapUIController;
import com.mogo.map.MogoMarkerManager;
import com.mogo.map.MogoOverlayManager;
import com.mogo.map.location.GDLocationClient;
import com.mogo.map.location.IMogoGDLocationClient;
import com.mogo.map.location.IMogoLocationClient;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.overlay.IMogoOverlayManager;
import com.mogo.map.uicontroller.IMogoMapUIController;
@@ -27,11 +25,6 @@ import com.mogo.map.uicontroller.IMogoMapUIController;
@Route(path = MogoServicePaths.PATH_SERVICES_MAP)
public class MogoMapService implements IMogoMapService {
@Override
public IMogoLocationClient getSingletonLocationClient(Context context) {
return MogoLocationClient.getInstance(context);
}
@Override
public IMogoMarkerManager getMarkerManager(Context context) {
return MogoMarkerManager.getInstance(context);

View File

@@ -0,0 +1,24 @@
package com.mogo.eagle.core.function.map
import android.content.Context
import android.os.Bundle
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLamplightListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager
import com.mogo.eagle.core.function.call.setting.CallerSkinModeListenerManager
import com.mogo.map.MogoMapView
class MapBizView(context: Context?) : MogoMapView(context) {
override fun onCreate(bundle: Bundle?) {
super.onCreate(bundle)
map.uiController.showMyLocation(true)
// 添加Caller监听
// CallerSkinModeListenerManager.addListener(MapFragment.functionName, this)
//
// CallerChassisLocationWGS84ListenerManager.addListener(MapFragment.functionName, this)
// CallerChassisLamplightListenerManager.addListener(MapFragment.functionName, this)
}
}

View File

@@ -60,7 +60,6 @@ class MapFragment : MvpFragment<MapView?, MapPresenter?>(),
private var mMogoMapView: MogoMapView? = null
private var mMogoMap: IMogoMap? = null
private val mIsControllerByOthersStatus = false
companion object {
const val functionName = "MapFragment"
@@ -140,9 +139,6 @@ class MapFragment : MvpFragment<MapView?, MapPresenter?>(),
override fun onPause() {
super.onPause()
if (mIsControllerByOthersStatus) {
return
}
if (mMogoMapView != null) {
mMogoMapView!!.onPause()
} else {
@@ -152,9 +148,6 @@ class MapFragment : MvpFragment<MapView?, MapPresenter?>(),
override fun onResume() {
super.onResume()
if (mIsControllerByOthersStatus) {
return
}
if (mMogoMapView != null) {
mMogoMapView!!.onResume()
} else {
@@ -384,11 +377,6 @@ class MapFragment : MvpFragment<MapView?, MapPresenter?>(),
}
}
override fun onAutopilotBrakeLightData(brakeLight: Boolean) {
d(SceneConstant.M_DEVA + "TurnLight", "---onAutopilotBrakeLightData ---brakeLight = $brakeLight")
}
private fun setTurnLightState(turn_light: Int): Int {
if (turn_light == 0) {
if (isOnTurnLight) {

View File

@@ -38,8 +38,11 @@ data class V2XEvent(
@SerializedName("radius")
var radius: Double,
@SerializedName("type")
var type: Int
@SerializedName("poiType")
var poiType: String?,
@SerializedName("coordinateType")
var coordinateType:Int? = null
)
@Keep

View File

@@ -8,6 +8,8 @@ import com.mogo.eagle.core.function.overview.OverviewDao
import com.mogo.eagle.core.function.overview.remote.OverViewServiceApi
import com.mogo.eagle.core.function.overview.remote.V2XEvent
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
@@ -22,6 +24,10 @@ class OverViewModel(
private val _V2XEvents = MutableLiveData<List<V2XEvent>>()
private var disposable: Disposable? = null
companion object {
const val TAG = "OverViewModel"
}
val infStructures
get() = _infStructures
@@ -90,8 +96,10 @@ class OverViewModel(
.queryAllV2XEventsByLineId(lineId.toString(), sn)
.map {
if (it.code == 200 || it.code == 0) {
CallerLogger.d(SceneConstant.M_MAP + TAG, "请求成功size为${it.result?.v2XEventList?.size}")
return@map it.result?.v2XEventList
} else {
CallerLogger.d(SceneConstant.M_MAP + TAG, "请求失败code为${it.code}")
return@map ArrayList()
}
}
@@ -121,7 +129,12 @@ class OverViewModel(
if (parameter != null) {
if (parameter.autoPilotLine != null) {
lineId = parameter.autoPilotLine!!.lineId
CallerLogger.d(SceneConstant.M_MAP + TAG, "lineId为:$lineId")
} else {
CallerLogger.d(SceneConstant.M_MAP + TAG, "parameter.autoPilotLine为null")
}
} else {
CallerLogger.d(SceneConstant.M_MAP + TAG, "parameter为null")
}
return lineId
}

View File

@@ -260,10 +260,16 @@ public class AMapCustomView
if (center != null) {
center.getLon();
MarkerOptions markerOption = new MarkerOptions();
LatLng latLng = MarkerDrawerManager.INSTANCE.coordinateConverterWgsToGcj(mContext, center.getLat(), center.getLon());
LatLng latLng;
if (event.getCoordinateType() == null || event.getCoordinateType() == 0) {
latLng = new LatLng(center.getLat(), center.getLon());
} else {
// wgs84坐标系需转成高德坐标系
latLng = MarkerDrawerManager.INSTANCE.coordinateConverterWgsToGcj(mContext, center.getLat(), center.getLon());
}
markerOption.position(latLng);
markerOption.anchor(0.13f, 1f);
markerOption.icon(BitmapDescriptorFactory.fromBitmap(getV2XBitmap()));
markerOption.icon(BitmapDescriptorFactory.fromBitmap(getV2XBitmap(event.getPoiType())));
markerOptionsList.add(markerOption);
}
}
@@ -276,8 +282,8 @@ public class AMapCustomView
currMarkerList = mAMap.addMarkers(markerOptionsList, false);
}
private Bitmap getV2XBitmap() {
V2XMarkerView marker = new V2XMarkerView(getContext());
private Bitmap getV2XBitmap(String poiType) {
V2XMarkerView marker = new V2XMarkerView(getContext(), null, 0, poiType);
marker.measure(View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(mContext, 229), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(AutoSizeUtils.dp2px(mContext, 96), View.MeasureSpec.EXACTLY));
marker.layout(0, 0, marker.getMeasuredWidth(), marker.getMeasuredHeight());
@@ -372,6 +378,7 @@ public class AMapCustomView
drawInfMarkers(pathMap);
}
//todo 扶风 需重构此处,封装至 全览
public void drawInfMarkers(Map<String, ArrayList<Infrastructure>> infStruMap) {
// 绘制新基建数据
if (!posInfMap.isEmpty()) {

View File

@@ -3,14 +3,16 @@ package com.mogo.eagle.core.function.smp
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.map.R
import kotlinx.android.synthetic.main.view_maker_with_count.view.*
class V2XMarkerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
defStyleAttr: Int = 0,
private val poiType: String? = ""
) : ConstraintLayout (
context,
attrs,
@@ -19,5 +21,33 @@ class V2XMarkerView @JvmOverloads constructor(
init {
LayoutInflater.from(context).inflate(R.layout.layout_v2x_maker, this, true)
initView()
}
private fun initView() {
val iconView = findViewById<ImageView>(R.id.ivIcon)
val contentView = findViewById<TextView>(R.id.tvContent)
when (poiType) {
"10006" -> {
iconView.setBackgroundResource(R.drawable.icon_small_v2x_road_construction)
contentView.text = "道路施工"
}
"10007" -> {
iconView.setBackgroundResource(R.drawable.icon_v2x_road_congestion)
contentView.text = "道路拥堵"
}
"10032" -> {
iconView.setBackgroundResource(R.drawable.icon_v2x_road_accidents)
contentView.text = "道路事故"
}
"10025" -> {
iconView.setBackgroundResource(R.drawable.icon_v2x_obstacle)
contentView.text = "障碍车辆"
}
// "10031" -> {
// iconView.setBackgroundResource(R.drawable.icon_small_v2x_road_construction)
// contentView.text = "弱势预警"
// }
}
}
}

View File

@@ -19,7 +19,7 @@
/>
<TextView
android:id="@+id/tv"
android:id="@+id/tvContent"
android:layout_width="119dp"
android:layout_height="35dp"
android:text="道路施工"

View File

@@ -33,6 +33,13 @@
</intent-filter>
</receiver>
<receiver android:name="com.mogo.eagle.core.function.obu.mogo.receiver.ObuTestNewObuRsiReceiver">
<intent-filter>
<action android:name="com.obu.test_newobu_rsi" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
</manifest>

View File

@@ -32,7 +32,9 @@ class MoGoObuProvider : IMoGoObuProvider {
}
override fun init(context: Context) {
CallerLogger.d("$M_OBU$TAG", "初始化蘑菇自研OBU…… localIp = " + CommonUtils.getLocalIPAddress() + "--")
//obu融合数据
// MogoObuDcCombineManager.INSTANCE.init(context)
CallerLogger.d("$M_OBU$TAG", "初始化蘑菇自研OBU…… localIp = " + CommonUtils.getLocalIPAddress())
//bus乘客版本obu功能去掉
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(
FunctionBuildConfig.appIdentityMode
@@ -55,8 +57,6 @@ class MoGoObuProvider : IMoGoObuProvider {
//old obu
MogoPrivateObuManager.INSTANCE.init(context, ipAddress)
CallerLogger.d("$M_OBU$TAG", "bus 司机 ipAddress = $ipAddress ---localIp = ${CommonUtils.getIpAddressString()}")
} else if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { //taxi 司机端和乘客端
val ipAddress =
SharedPrefsMgr.getInstance(context).getString(MoGoConfig.OBU_IP, taxiObuIp)
@@ -69,7 +69,6 @@ class MoGoObuProvider : IMoGoObuProvider {
//old obu
MogoPrivateObuManager.INSTANCE.init(context, ipAddress)
CallerLogger.d("$M_OBU$TAG", "taxi 司机端和乘客端 ipAddress = $ipAddress ---localIp = ${CommonUtils.getIpAddressString()}")
}
}
}

View File

@@ -0,0 +1,667 @@
package com.mogo.eagle.core.function.obu.mogo
import android.content.Context
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.enums.WarningDirectionEnum
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.api.obucombine.IMoGoObuDcCombineListener
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.call.obucombine.CallerObuDcCombineListenerManager
import com.mogo.eagle.core.function.obu.mogo.utils.TrafficDataConvertUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU
import com.mogo.support.obu.constants.MogoObuConstants
import mogo.v2x.ObuWarningEvent
import mogo.v2x.ObuWarningEvent.*
/**
*
* @author lixiaopeng
* @since 2021/11/30
* @description 工控机融合数据
*/
class MogoObuDcCombineManager private constructor() : IMoGoObuDcCombineListener {
companion object {
val INSTANCE: MogoObuDcCombineManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
MogoObuDcCombineManager()
}
}
private var mContext: Context? = null
private val TAG = "MogoObuDcCombineManager"
fun init(context: Context) {
mContext = context
CallerObuDcCombineListenerManager.addListener(TAG, this)
}
fun destoryListener() {
CallerObuDcCombineListenerManager.removeListener(TAG)
}
/**
* 通过工控机中转的obu数据,包括rsirsmspat
*
*/
override fun onMoGoObuDcCombineData(obuWarningData: ObuWarningEvent.ObuWarningData?) {
CallerLogger.d(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager onMoGoObuDcCombineData obuWarningData = ${obuWarningData.toString()} ---obuWarningData.msgDataType = ${obuWarningData?.msgDataType}"
)
obuWarningData?.let {
when (obuWarningData.msgDataType) {
1 -> { //rsiEvent
onMogoObuDcRsiWarning(obuWarningData.rsiEvent)
}
2 -> { //RsmEvent
onMogoObuDcRsmWarning(obuWarningData.rsmEvent)
}
3 -> { //SpatEvent
onMogoObuDcSpatWarning(obuWarningData.spatEvent)
}
4 -> { //map
onMogoObuMapMath(obuWarningData.mapMatchData)
}
}
}
}
/**
* RSI预警信息 CvxRtiThreatIndInfo交通标志预警前方限速、前方学校等等交通事件预警前方拥堵、前方积水等等
*/
fun onMogoObuDcRsiWarning(rsiWarningData: RsiWarningData?) {
CallerLogger.d(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager onMogoObuRsiWarning ------> ${rsiWarningData.toString()}"
)
if (rsiWarningData != null && rsiWarningData.warningMsgList != null && rsiWarningData.warningMsgList.size > 0) {
var alertContent = ""
var ttsContent = "" //TODO 列表还是只有一项吗?
var appId = rsiWarningData.warningMsgList[0].sceneType.toString()
val status = rsiWarningData.status
val level = rsiWarningData.warningMsgList[0].warningLevel
val direction = getMessageDirection(rsiWarningData.warningMsgList[0].targetPosition)
CallerLogger.d("${M_OBU}${TAG}",
"MogoObuDcCombineManager onMogoObuDcRsiWarning appId = $appId --status = $status --level = $level -- eventSerialNum = ${rsiWarningData.warningMsgList[0].eventSerialNum} ---signSerialNum = ${rsiWarningData.warningMsgList[0].signSerialNum} --- direction = $direction -- targetPosition = ${rsiWarningData.warningMsgList[0].targetPosition}"
)
when (appId) {
// 道路危险情况预警
MogoObuConstants.RSI_SCENE_TYPE.HLW.toString() -> {
when (rsiWarningData.warningMsgList[0].eventSerialNum) {
MogoObuConstants.RTE.RTI_TYPE_BREAKDOWN -> {//车辆故障
appId = EventTypeEnumNew.TYPE_USECASE_ID_BREAKDOWN_WARNING.poiType
}
MogoObuConstants.RTE.RTI_TYPE_ROAD_WATER -> { //道路积水
appId = EventTypeEnumNew.FOURS_PONDING.poiType
}
MogoObuConstants.RTE.RTI_TYPE_PARKING_VIOLATION -> { //异常停车
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_PARKING.poiType
}
// MogoObuConstants.RTE.RTI_TYPE_CONSTRUCTION_RTE -> { //施工占道,和标牌重复
// appId = EventTypeEnumNew.FOURS_ROAD_WORK.poiType
// }
MogoObuConstants.RTE.RTI_TYPE_SPEEDING -> { //超速行驶
appId = EventTypeEnumNew.TYPE_USECASE_ID_SLW.poiType
}
MogoObuConstants.RTE.RTI_TYPE_RETRIGRADE -> { //车辆逆行
appId =
EventTypeEnumNew.TYPE_USECASE_ID_ROAD_VEHICLE_RETROGRADE.poiType
}
}
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = String.format( //事件才有影响范围
alertContent,
Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
)
ttsContent = String.format(
ttsContent,
Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
)
}
//车内标牌
MogoObuConstants.RSI_SCENE_TYPE.IVS.toString() -> {
when (rsiWarningData.warningMsgList[0].signSerialNum) {
// MogoObuConstants.RTS.RTI_TYPE_INTERSECTION -> { //十字路口
// appId = V2iEventTypeEnum.TYPE_ID_NTERSECTION.poiType
// }
MogoObuConstants.RTS.RTI_TYPE_SHAPR_TURNS -> { //急转弯
appId = EventTypeEnumNew.TYPE_ID_SHAPR_TURNS.poiType
}
MogoObuConstants.RTS.RTI_TYPE_BRIDGE -> { //桥梁
appId = EventTypeEnumNew.TYPE_ID_BRIDGE.poiType
}
MogoObuConstants.RTS.RTI_TYPE_PEDESTRIAN -> { //行人
appId = EventTypeEnumNew.TYPE_ID_PEDESTRIAN.poiType
}
MogoObuConstants.RTS.RTI_TYPE_SLIPPERY_ROAD -> { //路滑
appId = EventTypeEnumNew.TYPE_ID_SLIPPERY_ROAD.poiType
}
MogoObuConstants.RTS.RTI_TYPE_TUNNEL -> { //隧道
appId = EventTypeEnumNew.TYPE_ID_TUNNEL.poiType
}
MogoObuConstants.RTS.RTI_TYPE_FERRY -> { //渡轮
appId = EventTypeEnumNew.TYPE_ID_FERRY.poiType
}
MogoObuConstants.RTS.RTI_TYPE_UNEVEN_ROAD -> { //路面不平
appId = EventTypeEnumNew.TYPE_ID_UNEVEN_ROAD.poiType
}
MogoObuConstants.RTS.RTI_TYPE_NON_MOTOR_VEHICLE -> { //非机动车
appId = EventTypeEnumNew.TYPE_ID_NON_MOTOR_VEHICLE.poiType
}
MogoObuConstants.RTS.RTI_TYPE_OBSTACLE -> { //障碍
appId = EventTypeEnumNew.TYPE_ID_OBSTACLE.poiType
}
MogoObuConstants.RTS.RTI_TYPE_CONSTRUCTION -> { //施工
appId = EventTypeEnumNew.TYPE_FOURS_ROAD_WORK.poiType
}
MogoObuConstants.RTS.RTI_TYPE_VEHICLE_QUEUE -> { //车队
appId = EventTypeEnumNew.TYPE_VEHICLE_QUEUE.poiType
}
MogoObuConstants.RTS.RTI_TYPE_NO_PASSING -> { //不通
appId = EventTypeEnumNew.TYPE_NO_PASSING.poiType
}
MogoObuConstants.RTS.RTI_TYPE_NO_TURNING_AROUND -> { //禁止掉头
appId = EventTypeEnumNew.TYPE_NO_TURNING_AROUND.poiType
}
MogoObuConstants.RTS.RTI_TYPE_NO_STOPPING -> { //禁止停车
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_NO_PARKING.poiType
}
MogoObuConstants.RTS.RTI_TYPE_NO_TOOTING -> { //禁止鸣笛
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_NO_TOOTING.poiType
}
MogoObuConstants.RTS.RTI_TYPE_SPEED_LIMIT -> { //限速
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
}
// MogoObuConstants.RTS.RTI_TYPE_GO_STRAIGHT_TURN_RIGHT -> { //直行或右转
// appId =
// EventTypeEnumNew.TYPE_USECASE_ID_GO_STRAIGHT_TURN_RIGHT.poiType
// }
MogoObuConstants.RTS.RTI_TYPE_BUS_WARNING -> { //公交提醒
appId = EventTypeEnumNew.TYPE_USECASE_ID_BUS_WARNING.poiType
}
MogoObuConstants.RTS.RTI_TYPE_NARROW_RIGHT -> { //右侧变窄/车道数减少
appId = EventTypeEnumNew.TYPE_USECASE_ID_NARROW_RIGHT.poiType
}
MogoObuConstants.RTS.RTI_TYPE_GAS_STATION -> { //加油站
appId = EventTypeEnumNew.TYPE_USECASE_ID_GAS_STATION.poiType
}
MogoObuConstants.RTS.RTI_TYPE_SCHOOL -> { //学校
appId =
EventTypeEnumNew.TYPE_USECASE_ID_ROAD_PEDESTRIAN_SCHOOL.poiType
}
MogoObuConstants.RTS.RTI_TYPE_ACCIDENT -> { //事故
appId = EventTypeEnumNew.TYPE_USECASE_ID_ACCIDENT.poiType
}
}
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = String.format( //标牌是没有影响范围的
alertContent,
Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString()
)
ttsContent = String.format(
ttsContent,
Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString()
)
}
// 拥堵
MogoObuConstants.RSI_SCENE_TYPE.TJW.toString() -> {
appId = EventTypeEnumNew.TYPE_USECASE_ID_TJW.poiType
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = String.format( //事件才有影响范围
alertContent,
Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
)
ttsContent = String.format(
ttsContent,
Math.round(rsiWarningData.warningMsgList[0].distance / 100.0).toString(),
Math.round(rsiWarningData.warningMsgList[0].eventRadius / 10.0).toString()
)
}
//限速预警, ADD处理一次
MogoObuConstants.RSI_SCENE_TYPE.SLW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
}
}
CallerLogger.d(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager ttsContent = $ttsContent --alertContent = $alertContent --appId = $appId ---direction = ${direction.direction} --distance = ${rsiWarningData.warningMsgList[0].distance} ---eventRadius = ${rsiWarningData.warningMsgList[0].eventRadius} --speedMaxLimit = ${rsiWarningData.warningMsgList[0].speedMaxLimit}"
)
when (status) {
// 添加
MogoObuConstants.STATUS.ADD -> {
//显示警告红边
CallerHmiManager.showWarning(direction)
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X,
V2XMsg(
appId,
alertContent,
ttsContent
)
)
// .apply {
// sourceType = DataSourceType.TELEMATIC
// }
)
CallerHmiManager.warningV2X(
appId,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(appId + direction.direction),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
}
},
true,
5000L
)
// 更新数据,是否需要
// TrafficDataConvertUtilsNew.cvxRtiThreatIndInfo2TrafficData(rsiWarningData)?.let {
// CallerMapUIServiceManager.getMarkerService()
// ?.updateITrafficThreatLevelInfo(it)
// }
}
MogoObuConstants.STATUS.UPDATE -> { // 更新
}
// 删除
MogoObuConstants.STATUS.DELETE -> {
// 关闭警告红边
// CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
// 移除顶部弹窗
CallerHmiManager.disableWarningV2X((appId + direction.direction))
// 更新数据,删除标牌?
// TrafficDataConvertUtilsNew.cvxRtiThreatIndInfo2TrafficData(rsiWarningData)
// ?.let {
// // 事件结束,还原车辆颜色
// it.threatLevel = 0x01
// CallerMapUIServiceManager.getMarkerService()
// ?.updateITrafficInfo(it)
// }
}
}
}
}
/**
* RSM预警信息 CvxPtcThreatIndInfo CvxPtcInfoIndInfo主车与弱势交通参与者之间的预警弱势交通参与者碰撞预警
*/
fun onMogoObuDcRsmWarning(rsmWarningData: RsmWarningData?) {
if (HmiBuildConfig.isShowObuWeaknessTrafficView) {
CallerLogger.d(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager onMogoObuRsmWarning ------> ${rsmWarningData.toString()}"
)
// 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu
if (rsmWarningData != null && rsmWarningData.participantOfOne != null) {
var v2xType = ""
if (rsmWarningData.participantOfOne.ptcType == 1) { //机动车
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType
} else if (rsmWarningData.participantOfOne.ptcType == 2) { //非机动车
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES.poiType
} else if (rsmWarningData.participantOfOne.ptcType == 3) { //行人
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_PERSON.poiType
} else { //未知
v2xType = EventTypeEnumNew.TYPE_ERROR.poiType
}
val ttsContent = EventTypeEnumNew.getWarningTts(v2xType)
val alertContent =
EventTypeEnumNew.getWarningContent(v2xType)
var level = -1
val direction =
getMessageDirection(rsmWarningData.participantOfOne.targetPosition) //TODO 只有一个
if (rsmWarningData.warningMsg != null && rsmWarningData.warningMsg.warningDataList != null && rsmWarningData.warningMsg.warningDataList.size > 0) {
level = rsmWarningData.warningMsg.warningDataList[0].warningLevel
CallerLogger.d(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager onMogoObuRsmWarning ---status---> ${rsmWarningData.status} --list status----> ${rsmWarningData.warningMsg.warningDataList.get(0).status} --v2xType--- $v2xType ---alertContent = $alertContent ---ttsContent= $ttsContent"
)
when (rsmWarningData.warningMsg.warningDataList.get(0).status) {
MogoObuConstants.STATUS.ADD -> { // 添加
//显示警告红边
CallerHmiManager.showWarning(direction)
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X,
V2XMsg(
v2xType,
alertContent,
ttsContent
)
)
// .apply { //TODO
// sourceType = DataSourceType.TELEMATIC
// }
)
CallerHmiManager.warningV2X(
v2xType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(v2xType + direction.direction),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(
WarningDirectionEnum.ALERT_WARNING_NON
)
}
},
true,
5000L
)
// 更新数据 TODO
// TrafficDataConvertUtils.cvxPtcThreatIndInfo2TrafficData(rsmWarningData)?.let {
//// TrafficMarkerDrawer.updateITrafficThreatLevelInfo(it)
// CallerMapUIServiceManager.getMarkerService()
// ?.updateITrafficThreatLevelInfo(it)
// }
}
MogoObuConstants.STATUS.UPDATE -> {// 更新
}
// 删除
MogoObuConstants.STATUS.DELETE -> {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
// 更新数据 TODO 由于obu通过域控需要转换单位这里临时转换后面3.0不需要转换
// TrafficDataConvertUtils.cvxPtcThreatIndInfo2TrafficData(rsmWarningData)?.let {
// // 事件结束,还原交通参与者颜色
// it.threatLevel = 0x01
//// TrafficMarkerDrawer.updateITrafficThreatLevelInfo(it)
// CallerMapUIServiceManager.getMarkerService()
// ?.updateITrafficThreatLevelInfo(it)
// }
//删除弱势交通元素
CallerMapUIServiceManager.getMarkerService()
?.removeCvxRvInfoIndInfo(rsmWarningData.participantOfOne.ptcID.toString())
// TrafficMarkerDrawer.removeCvxRvInfoIndInfo(rsmWarningData.participantOfOne.ptcID.toString())
}
}
}
}
}
}
/**
* 红绿灯预警信息
*/
fun onMogoObuDcSpatWarning(spatWarningData: SpatWarningData?) {
CallerLogger.d("${M_OBU}${TAG}", "onMogoObuDcSpatWarning warningType = ${spatWarningData!!.warningType} --status = ${spatWarningData?.status} --lightsList = ${spatWarningData.lightsList}")
handlerTrafficLight(
spatWarningData!!.warningType,
spatWarningData?.status,
spatWarningData?.lightsList
)
}
/**
* 地图匹配 是OBU算法输出地图匹配结果主车匹配道路哪条路或者哪条车道
*/
fun onMogoObuMapMath(data: MapMatchData?) {
CallerLogger.d("${M_OBU}${TAG}", "MogoObuDcCombineManager onMogoObuMapMath HmiBuildConfig.isShowObuLimitSpeedView = " + HmiBuildConfig.isShowObuLimitSpeedView)
if(HmiBuildConfig.isShowObuLimitSpeedView) {
if (data != null) {
CallerLogger.d("${M_OBU}${TAG}",
"MogoObuDcCombineManager onMogoObuMapMath = ${data.status} --speedMaxLimit = ${Math.round((data.speedMaxLimit*0.02*3.6))} --- data.speedMaxLimit = ${data.speedMaxLimit}")
when (data.status) {
MogoObuConstants.STATUS.ADD -> { // 添加 TODO
CallerHmiManager.showLimitingVelocity(Math.round((data.speedMaxLimit*0.02*3.6)).toInt(), 2)
}
MogoObuConstants.STATUS.UPDATE -> { // 更新
}
MogoObuConstants.STATUS.DELETE -> { // 删除
CallerHmiManager.disableLimitingVelocity()
}
}
}
}
}
/**
* 获取消息的方位 车辆相关
*/
private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum {
return when (targetClassification) {
MogoObuConstants.VEH_TARGET_POSITION.AHEAD_IN_LANE,
MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_TOP //正前方
MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_BOTTOM //正后方
MogoObuConstants.VEH_TARGET_POSITION.INTERSECTION_RIGHT -> WarningDirectionEnum.ALERT_WARNING_RIGHT //正右方
MogoObuConstants.VEH_TARGET_POSITION.INTERSECTION_LEFT -> WarningDirectionEnum.ALERT_WARNING_LEFT //正左方
MogoObuConstants.VEH_TARGET_POSITION.AHEAD_LEFT, MogoObuConstants.VEH_TARGET_POSITION.AHEAD_FAR_LEFT,
MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_LEFT, MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_FAR_LEFT
-> WarningDirectionEnum.ALERT_WARNING_TOP_LEFT //左前方
MogoObuConstants.VEH_TARGET_POSITION.AHEAD_RIGHT, MogoObuConstants.VEH_TARGET_POSITION.AHEAD_FAR_RIGHT,
MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_RIGHT, MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_FAT_RIGHT
-> WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT //右前方
MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_LEFT, MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_FAR_LEFT,
-> WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT //左后方
MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_RIGHT, MogoObuConstants.VEH_TARGET_POSITION.BEHEAD_FAR_RIGHT,
-> WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT //右后方
MogoObuConstants.VEH_TARGET_POSITION.UNCLASSIFIED -> WarningDirectionEnum.ALERT_WARNING_NON //未知
else -> WarningDirectionEnum.ALERT_WARNING_ALL
}
}
/**
* 处理红绿灯
*/
private fun handlerTrafficLight(appId: Int, status: Int, lights: List<ObuWarningEvent.SpatLight>) {
CallerLogger.d(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager handlerTrafficLight --- status = $status ---lights.size = ${lights.size} ---lights = $lights ---appId = $appId"
)
when (status) {
// 添加
MogoObuConstants.STATUS.ADD,
MogoObuConstants.STATUS.UPDATE
-> {
if (lights != null && lights.isNotEmpty()) {
changeTrafficLightStatus(appId, lights)
}
}
// 删除
MogoObuConstants.STATUS.DELETE -> {
// 移除顶部弹窗,当收不到信号的时候触发一次
CallerHmiManager.disableWarningTrafficLight()
CallerHmiManager.disableWarningV2X(appId.toString())
isShowGreenWave = false
isShowRunRedLight = false
}
}
}
private var isRedLight = false
private var isGreenLight = false
private var isShowGreenWave = false
private var isShowRunRedLight = false
/**
* 修改红绿灯
*/
@Synchronized
private fun changeTrafficLightStatus(
appId: Int,
lights: List<ObuWarningEvent.SpatLight>
) {
var ttsContent = ""
var alertContent = ""
//这里需要根据真实数据确定 index 取值方式
val currentLight = lights[0]
CallerLogger.e(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager currentLight = $currentLight ---currentLight.phaseID = ${currentLight.phaseID} ---appId = $appId ---isShowRunRedLight = $isShowRunRedLight ---isShowGreenWave = $isShowGreenWave"
)
// 闯红灯预警和绿波通行底层是互斥的
when (appId) {
0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效
}
1 -> { //闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次
if (!isShowRunRedLight) {
isShowRunRedLight = true
CallerHmiManager.disableWarningV2X(1667.toString())
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
CallerLogger.d("${M_OBU}${TAG}","MogoObuDcCombineManager changeTrafficLightStatus 闯红灯 --------> ttsContent = $ttsContent ---alertContent = $alertContent ")
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X,
V2XMsg(
EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
alertContent,
ttsContent
)
)
// .apply {
// sourceType = DataSourceType.TELEMATIC
// }
)
CallerHmiManager.warningV2X(
EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType, alertContent, ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType, null, true, 5000L)
}
}
2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次
if (!isShowGreenWave) {
isShowGreenWave = true
CallerHmiManager.disableWarningV2X(1666.toString())
CallerLogger.d(
"${M_OBU}${TAG}",
"MogoObuDcCombineManager 绿波通行引导 --------> speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed}")
val adviceSpeed =
"${Math.round(currentLight.suggestMinSpeed*3.6*0.02)} - ${Math.round(currentLight.suggestMaxSpeed*3.6*0.02)}"
val adviceSpeedTts =
"${Math.round(currentLight.suggestMinSpeed*3.6*0.02)} - ${Math.round(currentLight.suggestMaxSpeed*3.6*0.02)}"
ttsContent =
String.format(
EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeedTts
)
alertContent =
String.format(
EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeed
)
val maxSpeed = currentLight.suggestMaxSpeed*3.6
if (maxSpeed > 0) {
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X,
V2XMsg(
EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType,
alertContent,
ttsContent
)
)
// .apply { //TODO
// sourceType = DataSourceType.TELEMATIC
// }
)
CallerHmiManager.warningV2X(
EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
appId.toString(),
null,
true,
5000L
)
}
}
}
}
when (currentLight.light) {
// 灯光不可用
0 -> {
CallerHmiManager.showWarningTrafficLight(0, 2)
}
// 红灯
2, 3 -> {
if (!isRedLight) {
CallerHmiManager.disableWarningV2X(appId.toString())
isRedLight = true
}
isGreenLight = false
CallerHmiManager.showWarningTrafficLight(1, 2)
val red = currentLight.countDown / 10
CallerHmiManager.changeCountdownRed(red)
}
// 绿灯
4, 5, 6 -> {
if (!isGreenLight) {
CallerHmiManager.disableWarningV2X(appId.toString())
isGreenLight = true
}
isRedLight = false
CallerHmiManager.showWarningTrafficLight(3, 2)
val green = currentLight.countDown / 10
CallerHmiManager.changeCountdownGreen(green)
}
// 黄灯
7, 8 -> {
CallerHmiManager.disableWarningV2X(appId.toString())
CallerHmiManager.showWarningTrafficLight(2, 2)
val yellow = currentLight.countDown / 10
CallerHmiManager.changeCountdownYellow(yellow)
}
}
}
}

View File

@@ -2,16 +2,13 @@ package com.mogo.eagle.core.function.obu.mogo
import android.content.Context
import android.util.Log
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.enums.EventTypeEnum
import com.mogo.eagle.core.data.enums.EventTypeHelper
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.data.enums.WarningDirectionEnum
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
@@ -19,12 +16,18 @@ import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Default
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.TooClose
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager
import com.mogo.eagle.core.function.obu.mogo.utils.TrafficDataConvertUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.enums.EventTypeEnum
import com.mogo.eagle.core.data.enums.EventTypeHelper
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
//import com.mogo.service.IMogoServiceApis
import com.zhidao.support.obu.MogoObuManager
import com.zhidao.support.obu.OnMogoObuListener
import com.zhidao.support.obu.constants.ObuConstants
@@ -45,11 +48,14 @@ class MogoPrivateObuManager private constructor() {
}
}
// private var mMogoServiceApis: IMogoServiceApis? = null
private var mContext: Context? = null
private var mObuStatusInfo = CallerObuListenerManager.getObuStatusInfo()
fun init(context: Context, ipAddress: String) {
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "obuManager初始化--")
// mMogoServiceApis = ARouter.getInstance().build(MogoServicePaths.PATH_SERVICE_APIS)
// .navigation(context) as IMogoServiceApis
mContext = context
//连接obu设备
connectObu(context, ipAddress)
@@ -226,7 +232,7 @@ class MogoPrivateObuManager private constructor() {
// (3) 道路事件预警信息CVX_RTI_THREAT_IND
override fun onCvxRtiThreatIndInfo(info: CvxRtiThreatIndInfo?) {
if (HmiBuildConfig.isShowObuV2iView) {
// if (HmiBuildConfig.isShowObuV2iView) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxRtiThreatIndInfo ------> $info"
@@ -322,8 +328,7 @@ class MogoPrivateObuManager private constructor() {
}
//事故易发路段
0x1B -> {
appId =
EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType
appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType
}
//环岛行驶
0x1C -> {
@@ -370,21 +375,16 @@ class MogoPrivateObuManager private constructor() {
// 添加
ObuConstants.STATUS.ADD -> {
//不显示弹框,其它保留
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"old onCvxRtiThreatIndInfo ------> appId = $appId --- alertContent = $alertContent --- ttsContent = $ttsContent "
)
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "old onCvxRtiThreatIndInfo ------> appId = $appId --- alertContent = $alertContent --- ttsContent = $ttsContent ")
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuManager4", "alertContent或ttsContent为空!")
}
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
V2XMsg(
appId,
V2XMsg(appId,
alertContent,
ttsContent
)
ttsContent)
)
)
CallerHmiManager.warningV2X(
@@ -432,8 +432,7 @@ class MogoPrivateObuManager private constructor() {
}
}
}
}
// }
}
// (4) V2I预警信息CVX_IVP_THREAT_IND红绿灯
@@ -447,20 +446,20 @@ class MogoPrivateObuManager private constructor() {
&& info.ext_info.lights != null
&& info.ext_info.lights.isNotEmpty()
) {
if (HmiBuildConfig.isShowObuV2iView) {
// if (HmiBuildConfig.isShowObuV2iView) {
handlerTrafficLight(
info.threat_info.app_id,
info.status,
info.ext_info.lights,
info.ext_info.index
)
}
// }
}
}
// (2) 弱势交通参与者预警信息CVX_PTC_THREAT_IND
override fun onCvxPtcThreatIndInfo(info: CvxPtcThreatIndInfo?) {
if (HmiBuildConfig.isShowObuV2iView) {
// if (HmiBuildConfig.isShowObuV2iView) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxPtcInfoIndInfo ------> $info"
@@ -502,21 +501,16 @@ class MogoPrivateObuManager private constructor() {
// if (level == 2 || level == 3) { //不考虑level
//显示警告红边
CallerHmiManager.showWarning(direction)
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"old onCvxPtcThreatIndInfo ------> v2xType = $v2xType --- alertContent = $alertContent --- ttsContent = $ttsContent "
)
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "old onCvxPtcThreatIndInfo ------> v2xType = $v2xType --- alertContent = $alertContent --- ttsContent = $ttsContent ")
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuManager5", "alertContent或ttsContent为空!")
}
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
V2XMsg(
v2xType,
V2XMsg(v2xType,
alertContent,
ttsContent
)
ttsContent)
)
)
CallerHmiManager.warningV2X(
@@ -563,7 +557,7 @@ class MogoPrivateObuManager private constructor() {
}
}
}
// }
}
// (5) 限速预警信息CVX_SLW_THREAT_IND
@@ -596,7 +590,7 @@ class MogoPrivateObuManager private constructor() {
// (1) V2V预警信息CVX_V2V_THREAT_IND
override fun onCvxV2vThreatIndInfo(info: CvxV2vThreatIndInfo?) {
if (HmiBuildConfig.isShowObuV2vView) {
// if (HmiBuildConfig.isShowObuV2vView) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxV2vThreatIndInfo ------> $info"
@@ -624,7 +618,7 @@ class MogoPrivateObuManager private constructor() {
}
}
}
}
// }
}
/**
@@ -733,10 +727,7 @@ class MogoPrivateObuManager private constructor() {
0x2 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT
ttsContent = EventTypeEnum.getWarningTts(appId.toString())
alertContent = EventTypeEnum.getWarningContent(appId.toString())
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"old changeTrafficLightStatus ------> appId.toString() = ${appId.toString()} --- alertContent = $alertContent --- ttsContent = $ttsContent "
)
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "old changeTrafficLightStatus ------> appId.toString() = ${appId.toString()} --- alertContent = $alertContent --- ttsContent = $ttsContent ")
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuManager1", "alertContent或ttsContent为空!")
}
@@ -758,7 +749,7 @@ class MogoPrivateObuManager private constructor() {
when (currentLight.phase) {
// 灯光不可用
0x0 -> {
CallerHmiManager.showWarningTrafficLight(0, 2)
CallerHmiManager.showWarningTrafficLight(0, 3)
}
// 红灯
0x1 -> {
@@ -767,7 +758,7 @@ class MogoPrivateObuManager private constructor() {
isRedLight = true
}
isGreenLight = false
CallerHmiManager.showWarningTrafficLight(1, 2)
CallerHmiManager.showWarningTrafficLight(1, 3)
val red = currentLight.count_down.toInt()
CallerHmiManager.changeCountdownRed(red)
@@ -782,7 +773,7 @@ class MogoPrivateObuManager private constructor() {
isGreenLight = true
}
isRedLight = false
CallerHmiManager.showWarningTrafficLight(3, 2)
CallerHmiManager.showWarningTrafficLight(3, 3)
val green = currentLight.count_down.toInt()
CallerHmiManager.changeCountdownGreen(green)
//防止数据出现问题的容错
@@ -813,21 +804,16 @@ class MogoPrivateObuManager private constructor() {
val maxSpeed = currentLight.glosa_suggested_speed_max.toInt()
if (maxSpeed > 0) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"old changeTrafficLightStatus ------> TYPE_USECASE_ID_IVP_GREEN --- alertContent = $alertContent --- ttsContent = $ttsContent "
)
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "old changeTrafficLightStatus ------> TYPE_USECASE_ID_IVP_GREEN --- alertContent = $alertContent --- ttsContent = $ttsContent ")
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuManager2", "alertContent或ttsContent为空!")
}
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
V2XMsg(
EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType,
V2XMsg(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType,
alertContent,
ttsContent
)
ttsContent)
)
)
CallerHmiManager.warningV2X(
@@ -954,8 +940,7 @@ class MogoPrivateObuManager private constructor() {
)
if (level == 2 || level == 3) {
//不显示顶部弹框,其它保留
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"old handleSdkObu appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction"
)
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
@@ -964,11 +949,9 @@ class MogoPrivateObuManager private constructor() {
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
V2XMsg(
appId.toString(),
V2XMsg(appId.toString(),
alertContent,
ttsContent
)
ttsContent)
)
)
CallerHmiManager.warningV2X(

View File

@@ -1,11 +1,10 @@
package com.mogo.eagle.core.function.obu.mogo
import android.content.Context
import android.util.Log
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig.isShowObuLimitSpeedView
import com.mogo.eagle.core.data.enums.*
//import com.mogo.eagle.core.data.msgbox.DataSourceType
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
@@ -18,6 +17,8 @@ import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Defa
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.TooClose
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.call.obu.CallerObuListenerManager
import com.mogo.eagle.core.function.call.obu.CallerObuTrafficLightListenerManager
import com.mogo.eagle.core.function.call.v2x.CallObuLimitingSpeedListenerManager
import com.mogo.eagle.core.function.obu.mogo.utils.TrafficDataConvertUtilsNew
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU
@@ -93,7 +94,6 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onConnectStatus(connectStatus: Int) {
if (connectStatus == 0) { //断开连接
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onConnectFail ------> ")
mObuStatusInfo.obuStatus = false
mObuStatusInfo.obuHvStatus = false
mObuStatusInfo.obuRvStatus = false
@@ -102,7 +102,6 @@ class MogoPrivateObuNewManager private constructor() {
mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_HV", false) }
mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_RV", false) }
} else if (connectStatus == 1) { //连接成功
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onConnected ------> ")
mObuStatusInfo.obuStatus = true
CallerObuListenerManager.invokeListener(mObuStatusInfo)
mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU", true) }
@@ -170,47 +169,61 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onMogoObuRvWarning(data: MogoObuRvWarningData) {
super.onMogoObuRvWarning(data)
if (HmiBuildConfig.isShowObuV2vView) {
mObuStatusInfo.obuRvStatus = true
CallerObuListenerManager.invokeListener(mObuStatusInfo)
// if (HmiBuildConfig.isShowObuV2vView) { //TODO 临时需要关闭v2v开关
mObuStatusInfo.obuRvStatus = true
CallerObuListenerManager.invokeListener(mObuStatusInfo)
if (!data.warningMsg.warningData.isNullOrEmpty()) {
// 更新数据远车数据之前要匹配uuid
TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data)?.let {
CallerMapUIServiceManager.getMarkerService()?.updateITrafficLocationInfo(it)
}
if (!data.warningMsg.warningData.isNullOrEmpty()) {
// 更新数据远车数据之前要匹配uuid
TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data)?.let {
CallerMapUIServiceManager.getMarkerService()?.updateITrafficLocationInfo(it)
}
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", data.toString())
data.let {
//预警信息,预警类型 threat_level 2、3
data.vehBasicsMsg?.let {
//预警方位
val direction = getMessageDirection(data.vehBasicsMsg.targetPosition)
//处理预警类型
var appId = ""
var level = -1
var status = -1
data.warningMsg?.let {
if (data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
level = data.warningMsg.warningData[0].warningLevel
appId = data.warningMsg.warningData[0].warningType.toString()
status = data.warningMsg.warningData[0].status
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", data.toString())
data.let {
//预警信息,预警类型 threat_level 2、3
var status = data.status
data.vehBasicsMsg?.let {
//预警方位
val direction = getMessageDirection(data.vehBasicsMsg.targetPosition)
//处理预警类型
var appId = ""
var level = -1
data.warningMsg?.let {
if (data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
level = data.warningMsg.warningData[0].warningLevel
appId = data.warningMsg.warningData[0].warningType.toString()
//30秒内同一个事件只出现一次
if (rvMap.containsKey(appId)) {
var oldTime = rvMap[appId]
var timeDiff = (System.currentTimeMillis() - oldTime!!) / 1000
if (timeDiff < 30) {
return
}
rvMap.remove(appId)
rvMap[appId] = System.currentTimeMillis()
} else {
rvMap[appId] = System.currentTimeMillis()
}
//拼凑数据
if (appId != null) {
handleSdkObu(appId, direction, status, level, data)
}
}
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onMogoObuRvWarning target_classification = ${
getMessageDirection(data.vehBasicsMsg.targetPosition)
} --- direction = $direction --- appId = $appId ---level = $level -- status = $status"
)
//拼凑数据
if (appId != null) {
handleSdkObu(appId, direction, status, level, data)
}
}
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onMogoObuRvWarning target_classification = ${
getMessageDirection(data.vehBasicsMsg.targetPosition)
} --- direction = $direction --- appId = $appId ---level = $level -- status = $status"
)
}
}
}
// }
}
/**
@@ -218,46 +231,48 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onMogoObuSpatWarning(data: MogoObuSpatWarningData) {
super.onMogoObuSpatWarning(data)
if (data?.lights != null && data.lights.isNotEmpty()
) {
if (HmiBuildConfig.isShowObuV2iView) {
handlerTrafficLight(
data.warningType,
data.status,
data.lights
)
}
if (data != null) {
// if (HmiBuildConfig.isShowObuV2iView) {
handlerTrafficLight(
data.warningType,
data.status,
data.lights
)
// }
}
}
val rvMap = mutableMapOf<String, Long>()
val rsiMap = mutableMapOf<String, Long>()
val rsmMap = mutableMapOf<String, Long>()
val rsmPtcIdMap = mutableMapOf<String, Long>()
/**
* RSI预警信息 CvxRtiThreatIndInfo(交通标志预警(前方限速、前方学校等等),交通事件预警(前方拥堵、前方积水等等))
* RSI预警信息 onMogoObuRsiWarning(交通标志预警(前方限速、前方学校等等),交通事件预警(前方拥堵、前方积水等等))
*/
override fun onMogoObuRsiWarning(data: MogoObuRsiWarningData) {
super.onMogoObuRsiWarning(data)
if (HmiBuildConfig.isShowObuV2iView) {
// if (HmiBuildConfig.isShowObuV2iView) {
if (data != null && data.warningMsg != null && data.warningMsg.size > 0) {
var alertContent = ""
var ttsContent = ""
var appId = data.warningMsg[0].sceneType.toString()
val status = data.status
val level = data.warningMsg[0].warningLevel
val direction = getMessageDirection(data.warningMsg[0].targetPosition)
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onMogoObuRsiWarning ------> $data"
"onMogoObuRsiWarning appId = $appId --status = $status --level = $level -- eventSerialNum = ${data.warningMsg[0].eventSerialNum} ---signSerialNum = ${data.warningMsg[0].signSerialNum} --- direction = $direction -- targetPosition = ${data.warningMsg[0].targetPosition}"
)
if (data != null && data.warningMsg != null && data.warningMsg.size > 0) {
var alertContent = ""
var ttsContent = ""
var appId = data.warningMsg[0].sceneType.toString()
val status = data.status
val level = data.warningMsg[0].warningLevel
val direction = getMessageDirection(data.warningMsg[0].targetPosition)
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onCvxRtiThreatIndInfo appId = $appId --status = $status --level = $level -- eventSerialNum = ${data.warningMsg[0].eventSerialNum} ---signSerialNum = ${data.warningMsg[0].signSerialNum} --- direction = $direction -- targetPosition = ${data.warningMsg[0].targetPosition}"
)
if (appId != "0") {
when (appId) {
// 道路危险情况预警
MogoObuConstants.RSI_SCENE_TYPE.HLW.toString() -> {
when (data.warningMsg[0].eventSerialNum) {
MogoObuConstants.RTE.RTI_TYPE_BREAKDOWN -> {//车辆故障
appId = EventTypeEnumNew.TYPE_USECASE_ID_BREAKDOWN_WARNING.poiType
appId =
EventTypeEnumNew.TYPE_USECASE_ID_BREAKDOWN_WARNING.poiType
}
MogoObuConstants.RTE.RTI_TYPE_ROAD_WATER -> { //道路积水
appId = EventTypeEnumNew.FOURS_PONDING.poiType
@@ -302,9 +317,9 @@ class MogoPrivateObuNewManager private constructor() {
MogoObuConstants.RTS.RTI_TYPE_BRIDGE -> { //桥梁
appId = EventTypeEnumNew.TYPE_ID_BRIDGE.poiType
}
MogoObuConstants.RTS.RTI_TYPE_PEDESTRIAN -> { //行人
appId = EventTypeEnumNew.TYPE_ID_PEDESTRIAN.poiType
}
// MogoObuConstants.RTS.RTI_TYPE_PEDESTRIAN -> { //行人 TODO 暂时去掉
// appId = EventTypeEnumNew.TYPE_ID_PEDESTRIAN.poiType
// }
MogoObuConstants.RTS.RTI_TYPE_SLIPPERY_ROAD -> { //路滑
appId = EventTypeEnumNew.TYPE_ID_SLIPPERY_ROAD.poiType
}
@@ -341,9 +356,11 @@ class MogoPrivateObuNewManager private constructor() {
MogoObuConstants.RTS.RTI_TYPE_NO_TOOTING -> { //禁止鸣笛
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_NO_TOOTING.poiType
}
MogoObuConstants.RTS.RTI_TYPE_SPEED_LIMIT -> { //限速
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
}
// MogoObuConstants.RTS.RTI_TYPE_SPEED_LIMIT -> { //限速
// appId =
// EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
// }
// MogoObuConstants.RTS.RTI_TYPE_GO_STRAIGHT_TURN_RIGHT -> { //直行或右转
// appId =
// EventTypeEnumNew.TYPE_USECASE_ID_GO_STRAIGHT_TURN_RIGHT.poiType
@@ -381,7 +398,6 @@ class MogoPrivateObuNewManager private constructor() {
// 拥堵
MogoObuConstants.RSI_SCENE_TYPE.TJW.toString() -> {
appId = EventTypeEnumNew.TYPE_USECASE_ID_TJW.poiType
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = String.format( //事件才有影响范围
@@ -398,32 +414,52 @@ class MogoPrivateObuNewManager private constructor() {
//限速预警, ADD处理一次
MogoObuConstants.RSI_SCENE_TYPE.SLW.toString() -> {
appId = EventTypeEnumNew.TYPE_USECASE_ID_ROAD_SPEED_LIMIT.poiType
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
}
}
//30秒内同一个事件只出现一次
if (rsiMap.containsKey(appId)) {
var oldTime = rsiMap[appId]
var timeDiff = (System.currentTimeMillis() - oldTime!!) / 1000
if (timeDiff < 30) {
return
}
rsiMap.remove(appId)
rsiMap[appId] = System.currentTimeMillis()
} else {
rsiMap[appId] = System.currentTimeMillis()
}
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"new onMogoObuRsiWarning ttsContent = $ttsContent --alertContent = $alertContent --appId = $appId ---direction = ${direction.direction} --distance = ${Math.round(data.warningMsg[0].distance)} ---eventRadius = ${Math.round(data.warningMsg[0].eventRadius)} --speedMaxLimit = ${data.warningMsg[0].speedMaxLimit.toInt()}"
"new onMogoObuRsiWarning appId = $appId ---status = $status --- ttsContent = $ttsContent --alertContent = $alertContent -- eventSerialNum = ${data.warningMsg[0].eventSerialNum} ---signSerialNum = ${data.warningMsg[0].signSerialNum} ---direction = ${direction.direction} --distance = ${
Math.round(data.warningMsg[0].distance)
} ---eventRadius = ${Math.round(data.warningMsg[0].eventRadius)} --speedMaxLimit = ${data.warningMsg[0].speedMaxLimit.toInt()}"
)
when (status) {
MogoObuConstants.STATUS.ADD -> { // 添加
//显示警告红边
// CallerHmiManager.showWarning(direction)
//不显示弹框,语音提示,数据在消息盒子里面展示,此处不在处理弹框
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuNewMana1", "alertContent或ttsContent为空!")
return
}
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
MsgBoxType.V2X,
V2XMsg(
appId,
alertContent,
ttsContent
)
)
// .apply {
// sourceType = DataSourceType.OBU
// }
)
CallerHmiManager.warningV2X(
appId,
@@ -437,7 +473,7 @@ class MogoPrivateObuNewManager private constructor() {
}
},
true,
3000L
5000L
)
// 更新数据
@@ -451,10 +487,6 @@ class MogoPrivateObuNewManager private constructor() {
}
MogoObuConstants.STATUS.DELETE -> { // 删除
// 关闭警告红边
// CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
// 移除顶部弹窗
// CallerHmiManager.disableWarningV2X((appId + direction.direction))
// 更新数据
TrafficDataConvertUtilsNew.cvxRtiThreatIndInfo2TrafficData(data)
?.let {
@@ -467,7 +499,7 @@ class MogoPrivateObuNewManager private constructor() {
}
}
}
// }
}
/**
@@ -483,106 +515,160 @@ class MogoPrivateObuNewManager private constructor() {
data: MogoObuRsmWarningData?
) {
super.onMogoObuRsmWarning(data)
if (HmiBuildConfig.isShowObuV2iView) {
if (HmiBuildConfig.isShowObuWeaknessTrafficView) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onMogoObuRsmWarning ------> ${data.toString()}"
)
// if (HmiBuildConfig.isShowObuV2iView) {
if (HmiBuildConfig.isShowObuWeaknessTrafficView) {
// 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu
if (data != null && data.participant != null) {
var v2xType = ""
if (data.participant.ptcType == 1) { //机动车
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType
} else if (data.participant.ptcType == 2) { //非机动车
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES.poiType
} else if (data.participant.ptcType == 3) { //行人
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_PERSON.poiType
} else { //未知
v2xType = EventTypeEnumNew.TYPE_ERROR.poiType
}
val ttsContent = EventTypeEnumNew.getWarningTts(v2xType)
val alertContent =
EventTypeEnumNew.getWarningContent(v2xType)
var level = -1
val direction = getMessageDirection(data.participant.targetPosition)
//物体数据绘制 TODO 这里与dc通过工控机有区别
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onMogoObuRsmWarning ------> ${data.toString()}"
)
// 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu
if (data != null && data.participant != null) {
var v2xType = ""
if (data.participant.ptcType == 1) { //机动车
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType
} else if (data.participant.ptcType == 2) { //非机动车
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_NOT_MOTOR_VEHICLES.poiType
} else if (data.participant.ptcType == 3) { //行人
v2xType =
EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_PERSON.poiType
} else { //未知
v2xType = EventTypeEnumNew.TYPE_ERROR.poiType
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onMogoObuRsmWarning ---- data.status = ${data.status} ---data.participant.ptcId = ${data.participant.ptcId} ---data.participant.ptcType = ${data.participant.ptcType} ---data.warningMsg = ${data.warningMsg} -----data = ${data.toString()}")
when (data.status) {
MogoObuConstants.STATUS.ADD -> { // 添加
// 更新数据模型变色的时候是不是update,如果不是更新可能导致模型不变色add的时候是否有level高的 TODO
TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
?.let {
CallerMapUIServiceManager.getMarkerService()
?.updateITrafficThreatLevelInfo(it)
}
}
val ttsContent = EventTypeEnumNew.getWarningTts(v2xType)
val alertContent =
EventTypeEnumNew.getWarningContent(v2xType)
var level = -1
val direction = getMessageDirection(data.participant.targetPosition)
if (data.warningMsg != null && data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
level = data.warningMsg.warningData[0].warningLevel //默认是1个
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"new onMogoObuRsmWarning ---status---> ${data.status} ---data.warningMsg.warningData[0].status = ${data.warningMsg.warningData[0].status} ---v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent "
)
when (data.warningMsg.warningData[0].status) {
MogoObuConstants.STATUS.ADD -> { // 添加
// if (level == 2 || level == 3) { //不考虑level
//显示警告红边
CallerHmiManager.showWarning(direction)
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuNewMana2", "alertContent或ttsContent为空!")
MogoObuConstants.STATUS.UPDATE -> { // 更新
//处理删除逻辑,
// if (rsmPtcIdMap.containsKey(data.participant.ptcId.toString())) {
// var oldTime = rsmPtcIdMap[data.participant.ptcId.toString()]
// var timeDiff = (System.currentTimeMillis() - oldTime!!) / 1000
// if (timeDiff > 3) { //超过3秒,删除对应弱势交通元素
// CallerMapUIServiceManager.getMarkerService()
// ?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
// }
// rsmPtcIdMap.remove(data.participant.ptcId.toString())
// rsmPtcIdMap[data.participant.ptcId.toString()] = System.currentTimeMillis()
// } else {
// rsmPtcIdMap[data.participant.ptcId.toString()] = System.currentTimeMillis()
// }
}
MogoObuConstants.STATUS.DELETE -> { // 删除
// 更新数据 TODO 删除原来的改变颜色删除marker。不影响别的模型添加
TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
?.let {
// 事件结束,还原交通参与者颜色
it.threatLevel = 0x01
CallerMapUIServiceManager.getMarkerService()
?.updateITrafficThreatLevelInfo(it)
}
//删除弱势交通元素
CallerMapUIServiceManager.getMarkerService()
?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
}
}
//预警status
if (data.warningMsg != null && data.warningMsg.warningData != null && data.warningMsg.warningData.size > 0) {
level = data.warningMsg.warningData[0].warningLevel //默认是1个
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onMogoObuRsmWarning ---status---> ${data.status} ---data.warningMsg.warningData[0].status = ${data.warningMsg.warningData[0].status} ---v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent ---level = $level"
)
when (data.warningMsg.warningData[0].status) {
MogoObuConstants.STATUS.ADD -> { // 添加
//更新模型的颜色
//30秒内同一个事件只出现一次
if (rsmMap.containsKey(v2xType)) {
var oldTime = rsmMap[v2xType]
var timeDiff = (System.currentTimeMillis() - oldTime!!) / 1000
if (timeDiff < 30) {
return
}
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
V2XMsg(
v2xType,
alertContent,
ttsContent
)
)
)
CallerHmiManager.warningV2X(
v2xType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(v2xType + direction.direction),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(
WarningDirectionEnum.ALERT_WARNING_NON
)
}
},
true,
5000L
)
// }
rsmMap.remove(v2xType)
rsmMap[v2xType] = System.currentTimeMillis()
} else {
rsmMap[v2xType] = System.currentTimeMillis()
}
// 更新数据
TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)?.let {
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "add cvxPtcThreatIndInfo2TrafficData ---it---> $it")
TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
?.let {
CallerMapUIServiceManager.getMarkerService()
?.updateITrafficThreatLevelInfo(it)
}
}
MogoObuConstants.STATUS.UPDATE -> {// 更新
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
return
}
//显示警告红边
CallerHmiManager.showWarning(direction)
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X,
V2XMsg(
v2xType,
alertContent,
ttsContent
)
)
// .apply { //TODO
// sourceType = DataSourceType.OBU
// }
)
// 删除
MogoObuConstants.STATUS.DELETE -> {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
// 更新数据 TODO 删除原来的改变颜色删除marker。不影响别的模型添加
TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data)
?.let {
// 事件结束,还原交通参与者颜色
it.threatLevel = 0x01
CallerMapUIServiceManager.getMarkerService()
?.updateITrafficThreatLevelInfo(it)
CallerHmiManager.warningV2X(
v2xType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(v2xType + direction.direction),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(
WarningDirectionEnum.ALERT_WARNING_NON
)
}
},
true,
5000L
)
}
//删除弱势交通元素
CallerMapUIServiceManager.getMarkerService()?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
}
MogoObuConstants.STATUS.UPDATE -> {// 更新
}
MogoObuConstants.STATUS.DELETE -> { // 删除
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
//删除弱势交通元素
CallerMapUIServiceManager.getMarkerService()
?.removeCvxRvInfoIndInfo(data.participant.ptcId.toString())
}
}
}
}
}
// }
}
/**
@@ -590,16 +676,19 @@ class MogoPrivateObuNewManager private constructor() {
*/
override fun onMogoObuMapMath(data: MogoObuMapMathData?) {
super.onMogoObuMapMath(data)
if(isShowObuLimitSpeedView) {
// if (isShowObuLimitSpeedView) {
if (data != null) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"onMogoObuMapMathstatus = ${data.status} --speedMaxLimit = ${Math.round((data.speedMaxLimit*3.6))}")
"onMogoObuMapMath = ${data.status} --speedMaxLimit = ${Math.round((data.speedMaxLimit * 3.6))}"
)
when (data.status) {
MogoObuConstants.STATUS.ADD -> { // 添加
UiThreadHandler.post {
if(data.speedMaxLimit > 0) {
CallerHmiManager.showLimitingVelocity(Math.round((data.speedMaxLimit*3.6)).toInt())
if (data.speedMaxLimit > 0) {
// CallerHmiManager.showLimitingVelocity(
// Math.round((data.speedMaxLimit * 3.6)).toInt(), 2)
CallObuLimitingSpeedListenerManager.invokeOnObuLimitingSpeedChange(Math.round((data.speedMaxLimit * 3.6)).toInt())
}
}
}
@@ -609,22 +698,23 @@ class MogoPrivateObuNewManager private constructor() {
MogoObuConstants.STATUS.DELETE -> { // 删除
UiThreadHandler.post {
CallerHmiManager.disableLimitingVelocity()
// CallerHmiManager.disableLimitingVelocity()
CallObuLimitingSpeedListenerManager.invokeOnObuLimitingSpeedChange(-1)
}
}
}
}
}
// }
}
}
}
}
/**
* 获取消息的方位 车辆相关
*/
private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum {
// CallerLogger.d("$M_OBU${TAG_MOGO_NEW_OBU}", "预警红边:预警方向->$targetClassification")
// CallerLogger.d("$M_OBU${TAG_MOGO_NEW_OBU}", "预警红边:预警方向->$targetClassification")
return when (targetClassification) {
MogoObuConstants.VEH_TARGET_POSITION.AHEAD_IN_LANE,
MogoObuConstants.VEH_TARGET_POSITION.ONCOMING_IN_LANE -> WarningDirectionEnum.ALERT_WARNING_TOP //正前方
@@ -657,7 +747,7 @@ class MogoPrivateObuNewManager private constructor() {
/**
* 构造对应展示数据和场景 根据obu的场景add change delete确定是否展示
*
* @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容
* @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 TODO 添加事件频繁播报拦截
*
* @see com.mogo.module.common.enums.EventTypeEnum
*/
@@ -669,56 +759,32 @@ class MogoPrivateObuNewManager private constructor() {
info: MogoObuRvWarningData
) {
// 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnumNew 提供的
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"handleSdkObu appId = $appId --- handleDirection = $direction ---level = $level ---status = $status"
)
var alertContent: String
var ttsContent: String
var alertContent: String = ""
var ttsContent: String = ""
var changeVisualAngle = false
when (appId) {
// 变道预警,注意左后车辆/注意右后车辆
EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType -> {
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
if (
direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT
) {
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
} else if (
direction == WarningDirectionEnum.ALERT_WARNING_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT
) {
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
}
//交叉路口碰撞预警
MogoObuConstants.V2X_WARNING_TYPE.FCW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType)
}
//车辆失控预警
EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType -> {
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = String.format(alertContent, direction.desc)
ttsContent = String.format(ttsContent, direction.desc)
//交叉路口碰撞预警
MogoObuConstants.V2X_WARNING_TYPE.ICW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType)
}
//异常车辆提醒
EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType -> {
alertContent = EventTypeEnumNew.getWarningContent(appId)
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = String.format(alertContent, direction.desc)
ttsContent = String.format(ttsContent, direction.desc)
//左转辅助预警
MogoObuConstants.V2X_WARNING_TYPE.LTA.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType)
}
//盲区预警
EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType -> {
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = EventTypeEnumNew.getWarningContent(appId)
MogoObuConstants.V2X_WARNING_TYPE.BSW.toString() -> {
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType)
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType)
if (
direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
@@ -737,10 +803,65 @@ class MogoPrivateObuNewManager private constructor() {
alertContent = String.format(alertContent, "")
}
}
// 变道预警,注意左后车辆/注意右后车辆
MogoObuConstants.V2X_WARNING_TYPE.LCW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType)
if (
direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT
) {
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
} else if (
direction == WarningDirectionEnum.ALERT_WARNING_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT
) {
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
}
}
//逆向超车预警
MogoObuConstants.V2X_WARNING_TYPE.DNPW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType)
}
//紧急制动预警
MogoObuConstants.V2X_WARNING_TYPE.EBW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_EBW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_EBW.poiType)
}
//异常车辆提醒
MogoObuConstants.V2X_WARNING_TYPE.AVW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType)
alertContent = String.format(alertContent, direction.desc)
ttsContent = String.format(ttsContent, direction.desc)
}
//车辆失控预警
MogoObuConstants.V2X_WARNING_TYPE.CLW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType)
alertContent = String.format(alertContent, direction.desc)
ttsContent = String.format(ttsContent, direction.desc)
}
//车辆失控预警
MogoObuConstants.V2X_WARNING_TYPE.EVW.toString() -> {
alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType)
ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType)
}
// 这里处理固定的提示信息,包括了<紧急车辆提醒>
else -> {
ttsContent = EventTypeEnumNew.getWarningTts(appId)
alertContent = EventTypeEnumNew.getWarningContent(appId)
else -> { //TODO
// ttsContent = EventTypeEnumNew.getWarningTts(appId.toString())
// alertContent = EventTypeEnumNew.getWarningContent(appId.toString())
}
}
@@ -753,19 +874,19 @@ class MogoPrivateObuNewManager private constructor() {
"new handleSdkObu appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction"
)
if (level == 2 || level == 3) {
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuNewManager2", "alertContent或ttsContent为空!")
}
//不显示弹框,其它保留
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
MsgBoxType.V2X,
V2XMsg(
appId,
alertContent,
ttsContent
)
)
// .apply {
// sourceType = DataSourceType.OBU
// }
)
CallerHmiManager.warningV2X(
appId,
@@ -789,7 +910,7 @@ class MogoPrivateObuNewManager private constructor() {
}
},
true,
3000L
5000L
)
//显示警告红边
CallerHmiManager.showWarning(direction)
@@ -805,7 +926,7 @@ class MogoPrivateObuNewManager private constructor() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
// 移除顶部弹窗
// CallerHmiManager.disableWarningV2X((appId + direction.direction))
// CallerHmiManager.disableWarningV2X((appId + direction.direction))
//更新周边车辆进行预警颜色变换,车辆实时移动和变色
TrafficDataConvertUtilsNew.cvxV2vThreatIndInfo2TrafficData(info)?.let {
it.threatLevel = 0x01
@@ -829,7 +950,9 @@ class MogoPrivateObuNewManager private constructor() {
MogoObuConstants.STATUS.ADD,
MogoObuConstants.STATUS.UPDATE
-> {
changeTrafficLightStatus(appId, lights)
if (lights != null && lights.isNotEmpty()) {
changeTrafficLightStatus(appId, lights)
}
}
// 删除
MogoObuConstants.STATUS.DELETE -> {
@@ -838,15 +961,25 @@ class MogoPrivateObuNewManager private constructor() {
CallerHmiManager.disableWarningV2X(appId.toString())
isShowGreenWave = false
isShowRunRedLight = false
isYellowLight = false
// lightCountDownRed = 1
// lightCountDownGreen = 1
// lightCountDownYellow = 1
}
}
}
private var isRedLight = false
private var isGreenLight = false
private var isYellowLight = false
private var isShowGreenWave = false
private var isShowRunRedLight = false
// private var lightCountDownRed : Int = 1
// private var lightCountDownGreen : Int = 1
// private var lightCountDownYellow : Int = 1
/**
* 修改红绿灯
*/
@@ -861,63 +994,95 @@ class MogoPrivateObuNewManager private constructor() {
val currentLight = lights[0]
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"currentLight = $currentLight ---currentLight.phase = ${currentLight.phaseId} ---appId = $appId"
"changeTrafficLightStatus currentLight = $currentLight ----currentLight.light = ${currentLight.light} ---currentLight.phase = ${currentLight.phaseId} ---appId = $appId --countDown = ${currentLight.countDown.toInt()}"
)
// 闯红灯预警,绿波通行和闯红灯是互斥的
when (appId) {
0x0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效
0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE 无效
}
0x1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次
1 -> {//闯红灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_RED_LIGHT 一个红灯周期只显示一次
if (!isShowRunRedLight) {
isShowRunRedLight = true
CallerHmiManager.disableWarningV2X(0x2.toString())
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}","changeTrafficLightStatus 闯红灯 --------> ")
ttsContent = EventTypeEnumNew.getWarningTts(appId.toString())
alertContent = EventTypeEnumNew.getWarningContent(appId.toString())
CallerHmiManager.disableWarningV2X(1667.toString())
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"changeTrafficLightStatus 闯红灯 --------> "
)
ttsContent =
EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
alertContent =
EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType)
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.V2X,
V2XMsg(
EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
alertContent,
ttsContent
)
)
// .apply {
// sourceType = DataSourceType.OBU
// }
)
CallerHmiManager.warningV2X(
appId.toString(), alertContent, ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
appId.toString(), null, true, 5000L)
EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType,
null,
true,
5000L
)
}
}
0x2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次 100m的时候
2 -> { //绿波通行引导 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION 一个绿灯周期只显示一次 100m的时候
if (!isShowGreenWave) {
isShowGreenWave = true
CallerHmiManager.disableWarningV2X(0x1.toString())
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}",
"new changeTrafficLightStatus speed_min = ${currentLight.suggestMinSpeed} --speed_max = ${currentLight.suggestMaxSpeed} --TYPE_USECASE_ID_IVP_GREEN ---alertContent = $alertContent ---ttsContent = $ttsContent"
)
val adviceSpeed =
"${currentLight.suggestMinSpeed} - ${currentLight.suggestMaxSpeed}"
val adviceSpeedTts =
"${currentLight.suggestMinSpeed}${currentLight.suggestMaxSpeed}"
CallerHmiManager.disableWarningV2X(1666.toString())
var minSpeedTemp = Math.round(currentLight.suggestMinSpeed*3.6)
var maxSpeedTemp = Math.round(currentLight.suggestMaxSpeed*3.6)
if (minSpeedTemp == maxSpeedTemp) {
minSpeedTemp -= 5
}
val adviceSpeed = "$minSpeedTemp - $maxSpeedTemp"
val adviceSpeedTts = "$minSpeedTemp$maxSpeedTemp"
// val adviceSpeed =
// "${Math.round(currentLight.suggestMinSpeed*3.6)} - ${Math.round(currentLight.suggestMaxSpeed*3.6)}"
// val adviceSpeedTts =
// "${Math.round(currentLight.suggestMinSpeed*3.6)} 到 ${Math.round(currentLight.suggestMaxSpeed*3.6)}"
ttsContent =
String.format(
EventTypeEnumNew.getWarningTts(appId.toString()),
EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeedTts
)
alertContent =
String.format(
EventTypeEnumNew.getWarningContent(appId.toString()),
EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeed
)
val maxSpeed = currentLight.suggestMaxSpeed
if (maxSpeed > 0) {
if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) {
Log.d("MsgBox-PriObuNewManager1", "alertContent或ttsContent为空!")
}
CallerMsgBoxManager.saveMsgBox(
MsgBoxBean(
MsgBoxType.OBU,
MsgBoxType.V2X,
V2XMsg(
EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType,
alertContent,
ttsContent
)
)
// .apply { //TODO
// sourceType = DataSourceType.OBU
// }
)
CallerHmiManager.warningV2X(
@@ -937,7 +1102,7 @@ class MogoPrivateObuNewManager private constructor() {
when (currentLight.light) {
// 灯光不可用
0 -> {
CallerHmiManager.showWarningTrafficLight(0, 2)
CallerObuTrafficLightListenerManager.invokeObuTrafficLight(0)
}
// 红灯
2, 3 -> {
@@ -946,8 +1111,8 @@ class MogoPrivateObuNewManager private constructor() {
isRedLight = true
}
isGreenLight = false
CallerHmiManager.showWarningTrafficLight(1, 2)
isYellowLight = false
CallerObuTrafficLightListenerManager.invokeObuTrafficLight(1)
val red = currentLight.countDown.toInt()
CallerHmiManager.changeCountdownRed(red)
}
@@ -959,17 +1124,23 @@ class MogoPrivateObuNewManager private constructor() {
isGreenLight = true
}
isRedLight = false
CallerHmiManager.showWarningTrafficLight(3, 2)
isYellowLight = false
CallerObuTrafficLightListenerManager.invokeObuTrafficLight(3)
val green = currentLight.countDown.toInt()
CallerHmiManager.changeCountdownGreen(green)
}
// 黄灯
7, 8 -> {
if (!isYellowLight) {
isYellowLight = true
}
isRedLight = false
isGreenLight = false
CallerHmiManager.disableWarningV2X(appId.toString())
CallerHmiManager.showWarningTrafficLight(2, 2)
CallerObuTrafficLightListenerManager.invokeObuTrafficLight(2)
val yellow = currentLight.countDown.toInt()
CallerHmiManager.changeCountdownYellow(yellow)
}
}
}
}

View File

@@ -0,0 +1,57 @@
package com.mogo.eagle.core.function.obu.mogo.receiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
import com.mogo.eagle.core.function.obu.mogo.MogoPrivateObuNewManager
import com.mogo.support.obu.model.MogoObuRsiWarningData
import com.mogo.support.obu.model.MogoObuRvWarningData
import com.mogo.support.obu.model.advance.RsiWarning
import com.mogo.support.obu.model.advance.V2xWarning
import com.mogo.support.obu.model.advance.VehBasics
import com.mogo.support.obu.model.advance.WarningData
/**
* @author lixiaopeng
* @date 2023/1/13 10:50 上午
*
* 自研OBU RSI 模拟场景
*/
class ObuTestNewObuRsiReceiver : BroadcastReceiver() {
private var mContext: Context? = null
companion object {
private const val TAG = "ObuTestNewObuReceiver"
}
override fun onReceive(context: Context, intent: Intent) {
mContext = context
/**
* OBU 场景类型
*/
val obuSceneType = intent.getIntExtra("sceneType", 0)
val obuStatus = intent.getIntExtra("status", 0)
// val obuDistance = intent.getDoubleExtra("distance", 0.0)
val obuEventSeriaNum = intent.getIntExtra("seriaNum", 0)
val obuSignSerialNum = intent.getIntExtra("signSerialNum", 0)
val rsiWarning = RsiWarning(1)
rsiWarning.warningLevel = 1
rsiWarning.setDistance(1000)
rsiWarning.sceneType = obuSceneType //预警类型 0无效 1限速信息 2道路危险 3车内标牌 4前方拥堵
rsiWarning.eventSerialNum = obuEventSeriaNum //根据预警类型匹配 101 车辆故障
rsiWarning.signSerialNum = obuSignSerialNum // 2急转弯8桥梁
val rsiWarningList = listOf(rsiWarning) //TODO
val cvxObuRsiInfo = MogoObuRsiWarningData(obuStatus, 1, rsiWarningList)
MogoPrivateObuNewManager.INSTANCE
.getMogoObuListener()
.onMogoObuRsiWarning(cvxObuRsiInfo)
}
}

View File

@@ -4,6 +4,7 @@ plugins {
id 'kotlin-android-extensions'
id 'kotlin-kapt'
id 'com.alibaba.arouter'
id 'com.google.protobuf'
}
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
@@ -35,6 +36,19 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
protobuf {
protoc {
artifact = rootProject.ext.dependencies.protoc
}
generateProtoTasks {
all().each { task ->
task.builtins {
java {}
}
}
}
}
}
dependencies {
@@ -50,15 +64,18 @@ dependencies {
implementation rootProject.ext.dependencies.rxandroid
implementation rootProject.ext.dependencies.flexbox
kapt rootProject.ext.dependencies.aroutercompiler
implementation rootProject.ext.dependencies.mogo_v2x
implementation rootProject.ext.dependencies.protobuf_java
implementation rootProject.ext.dependencies.protobuf_java_util
implementation rootProject.ext.dependencies.mogoaicloudtrafficlive
if (Boolean.valueOf(USE_MAVEN_PACKAGE)) {
implementation rootProject.ext.dependencies.mogocommons
implementation rootProject.ext.dependencies.mogo_core_data
implementation rootProject.ext.dependencies.mogo_core_utils
implementation rootProject.ext.dependencies.mogo_core_function_call
implementation rootProject.ext.dependencies.mogo_core_res
compileOnly rootProject.ext.dependencies.mogomap
} else {
implementation project(":foudations:mogo-commons")
implementation project(':core:mogo-core-data')
@@ -66,7 +83,7 @@ dependencies {
implementation project(':core:mogo-core-function-call')
implementation project(':core:mogo-core-res')
implementation project(':libraries:mogo-adas')
compileOnly project(':libraries:mogo-map')
}
}

View File

@@ -4,44 +4,33 @@ import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.constants.MogoServicePaths.PATH_V2X_MODULE
import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightManager
import com.mogo.eagle.core.function.api.v2x.IV2XEventProvider
import com.mogo.eagle.core.function.v2x.events.V2XEventManager
import com.mogo.eagle.core.function.v2x.speedlimit.SpeedLimitDataManager
import com.mogo.eagle.core.function.v2x.trafficlight.core.TrafficLightDispatcher
import com.mogo.eagle.core.function.v2x.vip.VipCarManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
@Route(path = PATH_V2X_MODULE)
class V2XProvider : IMoGoFunctionServerProvider {
class V2XProvider : IV2XEventProvider {
override val functionName: String
get() = "V2XProvider"
override fun init(context: Context) {
CallerTrafficLightManager.getTrafficLightProvider().initTrafficLightServer(context)
VipCarManager.INSTANCE.initServer(context)
SpeedLimitDataManager.getInstance().start()
TrafficLightDispatcher.INSTANCE.initServer(context)
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
//不处理
} else {
V2XEventManager.init(context)
}
}
// RedLightWarningManager.INSTANCE.listenTrafficLight()
override fun queryWholeRoadEvents() {
V2XEventManager.queryWholeRoadEvents()
}
override fun onDestroy() {
VipCarManager.INSTANCE.destroy()
TrafficLightDispatcher.INSTANCE.destroy()
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
//不处理
} else {
V2XEventManager.onDestroy()
}
// RedLightWarningManager.INSTANCE.onDestroy()
}
}

View File

@@ -1,90 +1,83 @@
package com.mogo.eagle.core.function.v2x.events
import android.content.Context
import android.content.Intent
import android.os.Handler
import android.os.Looper
import android.util.Log
import androidx.core.util.Pair
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import com.mogo.cloud.commons.utils.CoordinateUtils
import com.mogo.cloud.passport.IMoGoTokenCallback
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import android.content.*
import android.os.*
import android.util.*
import androidx.localbroadcastmanager.content.*
import com.mogo.cloud.passport.*
import com.mogo.commons.constants.HostConst
import com.mogo.commons.module.ServiceConst.CARD_TYPE_ROAD_CONDITION
import com.mogo.commons.network.ParamsUtil
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.enums.EventTypeHelper
import com.mogo.commons.network.*
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_V2N
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CLOUD_V2N
import com.mogo.eagle.core.data.enums.EventTypeEnum
import com.mogo.eagle.core.data.enums.EventTypeHelper
import com.mogo.eagle.core.data.enums.TrafficTypeEnum
import com.mogo.eagle.core.data.map.MogoLatLng
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.data.enums.*
import com.mogo.eagle.core.data.map.*
import com.mogo.eagle.core.data.map.entity.MarkerExploreWay
import com.mogo.eagle.core.data.map.entity.MarkerShowEntity
import com.mogo.eagle.core.data.map.entity.V2XMessageEntity
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity
import com.mogo.eagle.core.data.msgbox.DataSourceType
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.V2XMsg
import com.mogo.eagle.core.data.traffic.TrafficData
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager
import com.mogo.eagle.core.data.traffic.*
import com.mogo.eagle.core.function.api.hmi.warning.*
import com.mogo.eagle.core.function.api.map.listener.*
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager
import com.mogo.eagle.core.function.call.hmi.*
import com.mogo.eagle.core.function.call.map.*
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.Default
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager.Scene.TooClose
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.v2x.events.alarm.V2XAlarmServer
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi
import com.mogo.eagle.core.function.v2x.events.alarm.*
import com.mogo.eagle.core.function.v2x.events.bridge.*
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.context
import com.mogo.eagle.core.function.v2x.events.consts.V2XConst
import com.mogo.eagle.core.function.v2x.events.consts.*
import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.*
import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager
import com.mogo.eagle.core.function.v2x.events.observer.V2XOptimalRouteObserver
import com.mogo.eagle.core.function.v2x.events.receiver.SceneBroadcastReceiver
import com.mogo.eagle.core.function.v2x.events.scenario.impl.V2XScenarioManager
import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker
import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker.Marker
import com.mogo.eagle.core.function.v2x.events.manager.*
import com.mogo.eagle.core.function.v2x.events.observer.*
import com.mogo.eagle.core.function.v2x.events.receiver.*
import com.mogo.eagle.core.function.v2x.events.scenario.impl.*
import com.mogo.eagle.core.function.v2x.events.utils.*
import com.mogo.eagle.core.function.v2x.events.utils.MapUtils
import com.mogo.eagle.core.function.v2x.events.utils.TrackUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.function.v2x.internal.V2XManager
import com.mogo.eagle.core.function.v2x.internal.callback.IV2XCallback
import com.mogo.eagle.core.function.v2x.internal.config.V2XConfig
import com.mogo.eagle.core.function.v2x.internal.data.V2XAdvanceWarning
import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult
import com.mogo.eagle.core.function.v2x.internal.data.V2XOptimalRoute
import com.mogo.eagle.core.function.v2x.internal.data.V2XWarningTarget
import com.mogo.eagle.core.function.v2x.internal.event.V2XEvent
import com.mogo.eagle.core.function.v2x.road.V2XEventServiceApi
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.utils.*
import com.mogo.eagle.core.utilcode.mogo.logger.*
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.*
import com.mogo.eagle.core.utilcode.util.Utils
import com.mogo.map.marker.IMogoMarker
import com.mogo.map.marker.IMogoMarkerClickListener
import com.mogo.map.marker.*
import com.mogo.map.marker.MogoMarkersHandler.Companion.mogoMarkersHandler
import com.mogo.v2x.V2XManager
import com.mogo.v2x.callback.IV2XCallback
import com.mogo.v2x.config.V2XConfig
import com.mogo.v2x.data.*
import com.mogo.v2x.event.V2XEvent
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.cache.CacheFactory
import com.shuyu.gsyvideoplayer.cache.ProxyCacheManager
import com.shuyu.gsyvideoplayer.model.VideoOptionModel
import com.shuyu.gsyvideoplayer.player.IjkPlayerManager
import com.shuyu.gsyvideoplayer.player.PlayerFactory
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
import com.zhjt.service.chain.ChainLog
import com.zhjt.service.chain.TracingConstants
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.android.asCoroutineDispatcher
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch
import roadwork.Road.RW_PB
import tv.danmaku.ijk.media.player.IjkMediaPlayer
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean
import com.shuyu.gsyvideoplayer.*
import com.shuyu.gsyvideoplayer.cache.*
import com.shuyu.gsyvideoplayer.model.*
import com.shuyu.gsyvideoplayer.player.*
import com.shuyu.gsyvideoplayer.utils.*
import com.zhjt.service.chain.*
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.*
import kotlinx.coroutines.android.*
import tv.danmaku.ijk.media.player.*
import java.util.concurrent.*
import java.util.concurrent.atomic.*
object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallback{
object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallback {
private const val TAG = "V2XEventManager"
@@ -94,15 +87,19 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
private val hasInit by lazy { AtomicBoolean(false) }
// 记录历史行驶轨迹,用于车行驶方向计算,只保留两个数据
private val historyPath = arrayOfNulls<MogoLocation>(2)
var v2xEventDisposable: Disposable? = null
fun init(context: Context) {
BridgeApi.init(context)
if (hasInit.compareAndSet(false, true)) {
if (!V2XManager.hasInit()) {
AiRoadMarker.init(context)
V2XManager.init(V2XConfig.Builder().also {
it.aiCloudConfig(MoGoAiCloudClientConfig.getInstance())
it.context(context)
it.loggable(false)
it.loggable(true)
it.distanceForTriggerRefresh(200f) //行驶超过200包含刷新道路周边信息短链请求
it.durationForTriggerRefresh(
60,
@@ -113,11 +110,9 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}.build())
V2XManager.start()
}
registerListener()
V2XManager.forceRefresh()
MoGoAiCloudClient.getInstance().addTokenCallbacks(this)
// 注册广播接收场景弹窗使用的
SceneBroadcastReceiver.register(context)
}
@@ -138,6 +133,7 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
private fun unRegisterListener() {
V2XManager.removeCallback(this)
CallerMapLocationListenerManager.removeListener(TAG, false)
mogoMarkersHandler.unregisterMarkerClickListener(CARD_TYPE_ROAD_CONDITION)
}
@@ -198,6 +194,18 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
return null
}
/**
* 刷新自车求助状态
*
* @param isTrue
*/
private fun refreshMeSeekHelp(isTrue: Boolean) {
val entity = V2XMessageEntity<Boolean>()
entity.type = V2XMessageEntity.V2XTypeEnum.ALERT_CAR_FOR_HELP
entity.content = isTrue
V2XScenarioManager.getInstance().handlerMessage(entity)
}
override fun onLocationChanged(location: MogoLocation?, from: Int, isGps: Boolean) {
location ?: return
BridgeApi.location.set(location)
@@ -238,13 +246,16 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
)
if (v2XRoadEventEntity != null) {
val distance = v2XRoadEventEntity.distance
val min = if (EventTypeEnum.AI_ROAD_WORK.poiType == v2XRoadEventEntity.poiType) 0 else 5
Logger.d(
TAG,
val min = if (EventTypeEnumNew.isCloudSocketEvent(v2XRoadEventEntity.poiType)) 0 else 5
CallerLogger.d(
"$M_V2X$TAG",
"--- trigger show before ---:data=>[${location.longitude}, ${location.latitude}, ${location.speed}], distance: $distance, minDistance: $min, poiType: ${v2XRoadEventEntity.poiType}"
)
if (distance >= min) {
Logger.d(TAG, "--- trigger show ---:poiType:" + v2XRoadEventEntity.poiType)
CallerLogger.d(
"$M_V2X$TAG",
"--- trigger show ---:poiType:" + v2XRoadEventEntity.poiType
)
TrackUtils.trackV2xRoadProduceEvent(1)
val v2XMessageEntity = V2XMessageEntity<V2XRoadEventEntity>()
v2XMessageEntity.type = V2XMessageEntity.V2XTypeEnum.ALERT_ROAD_WARNING
@@ -293,55 +304,19 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
handleWarningTargetEvent(event.data)
}
is V2XEvent.RoadAI -> {
handleRoadMarkerEvent(event.data.toRoadMarker)
/*
TODO zhongchao 先注掉,编译通过
if(FunctionBuildConfig.isV2NFromCar){
return
}*/
handleRoadMarkerEvent(event.data.toRoadMarker())
}
is V2XEvent.RoadEventX -> {
handleRoadMarkerEvent(event.data.toRoadMarker())
}
}
}
private val RW_PB.toRoadMarker: V2XMarkerCardResult
get() = V2XMarkerCardResult().also { l1 ->
this.roadwork?.polygonList?.takeIf { it.isNotEmpty() }?.also { old ->
l1.extras = HashMap<String, List<Pair<Double, Double>>>().also { extra ->
extra["polygon"] = old.map { d ->
Pair(d.lon, d.lat)
}
extra["gps_location"] = listOf(
Pair(
this.roadwork?.center?.point?.lon ?: 0.0,
this.roadwork?.center?.point?.lat ?: 0.0
)
)
}
}
l1.exploreWay = ArrayList<V2XMarkerExploreWay>().also { l2 ->
l2.add(V2XMarkerExploreWay().also { l3 ->
l3.poiType = this.roadwork?.poiType?.toString()
l3.generateTime = this.roadwork?.detectTime ?: 0L
l3.location = V2XMarkerLocation().also { l4 ->
val p = CoordinateUtils.transformWgsToGcj(
this.roadwork?.center?.point?.lat ?: 0.0,
this.roadwork?.center?.point?.lon ?: 0.0
)
l4.lon = p[0]
l4.lat = p[1]
l4.angle = this.roadwork?.center?.road?.bearing?.toDouble() ?: 0.0
}
})
}
AiRoadMarker.receive(
Marker(
this.roadwork?.center?.point?.lat ?: 0.0,
this.roadwork?.center?.point?.lon ?: 0.0,
this.roadwork?.center?.road?.bearing?.toDouble() ?: 0.0,
null,
null,
null
)
)
}
private fun handleWarningTargetEvent(data: V2XWarningTarget) {
val v2xMessageEntity = V2XMessageEntity<V2XWarningTarget>()
v2xMessageEntity.type = V2XMessageEntity.V2XTypeEnum.ALERT_THE_FRONT_WEAKNESS
@@ -402,32 +377,34 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}
1003 -> {
// 交叉路口碰撞预警
/*
TODO xiaopeng 先注掉,编译通过
changeVisualAngle = true
tempAppId = EventTypeEnum.TYPE_USECASE_ID_ICW.poiType.toInt()
tempTts = EventTypeEnum.TYPE_USECASE_ID_ICW.tts
tempContent = EventTypeEnum.TYPE_USECASE_ID_ICW.content
tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType.toInt()
tempTts = EventTypeEnumNew.TYPE_USECASE_ID_ICW.tts
tempContent = EventTypeEnumNew.TYPE_USECASE_ID_ICW.content*/
}
1004 -> {
// 交叉路口碰撞预警
changeVisualAngle = true
tempAppId = EventTypeEnum.TYPE_USECASE_ID_BSW.poiType.toInt()
tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType.toInt()
tempTts = String.format(
EventTypeEnum.TYPE_USECASE_ID_BSW.tts,
EventTypeEnumNew.TYPE_USECASE_ID_BSW.tts,
getWarningDirection()
)
tempContent = EventTypeEnum.TYPE_USECASE_ID_BSW.content
tempContent = EventTypeEnumNew.TYPE_USECASE_ID_BSW.content
}
1006 -> {
// 逆向超车预警
tempAppId = EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType.toInt()
tempTts = EventTypeEnum.TYPE_USECASE_ID_DNPW.tts
tempContent = EventTypeEnum.TYPE_USECASE_ID_DNPW.content
tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType.toInt()
tempTts = EventTypeEnumNew.TYPE_USECASE_ID_DNPW.tts
tempContent = EventTypeEnumNew.TYPE_USECASE_ID_DNPW.content
}
1005 -> {
// 闯红灯预警
tempAppId = EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt()
tempTts = EventTypeEnum.TYPE_USECASE_ID_IVP.tts
tempContent = EventTypeEnum.TYPE_USECASE_ID_IVP.content
tempAppId = EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.poiType.toInt()
tempTts = EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.tts
tempContent = EventTypeEnumNew.TYPE_USECASE_ID_IVP_RED.content
}
2001 -> {
// 最优车道100061
@@ -520,6 +497,63 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}
}
fun queryWholeRoadEvents() {
if (v2xEventDisposable != null && !v2xEventDisposable!!.isDisposed) {
v2xEventDisposable!!.dispose()
}
val sn = MoGoAiCloudClientConfig.getInstance().sn
val lineId = getLineId()
if (lineId > 0) {
realQueryV2xEvents(lineId.toString(), sn)
} else {
UiThreadHandler.postDelayed({
realQueryV2xEvents(getLineId().toString(), sn)
}, 500)
}
}
private fun realQueryV2xEvents(lineId: String, sn: String) {
v2xEventDisposable = MoGoRetrofitFactory.getInstance(HostConst.getHost())
.create(V2XEventServiceApi::class.java)
.queryAllV2XEventsByLineId(lineId, sn)
.map {
if (it.code == 200 || it.code == 0) {
CallerLogger.d(M_V2X + TAG, "请求成功size为${it.result?.v2XEventList?.size}")
return@map it.result?.v2XEventList
} else {
CallerLogger.d(M_V2X + TAG, "请求失败code为${it.code}")
return@map ArrayList()
}
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
val size = it?.size ?: 0
if (size > 0) {
val msgBoxBean = MsgBoxBean(MsgBoxType.V2X, V2XMsg("", "查询到当前全程共${size}个事件", ""))
msgBoxBean.sourceType = DataSourceType.SUMMARY
CallerMsgBoxManager.saveMsgBox(msgBoxBean)
}
}
}
private fun getLineId(): Long {
var lineId: Long = -1
val parameter = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo()
.autopilotControlParameters
if (parameter != null) {
if (parameter.autoPilotLine != null) {
lineId = parameter.autoPilotLine!!.lineId
CallerLogger.d(M_V2X + TAG, "lineId为:$lineId")
} else {
CallerLogger.d(M_V2X + TAG, "parameter.autoPilotLine为null")
}
} else {
CallerLogger.d(M_V2X + TAG, "parameter为null")
}
return lineId
}
override fun onFail(msg: String) {
CallerLogger.e("$M_V2X$TAG", "Error: $msg")
}
@@ -537,4 +571,5 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
}
}
}
}

View File

@@ -9,6 +9,7 @@ import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils;
import java.util.Iterator;
import java.util.concurrent.CopyOnWriteArrayList;
import io.netty.util.internal.ConcurrentSet;
import android.util.Log;
/**
* @author donghongyu
@@ -33,6 +34,7 @@ public class V2XAlarmServer {
CopyOnWriteArrayList<V2XRoadEventEntity> v2XRoadEventEntityList,
MogoLocation currentLocation) {
try {
Log.d("RWJ", "getDriveFrontAlarmEvent --- 1 ---" + currentLocation );
if (!showedEvents.isEmpty()) {
Iterator<V2XRoadEventEntity> iterator = showedEvents.iterator();
while (iterator.hasNext()) {
@@ -49,15 +51,18 @@ public class V2XAlarmServer {
}
}
}
Log.d("RWJ", "getDriveFrontAlarmEvent --- 2 ---" + currentLocation);
if (currentLocation != null && v2XRoadEventEntityList != null) {
// 因为集合是按照距离排序后的所以这里检索出来第一个就发出警告
for (V2XRoadEventEntity v2XRoadEventEntity : v2XRoadEventEntityList) {
// 0、道路事件必须有朝向角度>=0;
Log.d("RWJ", "entity:" + v2XRoadEventEntity.getLocation());
if (v2XRoadEventEntity.getLocation().getAngle() >= 0) {
// 计算车辆距离指定气泡的距离
MarkerLocation eventLocation = v2XRoadEventEntity.getLocation();
// 1、判断是否到达了触发距离,20 ~ 500,
double distance = v2XRoadEventEntity.getDistance();
Log.d("RWJ", "distance:" + distance);
if (distance <= 500) {
if (EventTypeEnum.GHOST_PROBE.getPoiType().equals(v2XRoadEventEntity.getPoiType())) {
if (distance > 25) {
@@ -68,7 +73,8 @@ public class V2XAlarmServer {
double carBearing = currentLocation.getBearing();
double eventBearing = eventLocation.getAngle();
double diffAngle = DrivingDirectionUtils.getAngleDiff(carBearing, eventBearing);
if (diffAngle < 20) {
Log.d("RWJ", "car_bearing:" + carBearing + ",eventBearing:" + eventBearing + ",diffAngle:" + diffAngle);
if (diffAngle <= 20) {
// 3、计算当前车辆行驶方向与事件位置之间夹角《20度保证道路事件在车辆前方
double eventAngle = DrivingDirectionUtils.getDegreeOfCar2Poi(
currentLocation.getLongitude(),
@@ -77,10 +83,13 @@ public class V2XAlarmServer {
eventLocation.getLat(),
(int) currentLocation.getBearing()
);
Log.d("RWJ", "eventAngle:" + eventAngle);
if (0 <= eventAngle && eventAngle <= 20) {
if (showedEvents.contains(v2XRoadEventEntity)) {
return null;
}
Log.d("RWJ", "showed---");
showedEvents.add(v2XRoadEventEntity);
return v2XRoadEventEntity;
}
@@ -91,6 +100,7 @@ public class V2XAlarmServer {
}
} catch (Exception e) {
e.printStackTrace();
Log.w("RWJ", "error: " + e.getMessage());
}
return null;
}

View File

@@ -4,8 +4,9 @@ import android.content.Context;
import com.alibaba.android.arouter.facade.template.IProvider;
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.v2x.data.V2XMarkerCardResult;
import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -37,11 +38,11 @@ public interface IMoGoV2XMarkerManager extends IProvider {
/**
* 绘制正在预警的道路事件的POI点
*
* @param context
* @param context
* @param roadEventEntity
* @return
*/
void drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener);
IMogoMarker drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener);
/**
* 清除 道路事件 POI

View File

@@ -32,10 +32,10 @@ import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.map.marker.IMogoMarkerManager;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.eagle.core.data.enums.EventTypeEnum;
import com.mogo.v2x.V2XManager;
import com.mogo.v2x.data.V2XMarkerCardResult;
import com.mogo.v2x.data.V2XMarkerExploreWay;
import com.mogo.v2x.data.V2XMarkerLocation;
import com.mogo.eagle.core.function.v2x.internal.V2XManager;
import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerCardResult;
import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerExploreWay;
import com.mogo.eagle.core.function.v2x.internal.data.V2XMarkerLocation;
import java.util.List;
import java.util.Objects;
@@ -55,8 +55,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
// 记录所有的:新鲜事儿的道路事件点、探路事件
private static final CopyOnWriteArraySet<V2XRoadEventEntity> mV2XRoadEventEntityArrayList = new CopyOnWriteArraySet<>();
// 上次的道路事件的预警Marker
private static IMogoMarker mAlarmInfoMarker;
@Override
public void drawableLastAllPOI() {
@@ -132,7 +131,7 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
}
@Override
public void drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener) {
public IMogoMarker drawableAlarmPOI(Context context, V2XRoadEventEntity roadEventEntity, IMogoMarkerClickListener clickListener) {
try {
IMoGoV2XStatusManager v2xStatus = BridgeApi.INSTANCE.v2xStatus();
if (v2xStatus != null) {
@@ -147,7 +146,6 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
.latitude(roadEventEntity.getLocation().getLat())
.longitude(roadEventEntity.getLocation().getLon());
optionsRipple.anchor(0.5f, 0.5f);
MarkerShowEntity markerShowEntity = new MarkerShowEntity();
MarkerExploreWay markerExploreWay = roadEventEntity.getNoveltyInfo();
markerShowEntity.setBindObj(markerExploreWay);
@@ -155,22 +153,21 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
markerShowEntity.setTextContent(markerExploreWay.getAddr());
markerShowEntity.setMarkerLocation(markerExploreWay.getLocation());
markerShowEntity.setMarkerType(CARD_TYPE_NOVELTY);
optionsRipple.icons(V2XMarkerAdapter.getV2XRoadEventViewGif(context, roadEventEntity));
optionsRipple.period(1);
IMogoMarker ret = null;
if (MogoStatusManager.getInstance().isVrMode()) {
mAlarmInfoMarker = Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerService()).drawMarker(markerShowEntity);
ret = Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMarkerService()).drawMarker(markerShowEntity);
} else {
optionsRipple.icon(V2XMarkerAdapter.getV2XRoadEventViewPng(context, roadEventEntity));
IMogoMarkerManager marker = CallerMapUIServiceManager.INSTANCE.getMarkerManager(context);
if (marker != null) {
mAlarmInfoMarker = marker.addMarker(V2X_EVENT_ALARM_POI, optionsRipple);
ret = marker.addMarker(V2X_EVENT_ALARM_POI, optionsRipple);
}
}
// 当前Marker设置为最上面
if (mAlarmInfoMarker != null) {
mAlarmInfoMarker.setToTop();
if (ret != null) {
ret.setToTop();
}
// 绘制连接线
IMoGoV2XPolylineManager polylineManager = BridgeApi.INSTANCE.v2xPolyline();
@@ -182,28 +179,30 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
new MogoLatLng(roadEventEntity.getLocation().getLat(),
roadEventEntity.getLocation().getLon()
), context);
return ret;
} else {
CallerLogger.INSTANCE.e(M_V2X + TAG, "Location 必须进行初始化!!!!!");
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void clearAlarmPOI() {
boolean isRoadEventPOIShow = false;
IMoGoV2XStatusManager v2xStatus = BridgeApi.INSTANCE.v2xStatus();
if (v2xStatus != null) {
isRoadEventPOIShow = v2xStatus.isRoadEventPOIShow();
}
if (isRoadEventPOIShow) {
v2xStatus.setRoadEventPOIShow(TAG, false);
if (mAlarmInfoMarker != null) {
mAlarmInfoMarker.remove();
}
}
// boolean isRoadEventPOIShow = false;
// IMoGoV2XStatusManager v2xStatus = BridgeApi.INSTANCE.v2xStatus();
// if (v2xStatus != null) {
// isRoadEventPOIShow = v2xStatus.isRoadEventPOIShow();
// }
// if (isRoadEventPOIShow) {
// v2xStatus.setRoadEventPOIShow(TAG, false);
// if (mAlarmInfoMarker != null) {
// mAlarmInfoMarker.remove();
// }
// }
}
@Override
@@ -220,9 +219,9 @@ public class MoGoV2XMarkerManager implements IMoGoV2XMarkerManager {
@Override
public void forceClearAlarmPOI() {
if (mAlarmInfoMarker != null) {
mAlarmInfoMarker.remove();
}
// if (mAlarmInfoMarker != null) {
// mAlarmInfoMarker.remove();
// }
}
@Override

View File

@@ -0,0 +1,193 @@
package com.mogo.eagle.core.function.v2x.events.marker
import android.os.Handler
import android.os.HandlerThread
import android.util.Log
import com.mogo.cloud.commons.utils.CoordinateUtils
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.utilcode.util.*
import com.mogo.map.marker.IMogoMarker
import com.mogo.map.overlay.IMogoPolyline
import kotlinx.coroutines.Runnable
import java.util.LinkedList
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference
data class MarkerWrapper(val id: String, val lon: Double, val lat: Double, val coordinateType: Int, var markers: ArrayList<IMogoMarker>? = null, var lines: ArrayList<IMogoPolyline>? = null) {
fun addLine(line: IMogoPolyline) {
var ll = this.lines
if (ll == null) {
ll = ArrayList()
this.lines = ll
}
ll.add(line)
}
fun addMarker(marker: IMogoMarker) {
var mm = this.markers
if (mm == null) {
mm = ArrayList()
this.markers = mm
}
mm.add(marker)
}
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as MarkerWrapper
if (id != other.id) return false
return true
}
override fun hashCode(): Int {
return id.hashCode()
}
}
object MarkerManager {
private const val TAG = "MarkerManager"
private val showedMarkers by lazy { LinkedList<MarkerWrapper>() }
private val toRemoveMakers by lazy { LinkedList<MarkerWrapper>() }
private val isFirstAdd by lazy { AtomicBoolean(false) }
private val elapsedDistances by lazy { ConcurrentHashMap<MarkerWrapper, Double>() }
private val lastCarLocation by lazy { AtomicReference<MogoLocation>() }
private val lastGpsLocation by lazy { AtomicReference<MogoLocation>() }
private val checkTask = object : Runnable {
override fun run() {
try {
Log.d(TAG, "--- checkTask --- 1 ---")
if (lastCarLocation.get() == null) {
return
}
Log.d(TAG, "--- checkTask --- 2 ---")
if (lastGpsLocation.get() == null) {
return
}
Log.d(TAG, "--- checkTask --- 3 ---")
val toRemove = toRemoveMakers.iterator()
val carLoc = AtomicReference<MogoLocation>()
while (toRemove.hasNext()) {
val marker = toRemove.next()
if (carLoc.get() == null) {
carLoc.set(if (marker.coordinateType == 0) {
//高德坐标
CallerMapLocationListenerManager.getCurrentLocation()
} else {
CallerMapLocationListenerManager.getCurrentGpsLocation()
})
}
val currentLocation = carLoc.get()
val lastLocation = if (marker.coordinateType == 0) lastCarLocation.get() else lastGpsLocation.get()
if (currentLocation != null && lastLocation != null) {
val delta = CoordinateUtils.calculateLineDistance(currentLocation.longitude, currentLocation.latitude, lastLocation.longitude, lastLocation.latitude)
Log.d(TAG, "--- checkTask --- 4 ---:delta:$delta, id:${marker.id}")
var elapsed = elapsedDistances[marker]
if (elapsed == null) {
elapsed = delta.toDouble()
} else {
elapsed += delta
}
Log.d(TAG, "--- checkTask --- 5 ---:delta:$delta, elapsed:${elapsed}, id: ${marker.id}")
if (elapsed >= 200) {
var removeMarkerError = false
marker.markers?.forEach {
try {
Log.e(TAG, "--- checkTask --- remove marker: $it, id: ${marker.id}")
it.setVisible(false)
it.destroy()
} catch (t: Throwable) {
t.printStackTrace()
removeMarkerError = true
Log.e(TAG, "--- checkTask --- remove marker error:${t.message}, id: ${marker.id}")
}
}
var removeLineError = false
marker.lines?.forEach {
try {
it.isVisible = false
Log.e(TAG, "--- checkTask --- remove line : $it, id:${marker.id}")
it.destroy()
} catch (t: Throwable) {
t.printStackTrace()
removeLineError = true
Log.e(TAG, "--- checkTask --- remove line error:${t.message}, id: ${marker.id}")
}
}
if (!removeLineError && !removeMarkerError) {
toRemove.remove()
synchronized(elapsedDistances) {
elapsedDistances.remove(marker)
}
}
} else {
elapsedDistances[marker] = elapsed
}
}
}
val iterator = showedMarkers.iterator()
while (iterator.hasNext()) {
val marker = iterator.next()
if (carLoc.get() == null) {
carLoc.set(if (marker.coordinateType == 0) {
//高德坐标
CallerMapLocationListenerManager.getCurrentLocation()
} else {
CallerMapLocationListenerManager.getCurrentGpsLocation()
})
}
val location = carLoc.get()
if (location != null) {
val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(location.longitude, location.latitude, marker.lon, marker.lat, location.bearing.toDouble())
if (angle >= 90) {
iterator.remove()
synchronized(toRemoveMakers) {
toRemoveMakers.offer(marker)
}
}
}
}
} catch (t: Throwable) {
t.printStackTrace()
} finally {
lastCarLocation.set(CallerMapLocationListenerManager.getCurrentLocation())
lastGpsLocation.set(CallerMapLocationListenerManager.getCurrentGpsLocation())
handler.postDelayed(this, 1000)
}
}
}
private val handler by lazy {
val thread = HandlerThread("check_marker_expired")
thread.start()
Handler(thread.looper)
}
fun addMarker(marker: MarkerWrapper) {
Log.d(TAG, "=== addMarker ====: $marker")
synchronized(showedMarkers) {
showedMarkers.offer(marker)
}
if (isFirstAdd.compareAndSet(false,true)) {
handler.postDelayed(checkTask, 1000)
}
}
}

View File

@@ -7,6 +7,8 @@ import com.mogo.eagle.core.data.map.entity.V2XMessageEntity;
import com.mogo.eagle.core.function.v2x.events.scenario.IV2XScenario;
import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
import java.util.concurrent.atomic.AtomicReference;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
@@ -17,7 +19,7 @@ import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
public abstract class AbsV2XScenario<T> implements IV2XScenario {
protected String TAG = "AbsV2XScenario";
private IV2XMarker mV2XMarker;
private V2XMessageEntity<T> mV2XMessageEntity;
private final AtomicReference<V2XMessageEntity> mV2XMessageEntity = new AtomicReference<>();
protected AbsV2XScenario() {
}
@@ -26,14 +28,14 @@ public abstract class AbsV2XScenario<T> implements IV2XScenario {
@Override
public void close() {
clearPOI();
// clearPOI();
}
/**
* 释放资源
*/
public void release() {
mV2XMessageEntity = null;
mV2XMessageEntity.set(null);
mV2XMarker = null;
}
@@ -46,19 +48,19 @@ public abstract class AbsV2XScenario<T> implements IV2XScenario {
}
public void setV2XMessageEntity(@Nullable V2XMessageEntity<T> mV2XMessageEntity) {
this.mV2XMessageEntity = mV2XMessageEntity;
this.mV2XMessageEntity.set(mV2XMessageEntity);
}
public V2XMessageEntity<T> getV2XMessageEntity() {
return mV2XMessageEntity;
return mV2XMessageEntity.get();
}
@Override
public boolean isSameScenario(@Nullable V2XMessageEntity v2XMessageEntity) {
if (mV2XMessageEntity == null) {
V2XMessageEntity old = mV2XMessageEntity.get();
if (old == null) {
return false;
}
return mV2XMessageEntity.equals(v2XMessageEntity);
return old.equals(v2XMessageEntity);
}
}

View File

@@ -21,6 +21,8 @@ import com.mogo.eagle.core.utilcode.util.Utils;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.map.uicontroller.VisualAngleMode;
import java.util.concurrent.atomic.AtomicReference;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com

View File

@@ -1,54 +1,42 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad
import android.animation.ArgbEvaluator
import android.content.Context
import android.graphics.Color
import android.os.Handler
import android.os.Looper
import android.view.animation.DecelerateInterpolator
import androidx.core.util.Pair
import androidx.lifecycle.Lifecycle.Event
import androidx.lifecycle.Lifecycle.Event.ON_CREATE
import androidx.lifecycle.Lifecycle.Event.ON_DESTROY
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import com.mogo.cloud.commons.utils.*
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.map.MapRoadInfo.StopLine
import com.mogo.eagle.core.data.map.MogoLatLng
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener
import com.mogo.eagle.core.function.api.v2x.OnClearAllMarker
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.OnRoadListener
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.v2x.CallMarkersClearManager
import com.mogo.eagle.core.function.v2x.events.consts.V2XConst.V2X_EVENT_ALARM_POI
import com.mogo.eagle.core.function.call.map.*
import com.mogo.eagle.core.function.v2x.events.scenario.scene.road.V2XAiRoadEventMarker
import com.mogo.eagle.core.utilcode.kotlin.lifeCycleOwner
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils
import com.mogo.map.MogoMap
import com.mogo.map.overlay.IMogoPolyline
import com.mogo.map.overlay.MogoPolylineOptions
import io.netty.util.internal.ConcurrentSet
import mogo.telematics.pad.MessagePad
import java.util.*
import java.util.concurrent.Executors
import java.util.concurrent.LinkedBlockingQueue
import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.ConcurrentHashMap
import com.mogo.eagle.core.function.v2x.events.marker.MarkerManager
import com.mogo.eagle.core.function.v2x.events.marker.MarkerWrapper
/**
* Ai云道路施工事件道路颜色标记类
*/
object AiRoadMarker {
class AiRoadMarker {
private const val TAG = "AiRoadMarker"
companion object {
@JvmField
val aiMakers = ConcurrentHashMap<String, AiRoadMarker>()
}
private val queue by lazy { LinkedBlockingQueue<Marker>() }
private val pool by lazy { Executors.newFixedThreadPool(2) }
private val TAG = "AiRoadMarker"
private val marker by lazy { AtomicReference<Marker>() }
@@ -60,54 +48,28 @@ object AiRoadMarker {
)
}
private val line by lazy { AtomicReference<IMogoPolyline>() }
private val START_COLOR = Color.parseColor("#002ABAD9")
private val END_COLOR = Color.parseColor("#66FF7A30")
private val roadMarker by lazy { V2XAiRoadEventMarker() }
private val line = AtomicReference<IMogoPolyline>()
private val handler by lazy {
Handler(Looper.getMainLooper())
}
private val checkExpiredTask = Runnable {
val poi = this.marker.get()
val car = this.carLocation.get()
val car = CallerMapLocationListenerManager.getCurrentGpsLocation()
if (poi != null && car != null) {
val distance = DrivingDirectionUtils.distance(
car.first,
car.second,
poi.poi_lon,
poi.poi_lat
) * 10000
val distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, poi.poi_lon, poi.poi_lat)
if (distance < 500) {
unMarker(poi)
}
}
}
private val onClearAllMarker = object : OnClearAllMarker {
override fun onClearAllMarkers() {
Logger.d(TAG, "--- onClearAllMarkers ----")
val marker = this@AiRoadMarker.marker.get()
if (marker != null) {
Logger.d(TAG, "--- onClearAllMarkers ----2")
unMarker(marker)
}
}
override fun onClearAllMarkers(tag: String) {
Logger.d(TAG, "--- onClearAllMarkers ----: tag: $tag")
val marker = this@AiRoadMarker.marker.get()
if (marker != null && tag == V2X_EVENT_ALARM_POI) {
Logger.d(TAG, "--- onClearAllMarkers ----: tag: -- 1: $tag")
unMarker(marker)
}
}
}
private val markers = ConcurrentSet<Marker>()
private val options by lazy {
MogoPolylineOptions().apply {
zIndex(40000f)
@@ -117,257 +79,83 @@ object AiRoadMarker {
}
}
fun init(ctx: Context) {
ctx.lifeCycleOwner.lifecycle.addObserver(object : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Event) {
if (event == ON_CREATE) {
onCreate()
}
if (event == ON_DESTROY) {
onDestroy()
}
}
})
pool.execute {
var interrupted = false
Logger.d(TAG, "--- consumer --- 0 ---")
while (!interrupted) {
try {
Logger.d(TAG, "--- consumer --- 1 ---")
val top = queue.take() ?: continue
Logger.d(TAG, "--- consumer --- 2 ---")
val location = carLocation.get()
if (location == null) {
if (queue.isEmpty()) {
synchronized(markers) {
markers.clear()
}
}
continue
}
val isTrigger = isTriggerEvent(
top.poi_lon,
top.poi_lat,
location.first,
location.second,
location.third
)
Logger.d(TAG, "--- consumer --- 3 ---: isTrigger => $isTrigger")
if (isTrigger) {
marker.set(top)
marker(top, true)
} else {
synchronized(markers) {
markers.remove(top)
}
}
interrupted = Thread.currentThread().isInterrupted
} catch (e: InterruptedException) {
e.printStackTrace()
break
}
}
fun marker(marker: Marker, drawMarker: Boolean, drawRoadLine: Boolean = false) {
val location = CallerMapLocationListenerManager.getCurrentGpsLocation() ?: return
this.marker.set(marker)
val wrapper = MarkerWrapper(marker.id, marker.poi_lon, marker.poi_lat, 1, null, null)
if (drawMarker) {
marker.entity?.apply { roadMarker.drawMarkers(this, wrapper) }
}
}
private fun isTriggerEvent(
x1: Double,
y1: Double,
x2: Double,
y2: Double,
a2: Double
): Boolean {
val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(x2, y2, x1, y1, a2)
if (angle <= 60 && DrivingDirectionUtils.distance(x1, y1, x2, y2) <= 300) {
return true
}
return false
}
private val onRoadListener = object : OnRoadListener {
private var roadId = ""
private var hasCrossRoad = false
override fun onRoadIdInfo(roadId: String) {
Logger.d(TAG, "--- onRoadInfo --- roadId: $roadId")
val oldRoadId = this.roadId
if (oldRoadId != roadId) {
if (hasCrossRoad) {
hasCrossRoad = false
}
}
this.roadId = roadId
}
override fun onStopLineInfo(info: StopLine) {
Logger.d(TAG, "--- onStopLineInfo --- info: $info")
if (!hasCrossRoad) {
hasCrossRoad = true
}
}
}
private val onLocationListener = object : IMoGoChassisLocationWGS84Listener {
override fun onChassisLocationWGS84(gnssInfo: MessagePad.GnssInfo?) {
if (gnssInfo == null) {
if (drawRoadLine) {
//施工中心点前方的自车行驶方向上300米距离
val l1 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(marker.poi_lon, marker.poi_lat, location.bearing, 300f)
//施工中心点后方的自车行驶方向上300米距离
Logger.d(TAG, "--- marker --- 3 --- l1: $l1")
val l2 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(marker.poi_lon, marker.poi_lat, location.bearing, -300f)
if (l1.points.isEmpty() || l2.points.isEmpty()) {
Logger.d(TAG, "--- marker --- 3 --- return ----")
return
}
try {
val loc = arrayOf(gnssInfo.longitude, gnssInfo.latitude)
carLocation.set(Triple(loc[0], loc[1], gnssInfo.heading.toDouble()))
} catch (t: Throwable) {
Logger.e(TAG, "error: ${t.message}")
Logger.d(TAG, "--- marker --- 4 --- l2: $l2")
val points = LinkedList<MogoLatLng>()
if (l2 != null && l2.points.isNotEmpty()) {
points.addAll(l2.points.reversed().map {
MogoLatLng(it.second, it.first)
})
}
}
}
private fun onCreate() {
CallerMapRoadListenerManager.registerRoadListener(TAG, onRoadListener)
CallMarkersClearManager.addAllMarkersClearListener(TAG, onClearAllMarker)
CallerChassisLocationWGS84ListenerManager.addListener(TAG, onLocationListener)
}
private fun onDestroy() {
CallerMapRoadListenerManager.unRegisterRoadListener(TAG)
CallMarkersClearManager.removeAllMarkersClearListener(TAG)
CallerMapLocationListenerManager.removeListener(TAG, true)
pool.shutdownNow()
removeLine()
}
fun enqueue(marker: Marker) {
Logger.d(TAG, "--- enqueue --- 1 ---")
if (markers.contains(marker)) {
Logger.d(TAG, "--- enqueue --- cache hit ---")
return
}
Logger.d(TAG, "--- enqueue --- 2 ---")
synchronized(markers) {
markers += marker
}
pool.execute {
Logger.d(
TAG,
"--- enqueue --- 3 ---${Thread.currentThread().name}::${Thread.currentThread().id}"
)
queue.put(marker)
}
}
fun marker(marker: Marker, drawMarker: Boolean) {
handler.removeCallbacks(checkExpiredTask)
val location = carLocation.get() ?: return
if (markers.contains(marker)) {
Logger.d(TAG, "--- enqueue --- cache hit ---")
return
}
synchronized(markers) {
markers += marker
}
this.marker.set(marker)
//施工中心点前方的自车行驶方向上300米距离
val l1 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(
marker.poi_lon,
marker.poi_lat,
location.third.toFloat(),
300f
)
//施工中心点后方的自车行驶方向上300米距离
Logger.d(TAG, "--- marker --- 3 --- l1: $l1")
val l2 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo(
marker.poi_lon,
marker.poi_lat,
location.third.toFloat(),
-300f
)
if (l1.points.isEmpty() || l2.points.isEmpty()) {
Logger.d(TAG, "--- marker --- 3 --- return ----")
synchronized(markers) {
markers.remove(marker)
}
return
}
Logger.d(TAG, "--- marker --- 4 --- l2: $l2")
val points = LinkedList<MogoLatLng>()
if (l2 != null && l2.points.isNotEmpty()) {
points.addAll(l2.points.reversed().map {
MogoLatLng(it.second, it.first)
})
}
val centerX = marker.poi_lon
val centerY = marker.poi_lat
Logger.d(TAG, "--- marker --- 5 --- marker: $marker")
val farthestPoint = marker.polygon?.let {
var find: Pair<Double, Double> = Pair(centerX, centerY)
var min = Long.MAX_VALUE
for (p in it) {
val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(
centerX,
centerY,
p.first,
p.second,
location.third
)
if (angle < min) {
min = angle
find = p
val centerX= marker.poi_lon
val centerY = marker.poi_lat
Logger.d(TAG, "--- marker --- 5 --- marker: $marker")
val farthestPoint = marker.polygon?.let {
var find: Pair<Double, Double> = Pair(centerX, centerY)
var min = Long.MAX_VALUE
for (p in it) {
val angle = DrivingDirectionUtils.getDegreeOfCar2Poi2(centerX, centerY, p.first, p.second, location.bearing.toDouble())
if (angle < min) {
min = angle
find = p
}
}
MogoLatLng(find.second, find.first)
} ?: MogoLatLng(centerY, centerX)
marker.farthestPoint = Pair(farthestPoint.lon, farthestPoint.lat)
Logger.d(TAG, "--- marker --- 6 --- marker: $marker")
if (l1 != null && l1.points.isNotEmpty()) {
for (l in l1.points) {
if (DrivingDirectionUtils.getDegreeOfCar2Poi2(farthestPoint.lon, farthestPoint.lat, l.first, l.second, (location.bearing + 180).toDouble()) < 90L) {
points.add(l.let { MogoLatLng(it.second, it.first) })
}
}
}
MogoLatLng(find.second, find.first)
} ?: MogoLatLng(centerY, centerX)
marker.farthestPoint = Pair(farthestPoint.lon, farthestPoint.lat)
Logger.d(TAG, "--- marker --- 6 --- marker: $marker")
if (l1 != null && l1.points.isNotEmpty()) {
for (l in l1.points) {
if (DrivingDirectionUtils.getDegreeOfCar2Poi2(
farthestPoint.lon,
farthestPoint.lat,
l.first,
l.second,
location.third + 180
) < 90L
) {
points.add(l.let { MogoLatLng(it.second, it.first) })
}
if (points.size <= 1) {
return
}
val evaluator = ArgbEvaluator()
val interceptor = DecelerateInterpolator(1.5f)
val total = points.size
val colors = ArrayList<Int>()
(0..total).forEach { i ->
colors += evaluator.evaluate(interceptor.getInterpolation(i * 1f / total), START_COLOR, END_COLOR) as Int
}
var line = line.get()
options.points(points)
options.colorValues(colors)
Logger.d(TAG, "--- marker --- 7 --- points: ${points.size}")
if (line == null || line.isDestroyed) {
val l = overlayManager?.addPolyline(options)
this.line.set(l)
line = l
} else {
line.setOption(options)
}
if (!line.isVisible) {
line.isVisible = true
}
if (line != null) {
wrapper.addLine(line)
}
}
if (points.size <= 1) {
synchronized(markers) {
markers.remove(marker)
}
return
}
removeLine()
if (drawMarker) {
marker.entity?.apply { V2XAiRoadEventMarker.drawMarkers(this) }
}
val evaluator = ArgbEvaluator()
val interceptor = DecelerateInterpolator(1.5f)
val total = points.size
val colors = ArrayList<Int>()
(0..total).forEach { i ->
colors += evaluator.evaluate(
interceptor.getInterpolation(i * 1f / total),
START_COLOR,
END_COLOR
) as Int
}
var line = line.get()
options.points(points)
options.colorValues(colors)
Logger.d(TAG, "--- marker --- 7 --- points: ${points.size}")
if (line == null || line.isDestroyed) {
val l = overlayManager?.addPolyline(options)
this.line.set(l)
line = l
} else {
line.setOption(options)
}
if (!line.isVisible) {
line.isVisible = true
}
MarkerManager.addMarker(wrapper)
}
private fun removeLine() {
@@ -381,30 +169,21 @@ object AiRoadMarker {
}
}
fun unMarker(marker: Marker) {
private fun unMarker(marker: Marker) {
Logger.d(TAG, "--- unMarker ---")
markers -= marker
this.marker.set(null)
removeLine()
V2XAiRoadEventMarker.removeMarkers(null)
roadMarker.removeMarkers()
handler.removeCallbacks(checkExpiredTask)
}
fun receive(marker: Marker) {
fun receive() {
Logger.d(TAG, "receive --- 1 ---")
val poi = this.marker.get()
val car = this.carLocation.get()
val car = CallerMapLocationListenerManager.getCurrentGpsLocation()
if (poi != null && car != null) {
val distance = DrivingDirectionUtils.distance(
car.first,
car.second,
marker.poi_lon,
marker.poi_lat
) * 10000
Logger.d(
TAG,
"receive --- 2 ---:car:[${car.first}, ${car.second}] -> poi:[${marker.poi_lon}, ${marker.poi_lat}] --> distance:$distance"
)
val distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, poi.poi_lon, poi.poi_lat)
Logger.d(TAG, "receive --- 2 ---:car:[${car.longitude}, ${car.latitude}] -> poi:[${poi.poi_lon}, ${poi.poi_lat}] --> distance:$distance")
if (distance < 500) {
checkExpired()
} else {
@@ -423,10 +202,12 @@ object AiRoadMarker {
}
data class Marker(
val id: String,
val poiType: String,
val poi_lat: Double,
val poi_lon: Double,
val poi_angle: Double,
val polygon: List<Pair<Double, Double>>?,
val polygon: List<Pair<Double, Double>>? = null,
var farthestPoint: Pair<Double, Double>? = null,
var entity: V2XRoadEventEntity? = null
) {
@@ -435,15 +216,12 @@ object AiRoadMarker {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Marker
if (poi_lat != other.poi_lat) return false
if (poi_lon != other.poi_lon) return false
if (id != other.id) return false
return true
}
override fun hashCode(): Int {
var result = poi_lat.hashCode()
result = 31 * result + poi_lon.hashCode()
return result
return id.hashCode()
}
}
}

View File

@@ -1,127 +1,88 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.road
import android.graphics.*
import android.util.*
import com.mogo.cloud.commons.utils.*
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.map.*
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.v2x.R
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.context
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi.v2xMarker
import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils
import com.mogo.eagle.core.function.v2x.events.marker.MarkerWrapper
import com.mogo.map.*
import com.mogo.map.marker.*
import com.mogo.map.overlay.*
import java.util.*
import java.util.concurrent.atomic.*
import kotlin.Pair
import kotlin.collections.ArrayList
object V2XAiRoadEventMarker {
class V2XAiRoadEventMarker {
private val current = AtomicReference<Pair<IMogoPolyline?, List<IMogoMarker>?>>()
private val v2xLocation = AtomicReference<MogoLocation>()
private val carLocation = AtomicReference<MogoLocation>()
private val overlayManager by lazy { MogoOverlayManager.getInstance() }
private val timer = Timer()
private val timerTask by lazy { AtomicReference<TimerTask>() }
private val distance = AtomicInteger(0)
private val overlayManager by lazy { CallerMapUIServiceManager.getOverlayManager(AbsMogoApplication.getApp()) }
fun drawMarkers(entity: V2XRoadEventEntity): Pair<IMogoPolyline?, List<IMogoMarker>?>? {
removeMarkers(current.get())
timerTask.get()?.cancel()
val extra = entity.noveltyInfo.extras.get("polygon");
if (extra is List<*>) {
val l = extra
if (l.size > 0) {
fun drawMarkers(entity: V2XRoadEventEntity, wrapper: MarkerWrapper) {
val extra = entity.noveltyInfo.extras["polygon"]
v2xMarker()?.drawableAlarmPOI(context(), entity, null)?.also {
wrapper.addMarker(it)
}
if (extra is List<*> && entity.poiType != EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.poiType) {
if (extra.size > 0) {
val polygons: MutableList<androidx.core.util.Pair<Double, Double>> = ArrayList()
for (i in l.indices) {
val o = l[i]!! as? androidx.core.util.Pair<*, *> ?: continue
val p = o
val first = p.first
val second = p.second
for (i in extra.indices) {
val o = extra[i]!! as? androidx.core.util.Pair<*, *> ?: continue
val first = o.first
val second = o.second
if (first == null || second == null) {
continue
}
if (first !is Double || second !is Double) {
continue
}
val xx = CoordinateUtils.transformWgsToGcj(second, first)
polygons.add(androidx.core.util.Pair.create(xx[0], xx[1]))
polygons.add(androidx.core.util.Pair.create(second, first))
}
if (polygons.size > 0) {
val markers = ArrayList<IMogoMarker>(polygons.size)
for (i in polygons.indices) {
val p = polygons[i]
val options = MogoMarkerOptions().data(entity).latitude(p.second).longitude(p.first)
options.anchor(0.5f, 0.5f)
options.icon3DRes(R.raw.sanjiaozhui)
try {
val marker = CallerMapUIServiceManager.getMarkerManager(AbsMogoApplication.getApp())?.addMarker("road_pyramid_" + entity.poiType, options)
marker?.let {
markers += it
}
} catch (t: Throwable) {
t.printStackTrace()
}
val l2 = entity.noveltyInfo?.location ?: return
v2xLocation.set(MogoLocation().also {
it.longitude = l2.lon; it.latitude = l2.lat; it.bearing = l2.angle.toFloat()
})
val options = MogoPolylineOptions()
val colors = ArrayList<Int>()
colors.add(Color.argb(204, 237, 172, 21))
colors.add(Color.argb(0, 255, 255, 255))
options.colorValues(colors)
val points = ArrayList<MogoLatLng>()
for (p in polygons) {
points.add(MogoLatLng(p.first, p.second))
}
if (markers.size > 0) {
v2xMarker()?.drawableAlarmPOI(context(), entity, null)
val l2 = entity.noveltyInfo?.location ?: return null
v2xLocation.set(MogoLocation().also { it.longitude = l2.lon; it.latitude = l2.lat; it.bearing = l2.angle.toFloat() })
val options = MogoPolylineOptions()
val colors = ArrayList<Int>()
colors.add(Color.argb(204, 237, 172, 21))
colors.add(Color.argb(0, 255, 255, 255))
options.colorValues(colors)
val points = ArrayList<MogoLatLng>()
for (p in polygons) {
points.add(MogoLatLng(p.second, p.first))
}
if (points.size > 2) {
points.add(points[0])
}
options.points(points)
options.useGradient(true)
options.useFacade(true)
options.setGps(false)
options.width(5f)
options.zIndex(75000f)
options.maxIndex(800000f)
val line = overlayManager?.addPolyline(options)
current.set(Pair(line, markers))
if (line != null) {
line.isVisible = true
}
if (points.size > 2) {
points.add(points[0])
}
options.points(points)
options.useGradient(true)
options.useFacade(true)
options.setGps(true)
options.width(5f)
options.zIndex(75000f)
options.maxIndex(800000f)
val line = overlayManager.addPolyline(options)
current.set(Pair(line, wrapper.markers))
if (line != null) {
line.isVisible = true
wrapper.addLine(line)
}
}
}
}
return current.get()
}
fun removeMarkers(pair: Pair<IMogoPolyline?, List<IMogoMarker>?>?) {
if (pair != null) {
realRemove(pair)
} else {
val prev = current.get()
if (prev != null) {
realRemove(prev)
val v2xMarker = v2xMarker()
v2xMarker?.also {
it.forceClearAlarmPOI()
}
}
fun removeMarkers() {
val prev = current.get()
if (prev != null) {
realRemove(prev)
}
}
@@ -137,40 +98,4 @@ object V2XAiRoadEventMarker {
}
}
}
fun onLocationChanged(location: MogoLocation) {
val markerLocation = v2xLocation.get()
carLocation.set(location)
if (markerLocation != null) {
if (isOutOfRange(markerLocation.longitude, markerLocation.latitude, location.longitude, location.latitude, location.bearing.toDouble())) {
v2xLocation.set(null)
this.distance.set(0)
timer.schedule(object : TimerTask() {
override fun run() {
val carLocation = this@V2XAiRoadEventMarker.carLocation.get()
Log.d("XXXXX", "timer do action ---: marker_lon: ${markerLocation.longitude}, marker_lat: ${markerLocation.latitude}, car_lon:${carLocation.longitude}, car_lat: ${carLocation.latitude}")
checkDistanceIsValid(markerLocation.longitude, markerLocation.latitude, carLocation)
}
}.also { this.timerTask.set(it) }, 1000, 1000)
}
}
}
private fun checkDistanceIsValid(x1: Double, y1: Double, location: MogoLocation) {
val distance = DrivingDirectionUtils.distance(x1, y1, location.longitude, location.latitude)
Log.d("XXXXX", "distance: $distance")
if (this.distance.addAndGet(distance.toInt()) >= 100) {
Log.d("XXXXX", "remove marker")
removeMarkers(null)
this.timerTask.get()?.cancel()
}
}
private fun isOutOfRange(markerLon: Double, markerLat: Double, carLon: Double, carLat: Double, carAngle: Double): Boolean {
return !isFrontOfCar(markerLon, markerLat, carLon, carLat, carAngle)
}
private fun isFrontOfCar(markerLon: Double, markerLat: Double, carLon: Double, carLat: Double, carAngle: Double): Boolean {
val degree = DrivingDirectionUtils.getDegreeOfCar2Poi2(carLon, carLat, markerLon, markerLat, carAngle)
return degree < 90
}
}

View File

@@ -1,16 +1,20 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.road;
import android.util.Log;
import androidx.core.util.Pair;
import com.mogo.eagle.core.data.enums.EventTypeEnumNew;
import com.mogo.eagle.core.data.map.entity.MarkerExploreWay;
import com.mogo.eagle.core.data.map.entity.MarkerLocation;
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity;
import com.mogo.eagle.core.function.v2x.events.bridge.BridgeApi;
import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XMarkerManager;
import com.mogo.eagle.core.function.v2x.events.manager.IMoGoV2XPolylineManager;
import com.mogo.eagle.core.function.v2x.events.marker.MarkerWrapper;
import com.mogo.eagle.core.function.v2x.events.marker.MarkerManager;
import com.mogo.eagle.core.function.v2x.events.scenario.scene.airoad.AiRoadMarker;
import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
import com.mogo.eagle.core.data.enums.EventTypeEnum;
import com.mogo.map.marker.IMogoMarker;
import java.util.ArrayList;
import java.util.List;
@@ -22,30 +26,31 @@ import java.util.Objects;
public class V2XRoadEventMarker implements IV2XMarker<V2XRoadEventEntity> {
private static AiRoadMarker.Marker mMarker;
@Override
public void drawPOI(V2XRoadEventEntity entity) {
try {
// 清除道路事件
IMoGoV2XMarkerManager marker = BridgeApi.INSTANCE.v2xMarker();
if (marker != null) {
marker.clearAlarmPOI();
if (entity != null) {
if (!Objects.equals(entity.getPoiType(), EventTypeEnum.AI_ROAD_WORK.getPoiType())) {
AiRoadMarker.Marker prev = mMarker;
if (prev != null) {
AiRoadMarker.INSTANCE.unMarker(prev);
mMarker = null;
Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType());
if (!Objects.equals(entity.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType())
&& !Objects.equals(entity.getPoiType(), EventTypeEnumNew.FOURS_ACCIDENT_04.getPoiType())
&& !Objects.equals(entity.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.getPoiType())
&& !Objects.equals(entity.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.getPoiType())) {
IMogoMarker iMarker = marker.drawableAlarmPOI(BridgeApi.INSTANCE.context(), entity, null);
if (iMarker != null) {
Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType() + "--- add Marker");
ArrayList<IMogoMarker> markers = new ArrayList<>();
markers.add(iMarker);
String id = entity.getLocation().getLon() + "_" + entity.getLocation().getLat();
MarkerManager.INSTANCE.addMarker(new MarkerWrapper(id, entity.getLocation().getLon(), entity.getLocation().getLat(), 0, markers, null));
} else {
Log.d("RWJ", "V2XRoadEventMarker:" + entity.getPoiType() + "--- return empty marker");
}
marker.drawableAlarmPOI(BridgeApi.INSTANCE.context(), entity, null);
} else {
AiRoadMarker.Marker prev = mMarker;
if (prev != null) {
AiRoadMarker.INSTANCE.unMarker(prev);
mMarker = null;
}
MarkerExploreWay noveltyInfo = entity.getNoveltyInfo();
Log.d("RWJ", "V2XRoadEventMarker -> noveltyInfo:" + noveltyInfo);
if (noveltyInfo != null && noveltyInfo.extras != null) {
List<Pair<Double, Double>> polygons = new ArrayList<>();
Pair<Double, Double> gpsLocation = null;
@@ -77,14 +82,13 @@ public class V2XRoadEventMarker implements IV2XMarker<V2XRoadEventEntity> {
if (noveltyInfo.extras.containsKey("gps_location")) {
gpsLocation = (Pair<Double, Double>) ((List)(noveltyInfo.extras.get("gps_location"))).get(0);
}
if (!polygons.isEmpty() && gpsLocation != null) {
MarkerLocation location = noveltyInfo.getLocation();
AiRoadMarker.Marker m = new AiRoadMarker.Marker(gpsLocation.second, gpsLocation.first, location.getAngle(), polygons, null, entity);
mMarker = m;
AiRoadMarker.INSTANCE.marker(m, true);
AiRoadMarker.Marker m = new AiRoadMarker.Marker(noveltyInfo.getInfoId(), noveltyInfo.getPoiType(), gpsLocation.second, gpsLocation.first, location.getAngle(), polygons, null, entity);
AiRoadMarker aiMarker = new AiRoadMarker();
aiMarker.marker(m, true, isDrawRoadLine(m.getPoiType()));
AiRoadMarker.aiMakers.put(noveltyInfo.getInfoId(), aiMarker);
}
}
}
}
@@ -94,19 +98,23 @@ public class V2XRoadEventMarker implements IV2XMarker<V2XRoadEventEntity> {
}
}
private boolean isDrawRoadLine(String poiType) {
return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType().equals(poiType);
}
@Override
public void clearPOI() {
// 移除线
IMoGoV2XPolylineManager polyLineManager = BridgeApi.INSTANCE.v2xPolyline();
if (polyLineManager != null) {
polyLineManager.clearLine();
}
IMoGoV2XMarkerManager v2xMarker = BridgeApi.INSTANCE.v2xMarker();
if (v2xMarker != null) {
// 移除事件POI
v2xMarker.clearAlarmPOI();
// 绘制上次的数据
v2xMarker.drawableLastAllPOI();
}
// IMoGoV2XPolylineManager polyLineManager = BridgeApi.INSTANCE.v2xPolyline();
// if (polyLineManager != null) {
// polyLineManager.clearLine();
// }
// IMoGoV2XMarkerManager v2xMarker = BridgeApi.INSTANCE.v2xMarker();
// if (v2xMarker != null) {
// // 移除事件POI
// v2xMarker.clearAlarmPOI();
// // 绘制上次的数据
// v2xMarker.drawableLastAllPOI();
// }
}
}

View File

@@ -1,12 +1,16 @@
package com.mogo.eagle.core.function.v2x.events.scenario.scene.road;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_V2X;
import android.util.Log;
import com.mogo.cloud.commons.utils.CoordinateUtils;
import com.mogo.commons.analytics.AnalyticsUtils;
import com.mogo.eagle.core.data.enums.EventTypeEnumNew;
import com.mogo.eagle.core.data.enums.WarningDirectionEnum;
import com.mogo.eagle.core.data.map.MogoLocation;
import com.mogo.eagle.core.data.map.entity.MarkerExploreWay;
import com.mogo.eagle.core.data.map.entity.MarkerLocation;
import com.mogo.eagle.core.data.map.entity.V2XMessageEntity;
import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity;
import com.mogo.eagle.core.data.msgbox.MsgBoxBean;
@@ -14,6 +18,7 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxType;
import com.mogo.eagle.core.data.msgbox.V2XMsg;
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager;
import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager;
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager;
import com.mogo.eagle.core.function.v2x.events.consts.V2XConst;
@@ -21,13 +26,13 @@ import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager;
import com.mogo.eagle.core.function.v2x.events.scenario.impl.AbsV2XScenario;
import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.data.enums.EventTypeEnum;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
@@ -45,7 +50,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
@Override
public void init(V2XMessageEntity<V2XRoadEventEntity> v2XMessageEntity) {
try {
CallerLogger.INSTANCE.d(M_V2X + TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity));
Log.d(TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity));
V2XRoadEventEntity v2XRoadEventEntity = v2XMessageEntity.getContent();
if (v2XRoadEventEntity != null) {
if (v2XMessageEntity.isShowState()) {
@@ -71,16 +76,23 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
try {
if (getV2XMessageEntity() != null && getV2XMessageEntity().getContent() != null) {
//只展示不播报 不广播
boolean onlyShow = getV2XMessageEntity().isOnlyShow();
V2XMessageEntity<V2XRoadEventEntity> entity = getV2XMessageEntity();
boolean onlyShow = entity.isOnlyShow();
if (!onlyShow) {
// 设置TTS
getV2XMessageEntity().getContent().getTts(false);
V2XRoadEventEntity content = entity.getContent();
if (content != null && !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType())
&& !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_JINGZHI.getPoiType())
&& !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.getPoiType())
&& !Objects.equals(content.getPoiType(), EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType())) {
content.getTts(false);
}
}
showWindow();
String poiType = getV2XMessageEntity().getContent().getPoiType();
String lat = String.valueOf(getV2XMessageEntity().getContent().getLocation().getLat());
String lon = String.valueOf(getV2XMessageEntity().getContent().getLocation().getLon());
String infoId = getV2XMessageEntity().getContent().getNoveltyInfo().getInfoId();
String poiType = entity.getContent().getPoiType();
String lat = String.valueOf(entity.getContent().getLocation().getLat());
String lon = String.valueOf(entity.getContent().getLocation().getLon());
String infoId = entity.getContent().getNoveltyInfo().getInfoId();
String style = "1";
Map<String, Object> properties = new HashMap<>();
properties.put("dbid", infoId);
@@ -100,20 +112,39 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
V2XRoadEventEntity content = entity != null ? entity.getContent() : null;
if (content != null) {
// //显示警告红边
if (content.getAlarmContent() == null || content.getAlarmContent().isEmpty()
|| content.getTts() == null || content.getTts().isEmpty()) {
String alarmText = content.getAlarmContent();
String ttsText = content.getTts();
if (alarmText == null || alarmText.isEmpty()
|| ttsText == null || ttsText.isEmpty()) {
Log.d("MsgBox-V2XRoadScenario", "alertContent或ttsContent为空!");
}
String poiType = content.getPoiType();
if (EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.getPoiType().equals(poiType) ||
EventTypeEnumNew. TYPE_SOCKET_ROAD_JINGZHI.getPoiType().equals(poiType) ||
EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType().equals(poiType) ||
EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU.getPoiType().equals(poiType)) {
MogoLocation carLocation = CallerMapLocationListenerManager.INSTANCE.getCurrentLocation();
MarkerExploreWay noveltyInfo = content.getNoveltyInfo();
if (carLocation != null && noveltyInfo != null) {
MarkerLocation eventLocation = noveltyInfo.getLocation();
if (eventLocation != null) {
double distance = content.getDistance();
alarmText = String.format(alarmText, Math.round(distance) + "");
ttsText = String.format(ttsText, Math.round(distance) + "");
}
}
}
CallerMsgBoxManager.INSTANCE.saveMsgBox(
new MsgBoxBean(
MsgBoxType.V2X,
new V2XMsg(content.getPoiType(),
content.getAlarmContent(),
content.getTts())
new V2XMsg(poiType,
alarmText,
ttsText)
)
);
CallerHmiManager.INSTANCE.warningV2X(content.getPoiType(), content.getAlarmContent(),
content.getTts(), TAG, this, !entity.isOnlyShow(),
CallerHmiManager.INSTANCE.warningV2X(poiType, alarmText,
ttsText, TAG, this, !entity.isOnlyShow(),
TimeUnit.SECONDS.toMillis(5));
}
}
@@ -130,10 +161,10 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
@Override
public void clearPOI() {
IV2XMarker marker = getV2XMarker();
if (marker != null) {
marker.clearPOI();
}
// IV2XMarker marker = getV2XMarker();
// if (marker != null) {
// marker.clearPOI();
// }
}
@Override
@@ -144,13 +175,14 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
CallerHmiManager.INSTANCE.showWarning(WarningDirectionEnum.ALERT_WARNING_TOP, TimeUnit.HOURS.toMillis(1));
V2XMessageEntity<V2XRoadEventEntity> entity = getV2XMessageEntity();
if (entity != null) {
if (entity.isNeedAddLine()) {
drawPOI();
}
V2XRoadEventEntity content = entity.getContent();
if (content != null) {
if (entity.isNeedAddLine() && !EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION.getPoiType().equals(content.getPoiType()) ) {
drawPOI();
}
MarkerExploreWay noveltyInfo = content.getNoveltyInfo();
if (noveltyInfo != null && EventTypeEnum.FOURS_FOG.getPoiType().equals(content.getNoveltyInfo().getPoiType())) {
if (noveltyInfo != null && EventTypeEnumNew.FOURS_FOG.getPoiType().equals(content.getNoveltyInfo().getPoiType())) {
CallerHmiManager.INSTANCE.displayEffects();
}
}
@@ -163,7 +195,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
if (content == null) {
return true;
}
return !EventTypeEnum.GHOST_PROBE.getPoiType().equals(content.getPoiType());
return !EventTypeEnumNew.GHOST_PROBE.getPoiType().equals(content.getPoiType());
}
@Override
@@ -172,7 +204,6 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
if (isNeedChangeAngle()) {
CallerVisualAngleManager.INSTANCE.changeVisualAngle(new CallerVisualAngleManager.Scene.Default(3, TimeUnit.SECONDS));
}
clearPOI();
release();
}
}

View File

@@ -39,13 +39,13 @@ public class V2XOptimalRouteVREventMarker implements IV2XMarker<V2XOptimalRouteD
@Override
public void clearPOI() {
// 移除线
clearLine();
// 绘制上次的数据
IMoGoV2XMarkerManager v2xMarker = BridgeApi.INSTANCE.v2xMarker();
if (v2xMarker != null) {
v2xMarker.drawableLastAllPOI();
}
// // 移除线
// clearLine();
// // 绘制上次的数据
// IMoGoV2XMarkerManager v2xMarker = BridgeApi.INSTANCE.v2xMarker();
// if (v2xMarker != null) {
// v2xMarker.drawableLastAllPOI();
// }
}
public void clearLine() {

Some files were not shown because too many files have changed in this diff Show More