diff --git a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java index 80b648d14c..46dd3a6b50 100644 --- a/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ b/OCH/mogo-och-bus-passenger/src/main/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -333,6 +333,11 @@ public class BusPassengerModel { private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + @Override + public void onAutopilotRouteLineId(long lineId) { + + } + @Override public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { } @@ -426,7 +431,7 @@ public class BusPassengerModel { //找出前往站对应的轨迹点,拿出两站点的集合 CallerLogger.INSTANCE.d(M_BUS_P + TAG, "mRoutePoints.size() = " + mRoutePoints.size()); if (mRoutePoints.size() > 0) { - if (mStations.size() > 2){ //两个站点以上要计算两个站点间的估计路线 + if (mStations.size() > 1){ //改为两个站点及以上计算两个站点间的估计路线 if (mNextStationIndex <= mStations.size()-1 && mNextStationIndex - 1 >=0){ mTwoStationsRouts.clear(); BusPassengerStation stationNext = mStations.get(mNextStationIndex); @@ -445,9 +450,6 @@ public class BusPassengerModel { mTwoStationsRouts.addAll(mRoutePoints.subList(currentRouteIndex,nextRouteIndex + 1)); } } - }else { //只有两个站点的时候整个路线就是两个站点之间的轨迹 - mTwoStationsRouts.clear(); - mTwoStationsRouts.addAll(mRoutePoints); } if (mTwoStationsRouts.size() > 0){ float sumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(mTwoStationsRouts); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index 5471b06c29..150b401a24 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -4,9 +4,7 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS import static com.mogo.och.bus.constant.BusConst.TIMER_START_AUTOPILOT_INTERVAL; import android.animation.ObjectAnimator; -import android.content.Intent; import android.os.Bundle; -import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,12 +19,9 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.Group; -import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; -import com.mogo.commons.voice.AIAssist; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.config.HmiBuildConfig; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener; @@ -39,24 +34,20 @@ import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager; import com.mogo.eagle.core.function.hmi.ui.widget.TrafficDataView; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.MogoMapUIController; -import com.mogo.map.MogoMarkerManager; import com.mogo.map.listener.IMogoMapListener; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.module.common.MogoApisHandler; import com.mogo.eagle.core.utilcode.mogo.view.OnPreventFastClickListener; import com.mogo.och.bus.R; import com.mogo.och.bus.bean.BusRoutesResult; -import com.mogo.och.bus.constant.BusConst; import com.mogo.och.bus.model.BusOrderModel; import com.mogo.och.bus.util.BDRouteDataTestUtils; import com.mogo.och.bus.view.SlidePanelView; import com.mogo.och.common.module.utils.SoundPoolHelper; import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.ThreadMode; import java.util.Objects; @@ -143,14 +134,16 @@ public abstract class BaseBusTabFragment //切换地图的远近视图 if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isLongSight() || MogoMapUIController.getInstance().getCurrentMapVisualAngle().isRoma()) { - CallerVisualAngleManager.INSTANCE.updateLongSightLevel(false); + if(FunctionBuildConfig.isRomaMode){ + CallerVisualAngleManager.INSTANCE.updateLongSightLevel(false); + } Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(true); MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_MEDIUM_SIGHT, null); mSwitchMapModeImage.setImageResource(R.drawable.bus_switch_map_medium); } else if (MogoMapUIController.getInstance().getCurrentMapVisualAngle().isMediumSight()) { - CallerVisualAngleManager.INSTANCE.updateLongSightLevel(true); if (FunctionBuildConfig.isRomaMode) { - MogoMapUIController.getInstance().setRomaMode(1); + CallerVisualAngleManager.INSTANCE.updateLongSightLevel(true); + MogoMapUIController.getInstance().setRomaMode(FunctionBuildConfig.romaModeStyle); } else { Objects.requireNonNull(CallerMapUIServiceManager.INSTANCE.getMapUIController()).setLockMode(false); MogoMapUIController.getInstance().changeMapVisualAngle(VisualAngleMode.MODE_LONG_SIGHT, null); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 1e9e003dfe..b8deed7471 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -44,6 +44,8 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.List; +import bag_manager.BagManagerOuterClass; + /** * 网约车小巴界面 @@ -536,4 +538,8 @@ public class BusFragment extends BaseBusTabFragment } } } + + @Override + public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index 3f09f3ab14..f657813645 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -267,6 +267,11 @@ public class BusPresenter extends Presenter onAutopilotStatusResponse(info); } + @Override + public void onAutopilotRouteLineId(long lineId) { + + } + @Override public void onAutopilotGuardian(MogoReportMsg.MogoReportMessage guardianInfo) { BusTrajectoryManager.getInstance().onAutopilotGuardian(guardianInfo); diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/OCHAdasAbilityManager.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/OCHAdasAbilityManager.java index fda4e3fa53..168e6cccc3 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/OCHAdasAbilityManager.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/OCHAdasAbilityManager.java @@ -11,11 +11,8 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListene import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotStatisticsListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.och.common.module.callback.OchAdasStartFailureCallback; -import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.bean.AutopilotStatistics; -import chassis.Chassis; -import system_master.SystemStatusInfo; /** * Created on 2022/10/9 @@ -77,36 +74,9 @@ public class OCHAdasAbilityManager implements IMoGoAutopilotActionsListener, IMo } @Override - public void onAutopilotAbility(@Nullable AutopilotAbility ability) { - isAutopilotAbility = true; - autopilotAbilityReason = null; - if (ability.gear == null || ability.gear == Chassis.GearPosition.GEAR_P || - ability.gear == Chassis.GearPosition.GEAR_R) { - isAutopilotAbility = false; - autopilotAbilityReason = "挡位不正常"; - } - - if (DebugConfig.getProductFlavor() == "fPadLenovoOchBus" && - ability.gear == Chassis.GearPosition.GEAR_N){ //bus档位不正常 - isAutopilotAbility = false; - autopilotAbilityReason = "挡位不正常"; - } - - if (isAutopilotAbility) - if (ability.brake > 0) { - isAutopilotAbility = false; - autopilotAbilityReason = "制动踏板被踩下"; - } - if (isAutopilotAbility) - if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_STARTING) { - isAutopilotAbility = false; - autopilotAbilityReason = "系统正在启动"; - } - if (isAutopilotAbility) - if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_EXITING) { - isAutopilotAbility = false; - autopilotAbilityReason = "系统正在关闭"; - } + public void onAutopilotAbility(boolean isAutopilotAbility, String unableAutopilotReason) { + this.isAutopilotAbility = isAutopilotAbility; + this.autopilotAbilityReason = unableAutopilotReason; Logger.d(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + autopilotAbilityReason); } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java index 6f3e5c5281..a00b559fe2 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java @@ -162,6 +162,11 @@ public class SweeperPresenter extends Presenter } + @Override + public void onAutopilotRouteLineId(long lineId) { + + } + @Override public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { if (autopilotStatusInfo == null) return; diff --git a/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ILeftMenuService.aidl b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ILeftMenuService.aidl index 0e0aa676e9..ab9159d363 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ILeftMenuService.aidl +++ b/OCH/mogo-och-taxi-passenger/src/main/aidl/com/mogo/och/taxi/passenger/mulprocess/ILeftMenuService.aidl @@ -8,7 +8,7 @@ import com.mogo.och.taxi.passenger.mulprocess.ICallback; interface ILeftMenuService { /** - * 向主进程传选中的item + * Pass the selected item to the main process */ void transmissionIndex(int index); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java index 1543ad8da0..0ee57c0c2c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerGeocodeSearchModel.java @@ -2,6 +2,7 @@ package com.mogo.och.taxi.passenger.model; import android.content.Context; +import com.amap.api.services.core.AMapException; import com.amap.api.services.core.LatLonPoint; import com.amap.api.services.geocoder.GeocodeResult; import com.amap.api.services.geocoder.GeocodeSearch; @@ -52,8 +53,12 @@ public class TaxiPassengerGeocodeSearchModel implements GeocodeSearch.OnGeocodeS public void initGeocodeSearch(){ //通过经纬度逆地理编码得到位置 - mGeocodeSearch = new GeocodeSearch(mContext); - mGeocodeSearch.setOnGeocodeSearchListener(this); + try { + mGeocodeSearch = new GeocodeSearch(mContext); + mGeocodeSearch.setOnGeocodeSearchListener(this); + } catch (AMapException e) { + e.printStackTrace(); + } timer = new Timer(); timerTask = new TimerTask() { @Override diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index aa06fd8dae..e185cc829f 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -24,6 +24,7 @@ import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.eagle.core.data.msgbox.MsgBoxBean; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener; @@ -497,6 +498,10 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + @Override + public void onAutopilotRouteLineId(long lineId) { + + } @Override public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { @@ -611,6 +616,26 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback }; private final IMsgBoxEventListener iMsgBoxEventListener = new IMsgBoxEventListener() { + @Override + public void onBubbleReportClickEvent(@NonNull MsgBoxBean msgBoxBean) { + + } + + @Override + public void onBubbleV2XClickEvent(@NonNull MsgBoxBean msgBoxBean) { + + } + + @Override + public void onBubbleOperationClickEvent(@NonNull MsgBoxBean msgBoxBean) { + + } + + @Override + public void onUpdateTipEvent(boolean isShow) { + + } + @Override public void onSummaryClickEvent() { if (mCurrentOCHOrder == null){ diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index 5eebed8920..188b6de7c2 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -15,6 +15,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.map.CallerSmpManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; import com.mogo.och.taxi.passenger.bean.TaxiPassengerScoreUpdateOrderReqBean; import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerADASStatusCallback; @@ -42,6 +43,7 @@ public class BaseTaxiPassengerPresenter extends Presenter - * Launcher application - */ -public class MogoApplication extends MainMoGoApplication { - - @Override - protected void attachBaseContext(Context base) { - super.attachBaseContext(base); -// ThreadConfig.Builder builder = new ThreadConfig.Builder().listener(new ThreadConfig.TaskExecuteListener() { -// @Override -// public boolean isEnabled() { -// return true; // 如果返回true,会有后续的回调;如果返回false, 不会有后续的回调 -// } -// -// @Override -// public void onExecutorBefore(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) { -// //每个任务执行前回调 -//// if (type == ThreadConfig.TaskType.HandlerThread) { -//// -//// -//// } -// } -// -// @Override -// public void onExecutorAfter(@NonNull Runnable runnable, @NonNull ThreadConfig.TaskType type) { -// //每个任务执行后回调 -// } -// -// /** -// * @param core 线程池的核心数 -// * @param max 线程池的最大线程数 -// * @param active 线程池正在活跃的任务数 -// * @param completed 线程池已完成的任务数 -// */ -// @Override -// public void onExecutorStateChanged(@NonNull ThreadPoolExecutor pool, int core, int max, int active, long completed) { -// //线程池在执行过程,状态变化回调 -// //Log.d("POOL", "core:" + core + ";max:" + max + ";active:" + active + ";completed:" + completed); -// } -// }); -// builder.loggable(false); -// ThreadManager.INSTANCE.init(builder); - } - - @Override - protected void initCrashConfig() { - CrashSystem crashSystem = CrashSystem.getInstance(this); - crashSystem.init(); - //设置debug模式,日志不上传 - crashSystem.setDebug(BuildConfig.DEBUG); - } - - @Override - protected void initLogConfig() { - super.initLogConfig(); - Logger.init(BuildConfig.DEBUG ? LogLevel.DEBUG : LogLevel.OFF); - } -} +package com.mogo.launcher; import com.mogo.eagle.core.function.main.MainMoGoApplication; import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.launcher.crash.CrashSystem; /** * @author congtaowang * @since 2019-12-18 *

* Launcher application */ public class MogoApplication extends MainMoGoApplication { @Override protected void initCrashConfig() { CrashSystem crashSystem = CrashSystem.getInstance(this); crashSystem.init(); //设置debug模式,日志不上传 crashSystem.setDebug(BuildConfig.DEBUG); } @Override protected void initLogConfig() { super.initLogConfig(); Logger.init(BuildConfig.DEBUG ? LogLevel.DEBUG : LogLevel.OFF); } } \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt new file mode 100644 index 0000000000..09ae7d1c42 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/CrashFix.kt @@ -0,0 +1,32 @@ +package com.mogo.launcher.lancet + +import android.content.ComponentName +import android.content.Intent +import androidx.annotation.* +import com.knightboost.lancet.api.Origin +import com.knightboost.lancet.api.Scope.ALL +import com.knightboost.lancet.api.Scope.LEAF +import com.knightboost.lancet.api.annotations.* + +@Keep +@Weaver +@Group("crash_fix") +class CrashFix { + + /** + * 修正Android8.0及之后,后台启动Service引起的崩溃 + * java.lang.IllegalStateException: Not allowed to start service Intent { + * act=com.zhidao.cosupload.service.UPLOAD_ACTION cmp=com.mogo.launcher.f/com.zhidao.cosupload.service.UploadService }: app is in background uid UidRecord{6443b7b u0a404 LAST bg:+1m15s362ms idle change:idle procs:1 seq(0,0,0)} + */ + @Insert(mayCreateSuper = true) + @TargetClass("android.content.Context", scope = LEAF) + @TargetMethod(methodName = "startService") + fun fixStartServiceCrash(intent: Intent): ComponentName? { + return try { + Origin.call() as ComponentName? + } catch (t: Throwable) { + t.printStackTrace() + null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt b/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt new file mode 100644 index 0000000000..5357e485f6 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/MemoryLeakFix.kt @@ -0,0 +1,140 @@ +package com.mogo.launcher.lancet + +import android.app.Activity +import android.app.Dialog +import android.content.Context +import android.view.View +import androidx.annotation.* +import androidx.core.view.ViewCompat +import androidx.fragment.app.* +import androidx.lifecycle.* +import androidx.lifecycle.Lifecycle.Event +import androidx.lifecycle.Lifecycle.Event.ON_DESTROY +import com.knightboost.lancet.api.* +import com.knightboost.lancet.api.annotations.* +import com.knightboost.lancet.api.annotations.Weaver +import com.mogo.eagle.core.utilcode.kotlin.* +import io.netty.util.internal.ConcurrentSet +import java.lang.ref.* +import java.lang.reflect.Modifier +import java.util.concurrent.ConcurrentHashMap + +@Keep +@Weaver +@Group("memory_leak") +class MemoryLeakFix { + + @Insert + @ImplementedInterface("java.lang.Runnable") + @TargetMethod(methodName = "run") + fun runProxy() { + if (AccessSyntheticUtils.isTargetAlive(This.get())) { + Origin.callVoid() + } + } +} + +internal class AccessSyntheticUtils { + + companion object { + + private val fields = ConcurrentHashMap>() + private val observers = ConcurrentSet() + + @JvmStatic + fun isTargetAlive(obj: Any): Boolean { + try { + val clazz = obj.javaClass + if (!clazz.isAnonymousClass) { + return true + } + val key = clazz.name + return (fields[key] ?: clazz.declaredFields.find { + it.isSynthetic && + ((it.modifiers and Modifier.STATIC) == 0) && + (View::class.java.isAssignableFrom(it.type) or + Context::class.java.isAssignableFrom(it.type) or + Fragment::class.java.isAssignableFrom(it.type) or + android.app.Fragment::class.java.isAssignableFrom(it.type) or + Dialog::class.java.isAssignableFrom(it.type) + ) + }?.let { + it.isAccessible = true + val wf = WeakReference(it.get(obj), ReferenceQueue()) + fields[key] = wf + wf + })?.also { + if (it.isEnqueued) { + //对像被垃圾回收了 + fields.remove(key) + } + }?.get()?.let { t -> + var lifecycle: Lifecycle? = null + val ret = when (t) { + is View -> { + lifecycle = t.lifecycleOwner.lifecycle + ViewCompat.isAttachedToWindow(t) + } + is Activity -> { + lifecycle = t.findViewById(android.R.id.content)?.lifecycleOwner?.lifecycle + !t.isFinishing && !t.isDestroyed + } + is Fragment -> { + lifecycle = t.lifecycle + !t.isDetached + } + is android.app.Fragment -> { + lifecycle = t.view?.lifecycleOwner?.lifecycle + !t.isDetached + } + is Dialog -> { + t.window?.decorView?.let { + v -> + lifecycle = v.lifecycleOwner.lifecycle + ViewCompat.isAttachedToWindow(v) + } ?: false + } + else -> { + true + } + } + if (!ret) { + assignFinalFieldNull(obj, t.javaClass) + } else { + val l = lifecycle + if (l != null && !observers.contains(key)) { + observers.add(key) + l.addObserver(object : LifecycleEventObserver { + override fun onStateChanged(source: LifecycleOwner, event: Event) { + if (event == ON_DESTROY) { + assignFinalFieldNull(obj, t.javaClass) + observers.remove(key) + } + } + }) + } + } + ret + } ?: true + } catch (t: Throwable) { + t.printStackTrace() + } + return true + } + + @JvmStatic + private fun assignFinalFieldNull(obj: Any, fieldType: Class<*>) { + try { + obj.javaClass.declaredFields.find { + it.isSynthetic && + ((it.modifiers and Modifier.STATIC) == 0) && it.type == fieldType + }?.also { + it.isAccessible = true + it.set(obj, null) + } + } catch (t: Throwable) { + t.printStackTrace() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt b/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt index b3a3d8345a..33d13a30a7 100644 --- a/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt +++ b/app/src/main/java/com/mogo/launcher/stageone/APMStartup.kt @@ -3,13 +3,10 @@ package com.mogo.launcher.stageone import android.content.Context import com.rousetime.android_startup.AndroidStartup import com.alibaba.android.arouter.launcher.ARouter -import com.mogo.test.crashreport.upgrade.UpgradeReportConstants import com.mogo.test.crashreport.CrashReportConstants class APMStartup : AndroidStartup() { override fun create(context: Context): Boolean? { - // bugly - ARouter.getInstance().build(UpgradeReportConstants.PATH).navigation() // apm ARouter.getInstance().build(CrashReportConstants.PATH).navigation() return true diff --git a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt index dd5ef2f13b..13cc882668 100644 --- a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt @@ -113,7 +113,7 @@ class HttpDnsStartUp : AndroidStartup() { // 使用中台长链接 clientConfig.isUseOriginSocket = true // 设置是否输出网络日志 - clientConfig.isShowNetDebugLog = false + clientConfig.isShowNetDebugLog = true // 设置是否是直播推流的主播 clientConfig.isAnchor = true when (DebugConfig.getCarMachineType()) { diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java index 7381bc5116..fa494393dc 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/ConfigAdapter.java @@ -36,7 +36,10 @@ public class ConfigAdapter extends BaseAdapter } viewHolder.name.setText(data.name); viewHolder.value.setText(data.value); - + if (data.color == -1) { + data.color = R.color.colorSlateGray; + } + viewHolder.value.setTextColor(mContext.getResources().getColor(data.color)); } @Override diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseAdapter.java index 333d6198e1..ca5e419fc4 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseAdapter.java @@ -48,6 +48,10 @@ public abstract class BaseAdapter extends Recycler notifyDataSetChanged(); } + public List getData() { + return mDatas; + } + public void setOnItemClickListener(OnItemClickListener listener) { mItemClick = listener; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Config.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Config.java index 9f18c1fd2b..960c40a65c 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Config.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Config.java @@ -1,11 +1,26 @@ package com.zhidao.adas.client.bean; +import java.util.Objects; + public class Config { public final String name; - public final String value; + public String value; + public int color = -1; public Config(String name, String value) { this.name = name; this.value = value; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Config config = (Config) o; + return Objects.equals(name, config.name); + } + + public void cover(Config config) { + this.value = config.value; + } } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 538eea185c..8bd87f3cf1 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -88,7 +88,6 @@ import com.zhidao.support.adas.high.AdasOptions; import com.zhidao.support.adas.high.OnAdasConnectStatusListener; import com.zhidao.support.adas.high.OnAdasListener; import com.zhidao.support.adas.high.OnMultiDeviceListener; -import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.bean.AutopilotStatistics; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.ByteUtil; @@ -113,7 +112,7 @@ import java.util.List; import java.util.Locale; import java.util.concurrent.ScheduledExecutorService; -import chassis.Chassis; +import bag_manager.BagManagerOuterClass; import chassis.VehicleStateOuterClass; import io.netty.channel.Channel; import mogo.telematics.pad.MessagePad; @@ -170,8 +169,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas private ListPopupWindow listPopupWindow; private FloatWindow floatWindow; private View include_title; - private boolean isAutopilotAbility = true; - private String autopilotAbilityReason; private List specialVehicleBeanList;//特种车辆 // @Override // protected void onStart() { @@ -821,47 +818,12 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } @Override - public void onAutopilotAbility(AutopilotAbility ability) { - isAutopilotAbility = true; - autopilotAbilityReason = null; - if (ability.gear == null || ability.gear == Chassis.GearPosition.GEAR_P || ability.gear == Chassis.GearPosition.GEAR_R) { - isAutopilotAbility = false; - autopilotAbilityReason = "挡位不正常"; + public void onAutopilotAbility(boolean isAutopilotAbility, String unableAutopilotReason) { + if (fromFragment instanceof VersionFragment) { + VersionFragment fragment = (VersionFragment) fromFragment; + fragment.autopilotAbility(isAutopilotAbility, unableAutopilotReason); } - if (isAutopilotAbility) - if (ability.brake > 0) { - isAutopilotAbility = false; - autopilotAbilityReason = "制动踏板被踩下"; - } - if (isAutopilotAbility) - if (ability.statusInfo == null) { - isAutopilotAbility = false; - autopilotAbilityReason = "系统Topic不正常"; - } - if (isAutopilotAbility) - if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_STARTING) { - isAutopilotAbility = false; - autopilotAbilityReason = "系统正在启动"; - } - if (isAutopilotAbility) - if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_EXITING) { - isAutopilotAbility = false; - autopilotAbilityReason = "系统正在关闭"; - } - if (isAutopilotAbility) - if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_FAULT) { - isAutopilotAbility = false; - autopilotAbilityReason = "系统异常"; - } - if (isAutopilotAbility) - for (SystemStatusInfo.HealthInfo healthInfo : ability.statusInfo.getHealthInfoList()) { - if (healthInfo.getState() == SystemStatusInfo.HealthState.FAULT) { - isAutopilotAbility = false; - autopilotAbilityReason = healthInfo.getName() + " 节点异常"; - break; - } - } - Log.i(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + autopilotAbilityReason); + Log.i(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + unableAutopilotReason); } @Override @@ -966,7 +928,12 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas BasicInfoReq info = new BasicInfoReq(header, basicInfoReq, sdf); DataDistribution.getInstance().addData(info); AdasManager.getInstance().sendBasicInfoResp("", 0, com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DEBUG); - showToastCenter("收到车机基础信息请求:" + info.toString()); + runOnUiThread(new Runnable() { + @Override + public void run() { + showToastCenter("收到车机基础信息请求:" + info.toString()); + } + }); } @Override @@ -1025,6 +992,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas DataDistribution.getInstance().addData(base); } + @Override + public void onBagManagerCmd(MessagePad.Header header, BagManagerOuterClass.BagManager bagManager) { + + } + private void initAdas() { CupidLogUtils.e(TAG, "--->初始化"); AdasOptions options; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java index 23e8c12b62..7018f37cc2 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java @@ -30,6 +30,7 @@ import com.zhidao.adas.client.adapter.InterfaceAdapter; import com.zhidao.adas.client.base.BaseFragment; import com.zhidao.adas.client.bean.Config; import com.zhidao.adas.client.bean.InterfaceModel; +import com.zhidao.adas.client.utils.RandomColor; import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.Constants; @@ -213,10 +214,44 @@ public class VersionFragment extends BaseFragment { } list.add(new Config("ADAS LIB版本:", AdasManager.getInstance().getAdasVersion())); list.add(new Config("APP构建时间:", BuildConfig.BUILD_TIME)); + list.add(getAutopilotAbilityConfig("")); adapter.setData(list); } + private Config getAutopilotAbilityConfig(String value) { + return new Config("能否启动自动驾驶:", value); + } + public void autopilotAbility(boolean isAutopilotAbility, String unableAutopilotReason) { + List list = adapter.getData(); + if (list != null) { + Config temp = getAutopilotAbilityConfig(isAutopilotAbility + ",原因:" + unableAutopilotReason); + int index = list.indexOf(temp); + if (index < 0) { + list.add(temp); + if (getActivity() != null) + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + adapter.notifyItemInserted(list.size() - 1); + } + }); + } else { + Config config = list.get(index); + config.cover(temp); + config.color = RandomColor.randomColor(); + if (getActivity() != null) + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + adapter.notifyItemChanged(index); + } + }); + } + } + + + } @Override protected void onRefreshView() { showVersion(); diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/RandomColor.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/RandomColor.java new file mode 100644 index 0000000000..1b36a27c04 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/RandomColor.java @@ -0,0 +1,29 @@ +package com.zhidao.adas.client.utils; + +import com.zhidao.adas.client.R; + +import java.util.Random; + + +public class RandomColor { + //随机颜色,且不与上一次重复 + private static Random randomColor; + private static int tempColorIndex; + private static int[] colors = {R.color.color1, R.color.color2, R.color.color3, R.color.color4, R.color.color5}; + + public static int randomColor() { + randomColorTemp(); + return colors[tempColorIndex]; + } + + private static void randomColorTemp() { + if (randomColor == null) + randomColor = new Random(); + int colorInt = randomColor.nextInt(colors.length); + if (tempColorIndex == colorInt) { + randomColorTemp(); + } else { + tempColorIndex = colorInt; + } + } +} diff --git a/app_ipc_monitoring/src/main/res/values/colors.xml b/app_ipc_monitoring/src/main/res/values/colors.xml index bfe52b115c..dfe8bd49f3 100644 --- a/app_ipc_monitoring/src/main/res/values/colors.xml +++ b/app_ipc_monitoring/src/main/res/values/colors.xml @@ -17,4 +17,9 @@ #FF00FF #DAA520 #1E90FF + #FFC0CB + #FF8F00 + #FFE500 + #B9ED3E + #2EEDEB diff --git a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java index a4e603b05e..7bfea7ad7a 100644 --- a/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java +++ b/app_mogo_magic_ring/src/main/java/com/zhidao/adas/magic/ui/MainActivity.java @@ -44,7 +44,6 @@ import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.AdasOptions; import com.zhidao.support.adas.high.OnAdasConnectStatusListener; import com.zhidao.support.adas.high.OnAdasListener; -import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.bean.AutopilotStatistics; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; @@ -64,6 +63,7 @@ import java.util.Locale; import java.util.Timer; import java.util.TimerTask; +import bag_manager.BagManagerOuterClass; import chassis.VehicleStateOuterClass; import mogo.telematics.pad.MessagePad; import mogo.v2x.ObuWarningEvent; @@ -544,6 +544,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } + @Override + public void onBagManagerCmd(MessagePad.Header header, BagManagerOuterClass.BagManager bagManager) { + + } + private void initAdas() { CupidLogUtils.e(TAG, "--->初始化"); AdasOptions options; @@ -812,10 +817,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } @Override - public void onAutopilotAbility(AutopilotAbility ability) { + public void onAutopilotAbility(boolean isAutopilotAbility, String unableAutopilotReason) { } + @Override public void onStartAutopilotFailed(MogoReportMsg.MogoReportMessage message) { diff --git a/build.gradle b/build.gradle index 0eb109a8a4..f2262f2a2e 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ buildscript { classpath 'com.mogo.cloud:systrace:1.0.1' classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.18' classpath 'com.mogo.sticky:service:1.0.8' - classpath 'io.github.knight-zxw:lancet-plugin:0.0.1' + classpath 'io.github.knight-zxw:lancet-plugin:0.0.4_mogo' // classpath ("com.tencent.matrix:matrix-gradle-plugin:0.6.6") { changing = true } } diff --git a/config.gradle b/config.gradle index 248a9c1ae9..e2d70bfd02 100644 --- a/config.gradle +++ b/config.gradle @@ -23,9 +23,9 @@ ext { // amapnavi3dmap : "com.amap.api:navi-3dmap:8.0.1_3dmap8.0.1", // amapsearch : "com.amap.api:search:7.9.0", // amaplocation : "com.amap.api:location:5.5.0", - amapnavi3dmap : "com.amap.api:navi-3dmap:8.0.1_3dmap8.0.1", - amapsearch : "com.amap.api:search:7.1.0", - amaplocation : "com.amap.api:location:5.3.1", + amapnavi3dmap : "com.amap.api:navi-3dmap:9.5.1_3dmap9.5.0", + amapsearch : "com.amap.api:search:9.5.0", + amaplocation : "com.amap.api:location:6.2.0", // json 转换 gson : "com.google.code.gson:gson:2.8.4", // 内存泄漏检测 @@ -97,9 +97,7 @@ ext { // obu sdk obusdk : "com.zhidao.enterprise.smartv2x:smartv2x:1.0.0.3", - mogoobuold : 'com.zhidao.support.obu:mogoobu:1.0.0.33', mogoobu : 'com.mogo.support.obu:mogo-obu:1.0.6', - mogoami : 'com.zhidao.support.obu.ami:mogoami:1.0.0.24', // google googlezxing : "com.google.zxing:core:3.3.3", @@ -149,10 +147,8 @@ ext { mogologlib : "com.mogo.module:module-loglib:${LOGLIB_VERSION}", kotlingradleplugin : "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}", crashreport : "com.mogo.test:crashreport:${CRASHREPORT_VERSION}", - crashreportbugly : "com.mogo.test:crashreport-bugly:${CRASHREPORT_BUGLY_VERSION}", crashreportapmbyte : "com.mogo.test:crashreport-apmbyte:${CRASHREPORT_APMBYTE_VERSION}", crashreportnoop : "com.mogo.test:crashreport-noop:${CRASHREPORT_NOOP_VERSION}", - crashreportupgrade : "com.mogo.test:crashreport-upgrade:${CRASHREPORT_UPGRADE_VERSION}", apm_insight : 'com.volcengine:apm_insight:1.4.9.cn-rc.5', apm_insight_crash : 'com.volcengine:apm_insight_crash:1.4.6-rc.14', cicle_indicator : 'me.relex:circleindicator:2.1.6', @@ -241,7 +237,7 @@ ext { //========================= LancetX =================== - lancetx_runtime : "io.github.knight-zxw:lancet-runtime:0.0.1", + lancetx_runtime : "io.github.knight-zxw:lancet-runtime:0.0.4_mogo", //========================= autosize ====================== androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1', diff --git a/core/function-impl/mogo-core-function-autopilot/build.gradle b/core/function-impl/mogo-core-function-autopilot/build.gradle index ba162e7500..c7d18e5e1f 100644 --- a/core/function-impl/mogo-core-function-autopilot/build.gradle +++ b/core/function-impl/mogo-core-function-autopilot/build.gradle @@ -51,7 +51,6 @@ dependencies { kapt rootProject.ext.dependencies.aroutercompiler - implementation rootProject.ext.dependencies.mogoami implementation rootProject.ext.dependencies.mogoaicloudtelematic if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index cf75ad4dbe..c89509c59e 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -4,12 +4,14 @@ import android.Manifest.permission import android.content.Context import android.util.Log import androidx.annotation.RequiresPermission +import bag_manager.BagManagerOuterClass import chassis.SpecialVehicleTaskCmdOuterClass import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.autopilot.toAutoPilotLine import com.mogo.eagle.core.data.autopilot.toRouteInfo +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.constants.MogoServicePaths @@ -54,6 +56,7 @@ import com.zhidao.support.adas.high.common.Constants import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS import com.zhidao.support.adas.high.common.CupidLogUtils import com.zhidao.support.adas.high.common.MogoReport +import com.zhidao.support.adas.high.msg.BagManagerMessage import com.zhjt.service.chain.ChainLog import com.zhjt.service.chain.TracingConstants import io.netty.channel.Channel @@ -106,6 +109,7 @@ class MoGoAutopilotProvider : .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) .setClient(false) + .setIdentityMode(FunctionBuildConfig.appIdentityMode) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// .build() @@ -196,6 +200,7 @@ class MoGoAutopilotProvider : val options = AdasOptions .Builder() .setClient(true) + .setIdentityMode(FunctionBuildConfig.appIdentityMode) .build() AdasManager.getInstance() .create(options, MoGoAdasMsgConnectStatusListenerImpl()) @@ -223,6 +228,7 @@ class MoGoAutopilotProvider : .setIpcConnectionMode(AdasOptions.IPC_CONNECTION_MODE.FIXATION) .setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(mContext)) .setClient(false)// 乘客端直连工控机改为false + .setIdentityMode(FunctionBuildConfig.appIdentityMode) .build() AdasManager.getInstance().create(options, MoGoAdasMsgConnectStatusListenerImpl()) //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// @@ -544,6 +550,105 @@ class MoGoAutopilotProvider : return AdasManager.getInstance().sendRecordDataConfigReq(reqType, recordType, topicsNeedToCache) } + /** + * 获取Bag包管理信息 + * @param bagManagerEntity 包管理请求实体类 + */ + override fun sendBagManagerCmd(bagManagerEntity: BagManagerEntity): Boolean { + val bagManager = BagManagerOuterClass.BagManager + .newBuilder() + .setReqType(bagManagerEntity.reqType) + .setKeyReq(bagManagerEntity.keyReq) + + // 更新包附加信息,发送请求且reqType=5时有效 + val descReq = BagManagerOuterClass.BagDescription + .newBuilder() + bagManagerEntity.descReq?.let { + descReq.description = it.description + descReq.hasAudio = it.hasAudio + descReq.audioUrl = it.audioUrl + descReq.setReportBI(it.reportBI) + } + bagManager.descReq = descReq.build() + + // 空间使用信息,获取响应且reqType=1时有效 + for(diskSpaceInfoEntity in bagManagerEntity.spaceInfoResp){ + val spaceInfoResp = BagManagerOuterClass.BagSpaceInfo + .newBuilder() + val diskSpaceInfo = BagManagerOuterClass.SpaceInfo + .newBuilder() + .setDirectory(diskSpaceInfoEntity.diskSpaceInfo.directory) + .setTotal(diskSpaceInfoEntity.diskSpaceInfo.total) + .setFree(diskSpaceInfoEntity.diskSpaceInfo.free) + .setUsed(diskSpaceInfoEntity.diskSpaceInfo.used) + .build() + spaceInfoResp + .setHost(diskSpaceInfoEntity.host).diskSpaceInfo = diskSpaceInfo + for(entity in diskSpaceInfoEntity.BagDirsSpaceInfo){ + val bagDirsSpaceInfo = BagManagerOuterClass.SpaceInfo + .newBuilder() + .setDirectory(entity.directory) + .setTotal(entity.total) + .setFree(entity.free) + .setUsed(entity.used) + .build() + spaceInfoResp.addBagDirsSpaceInfo(bagDirsSpaceInfo) + } + bagManager.addSpaceInfoResp(spaceInfoResp.build()) + } + + // 包信息列表,获取响应且reqType=2时有效 + for(bagsInfoRespEntity in bagManagerEntity.bagsInfoResp){ + if(bagsInfoRespEntity.itemType == 0){ + // 包描述信息 + val bagDescription = BagManagerOuterClass.BagDescription + .newBuilder() + bagsInfoRespEntity.description?.let { + bagDescription.description = it.description + bagDescription.hasAudio = it.hasAudio + bagDescription.audioUrl = it.audioUrl + bagDescription.setReportBI(it.reportBI) + } + + val bagsInfoResp = BagManagerOuterClass.BagInfo + .newBuilder() + .setKey(bagsInfoRespEntity.key) + .setTotalSize(bagsInfoRespEntity.totalSize) + .setTimestamp(bagsInfoRespEntity.timestamp) + .setBagPath(bagsInfoRespEntity.bagPath) + .setMergeStat(bagsInfoRespEntity.mergeStat) + .setUploadStat(bagsInfoRespEntity.uploadStat) + .setDescription(bagDescription.build()) + + // 子包信息 + for(subBagEntity in bagsInfoRespEntity.subBags){ + val subBag = BagManagerOuterClass.SubBag + .newBuilder() + .setKey(subBagEntity.key) + .setHost(subBagEntity.host) + .setSize(subBagEntity.size) + .build() + bagsInfoResp.addSubBags(subBag) + } + bagManager.addBagsInfoResp(bagsInfoResp) + } + } + + //反馈上传cos桶结果,获取响应且reqType=3时有效 + val uploadCosResp = BagManagerOuterClass.UploadCosStat + .newBuilder() + + bagManagerEntity.uploadCosResp?.let { + uploadCosResp.key = it.key + uploadCosResp.stat = it.stat + uploadCosResp.message = it.message + bagManager.uploadCosResp = uploadCosResp.build() + } + + + return AdasManager.getInstance().sendBagManagerCmd(bagManager.build()) + } + /** * 向左变道 */ diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index 8cffd15828..3e5f30c363 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.autopilot.adapter +import bag_manager.BagManagerOuterClass import chassis.VehicleStateOuterClass import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig @@ -48,6 +49,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListen import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPointCloudListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordConfig import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordResult +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeBagManagerResult import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotStatisticsListenerManager.invokeAutopilotStatistics import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerStartAutopilotFailedListenerManager.invokeStartAutopilotFailed @@ -56,7 +58,6 @@ import com.mogo.eagle.core.function.call.obucombine.CallerObuDcCombineListenerMa import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasListener -import com.zhidao.support.adas.high.bean.AutopilotAbility import com.zhidao.support.adas.high.bean.AutopilotStatistics import com.zhidao.support.adas.high.common.ProtocolStatus import com.zhjt.service.chain.ChainLog @@ -454,11 +455,22 @@ class MoGoAdasListenerImpl : OnAdasListener { } /** - * 是否可以启动自动驾驶 - * 使用方法查看:app_ipc_monitoring/uiMainActivity/onAutopilotAbility + * Bag管理应答 + * + * @param header 头 + * @param bagManager 数据 */ - override fun onAutopilotAbility(ability: AutopilotAbility?) { - invokeAutopilotAbility(ability) + override fun onBagManagerCmd(header: MessagePad.Header?, bagManager: BagManagerOuterClass.BagManager?) { + bagManager?.let { + invokeBagManagerResult(it) + } + } + + /** + * 是否可以启动自动驾驶 + */ + override fun onAutopilotAbility(isAutopilotAbility: Boolean, unableAutopilotReason: String?) { + invokeAutopilotAbility(isAutopilotAbility, unableAutopilotReason) } /** diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java index f484c74f53..0f3a288a2d 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/BindingcarProvider.java @@ -94,7 +94,7 @@ public class BindingcarProvider implements IMoGoBindingcarProvider { @Override public void modifyCarInfo(BindingcarCallBack callBack) { - BindingcarNetWorkManager.getInstance().modifyBindingcar(mAddress, mWidevineIDWithMd5, callBack, getScreenType()); + BindingcarNetWorkManager.getInstance().modifyBindingcar(mContext, mAddress, mWidevineIDWithMd5, callBack, getScreenType()); } private void driverScreen(String macAddress, String widevineIDWithMd5) { diff --git a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java index b687adde48..4f563ecc8a 100644 --- a/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java +++ b/core/function-impl/mogo-core-function-bindingcar/src/main/java/com/mogo/eagle/core/function/bindingcar/network/BindingcarNetWorkManager.java @@ -80,7 +80,9 @@ public class BindingcarNetWorkManager { if (info != null && info.getData() != null) { CallerLogger.INSTANCE.d(M_BINDING + TAG, "getBindingcarInfo onNext info.getData() =" + info.getData().toString()); //根据车辆类型切换不同的车辆模型,只针对红旗做处理 - updateCarVrIconRes(info.getData().getBrandId()); + if (!SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.MAC_ADDRESS).equals(macAddress)) { + updateCarVrIconRes(info.getData().getBrandId()); + } switch (info.getData().getCompare()) { case "0": CallerHmiManager.INSTANCE.showBindingcarDialog(); @@ -93,6 +95,7 @@ public class BindingcarNetWorkManager { break; } SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, GsonUtils.toJson(info.getData())); + SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.MAC_ADDRESS, macAddress); } } @@ -112,7 +115,7 @@ public class BindingcarNetWorkManager { * 绑定和修改绑定车辆 * mac: 48:b0:2d:3a:9c:19 */ - public void modifyBindingcar(String macAddress, String widevineIDWithMd5, BindingcarCallBack callBack, int screenType) { + public void modifyBindingcar(Context context, String macAddress, String widevineIDWithMd5, BindingcarCallBack callBack, int screenType) { // String macAddress1 = "48:b0:2d:4d:33:40"; // String sn = "X2020220417KA94QIN"; BindingcarRequest request = new BindingcarRequest(macAddress, widevineIDWithMd5, screenType); @@ -130,7 +133,10 @@ public class BindingcarNetWorkManager { if (info != null) { callBack.callBackResult(info); CallerLogger.INSTANCE.d(M_BINDING + TAG, "modifyBindingcar onNext code = " + info.code + "---msg = " + info.msg + "--info.toString() = " + info.toString()); - updateCarVrIconRes(info.getData().getBrandId()); + if (!SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.MAC_ADDRESS).equals(macAddress)) { + updateCarVrIconRes(info.getData().getBrandId()); + } + SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.MAC_ADDRESS, macAddress); } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 1f8dfe50b6..3036f9b16f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -107,6 +107,10 @@ class DevaToolsProvider : IDevaToolsProvider { BadCaseManager.showBadCaseConfigWindow(ctx) } + override fun showBadCaseManagerView(context: Context) { + BadCaseManager.showBadCaseManagerWindow(context) + } + override fun getUpgradeVersionUrls(versionName: String) { upgradeManager.getPackageUrls(versionName) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 5eed6e1651..85a454654b 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -6,40 +6,26 @@ import android.content.Context import android.view.View import android.view.WindowManager import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.* import androidx.lifecycle.Lifecycle.Event -import androidx.lifecycle.Lifecycle.Event.ON_CREATE -import androidx.lifecycle.Lifecycle.Event.ON_DESTROY -import androidx.lifecycle.LifecycleCoroutineScope -import androidx.lifecycle.LifecycleEventObserver -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope -import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.msgbox.MsgBoxBean -import com.mogo.eagle.core.data.msgbox.RecordBagMsg -import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager -import com.mogo.eagle.core.utilcode.kotlin.PX import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner -import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA -import com.mogo.eagle.core.utilcode.reminder.Reminder -import com.mogo.eagle.core.utilcode.reminder.api.IReminder -import com.mogo.eagle.core.utilcode.reminder.api.IReminder.IGlobalStateChangeListener 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 import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord -import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.BadCaseResponse.Reason import com.zhjt.mogo_core_function_devatools.ext.enqueuePop -import com.zhjt.mogo_core_function_devatools.ext.toast -import kotlinx.coroutines.* +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.Job import kotlinx.coroutines.channels.Channel import me.jessyan.autosize.utils.AutoSizeUtils import record_cache.RecordPanelOuterClass import java.lang.ref.WeakReference import java.util.concurrent.TimeUnit -internal object BadCaseManager : LifecycleEventObserver { +internal object BadCaseManager : LifecycleEventObserver{ const val TAG = "BadCase" @@ -98,6 +84,22 @@ internal object BadCaseManager : LifecycleEventObserver { } } + /** + * 展示BadCase录包管理页面 + */ + fun showBadCaseManagerWindow(context: Context){ + val badCaseManagerView = BadCaseManagerView(context) + badCaseManagerView.setOnClickListener(object: BadCaseManagerView.ClickListener{ + override fun onClose() { + hideFloat?.invoke() + hideFloat = null + } + }) + context.enqueuePop(badCaseManagerView,AutoSizeUtils.dp2px(context,960f), WindowManager.LayoutParams.MATCH_PARENT, key = "BadCaseManagerView").also { + hideFloat = it + } + } + /** * 主动采集BadCase */ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseManagerView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseManagerView.kt new file mode 100644 index 0000000000..70f318d8fe --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseManagerView.kt @@ -0,0 +1,491 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz + +import android.app.Activity +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Handler +import android.util.AttributeSet +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.LinearLayoutManager +import bag_manager.BagManagerOuterClass +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagInfoEntity +import com.mogo.eagle.core.data.badcase.BagManagerEntity +import com.mogo.eagle.core.data.badcase.SubBagEntity +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.zhidao.loglib.download.DownloadManager +import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.badcase.biz.adapter.BagManagerListAdapter +import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig.bagManagerList +import com.zhjt.mogo_core_function_devatools.badcase.record.Audition +import kotlinx.android.synthetic.main.layout_badcase_manager.view.* +import java.util.* + + +/** + * @author XuXinChao + * @description BadCase录包管理页面 + * @since: 2022/12/15 + */ +class BadCaseManagerView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotRecordListener { + + companion object { + const val TAG = "BadCaseManagerView" + } + + private var bagManagerListAdapter: BagManagerListAdapter ?= null + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() + private var clickListener: ClickListener? = null + private var bagUploadDialog: BagUploadDialog ?= null + + private var spaceTotal: Long = 0 //总空间 + private var spaceUsed: Long = 0 //已用空间 + private var spaceFree: Long = 0 //可用空间 + + private var selectedBagNum = 0 //选中Bag包的数量 + private var selectedBagSize: Long = 0 //选中Bag包的大小 + + private val audioSavePath = "/mnt/sdcard/mogo/" + + private var isNameModify = false + + init { + LayoutInflater.from(context).inflate(R.layout.layout_badcase_manager, this, true) + initView() + } + + private fun initView(){ + background = ColorDrawable(Color.parseColor("#F0151D41")) + clLayout.setOnClickListener { + } + //关闭BadCase管理窗口 + ivManagerClose.setOnClickListener { + clickListener?.onClose() + } + //一键全选 + tvSelectAll.setOnClickListener { + if(bagManagerEntity.bagsInfoResp.size>0){ + selectedBagSize = 0 + selectedBagNum = 0 + bagManagerList.clear() + for(selectBagInfo in bagManagerEntity.bagsInfoResp){ + if(selectBagInfo.itemType == 0){ + selectBagInfo.selectStatus = true + selectedBagSize += selectBagInfo.totalSize + bagManagerList.add(selectBagInfo) + selectedBagNum++ + } + } + //显示选择包的个数和大小 + tvSelectedBagSize.text = "已选${selectedBagNum}个包,共${selectedBagSize/(1000*1024*1024)}G" + tvSelectedBagSize.visibility = View.VISIBLE + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + } + //取消选中 + tvCancelSelect.setOnClickListener { + if(bagManagerEntity.bagsInfoResp.size>0){ + for(cancelBagInfo in bagManagerEntity.bagsInfoResp){ + cancelBagInfo.selectStatus = false + bagManagerList.remove(cancelBagInfo) + } + selectedBagNum = 0 + selectedBagSize = 0 + tvSelectedBagSize.visibility = View.GONE + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + } + + + //上传Cos桶 + tvUploadCloud.setOnClickListener { + if(bagManagerList.size>0){ + bagManagerEntity.reqType = 3 + bagManagerEntity.keyReq = bagManagerList[0].key + Log.i("sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq) + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + + bagUploadDialog = BagUploadDialog(context) + bagUploadDialog?.setListener { //删除选择,取消上传 + bagManagerList.clear() + if (bagManagerEntity.bagsInfoResp.size > 0) { + for (cancelBagInfo in bagManagerEntity.bagsInfoResp) { + if(cancelBagInfo.itemType == 0){ + cancelBagInfo.selectStatus = false + bagManagerList.remove(cancelBagInfo) + } + } + selectedBagNum = 0 + selectedBagSize = 0 + tvSelectedBagSize.visibility = View.GONE + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + } + bagUploadDialog?.show() + bagUploadDialog?.setAllUpload(selectedBagNum,selectedBagSize) + }else{ + ToastUtils.showShort("请先选择要上传的Bag包") + } + + } + //删除Bag包 + tvDeleteSelect.setOnClickListener { + if(bagManagerList.size>0){ + bagManagerEntity.reqType = 4 + bagManagerEntity.keyReq = bagManagerList[0].key + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + }else{ + ToastUtils.showShort("请先选择要删除的Bag包") + } + + } + + bagManagerListAdapter = BagManagerListAdapter() + bagManagerListAdapter?.setListener(object :BagManagerListAdapter.BagClickListener{ + override fun onClick(bagInfoEntity: BagInfoEntity, isChecked: Boolean) { + if(isChecked){ + bagInfoEntity.selectStatus = true + bagManagerList.add(bagInfoEntity) + selectedBagNum++ + selectedBagSize += bagInfoEntity.totalSize + tvSelectedBagSize.text = "已选${selectedBagNum}个包,共${selectedBagSize/(1000*1024*1024)}G" + tvSelectedBagSize.visibility = View.VISIBLE + }else{ + bagInfoEntity.selectStatus = false + bagManagerList.remove(bagInfoEntity) + selectedBagNum-- + selectedBagSize -= bagInfoEntity.totalSize + if(selectedBagNum == 0){ + tvSelectedBagSize.visibility = View.GONE + }else{ + tvSelectedBagSize.text = "已选${selectedBagNum}个包,共${selectedBagSize/(1000*1024*1024)}G" + tvSelectedBagSize.visibility = View.VISIBLE + } + } + + } + + override fun uploadBI(bagInfoEntity: BagInfoEntity) { + //展示上报弹窗 + val initiativeBadCaseWindow = InitiativeBadCaseWindow(context as Activity) + initiativeBadCaseWindow.setClickListener(object: InitiativeBadCaseWindow.ClickListener{ + override fun closeWindow() { + initiativeBadCaseWindow.hideFloatWindow() + } + }) + initiativeBadCaseWindow.showReportBIWindow(bagInfoEntity) + } + + override fun editDescription(key: Long, description: BagDescriptionEntity) { + //编辑Bag包描述信息 + isNameModify = true + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = key + bagManagerEntity.descReq = description + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } + + override fun bagAudio(key: Long, audioUrl: String) { + DownloadManager.getInstance().init(context) + val downUrl = audioUrl.replace("http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/","") + DownloadManager.getInstance().download(downUrl, + audioSavePath,"${key}.wav") + //延迟播放 + Handler().postDelayed({ + //音频文件播放 + Audition.getInstance().playOrStop("${audioSavePath}${key}.wav") + }, 1500) + } + + }) + val linearLayoutManager = LinearLayoutManager(context) + rvBagList.layoutManager = linearLayoutManager + rvBagList.adapter = bagManagerListAdapter + + //音频文件播放 +// Audition.getInstance().playOrStop("/mnt/sdcard/mogo/test.wav") +// +// 音频下载 +// DownloadManager.getInstance().init(context) +// DownloadManager.getInstance().download("CarPad/mogopadlog/X20202111230C01YYW/2023-01-30/Audio_1675049657187_BadCase.wav", +// "/mnt/sdcard/mogo/","test13.wav") + + } + + fun setOnClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener { + fun onClose() + } + + override fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager) { + super.onBagManagerResult(bagManager) + UiThreadHandler.post { + Log.i(TAG,"onBagManagerResult Start") + Log.i(TAG,"keyReq="+bagManager.keyReq) + Log.i(TAG,"reqType="+bagManager.reqType) + Log.i(TAG,"uploadCosResp stat="+bagManager.uploadCosResp.stat) + Log.i(TAG,"descReq description="+bagManager.descReq.description + +" audioUrl="+bagManager.descReq.audioUrl + +" reportBI="+bagManager.descReq.reportBI + +" hasAudio="+bagManager.descReq.hasAudio) + for(logBag in bagManager.bagsInfoRespList){ + Log.i(TAG,"bagPath="+logBag.bagPath) + Log.i(TAG,"timestamp="+logBag.timestamp) + Log.i(TAG,"description="+logBag.description) + Log.i(TAG,"key="+logBag.key) + Log.i(TAG,"mergeStat="+logBag.mergeStat) + Log.i(TAG,"totalSize="+logBag.totalSize) + Log.i(TAG,"uploadStat="+logBag.uploadStat) + } + Log.i(TAG,"onBagManagerResult End") + + //获取空间使用信息 + if(bagManager.reqType == 1){ + //遍历各个主机的硬盘空间信息 + if(bagManager.spaceInfoRespCount>0){ + spaceTotal = 0 + spaceUsed = 0 + spaceFree = 0 + for(spaceInfo in bagManager.spaceInfoRespList){ + spaceInfo.diskSpaceInfo?.let { + spaceTotal += it.total + spaceUsed += it.used + spaceFree += it.free + } + } + //展示空间使用情况 + //已使用空间 + tvUsedSpaceContent.text = "${(spaceUsed/(1000*1024*1024L))}G" + //可使用空间 + tvFreeSpaceContent.text = "${(spaceFree/(1000*1024*1024L))}G" + //进度条展示空间 + pbSpacePercent.progress = (spaceUsed*100/spaceTotal).toInt() + } + } + //遍历所有bag + else if(bagManager.reqType == 2){ + clBagHaveDataLayout.visibility = View.VISIBLE + clBagNoDataLayout.visibility = View.GONE + if(bagManager.bagsInfoRespCount>0){ + bagManagerEntity.bagsInfoResp.clear() + val originBagInfoList = ArrayList() + for(bagInfo in bagManager.bagsInfoRespList){ + bagInfo?.let { + val descriptionEntity = BagDescriptionEntity(it.description.description,it.description.hasAudio,it.description.audioUrl,it.description.reportBI) + val bagInfoEntity = BagInfoEntity() + bagInfoEntity.key = it.key + bagInfoEntity.totalSize = it.totalSize + bagInfoEntity.timestamp = it.timestamp + bagInfoEntity.bagPath = it.bagPath + bagInfoEntity.mergeStat = it.mergeStat + bagInfoEntity.uploadStat = it.uploadStat + bagInfoEntity.itemType = 0 + bagInfoEntity.description = descriptionEntity + for(subBag in it.subBagsList){ + val subBagEntity = SubBagEntity(subBag.key,subBag.host,subBag.size) + bagInfoEntity.subBags.add(subBagEntity) + } + originBagInfoList.add(bagInfoEntity) + //对数组按照时间顺序进行倒序排序 + originBagInfoList.sortWith(Comparator { o1, o2 -> + o2.timestamp.compareTo(o1.timestamp) + }) + } + } + + for(originBagInfo in originBagInfoList){ + originBagInfo.let { + it.timestamp.let { time -> + val month = time.substring(4,6) + val day = time.substring(6,8) + val timeStr = "${month}月${day}日" + var containTime = false + for(bag in bagManagerEntity.bagsInfoResp){ + if(bag.timeStr == timeStr){ + containTime = true + } + } + if(!containTime || bagManagerEntity.bagsInfoResp.size ==0){ + //增加时间的 + val bagInfoTimeEntity = BagInfoEntity() + bagInfoTimeEntity.itemType = 1 + bagInfoTimeEntity.timeStr = timeStr + bagInfoTimeEntity.timestamp = time.substring(0,8) + bagManagerEntity.bagsInfoResp.add(bagInfoTimeEntity) + } + var containKey = false + for(bagInfoContain in bagManagerEntity.bagsInfoResp){ + if(bagInfoContain.key == it.key){ + containKey = true + } + } + if(!containKey){ + bagManagerEntity.bagsInfoResp.add(it) + } + } + } + } + + //更新List + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + + // 开启定时查询速度 + Timer().schedule(timerTaskRefresh, Date(), 60*1000) + } + //上传Cos + else if(bagManager.reqType == 3){ + //此处应循环上传Cos + val uploadIterator = bagManagerEntity.bagsInfoResp.iterator() + while(uploadIterator.hasNext()){ + val uploadBagInfo = uploadIterator.next() + if(uploadBagInfo.key == bagManager.uploadCosResp.key && bagManager.uploadCosResp.stat!=1){ + bagManagerList.remove(uploadBagInfo) + if(bagManagerList.size>0){ + var remainSize = 0L + for(bagInfo in bagManagerList){ + remainSize += bagInfo.totalSize + } + bagUploadDialog?.updateRemainUpload(bagManagerList.size,remainSize) + //执行下一个上传Bag命令 + bagManagerEntity.reqType = 3 + bagManagerEntity.keyReq = bagManagerList[0].key + Log.i("sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq) + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + //上传Cos执行完成 + if(bagManagerList.size == 0 && selectedBagNum != 0){ + ToastUtils.showShort("上传命令完成") + bagUploadDialog?.uploadCompleted() + tvCancelSelect.performClick() + } + + when (bagManager.uploadCosResp.stat) { + 0 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶成功") + } + 2 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶copy过程失败,原因:${bagManager.uploadCosResp.message}") + } + 3 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶合并过程失败,原因:${bagManager.uploadCosResp.message}") + } + 4 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶上传过程失败,原因:${bagManager.uploadCosResp.message}") + } + } + + } + //删除Bag + else if(bagManager.reqType == 4){ + //收到此回调就删除对应key的Bag + val iterator = bagManagerEntity.bagsInfoResp.iterator() + while(iterator.hasNext()){ + val deleteBagInfo = iterator.next() + if(deleteBagInfo.key == bagManager.keyReq){ + iterator.remove() + bagManagerList.remove(deleteBagInfo) + //更新列表 +// bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + if(bagManagerList.size>0){ + //继续执行删除命令 + bagManagerEntity.reqType = 4 + bagManagerEntity.keyReq = bagManagerList[0].key + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + //遍历列表,如当天Bag全部删除,同时把日期标题也删除更新列表 + val titleIterator = bagManagerEntity.bagsInfoResp.iterator() + while(titleIterator.hasNext()){ + val titleBagInfo = titleIterator.next() + if(titleBagInfo.itemType == 1){ + val bagIterator = bagManagerEntity.bagsInfoResp.iterator() + var hasBag = false + while(bagIterator.hasNext()){ + val bagBagInfo = bagIterator.next() + if(bagBagInfo.itemType == 0){ + bagBagInfo.timestamp?.let { + if(it.contains(titleBagInfo.timestamp.toString())){ + hasBag = true + } + } + } + } + if(!hasBag){ + bagIterator.remove() + } + } + } + //更新列表 + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + //修改bag附加信息 + else if(bagManager.reqType == 5){ + //更新Bag包上报状态 + for(bagInfo in bagManagerEntity.bagsInfoResp){ + if(bagInfo.key == bagManager.keyReq){ + bagInfo.description?.let { + it.reportBI = bagManager.descReq.reportBI + it.description = bagManager.descReq.description + it.hasAudio = bagManager.descReq.hasAudio + it.audioUrl = bagManager.descReq.audioUrl + } + } + } + if(!isNameModify){ + //更新List + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + isNameModify = false + } + } + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerAutopilotRecordListenerManager.addListener(TAG, this) + bagManagerEntity.reqType = 2 + //遍历所有bag + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerAutopilotRecordListenerManager.removeListener(TAG) + try { + timerTaskRefresh.cancel() + } catch (e: Exception) { + e.printStackTrace() + } + } + + private val timerTaskRefresh = object : TimerTask() { + override fun run() { + UiThreadHandler.post { + //获取空间使用信息,每隔1分钟获取一次 + bagManagerEntity.reqType = 1 + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BagUploadDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BagUploadDialog.java new file mode 100644 index 0000000000..00dd1145b0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BagUploadDialog.java @@ -0,0 +1,121 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz; + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.WindowManager; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.zhjt.mogo_core_function_devatools.R; + +import java.text.DecimalFormat; + +/** + * @author XuXinChao + * @description Bag包上传进度展示弹窗 + * @since: 2022/2/1 + */ +public class BagUploadDialog extends Dialog { + + private TextView tvCancelUpload;//取消上传 + private TextView tvCancel;//取消 + private TextView tvUploadDetail;//上传详情 + private ProgressBar viewUploadProgress;//上传进度条 + + private int totalNum = 0; + private Long totalSize = 0L; + private int remainNum = 0; + private Long remainSize = 0L; + + private BagUploadListener uploadListener; + private DecimalFormat format = new DecimalFormat("0.0"); + + public BagUploadDialog(@NonNull Context context) { + super(context, R.style.bad_case_dialog); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_bag_upload); + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.height = 688; + params.width = 1110; + getWindow().setAttributes(params);//向WindowManager设置属性 + setCanceledOnTouchOutside(false); + init(); + initEvent(); + } + + private void init(){ + tvCancelUpload = findViewById(R.id.tvCancelUpload); + tvCancel = findViewById(R.id.tvCancel); + tvUploadDetail = findViewById(R.id.tvUploadDetail); + viewUploadProgress = findViewById(R.id.viewUploadProgress); + } + + private void initEvent(){ + //取消上传 + tvCancelUpload.setOnClickListener(v -> { + if(uploadListener!=null){ + uploadListener.cancelUpload(); + } + dismiss(); + }); + //取消 + tvCancel.setOnClickListener(v -> { + dismiss(); + }); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + public void setListener(BagUploadListener listener){ + uploadListener = listener; + } + + @SuppressLint("SetTextI18n") + public void setAllUpload(int totalNum, Long totalSize){ + this.totalNum = totalNum; + this.totalSize = totalSize; + //更新进度条和进度文字 + String totalStr = format.format((totalSize/(1000*1024*1024.0))); + tvUploadDetail.setText("共计"+totalNum+"个包 ("+totalStr+"G) 已上传"+(0)+"个包 (" + +0+"G) 剩余"+totalNum+"个包 ("+ totalStr+"G)"); + } + + @SuppressLint("SetTextI18n") + public void updateRemainUpload(int remainNum, Long remainSize){ + this.remainNum = remainNum; + this.remainSize = remainSize; + //更新进度条和进度文字 + String updateTotalStr = format.format((totalSize/(1000*1024*1024.0))); + String updateUploadStr = format.format(((totalSize-remainSize)/(1000*1024*1024.0))); + String updateRemainStr = format.format((remainSize/(1000*1024*1024.0))); + tvUploadDetail.setText("共计"+totalNum+"个包 ("+updateTotalStr+"G) 已上传"+(totalNum-remainNum)+"个包 (" + +updateUploadStr+"G) 剩余"+remainNum+"个包 ("+ updateRemainStr +"G)"); + viewUploadProgress.setProgress((totalNum-remainNum)*100/totalNum); + } + + public void uploadCompleted(){ + dismiss(); + } + + interface BagUploadListener{ + //取消上传 + void cancelUpload(); + } + +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java index 9756927f7f..7b35d26999 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java @@ -20,6 +20,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig; import java.util.ArrayList; +import bag_manager.BagManagerOuterClass; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -116,4 +117,8 @@ public class CaseListDialog extends Dialog implements IMoGoAutopilotRecordListen caseListAdapter.notifyDataSetChanged(); }); } + + @Override + public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { + } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java index 08ad929554..9bc755aefa 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java @@ -28,6 +28,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig; import java.util.ArrayList; import java.util.List; +import bag_manager.BagManagerOuterClass; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -203,4 +204,8 @@ public class CaseTopicListDialog extends Dialog implements IMoGoAutopilotRecordL @Override public void onAutopilotRecordResult(@NonNull RecordPanelOuterClass.RecordPanel recordPanel) { } + + @Override + public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { + } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt index 50f692b8ba..2baf361247 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt @@ -13,6 +13,9 @@ import android.widget.ImageView import android.widget.TextView import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagInfoEntity +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.badcase.RecordCaseEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener @@ -89,6 +92,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var longitude: Double?=null private var latitude: Double?=null + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() + private var mInViewX = 0f private var mInViewY = 0f private var mDownInScreenX = 0f @@ -150,6 +155,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList TipToast.shortTip("请选择至少一个Case") return@setOnClickListener } + uploadReason.clear() if(rbOne.isChecked){ uploadReason.append("严重画龙 ") } @@ -285,7 +291,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 itx["key"] = recordKey?:"" //key - itx["reason"] = uploadReason.toString()?:"" //采集原因 + itx["reason"] = uploadReason.toString() //采集原因 itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) itx["channel"] = "1" //渠道 @@ -301,6 +307,15 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList TipToast.shortTip("上报失败") } else { TipToast.shortTip("上报成功") + //将上报BI的结果同步给工控机记录保存 + recordKey?.let { + val hasAudio = downloadUrl != null + val descReqEntity = BagDescriptionEntity(uploadReason.toString(),hasAudio,downloadUrl.toString(),true) + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = it.toLong() + bagManagerEntity.descReq = descReqEntity + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } BadCaseConfig.windowNum-- clickListener?.closeWindow() } @@ -351,6 +366,22 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } } + fun showReportBIWindow(bagInfoEntity: BagInfoEntity){ + if (mFloatLayout.parent == null) { + val metrics = DisplayMetrics() + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager!!.defaultDisplay.getMetrics(metrics) + mWindowParams!!.x = metrics.widthPixels + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-950 + mWindowManager!!.addView(mFloatLayout, mWindowParams) + //已经录包无需再次启动录包,只要将录包信息同步到弹窗 + bagInfoEntity.let { + recordKey = it.key.toString() + recordFileName = it.bagPath + } + } + } + fun hideFloatWindow() { //注销采集结果回调监听 CallerAutopilotRecordListenerManager.removeListener(this.hashCode().toString()) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index cfb42c46b6..451465b1f1 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -16,10 +16,13 @@ import android.widget.TextView import com.google.android.flexbox.FlexboxLayout import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -61,6 +64,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var audioStatus = false private var audioFileName:String?=null //录音文件名称 + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() + private var uploadReason: String = String() //上报原因,标签 private var recordKey: String?=null //录制bag包key private var recordFileName: String?=null //录制文件包名 @@ -265,6 +270,15 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene TipToast.shortTip("上报失败") } else { TipToast.shortTip("上报成功") + //将上报BI的结果同步给工控机记录保存 + recordKey?.let { + val hasAudio = downloadUrl != null + val descReqEntity = BagDescriptionEntity(uploadReason,hasAudio,downloadUrl.toString(),true) + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = it.toLong() + bagManagerEntity.descReq = descReqEntity + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } BadCaseConfig.windowNum-- clickListener?.closeWindow() } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/SpaceWarningDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/SpaceWarningDialog.java new file mode 100644 index 0000000000..036f2cb2b0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/SpaceWarningDialog.java @@ -0,0 +1,87 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Bundle; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; +import com.zhjt.mogo_core_function_devatools.R; + +/** + * @author XuXinChao + * @description BadCase车端磁盘空间已满预警弹窗 + * @since: 2022/2/1 + */ +public class SpaceWarningDialog extends Dialog { + + private TextView tvCleanDisk;//清理磁盘 + private TextView tvCancel;//取消 + private Activity mActivity; + + private ClickListener clickListener; + + public SpaceWarningDialog(@NonNull Activity activity) { + super(activity, R.style.bad_case_dialog); + mActivity = activity; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_space_warning); + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.height = 688; + params.width = 1110; + getWindow().setAttributes(params);//向WindowManager设置属性 + setCanceledOnTouchOutside(false); + init(); + initEvent(); + } + + private void init(){ + tvCleanDisk = findViewById(R.id.tvCleanDisk); + tvCancel = findViewById(R.id.tvCancel); + } + + private void initEvent(){ + //清理磁盘 + tvCleanDisk.setOnClickListener(v -> { + //跳转录包管理页面 +// if(mActivity!=null){ +// CallerDevaToolsManager.INSTANCE.showBadCaseManagerView(mActivity); +// } + if(clickListener!=null){ + clickListener.showBadCaseManagerView(); + } + dismiss(); + }); + //取消 + tvCancel.setOnClickListener(v -> { + //取消弹窗 + dismiss(); + }); + } + + public void setClickListener(ClickListener clickListener){ + this.clickListener = clickListener; + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + public interface ClickListener{ + void showBadCaseManagerView(); + } + +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt new file mode 100644 index 0000000000..d3c8abc803 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt @@ -0,0 +1,175 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz.adapter + +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.CheckBox +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagInfoEntity +import com.zhjt.mogo_core_function_devatools.R +import java.text.DecimalFormat + +/** + * @author XuXinChao + * @description Bag包管理列表适配器 + * @since: 2022/12/19 + */ +class BagManagerListAdapter: RecyclerView.Adapter() { + + private var data:List ?= null + private var bagClickListener: BagClickListener ?= null + private val format = DecimalFormat("0.00") + + fun setData(data: List?){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if(viewType == 1){ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_bag_time_title,parent,false) + return BagTimeTitleHolder(view) + }else{ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_bag_manager, parent, false) + return BagManagerListHolder(view) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when(holder){ + is BagTimeTitleHolder ->{ + data?.let { + holder.tvBagTimeTitle.text = it[position].timeStr + } + } + is BagManagerListHolder->{ + data?.let { + val bagInfoEntity = it[position] + holder.cbBagSelect.setOnCheckedChangeListener(null) + holder.cbBagSelect.isChecked = bagInfoEntity.selectStatus + holder.cbBagSelect.tag = bagInfoEntity + holder.cbBagSelect.setOnCheckedChangeListener { _, isChecked -> + bagClickListener?.onClick(bagInfoEntity,isChecked) + } + + val textWatcher: TextWatcher = object : TextWatcher { + override fun beforeTextChanged( + charSequence: CharSequence, + i: Int, + i1: Int, + i2: Int + ) { + } + + override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + override fun afterTextChanged(editable: Editable) { + bagInfoEntity.description?.let { desc-> + val descriptionStr = editable.toString() + if(desc.description != descriptionStr){ + desc.description = descriptionStr + bagClickListener?.editDescription(bagInfoEntity.key,desc) + } + } + } + } + holder.etBagNameEdit.onFocusChangeListener = + View.OnFocusChangeListener { p0, hasFocus -> + val edit = p0 as EditText + if(hasFocus){ + edit.addTextChangedListener(textWatcher) + }else{ + edit.removeTextChangedListener(textWatcher) + } + } + + + bagInfoEntity.description?.let { des-> + if(des.reportBI){ + //已上报 + holder.tvBagReportStatus.text = "已上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_reported_button_bg) + }else{ + //未上报 + holder.tvBagReportStatus.text = "上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_report_button_bg) + holder.tvBagReportStatus.setOnClickListener { + bagClickListener?.uploadBI(bagInfoEntity) + } + } + if(des.description.isEmpty()){ + holder.etBagNameEdit.setText(bagInfoEntity.key.toString()) + }else{ + holder.etBagNameEdit.setText(des.description) + } + } + + + if(bagInfoEntity.description?.hasAudio == true){ + holder.ivBagAudio.visibility = View.VISIBLE + holder.ivBagAudio.setOnClickListener { + bagInfoEntity.description?.let { description-> + bagClickListener?.bagAudio(bagInfoEntity.key,description.audioUrl) + } + } + }else{ + holder.ivBagAudio.visibility = View.INVISIBLE + } + //大小 + val bagSize = format.format(bagInfoEntity.totalSize/(1000*1024*1024.0)) + holder.tvBagSize.text = "${bagSize}G" + + //时间 + bagInfoEntity.timestamp?.let { time-> + val hour = time.substring(8,10) + val min = time.substring(10,12) + val second = time.substring(12,14) + holder.tvBagTime.text = "${hour}:${min}:${second}" + } + } + } + } + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + return data!![position].itemType + } + + class BagTimeTitleHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBagTimeTitle: TextView = itemView.findViewById(R.id.tvBagTimeTitle) + } + + class BagManagerListHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var cbBagSelect: CheckBox = itemView.findViewById(R.id.cbBagSelect) + var etBagNameEdit: EditText = itemView.findViewById(R.id.etBagNameEdit) + var tvBagReportStatus: TextView = itemView.findViewById(R.id.tvBagReportStatus) + var ivBagAudio: ImageView = itemView.findViewById(R.id.ivBagAudio) + var tvBagTime: TextView = itemView.findViewById(R.id.tvBagTime) + var tvBagSize: TextView = itemView.findViewById(R.id.tvBagSize) + } + + fun setListener(listener: BagClickListener){ + bagClickListener = listener + } + + interface BagClickListener{ + //选择Bag包 + fun onClick(bagInfoEntity: BagInfoEntity,isChecked: Boolean) + //上报BI平台 + fun uploadBI(bagInfoEntity: BagInfoEntity) + //编辑Bag包描述信息 + fun editDescription(key: Long,description: BagDescriptionEntity) + //听录音 + fun bagAudio(key: Long,audioUrl: String) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt index 44c7041d9a..f7c6fcd06f 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt @@ -1,5 +1,7 @@ package com.zhjt.mogo_core_function_devatools.badcase.consts +import com.mogo.eagle.core.data.badcase.BagInfoEntity + /** * @author XuXinChao * @description 录包配置参数 @@ -32,5 +34,8 @@ object BadCaseConfig { //自定义Topic清单列表 @JvmField var customTopicList: ArrayList = ArrayList() + //Bag包管理列表 + @JvmField + var bagManagerList: ArrayList = ArrayList() } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java new file mode 100644 index 0000000000..f4ec60ac13 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java @@ -0,0 +1,103 @@ +package com.zhjt.mogo_core_function_devatools.badcase.record; + +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; + +//播放试听 +public class Audition implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener{ + private static volatile Audition INSTANCE; + public MediaPlayer mediaPlayer; + private String oldPath; + private OnAuditionListener listener; + + public interface OnAuditionListener { + void onAuditionCompletion(); + + } + + public void registerOnAuditionListener(OnAuditionListener listener) { + this.listener = listener; + } + + public void unregisterOnAuditionListener() { + this.listener = null; + } + + private Audition() { + } + + public static Audition getInstance() { + if (INSTANCE == null) { + synchronized (Audition.class) { + if (INSTANCE == null) { + INSTANCE = new Audition(); + } + } + } + return INSTANCE; + } + + + public boolean isPlaying() { + return mediaPlayer != null && mediaPlayer.isPlaying(); + } + + private void play(String path) { + oldPath = path; + if (mediaPlayer != null) { + mediaPlayer.release(); + mediaPlayer = null; + } + if (mediaPlayer == null) { + mediaPlayer = new MediaPlayer(); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.setOnPreparedListener(this); + mediaPlayer.setOnCompletionListener(this); + } + try { + mediaPlayer.setDataSource(path); + } catch (Exception e) { + e.printStackTrace(); + } + mediaPlayer.prepareAsync(); + + } + + public void stop() { + oldPath = null; + if (mediaPlayer != null) { + mediaPlayer.stop(); + mediaPlayer.reset(); + } + + } + + public boolean playOrStop(String path) { + if (!TextUtils.equals(oldPath, path)) { + play(path); + return true; + } else { + stop(); + return false; + } + } + + public void onDestroy() { + stop(); + mediaPlayer = null; + } + + @Override + public void onPrepared(MediaPlayer mp) { + mp.start(); + } + + @Override + public void onCompletion(MediaPlayer mp) { + oldPath = null; + if (listener != null) { + listener.onAuditionCompletion(); + } + } +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt index 51ca529e18..aa1734dd78 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt @@ -10,6 +10,7 @@ import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.getMisChannelCode import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.util.NetworkUtils @@ -38,6 +39,7 @@ object SyncConfig { AppConfigInfo.mapSdkOptVersion = DebugConfig.getMapOptVersion() AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context) AppConfigInfo.isConnectSocket = MogoStatusManager.getInstance().isSocketOnLine + AppConfigInfo.role = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) when { AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端 AppConfigInfo.isDriver = true diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_audio.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_audio.png new file mode 100644 index 0000000000..2959045ff3 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_audio.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_no_data.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_no_data.png new file mode 100644 index 0000000000..5f4ea0176b Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_no_data.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_report_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_report_button_bg.xml new file mode 100644 index 0000000000..23037d43c7 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_report_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_reported_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_reported_button_bg.xml new file mode 100644 index 0000000000..40bd562159 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_reported_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_select_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_select_button_bg.xml new file mode 100644 index 0000000000..b08f6cbec3 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_select_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/delete_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/delete_button_bg.xml new file mode 100644 index 0000000000..7bcbe63d19 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/delete_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_bag_edit.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_bag_edit.png new file mode 100644 index 0000000000..09ffe565d7 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_bag_edit.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_ct.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_ct.xml new file mode 100644 index 0000000000..e5075f161d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_ct.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_drawable.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_drawable.xml new file mode 100644 index 0000000000..353d7da364 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_drawable.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/select_all_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/select_all_button_bg.xml new file mode 100644 index 0000000000..8db8728253 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/select_all_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_percent_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_percent_bg.xml new file mode 100644 index 0000000000..c4425322f3 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_percent_bg.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_warning_progress_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_warning_progress_bg.xml new file mode 100644 index 0000000000..645b1b3df2 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_warning_progress_bg.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/unused_space_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/unused_space_bg.xml new file mode 100644 index 0000000000..efb8967e91 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/unused_space_bg.xml @@ -0,0 +1,8 @@ + + + + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/upload_cloud_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/upload_cloud_button_bg.xml new file mode 100644 index 0000000000..fe4635f8aa --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/upload_cloud_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/used_space_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/used_space_bg.xml new file mode 100644 index 0000000000..8d23b4cb9f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/used_space_bg.xml @@ -0,0 +1,8 @@ + + + + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_bag_upload.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_bag_upload.xml new file mode 100644 index 0000000000..0f76ebdba2 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_bag_upload.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_space_warning.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_space_warning.xml new file mode 100644 index 0000000000..5cfa0f954f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_space_warning.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml new file mode 100644 index 0000000000..8cd8a75b48 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_time_title.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_time_title.xml new file mode 100644 index 0000000000..38ccd6bf86 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_time_title.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_manager.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_manager.xml new file mode 100644 index 0000000000..6a86a27676 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_manager.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java index 72a42c653c..7774d55b64 100644 --- a/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java +++ b/core/function-impl/mogo-core-function-dispatch/src/main/java/com/zhjt/dispatch/DispatchAutoPilotManager.java @@ -350,4 +350,9 @@ public class DispatchAutoPilotManager implements IMogoOnMessageListener(), private var mSOPSettingViewFloat: WarningFloat.Builder? = null private var mSOPSettingView: SOPSettingView? = null + //BadCaseManagerView + private var mBadCaseManagerViewFloat: WarningFloat.Builder ?= null + private var mBadCaseManagerView: BadCaseManagerView?= null + //StatusView private var statusBarView: StatusBarView? = null @@ -181,6 +192,11 @@ class MoGoHmiFragment : MvpFragment(), private var busOperationStatus: IOchBusView? = null + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() + + private var spaceWarningDialog: SpaceWarningDialog ?=null + private var isShowWarningDialog = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } @@ -253,41 +269,45 @@ class MoGoHmiFragment : MvpFragment(), } } } - - cbMsgBoxDriver.setOnCheckedChangeListener { _, isChecked -> - if(isChecked){ - viewDriverMsgBoxList.visibility = View.VISIBLE - viewDriverMsgBoxList.notifyData() - viewDriverMsgBoxBubble.visibility = View.GONE - viewDriverMsgBoxBubble.isShowData(false) - CallerHmiManager.updateDriverMsgBoxTipView(false) - }else{ - viewDriverMsgBoxList.visibility = View.GONE - viewDriverMsgBoxBubble.visibility = View.VISIBLE - viewDriverMsgBoxBubble.isShowData(true) + //消息盒子 + viewDriverMsgBoxButton.setClickListener(object: DriverMsgBoxButtonView.ClickListener{ + override fun showMsgBoxList(show: Boolean) { + if(show){ + viewDriverMsgBoxList.visibility = View.VISIBLE + viewDriverMsgBoxList.notifyData() + viewDriverMsgBoxBubble.visibility = View.GONE + viewDriverMsgBoxBubble.isShowData(false) + }else{ + viewDriverMsgBoxList.visibility = View.GONE + viewDriverMsgBoxBubble.visibility = View.VISIBLE + viewDriverMsgBoxBubble.isShowData(true) + } } - } - cbMsgBoxPassenger.setOnCheckedChangeListener { _, isChecked -> - if(isChecked){ - viewPassengerMsgBoxList.visibility = View.VISIBLE - viewPassengerMsgBoxBubble.visibility = View.GONE - viewPassengerMsgBoxBubble.isShowData(false) - CallerHmiManager.updatePassengerMsgBoxTipView(false) - }else{ - viewPassengerMsgBoxList.visibility = View.GONE - viewPassengerMsgBoxBubble.visibility = View.VISIBLE - viewPassengerMsgBoxBubble.isShowData(true) + }) + + viewPassengerMsgBoxButton.setClickListener(object: PassengerMsgBoxButtonView.ClickListener{ + override fun showMsgBoxList(show: Boolean) { + if(show){ + viewPassengerMsgBoxList.visibility = View.VISIBLE + viewPassengerMsgBoxBubble.visibility = View.GONE + viewPassengerMsgBoxBubble.isShowData(false) + }else{ + viewPassengerMsgBoxList.visibility = View.GONE + viewPassengerMsgBoxBubble.visibility = View.VISIBLE + viewPassengerMsgBoxBubble.isShowData(true) + } } - } + + }) if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ - cbMsgBoxDriver.visibility = View.VISIBLE + viewDriverMsgBoxButton.visibility = View.VISIBLE viewDriverMsgBoxBubble.visibility = View.VISIBLE } if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ - cbMsgBoxPassenger.visibility = View.VISIBLE + viewPassengerMsgBoxButton.visibility = View.VISIBLE viewPassengerMsgBoxBubble.visibility = View.VISIBLE } } @@ -307,6 +327,17 @@ class MoGoHmiFragment : MvpFragment(), setProxyTrafficLightView(viewTrafficLightVr) setProxyLimitingSpeedView(viewLimitingVelocity) setViewNotificationProvider(this) + + // 开启定时查询速度 + Timer().schedule(timerTaskRefresh, Date(), 60*1000) + } + + private val timerTaskRefresh = object : TimerTask() { + override fun run() { + //请求磁盘空间使用情况 + bagManagerEntity.reqType = 1 + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } } override fun getNotificationView(): IViewNotification? = @@ -375,10 +406,52 @@ class MoGoHmiFragment : MvpFragment(), } } + override fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager) { + super.onBagManagerResult(bagManager) + //判断磁盘是否已满,展示预警弹窗 + UiThreadHandler.post{ + if(bagManager.reqType == 1){ + if(bagManager.spaceInfoRespCount>0){ + for(spaceInfo in bagManager.spaceInfoRespList){ + for(bagSpaceInfo in spaceInfo.bagDirsSpaceInfoList){ + if(bagSpaceInfo.free == 0L){ + //磁盘空间已满 + if(!isShowWarningDialog){ + if(spaceWarningDialog == null){ + spaceWarningDialog = SpaceWarningDialog(context as Activity) + spaceWarningDialog?.setClickListener(object:SpaceWarningDialog.ClickListener{ + override fun showBadCaseManagerView() { + if(mBadCaseManagerView == null){ + toggleBagManagerView() + } + } + + }) + } + spaceWarningDialog?.let { + if(!it.isShowing){ + it.show() + } + } + isShowWarningDialog = true + } + } + } + } + } + } + } + } + override fun onDestroyView() { super.onDestroyView() CallerAutopilotRecordListenerManager.removeListener(TAG) CallerAutoPilotStatusListenerManager.removeListener(TAG) + try { + timerTaskRefresh.cancel() + } catch (e: Exception) { + e.printStackTrace() + } } @@ -469,20 +542,8 @@ class MoGoHmiFragment : MvpFragment(), statusBarView?.updateMfStatus(tag, status) } - override fun updateDriverMsgBoxTipView(show: Boolean) { - if(show){ - MsgBoxTipView?.visibility = View.VISIBLE - }else{ - MsgBoxTipView?.visibility = View.GONE - } - } - - override fun updatePassengerMsgBoxTipView(show: Boolean) { - if(show){ - MsgBoxPTipView?.visibility = View.VISIBLE - }else{ - MsgBoxPTipView?.visibility = View.GONE - } + override fun updateHDDataCacheStatus(isCached: Boolean) { + toolsView?.updateHDDataCacheStatus(isCached) } /** @@ -527,6 +588,12 @@ class MoGoHmiFragment : MvpFragment(), override fun showSOPSettingView() { toggleSOPView() } + + override fun showBadCaseManagerView() { + dismissToolsFloatView() +// CallerDevaToolsManager.showBadCaseManagerView(it) + toggleBagManagerView() + } }) } toolsViewFloat = WarningFloat.with(it) @@ -800,6 +867,55 @@ class MoGoHmiFragment : MvpFragment(), } } + override fun toggleBagManagerView() { + activity?.let{ + if (mBadCaseManagerViewFloat != null) { + WarningFloat.dismiss(mBadCaseManagerViewFloat!!.config.floatTag, false) + mBadCaseManagerViewFloat = null + mBadCaseManagerView = null + } else { + if (mBadCaseManagerView == null) { + mBadCaseManagerView = BadCaseManagerView(it) + mBadCaseManagerView?.setOnClickListener(object: BadCaseManagerView.ClickListener{ + override fun onClose() { + toggleBagManagerView() + } + }) + } + mBadCaseManagerViewFloat = WarningFloat.with(it) + .setTag("mBadCaseManagerView") + .setLayout(mBadCaseManagerView!!) + .setSidePattern(LEFT) + .setGravity(Gravity.LEFT, offsetY = 70) + .setImmersionStatusBar(false) + .setWindowHeight(LayoutParams.MATCH_PARENT) + .setAnimator(object : DefaultAnimator() { + override fun enterAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.enterAnim(view, params, windowManager, sidePattern) + ?.apply { + interpolator = OvershootInterpolator() + } + + override fun exitAnim( + view: View, + params: LayoutParams, + windowManager: WindowManager, + sidePattern: SidePattern + ): Animator? = + super.exitAnim(view, params, windowManager, sidePattern) + ?.setDuration(200) + }) + .show() + } + } + } + + /** * 展示VR下V2X预警 * @@ -1091,25 +1207,27 @@ class MoGoHmiFragment : MvpFragment(), * 控制展示限速标志及内容 */ override fun showLimitingVelocity(limitingSpeed: Int, limitSpeedSource: Int) { - // 控制 限速UI 展示 - if (HmiBuildConfig.isShowLimitingVelocityView) { - if (limitingSpeed > 0) { - mViewLimitingVelocity?.visibility = View.VISIBLE - mViewLimitingVelocity?.updateLimitingSpeed(limitingSpeed, limitSpeedSource) - tvLimitingSource?.visibility = View.VISIBLE - if (limitSpeedSource == 1) { - tvLimitingSource.text = "MAP" - } else if (limitSpeedSource == 2) { - tvLimitingSource.text = "RSU" + ThreadUtils.runOnUiThread { + // 控制 限速UI 展示 + if (HmiBuildConfig.isShowLimitingVelocityView) { + if (limitingSpeed > 0) { + mViewLimitingVelocity?.visibility = View.VISIBLE + mViewLimitingVelocity?.updateLimitingSpeed(limitingSpeed, limitSpeedSource) + tvLimitingSource?.visibility = View.VISIBLE + if (limitSpeedSource == 1) { + tvLimitingSource?.text = "MAP" + } else if (limitSpeedSource == 2) { + tvLimitingSource?.text = "RSU" + } + } else { + mViewLimitingVelocity?.visibility = View.INVISIBLE + mViewLimitingVelocity?.updateLimitingSpeed(0, limitSpeedSource) + tvLimitingSource?.visibility = View.INVISIBLE } } else { - mViewLimitingVelocity?.visibility = View.INVISIBLE - mViewLimitingVelocity?.updateLimitingSpeed(0, limitSpeedSource) - tvLimitingSource?.visibility = View.INVISIBLE + disableLimitingVelocity() + tvLimitingSource?.visibility = View.GONE } - } else { - disableLimitingVelocity() - tvLimitingSource?.visibility = View.GONE } } @@ -1556,7 +1674,6 @@ class MoGoHmiFragment : MvpFragment(), } } - override fun setTurnLightFunction(isOpen: Boolean) { HmiBuildConfig.isShowTurnLightView = isOpen } @@ -1634,6 +1751,7 @@ class MoGoHmiFragment : MvpFragment(), } override fun showSmallFragment() { + CallerLogger.d("$M_HMI$TAG", "showSmallFragment start!") // 加载全览模式图层 val fragmentOverview = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW) .navigation() as BaseFragment @@ -1650,9 +1768,11 @@ class MoGoHmiFragment : MvpFragment(), }.commitAllowingStateLoss() } CallerDevaToolsManager.hideStatusBar() + CallerLogger.d("$M_HMI$TAG", "showSmallFragment end!") } override fun hideSmallFragment() { + CallerLogger.d("$M_HMI$TAG", "hideSmallFragment start!") val fragmentOverview = ARouter.getInstance().build(MoGoFragmentPaths.PATH_FRAGMENT_OVERVIEW) .navigation() as BaseFragment activity?.supportFragmentManager?.beginTransaction() @@ -1662,6 +1782,7 @@ class MoGoHmiFragment : MvpFragment(), } } ?.commitAllowingStateLoss() + CallerLogger.d("$M_HMI$TAG", "hideSmallFragment end!") // context?.let { CallerDevaToolsManager.showStatusBar(it, statusBarContainer) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/map/OfflineMapDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/map/OfflineMapDialog.kt new file mode 100644 index 0000000000..2f649553a8 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/map/OfflineMapDialog.kt @@ -0,0 +1,184 @@ +package com.mogo.eagle.core.function.hmi.ui.map + +import android.annotation.SuppressLint +import android.content.Context +import android.view.View +import android.widget.ImageView +import android.widget.ProgressBar +import android.widget.TextView +import androidx.annotation.MainThread +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.core.content.res.ResourcesCompat +import androidx.core.view.marginTop +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.dialog.BaseFloatDialog +import com.mogo.map.hdcache.IHdCacheListener +import me.jessyan.autosize.utils.AutoSizeUtils + +/** + * 离线地图缓存 + */ +class OfflineMapDialog(context: Context): BaseFloatDialog(context) { + + private var roundRootLayout: ConstraintLayout? = null + private var offlineTitleView: TextView? = null + private var leftView: TextView? = null + private var rightView: TextView? = null + private var okView: TextView? = null + private var vertLineView: View? = null + private var horizontalLineView: View? = null + private var cacheTipView: TextView? = null + + private var progressBar: ProgressBar? = null + private var downloadPercentView: TextView? = null + private var downloadResultImg: ImageView? = null + + private var isLoading = false + private var isConfirm = true + private var isRetry = false + + init { + setContentView(R.layout.dialog_offline_map) + setCanceledOnTouchOutside(true) + + initView() + } + + private fun initView() { + roundRootLayout = findViewById(R.id.roundRootLayout) + offlineTitleView = findViewById(R.id.tv_cache_title) + progressBar = findViewById(R.id.progressBar) + downloadPercentView = findViewById(R.id.tvDownloadProgress) + leftView = findViewById(R.id.tv_cache_confirm) + rightView = findViewById(R.id.tv_cache_cancel) + okView = findViewById(R.id.tv_cache_ok) + vertLineView = findViewById(R.id.view_vertical_line) + horizontalLineView = findViewById(R.id.view_horizontal_line) + cacheTipView = findViewById(R.id.tv_cache_tips) + downloadResultImg = findViewById(R.id.iv_download_Status) + + leftView?.setOnClickListener { + when { + isConfirm -> { + showNewContent(isLoading = true, false) + cacheHDOfflineData() + } + else -> { + dismiss() + } + } + } + + rightView?.setOnClickListener { + when { + isRetry -> { + showNewContent(isLoading = true, false) + cacheHDOfflineData() + } + else -> { + dismiss() + } + } + } + + okView?.setOnClickListener { + if (isLoading) { + CallerMapUIServiceManager.cancelDownloadCacheData() + } + dismiss() + } + } + + private fun cacheHDOfflineData() { + CallerMapUIServiceManager.cacheHDDataByCity(object : IHdCacheListener { + override fun onMapHdCacheProgress(cityId: Int, progress: Double) { + updateProgress(progress.toInt()) + } + + override fun onMapHdCacheResult(cityId: Int, state: Int) { + if (state == 0) {// 失败 + showNewContent(isLoading = false, false) + } + } + }) + } + + @SuppressLint("SetTextI18n") + private fun updateProgress(progress: Int) { + if (this@OfflineMapDialog.isShowing) { + progressBar?.let { + if (it.visibility == View.VISIBLE) { + it.progress = if (progress in 1..5) 5 else progress + } + } + downloadPercentView?.text = "$progress%" + if (progress == 100) { + showNewContent(isLoading = false, true) + CallerHmiManager.updateHDDataCacheStatus(true) + } + } + } + + private fun change2NewStyle() { + roundRootLayout?.layoutParams?.width = AutoSizeUtils.dp2px(context, 1110f) + roundRootLayout?.layoutParams?.height = AutoSizeUtils.dp2px(context, 668f) + + val titleParams = offlineTitleView?.layoutParams as ConstraintLayout.LayoutParams + titleParams.topMargin = AutoSizeUtils.dp2px(context, 51f) + + val horizontalLineParams = horizontalLineView?.layoutParams as ConstraintLayout.LayoutParams + horizontalLineParams.topMargin = AutoSizeUtils.dp2px(context, 374f) + + progressBar?.visibility = View.VISIBLE + downloadPercentView?.visibility = View.VISIBLE + okView?.visibility = View.VISIBLE + + vertLineView?.visibility = View.GONE + leftView?.visibility = View.GONE + rightView?.visibility = View.GONE + cacheTipView?.visibility = View.INVISIBLE + } + + @SuppressLint("UseCompatLoadingForDrawables") + private fun showNewContent(isLoading: Boolean, isSuccess: Boolean) { + this.isLoading = isLoading + change2NewStyle() + when { + isLoading -> { + okView?.text = context.resources.getString(R.string.cancel) + offlineTitleView?.text = context.resources.getString(R.string.offline_downloading) + downloadResultImg?.visibility = View.GONE + } + else -> { + downloadResultImg?.visibility = View.VISIBLE + when { + isSuccess -> { + okView?.visibility = View.VISIBLE + okView?.text = context.resources.getString(R.string.ok_tip) + offlineTitleView?.text = context.resources.getString(R.string.offline_download_success) + progressBar?.visibility = View.GONE + downloadPercentView?.visibility = View.GONE + downloadResultImg?.background = ContextCompat.getDrawable(context, R.drawable.download_success_icon) + } + else -> { + isRetry = true + isConfirm = false + offlineTitleView?.text = context.resources.getString(R.string.offline_download_failure) + okView?.visibility = View.GONE + progressBar?.visibility = View.GONE + downloadPercentView?.visibility = View.GONE + leftView?.visibility = View.VISIBLE + leftView?.text = context.resources.getString(R.string.ok_tip) + rightView?.visibility = View.VISIBLE + vertLineView?.visibility = View.VISIBLE + rightView?.text = context.resources.getString(R.string.retry) + downloadResultImg?.background = ContextCompat.getDrawable(context, R.drawable.download_fail_icon) + } + } + } + } + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index fb8fabb4a4..584acbe0ca 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -13,6 +13,7 @@ import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener 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.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter @@ -83,11 +84,15 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } } if(isShowData){ - CallerHmiManager.updateDriverMsgBoxTipView(true) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if(category == MsgCategory.RECORD_BAG){ - //弹出被动录包弹窗 - CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) - }else{ + if(!FunctionBuildConfig.isDemoMode){ + //弹出被动录包弹窗 + CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean,context as Activity,true) + } + } else if(category == MsgCategory.SYS_INFO){ + //todo 过滤MAP系统异常报警 + } else{ clMsgBubbleLayout.visibility = View.VISIBLE dataList.add(msgBoxBean) driverMsgBoxBubbleAdapter?.setData(dataList) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxButtonView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxButtonView.kt new file mode 100644 index 0000000000..3d1bf00d43 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxButtonView.kt @@ -0,0 +1,96 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +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.msgbox.MsgBoxBean +import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import kotlinx.android.synthetic.main.view_driver_msg_box_button.view.* + +/** + * @author XuXinChao + * @description 消息盒子司机端视图切换按钮 + * @since: 2023/1/31 + */ +class DriverMsgBoxButtonView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +):ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxEventListener { + + companion object { + const val TAG = "DriverMsgBoxButtonView" + } + + private var clickListener: ClickListener? = null + + init{ + LayoutInflater.from(context).inflate(R.layout.view_driver_msg_box_button, this, true) + initView() + } + + private fun initView(){ + cbMsgBoxDriver.setOnCheckedChangeListener { _, isChecked -> + clickListener?.showMsgBoxList(isChecked) + msgBoxTipView.visibility = View.GONE + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + CallerMsgBoxEventListenerManager.addListener(TAG,this) + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + CallerMsgBoxEventListenerManager.removeListener(TAG) + } + } + + override fun onSummaryClickEvent() { + + } + + /** + * 更新新消息提醒红点 + * @param isShow true:展示;false:不展示 + */ + override fun onUpdateTipEvent(isShow: Boolean) { + if(isShow){ + msgBoxTipView.visibility = View.VISIBLE + }else{ + msgBoxTipView.visibility = View.GONE + } + } + + override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxDriver.performClick() + } + + override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxDriver.performClick() + } + + override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxDriver.performClick() + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener{ + fun showMsgBoxList(show: Boolean) + } + + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt index 547b6c8719..937864de91 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxListView.kt @@ -10,7 +10,9 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgCategory +import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R @@ -32,7 +34,7 @@ class DriverMsgBoxListView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr) , IMsgBoxListener { +) : ConstraintLayout(context, attrs, defStyleAttr) , IMsgBoxListener, IMsgBoxEventListener { init { LayoutInflater.from(context).inflate(R.layout.layout_driver_msg_box_list, this, true) @@ -43,11 +45,13 @@ class DriverMsgBoxListView @JvmOverloads constructor( private var ipcReportList: ArrayList ?= null private var badCaseList: ArrayList ?= null private var driverMsgBoxListAdapter: DriverMsgBoxListAdapter ?=null + private var linearLayoutManager: LinearLayoutManager ?= null private fun initView() { driverMsgBoxListAdapter= DriverMsgBoxListAdapter(context as Activity) rvMsgBoxList.adapter = driverMsgBoxListAdapter - rvMsgBoxList.layoutManager = LinearLayoutManager(context) + linearLayoutManager = LinearLayoutManager(context) + rvMsgBoxList.layoutManager = linearLayoutManager //获取通知消息列表 noticeList= CallerMsgBoxManager.getCachedNotifyData() as ArrayList? @@ -195,6 +199,7 @@ class DriverMsgBoxListView @JvmOverloads constructor( super.onAttachedToWindow() if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ CallerMsgBoxListenerManager.addListener(TAG,this) + CallerMsgBoxEventListenerManager.addListener(TAG,this) EventBus.getDefault().register(this) } } @@ -203,6 +208,7 @@ class DriverMsgBoxListView @JvmOverloads constructor( super.onDetachedFromWindow() if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ CallerMsgBoxListenerManager.removeListener(TAG) + CallerMsgBoxEventListenerManager.removeListener(TAG) EventBus.getDefault().unregister(this) } } @@ -214,4 +220,37 @@ class DriverMsgBoxListView @JvmOverloads constructor( it.remove(msgBoxList) } } + + override fun onSummaryClickEvent() { + + } + + override fun onUpdateTipEvent(isShow: Boolean) { + + } + + override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) { + MsgBoxConfig.setUserRecord(0) + notifyData() + noticeList?.let { + rvMsgBoxList?.scrollToPosition(it.indexOf(msgBoxBean)) + } + } + + override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) { + MsgBoxConfig.setUserRecord(0) + notifyData() + noticeList?.let { + rvMsgBoxList?.scrollToPosition(it.indexOf(msgBoxBean)) + } + } + + override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) { + MsgBoxConfig.setUserRecord(1) + notifyData() + ipcReportList?.let { + linearLayoutManager?.scrollToPositionWithOffset(it.indexOf(msgBoxBean),0) + driverMsgBoxListAdapter?.setReportShowData(msgBoxBean) + } + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt index edd8a0688b..feda00428a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxBubbleView.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.PassengerMsgBoxBubbleAdapter @@ -64,7 +65,7 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor( || msgBoxList.type == MsgBoxType.OBU){ MsgBoxConfig.noticeList.add(msgBoxList) if(isShowData){ - CallerHmiManager.updatePassengerMsgBoxTipView(true) + CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) dataList.add(msgBoxList) passengerMsgBoxBubbleAdapter?.setData(dataList) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxButtonView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxButtonView.kt new file mode 100644 index 0000000000..8026b86070 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxButtonView.kt @@ -0,0 +1,97 @@ +package com.mogo.eagle.core.function.hmi.ui.msgbox + +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.msgbox.MsgBoxBean +import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager +import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import kotlinx.android.synthetic.main.view_passenger_msg_box_button.view.* + +/** + * @author XuXinChao + * @description 消息盒子乘客端视图切换按钮 + * @since: 2023/1/31 + */ +class PassengerMsgBoxButtonView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +): ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxEventListener { + + companion object { + const val TAG = "PassengerMsgBoxButtonView" + } + + private var clickListener: ClickListener? = null + + init{ + LayoutInflater.from(context).inflate(R.layout.view_passenger_msg_box_button, this, true) + initView() + } + + private fun initView(){ + cbMsgBoxPassenger.setOnCheckedChangeListener { _, isChecked -> + clickListener?.showMsgBoxList(isChecked) + msgBoxPTipView.visibility = View.GONE + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + CallerMsgBoxEventListenerManager.addListener(TAG,this) + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && + AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + CallerMsgBoxEventListenerManager.removeListener(TAG) + } + } + + override fun onSummaryClickEvent() { + + } + + /** + * 更新新消息提醒红点 + * @param isShow true:展示;false:不展示 + */ + override fun onUpdateTipEvent(isShow: Boolean) { + if(isShow){ + msgBoxPTipView.visibility = View.VISIBLE + }else{ + msgBoxPTipView.visibility = View.GONE + } + } + + override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxPassenger.performClick() + } + + override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxPassenger.performClick() + } + + override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) { + cbMsgBoxPassenger.performClick() + } + + fun setClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener{ + fun showMsgBoxList(show: Boolean) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt index f0720f387c..1c5bdd33d7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/PassengerMsgBoxListView.kt @@ -11,7 +11,9 @@ 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.MsgCategory +import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener import com.mogo.eagle.core.function.api.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R @@ -30,7 +32,7 @@ class PassengerMsgBoxListView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener { +) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IMsgBoxEventListener { private val TAG = "PassengerMsgBoxListView" var passengerMsgBoxListAdapter: PassengerMsgBoxListAdapter ?= null @@ -78,6 +80,7 @@ class PassengerMsgBoxListView @JvmOverloads constructor( if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ CallerMsgBoxListenerManager.addListener(TAG,this) + CallerMsgBoxEventListenerManager.addListener(TAG,this) } } @@ -86,7 +89,30 @@ class PassengerMsgBoxListView @JvmOverloads constructor( if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ CallerMsgBoxListenerManager.removeListener(TAG) + CallerMsgBoxEventListenerManager.removeListener(TAG) } } + override fun onSummaryClickEvent() { + + } + + override fun onUpdateTipEvent(isShow: Boolean) { + + } + + override fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) { + + } + + override fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) { + noticeList?.let { + rvPassengerList.scrollToPosition(it.indexOf(msgBoxBean)) + } + } + + override fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) { + + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt index 1f656db107..de4a40a628 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -13,12 +13,14 @@ import com.mogo.eagle.core.data.msgbox.* import com.mogo.eagle.core.data.report.ReportEntity import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager 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.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat +import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout /** * @author XuXinChao @@ -75,14 +77,19 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A when (holder) { is BubbleOperationHolder -> { data?.let { - val operationMsg = it[position].bean as OperationMsg + val msgBoxBean = it[position] + val operationMsg = msgBoxBean.bean as OperationMsg holder.tvBubbleOperationTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) holder.tvBubbleOperationContent.text = operationMsg.content + holder.clBubbleOperationLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleOperationListener(msgBoxBean) + } } } is BubbleReportHolder -> { data?.let { - val reportEntity = it[position].bean as ReportEntity + val msgBoxBean = it[position] + val reportEntity = msgBoxBean.bean as ReportEntity holder.tvBubbleReportTime.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" holder.tvBubbleReceiveTime.text = TimeUtils.millis2String(it[position].timestamp,getHourMinFormat()) var resultStr = "类型:" @@ -90,6 +97,9 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A resultStr = "${resultStr}${CallerAutoPilotManager.getReportResultDesc(result)}" } holder.tvBubbleReportType.text = resultStr + holder.clReportLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleReportListener(msgBoxBean) + } } } is BubbleNoticeHolder -> { @@ -139,6 +149,9 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A holder.tvV2XContent.text = v2XMsg.content holder.ivV2XImage.setImageDrawable(activity.resources.getDrawable( EventTypeEnumNew.getUpdateIconRes(v2XMsg.type))) + holder.clV2XLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleV2XListener(msgBoxBean) + } } } is BubbleSummaryHolder -> { @@ -190,12 +203,14 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A var tvBubbleReportTime: TextView = itemView.findViewById(R.id.tvBubbleReportTime) var tvBubbleReportType: TextView = itemView.findViewById(R.id.tvBubbleReportType) var tvBubbleReceiveTime: TextView = itemView.findViewById(R.id.tvBubbleReceiveTime) + var clReportLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clReportLayout) } //运营平台 class BubbleOperationHolder(itemView: View): RecyclerView.ViewHolder(itemView){ var tvBubbleOperationTime: TextView = itemView.findViewById(R.id.tvBubbleOperationTime) var tvBubbleOperationContent: TextView = itemView.findViewById(R.id.tvBubbleOperationContent) + var clBubbleOperationLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clBubbleOperationLayout) } //Notice @@ -212,6 +227,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A var ivV2XImage: ImageView = itemView.findViewById(R.id.ivV2XImage) var tvV2XTime: TextView = itemView.findViewById(R.id.tvV2XTime) var tvV2XContent: TextView = itemView.findViewById(R.id.tvV2XContent) + var clV2XLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clV2XLayout) } //汇总消息 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt index 1cbb3186d0..1b2408f3bf 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -31,6 +31,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : RecyclerView.Adapter() { private var data: List? = null + private var reportBean: MsgBoxBean ?= null private val operation: Int = 1 private val notice: Int = 2 @@ -49,6 +50,10 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : notifyDataSetChanged() } + fun setReportShowData(reportClickBean: MsgBoxBean){ + reportBean = reportClickBean + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { when (viewType) { record -> { @@ -102,6 +107,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : } is MsgBoxIpcReportHolder -> { data?.let { it -> + val reportMsgBox = it[position] holder.tvReportTimeNormal.text = "时间:${TimeUtils.millis2String(it[position].timestamp)}" holder.tvReportTimeOpen.text = @@ -137,6 +143,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : holder.tvReportTypeNormal.text = resultStr holder.tvReportTypeOpen.text = resultStr holder.tvReportReasonOpen.text = "原因:${reportEntity.msg}" + holder.tvReportSrcOpen.text = "消息来源:${reportEntity.src}" var actionStr = "" for (action in reportEntity.actionsList) { actionStr = @@ -151,6 +158,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvStatusSelect.text = "折叠" holder.ivReportImageNormal.visibility = View.GONE holder.tvReportLevelNormal.visibility = View.GONE holder.tvReportTimeNormal.visibility = View.GONE @@ -161,6 +169,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : holder.tvReportTimeOpen.visibility = View.VISIBLE holder.tvReportTypeOpen.visibility = View.VISIBLE holder.tvReportReasonOpen.visibility = View.VISIBLE + holder.tvReportSrcOpen.visibility = View.VISIBLE holder.tvReportActionOpen.visibility = View.VISIBLE } else { holder.tvStatusSelect.setCompoundDrawablesWithIntrinsicBounds( @@ -169,6 +178,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvStatusSelect.text = "展开" holder.ivReportImageNormal.visibility = View.VISIBLE holder.tvReportLevelNormal.visibility = View.VISIBLE holder.tvReportTimeNormal.visibility = View.VISIBLE @@ -179,9 +189,16 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : holder.tvReportTimeOpen.visibility = View.GONE holder.tvReportTypeOpen.visibility = View.GONE holder.tvReportReasonOpen.visibility = View.GONE + holder.tvReportSrcOpen.visibility = View.GONE holder.tvReportActionOpen.visibility = View.GONE } } + reportBean?.let { + if(reportMsgBox.timestamp == it.timestamp){ + holder.tvStatusSelect.performClick() + } + } + } } is MsgBoxOperation -> { @@ -199,6 +216,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvOperationStatusSelect.text = "折叠" holder.ivOperationImageNormal.visibility = View.GONE holder.tvOperationTitleNormal.visibility = View.GONE holder.tvOperationContentNormal.visibility = View.GONE @@ -213,6 +231,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : null, null ) + holder.tvOperationStatusSelect.text = "展开" holder.ivOperationImageNormal.visibility = View.VISIBLE holder.tvOperationTitleNormal.visibility = View.VISIBLE holder.tvOperationContentNormal.visibility = View.VISIBLE @@ -328,6 +347,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) : var tvReportTimeOpen: TextView = itemView.findViewById(R.id.tvReportTimeOpen) var tvReportTypeOpen: TextView = itemView.findViewById(R.id.tvReportTypeOpen) var tvReportReasonOpen: TextView = itemView.findViewById(R.id.tvReportReasonOpen) + var tvReportSrcOpen: TextView = itemView.findViewById(R.id.tvReportSrcOpen) var tvReportActionOpen: TextView = itemView.findViewById(R.id.tvReportActionOpen) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt index db78cd9935..2edcd6acc1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt @@ -18,6 +18,7 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat +import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout /** * @author XuXinChao @@ -104,6 +105,9 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView holder.tvPassengerV2XContent.text = v2XMsg.content holder.ivPassengerV2XImage.setImageDrawable(activity.resources.getDrawable( EventTypeEnumNew.getUpdateIconRes(v2XMsg.type))) + holder.clPassengerVeXLayout.setOnClickListener { + CallerMsgBoxEventListenerManager.invokeBubbleV2XListener(msgBoxBean) + } } } is BubbleSummaryHolder -> { @@ -114,7 +118,7 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView holder.tvPassengerSummaryCheck.setOnClickListener { //跳转全览模式 // CallerHmiManager.showSmallFragment() - CallerMsgBoxEventListenerManager.invokeListener() + CallerMsgBoxEventListenerManager.invokeSummaryListener() } } } @@ -163,6 +167,7 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView var ivPassengerV2XImage: ImageView = itemView.findViewById(R.id.ivPassengerV2XImage) var tvPassengerV2XTime: TextView = itemView.findViewById(R.id.tvPassengerV2XTime) var tvPassengerV2XContent: TextView = itemView.findViewById(R.id.tvPassengerV2XContent) + var clPassengerVeXLayout: RoundCanClickConstraintLayout = itemView.findViewById(R.id.clPassengerVeXLayout) } //汇总消息 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxListAdapter.kt index 8bb23e0ed6..c183783d1d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxListAdapter.kt @@ -106,7 +106,7 @@ class PassengerMsgBoxListAdapter(private val activity: Activity): RecyclerView.A holder.tvPassengerSummaryCheck.setOnClickListener { //跳转全览模式 // CallerHmiManager.showSmallFragment() - CallerMsgBoxEventListenerManager.invokeListener() + CallerMsgBoxEventListenerManager.invokeSummaryListener() } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/pnc/PncActionsView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/pnc/PncActionsView.kt index 1c178824d5..60c4f7420e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/pnc/PncActionsView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/pnc/PncActionsView.kt @@ -72,34 +72,49 @@ class PncActionsView @JvmOverloads constructor( @BizConfig(FOUNDATION, "", BIZ_PNC_ACTIONS) override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) { - mAutoPilotStatusInfo?.let { it -> - if (it.state == STATUS_AUTOPILOT_RUNNING) { + try { + mAutoPilotStatusInfo?.let { it -> UiThreadHandler.post { - var actions: String? = null - planningActionMsg.actionMsg?.let { - actions = PncActionsHelper.getAction(it.drivingState.number, it.drivingAction.number) + if (it.state == STATUS_AUTOPILOT_RUNNING) { + var actions: String? = null + planningActionMsg.actionMsg?.let { + actions = PncActionsHelper.getAction( + it.drivingState.number, + it.drivingAction.number + ) - //如果是存在云端红绿灯数据条件下,设置云端数据 - if (PncActionsHelper.isWaitingTrafficlight(it.drivingState.number, it.drivingAction.number) - && mTrafficLightResult != null - && getWaitTrafficlightTime().isNotBlank()) { - actions += ",预计${getWaitTrafficlightTime()}秒后通过" - } else { - mTrafficLightResult = null + //如果是存在云端红绿灯数据条件下,设置云端数据 + if (PncActionsHelper.isWaitingTrafficlight( + it.drivingState.number, + it.drivingAction.number + ) + && mTrafficLightResult != null + && getWaitTrafficlightTime().isNotBlank() + ) { + actions += ",预计${getWaitTrafficlightTime()}秒后通过" + } else { + mTrafficLightResult = null + } } - } - // update view - if (actions.isNullOrEmpty()) { + // update view + if (actions.isNullOrEmpty()) { + this.background = null + tvHmiPncActions.text = "" + } else { + this.background = + AppCompatResources.getDrawable(context, R.drawable.pnc_actions_bg) + tvHmiPncActions.text = actions + } + + } else { this.background = null tvHmiPncActions.text = "" - } else { - this.background = AppCompatResources.getDrawable(context, R.drawable.pnc_actions_bg) - tvHmiPncActions.text = actions } } } + } catch (e: Exception) { + e.printStackTrace() } - } override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 8fe270ab24..be21f4d7f0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -80,7 +80,6 @@ import com.mogo.map.uicontroller.VisualAngleMode.* import com.mogo.eagle.core.function.business.routeoverlay.* import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner -import com.zhidao.easysocket.utils.L import com.zhidao.support.adas.high.other.permission.BackgrounderPermission import com.zhjt.mogo_core_function_devatools.env.* import kotlinx.android.synthetic.main.view_debug_setting.view.* @@ -235,7 +234,10 @@ class DebugSettingView @JvmOverloads constructor( CallerAutopilotVehicleStateListenerManager.removeListener(TAG) // 移除 业务配置监听 - CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener( FuncBizConfig.FOUNDATION, TAG) + CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener( + FuncBizConfig.FOUNDATION, + TAG + ) if (logInfoView != null) { logInfoView!!.onEnterBackground() @@ -577,7 +579,7 @@ class DebugSettingView @JvmOverloads constructor( } btnDrawFusion.isChecked = FunctionBuildConfig.isFusionColor - btnDrawFusion.setOnCheckedChangeListener{_, isChecked -> + btnDrawFusion.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isFusionColor = isChecked } @@ -587,7 +589,11 @@ class DebugSettingView @JvmOverloads constructor( // 演示模式 tbIsDemoMode.setOnCheckedChangeListener { _, _ -> FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode - CallerHmiManager.updateStatusBarLeftView(FunctionBuildConfig.isDemoMode, "demoMode", DemoModeView(context)) + CallerHmiManager.updateStatusBarLeftView( + FunctionBuildConfig.isDemoMode, + "demoMode", + DemoModeView(context) + ) CallerAutoPilotManager.setDemoMode(FunctionBuildConfig.isDemoMode) if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 @@ -645,7 +651,7 @@ class DebugSettingView @JvmOverloads constructor( } tbDrawRomaMode.isChecked = FunctionBuildConfig.isRomaMode - //云端感知绘制 + //漫游模式开启控制 tbDrawRomaMode.setOnCheckedChangeListener { _, isChecked -> FunctionBuildConfig.isRomaMode = isChecked if (!FunctionBuildConfig.isRomaMode) { @@ -653,6 +659,19 @@ class DebugSettingView @JvmOverloads constructor( } } + tbRomaModeStyle.isChecked = FunctionBuildConfig.romaModeStyle == 1 + //漫游模式选择 + tbRomaModeStyle.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + FunctionBuildConfig.romaModeStyle = 1 + } else { + FunctionBuildConfig.romaModeStyle = 0 + } + if (FunctionBuildConfig.romaModeStyle != 1) { + tbRomaModeStyle.isChecked = false + } + } + //重启工控机所有节点 btnIpcReboot.onClick { CallerAutoPilotManager.sendIpcReboot() @@ -1297,7 +1316,7 @@ class DebugSettingView @JvmOverloads constructor( * 设置是否输出OBU日志 true-打印日志,false-不打印日志 */ tbObuLog.setOnCheckedChangeListener { _, isChecked -> - L.setEnableLog(isChecked) + CallerOBUManager.setObuLog(isChecked) } /** @@ -1865,9 +1884,9 @@ class DebugSettingView @JvmOverloads constructor( mTrajectoryInfoSize = 0 mRouteInfoSize = 0 - if(FunctionBuildConfig.isDemoMode){ + if (FunctionBuildConfig.isDemoMode) { tbIsDemoMode.text = "关闭美化模式" - }else{ + } else { tbIsDemoMode.text = "开启美化模式" } @@ -1956,7 +1975,7 @@ class DebugSettingView @JvmOverloads constructor( when (type) { BIZ_BEAUTY_MODE -> { tbIsDemoMode.isClickable = !lock - val (left,top,right,bottom) = tbIsDemoMode.currentPadding() + val (left, top, right, bottom) = tbIsDemoMode.currentPadding() if (lock) { tbIsDemoMode.background = resources.getDrawable(R.drawable.radio_button_lock_background) @@ -1964,11 +1983,11 @@ class DebugSettingView @JvmOverloads constructor( tbIsDemoMode.background = resources.getDrawable(R.drawable.radio_button_normal_background_right) } - tbIsDemoMode.setPadding(left,top,right,bottom) + tbIsDemoMode.setPadding(left, top, right, bottom) } BIZ_RAIN_MODE -> { tbIsRainMode.isClickable = !lock - val (left,top,right,bottom) = tbIsRainMode.currentPadding() + val (left, top, right, bottom) = tbIsRainMode.currentPadding() if (lock) { tbIsRainMode.background = resources.getDrawable(R.drawable.radio_button_lock_background) @@ -1976,21 +1995,21 @@ class DebugSettingView @JvmOverloads constructor( tbIsRainMode.background = resources.getDrawable(R.drawable.radio_button_normal_background_right) } - tbIsRainMode.setPadding(left,top,right,bottom) + tbIsRainMode.setPadding(left, top, right, bottom) } BIZ_WARNING_UPLOAD -> { tbReportWarning.isClickable = !lock - val (left,top,right,bottom) = tbReportWarning.currentPadding() + val (left, top, right, bottom) = tbReportWarning.currentPadding() if (lock) { tbReportWarning.background = resources.getDrawable(R.drawable.radio_button_lock_background) } else { tbReportWarning.background = null } - tbReportWarning.setPadding(left,top,right,bottom) + tbReportWarning.setPadding(left, top, right, bottom) } BIZ_BAG_RECORD -> { - val (left,top,right,bottom) = btnRecordBag.currentPadding() + val (left, top, right, bottom) = btnRecordBag.currentPadding() if (lock) { btnRecordBag.isClickable = false btnRecordBag.background = @@ -2000,10 +2019,10 @@ class DebugSettingView @JvmOverloads constructor( btnRecordBag.requestFocus() btnRecordBag.background = null } - btnRecordBag.setPadding(left,top,right,bottom) + btnRecordBag.setPadding(left, top, right, bottom) } BIZ_FULL_LOG -> { - val (left,top,right,bottom) = tbLogCatch.currentPadding() + val (left, top, right, bottom) = tbLogCatch.currentPadding() if (lock) { tbLogCatch.isClickable = false tbLogCatch.background = @@ -2013,7 +2032,7 @@ class DebugSettingView @JvmOverloads constructor( tbLogCatch.requestFocus() tbLogCatch.background = null } - tbLogCatch.setPadding(left,top,right,bottom) + tbLogCatch.setPadding(left, top, right, bottom) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt index 6865374f1c..e85c990676 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt @@ -157,7 +157,10 @@ class SOPSettingView @JvmOverloads constructor( // 演示模式,上一次勾选的数据 tbDemoMode.isChecked = FunctionBuildConfig.isDemoMode // 演示模式 - tbDemoMode.setOnCheckedChangeListener { _, _ -> + tbDemoMode.setOnCheckedChangeListener { compoundButton, _ -> + if(!compoundButton.isPressed){ + return@setOnCheckedChangeListener + } FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode CallerHmiManager.updateStatusBarLeftView(FunctionBuildConfig.isDemoMode, "demoMode", DemoModeView(context)) CallerAutoPilotManager.setDemoMode(FunctionBuildConfig.isDemoMode) @@ -175,7 +178,10 @@ class SOPSettingView @JvmOverloads constructor( // 雨天模式,上一次勾选的数据 tbRainMode.isChecked = FunctionBuildConfig.isRainMode //雨天模式 - tbRainMode.setOnCheckedChangeListener { _, isChecked -> + tbRainMode.setOnCheckedChangeListener { compoundButton, isChecked -> + if(!compoundButton.isPressed){ + return@setOnCheckedChangeListener + } CallerAutoPilotManager.setRainMode(isChecked) FunctionBuildConfig.isRainMode = isChecked } @@ -191,7 +197,7 @@ class SOPSettingView @JvmOverloads constructor( if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { CallerOBUManager.resetObuIpAddress("192.168.1.199") } else if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { - CallerOBUManager.resetObuIpAddress("192.168.8.199") + CallerOBUManager.resetObuIpAddress("192.168.1.199") } } else { //断开链接 @@ -268,11 +274,8 @@ class SOPSettingView @JvmOverloads constructor( private val timerTaskRefresh = object : TimerTask(){ override fun run() { UiThreadHandler.post{ - if(FunctionBuildConfig.isDemoMode){ - tbDemoMode.text = "关闭美化模式" - }else{ - tbDemoMode.text = "开启美化模式" - } + tbDemoMode.isChecked = FunctionBuildConfig.isDemoMode + tbRainMode.isChecked = FunctionBuildConfig.isRainMode } } @@ -282,39 +285,27 @@ class SOPSettingView @JvmOverloads constructor( when (type) { FuncBizConfig.BIZ_BEAUTY_MODE -> { tbDemoMode.isClickable = !lock - val (left,top,right,bottom) = tbDemoMode.currentPadding() - if (lock) { - tbDemoMode.background = - resources.getDrawable(R.drawable.radio_button_lock_background) - } else { - tbDemoMode.background = - resources.getDrawable(R.drawable.radio_button_normal_background_right) + if(lock){ + tbDemoMode.visibility = View.INVISIBLE + }else{ + tbDemoMode.visibility = View.VISIBLE } - tbDemoMode.setPadding(left,top,right,bottom) } FuncBizConfig.BIZ_RAIN_MODE -> { tbRainMode.isClickable = !lock - val (left,top,right,bottom) = tbRainMode.currentPadding() if (lock) { - tbRainMode.background = - resources.getDrawable(R.drawable.radio_button_lock_background) + tbRainMode.visibility = View.INVISIBLE } else { - tbRainMode.background = - resources.getDrawable(R.drawable.radio_button_normal_background_right) + tbRainMode.visibility = View.VISIBLE } - tbRainMode.setPadding(left,top,right,bottom) } FuncBizConfig.BIZ_PNC_WARNING -> { tbMarkingObstacles.isClickable = !lock - val (left,top,right,bottom) = tbMarkingObstacles.currentPadding() if (lock) { - tbMarkingObstacles.background = - resources.getDrawable(R.drawable.radio_button_lock_background) + tbMarkingObstacles.visibility = View.INVISIBLE } else { - tbMarkingObstacles.background = - resources.getDrawable(R.drawable.radio_button_normal_background_right) + tbMarkingObstacles.visibility = View.VISIBLE } - tbMarkingObstacles.setPadding(left,top,right,bottom) } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index dd38c48ad2..aced13e3b1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -7,7 +7,6 @@ import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Process import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.FrameLayout @@ -22,7 +21,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showTurnLight import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.utils.KeyBoardUtil import com.mogo.eagle.core.function.msgbox.MsgBoxConfig @@ -100,14 +98,15 @@ class AutoPilotAndCheckView @JvmOverloads constructor( sopLayout.setOnClickListener { clickListener?.showSOPSettingView() } + managerLayout.setOnClickListener { + //录包管理页面 + clickListener?.showBadCaseManagerView() + } viewCheckStatus.setOnClickListener { clickListener?.go2CheckPage() } ivDebugPanel.setOnClickListener { clickListener?.showDebugPanelView() - - - } ivDebugFeedback.onClick { clickListener?.showFeedbackView() @@ -202,6 +201,9 @@ class AutoPilotAndCheckView @JvmOverloads constructor( systemVersionView?.showAdUpgradeStatus(ipcUpgradeStateInfo) } + fun updateHDDataCacheStatus(isCached: Boolean) { + systemVersionView?.updateHDDataCacheStatus(isCached) + } override fun onAttachedToWindow() { super.onAttachedToWindow() @@ -225,6 +227,7 @@ class AutoPilotAndCheckView @JvmOverloads constructor( fun showDebugPanelView() fun showFeedbackView() fun showSOPSettingView() + fun showBadCaseManagerView() } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java index fbf8c38268..9814edceb9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.java @@ -100,6 +100,11 @@ public class SteeringWheelView extends ConstraintLayout { private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { + @Override + public void onAutopilotRouteLineId(long lineId) { + + } + @Override public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt index 8044145aff..f3291ce9c3 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SystemVersionView.kt @@ -1,26 +1,21 @@ package com.mogo.eagle.core.function.hmi.ui.widget -import android.app.NotificationManager import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.app.NotificationCompat import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.bindingcar.IMoGoBindingCarListener -import com.mogo.eagle.core.function.api.devatools.IMogoDevaToolsUpgradeListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.bindingcar.CallerBindingCarListenerManager import com.mogo.eagle.core.function.call.bindingcar.CallerBindingcarManager -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsUpgradeListenerManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showUpgradeDialog +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.map.OfflineMapDialog 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.AppUtils @@ -56,6 +51,8 @@ class SystemVersionView @JvmOverloads constructor( private var previousProgress: Int = -1 //前一秒的下载进度,用于计算下载剩余时间 private var currentProgress: Int = -1 //当前已下载包体大小 + private var isHDCached = false + init { LayoutInflater.from(context).inflate(R.layout.view_system_version, this, true) initView() @@ -142,6 +139,16 @@ class SystemVersionView @JvmOverloads constructor( } + ivHDCache.setOnClickListener { + if (isHDCached) {// 已缓存 + ToastUtils.showShort(resources.getString(R.string.offline_had_downloaded)) + } else {// 未缓存 + OfflineMapDialog(context).show() + } + } + + updateHDDataCacheStatus(CallerMapUIServiceManager.isCityDataCached()) + if(AdUpgradeStateHelper.isConfirmUpgrade()){ //将角标改为“下载中” ivAdStatus?.setImageResource(R.drawable.icon_downloading) @@ -246,6 +253,15 @@ class SystemVersionView @JvmOverloads constructor( } + fun updateHDDataCacheStatus(isCached: Boolean) { + if (isCached) { + ivHDCacheStatus?.setImageResource(R.drawable.icon_latest_version) + } else { + ivHDCacheStatus?.setImageResource(R.drawable.icon_be_updated) + } + isHDCached = isCached + } + /** * 展示当前鹰眼版本 */ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java index 337e4aacf0..83c22b1cbe 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java @@ -445,6 +445,11 @@ public class MainActivity extends MvpActivity implement } + @Override + public void onAutopilotRouteLineId(long lineId) { + + } + private void updateConnectInfoView(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { if (!isFloatingLayerHidden) {// 遮罩层显示的时候 mConnAdapter.updateData(autoPilotStatusInfo); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java index 012b4f7f38..57da422786 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainLauncherActivity.java @@ -10,10 +10,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.Process; import android.text.TextUtils; -import android.util.Log; import android.view.KeyEvent; import android.widget.FrameLayout; - import androidx.annotation.Nullable; import com.alibaba.android.arouter.launcher.ARouter; @@ -25,7 +23,6 @@ import com.mogo.eagle.core.function.api.base.IMoGoFunctionProvider; import com.mogo.eagle.core.function.api.setting.IMoGoSkinModeChangeListener; 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.call.setting.CallerSkinModeListenerManager; import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; @@ -76,6 +73,11 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis private long pressEDownTime = 0; private long pressEUpTime = 0; + private int clickTime = 300; //单击 + private int clickTimeInterval = 330; + private int longPressTime = 670; + private int longPressTimeInterval = 700; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -219,7 +221,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressADownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent A down pressADownTime = " + pressADownTime + "---" + (pressADownTime - startPressTime) + "----isCombinationKey = " + isCombinationKey + "--pressBDownTime = " + pressBDownTime); - if ((pressADownTime - startPressTime) > 360 && (pressADownTime - startPressTime) < 1300 && pressBDownTime > 0) { + if ((pressADownTime - startPressTime) > clickTimeInterval && (pressADownTime - startPressTime) < longPressTime && pressBDownTime > 0) { if (isShowToast) { ToastUtils.showShort("方块 A 按AB组合 +1 "); } @@ -228,7 +230,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } if (isCombinationKey != 3 && isCombinationKey != 1) { - if ((pressADownTime - startPressTime) > 1320) { + if ((pressADownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按A -2 "); } @@ -239,7 +241,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } else if (event.getAction() == KeyEvent.ACTION_UP) { pressAUpTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent A up pressAUpTime = " + pressAUpTime + "---" + (pressAUpTime - startPressTime) + "--pressBDownTime = " + pressBDownTime); - if ((pressAUpTime - startPressTime) < 350 && isCombinationKey != 3) { + if ((pressAUpTime - startPressTime) < clickTime && isCombinationKey != 3) { isCombinationKey = 1; if (isShowToast) { ToastUtils.showShort("方块 单击A -1 "); @@ -260,7 +262,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressBDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent B down pressBDownTime = " + pressBDownTime + "--差-" + (pressBDownTime - startPressTime) + "---isCombinationKey = " + isCombinationKey + "--pressADownTime = " + pressADownTime); - if ((pressBDownTime - startPressTime) > 360 && (pressBDownTime - startPressTime) < 1300 && pressADownTime > 0) { + if ((pressBDownTime - startPressTime) > clickTimeInterval && (pressBDownTime - startPressTime) < longPressTime && pressADownTime > 0) { if (isShowToast) { ToastUtils.showShort("方块 B 按AB组合 +1 "); } @@ -268,7 +270,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis isCombinationKey = 3; } if (isCombinationKey != 3 && isCombinationKey != 1) { - if ((pressBDownTime - startPressTime) > 1320) { + if ((pressBDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按B 无操作 "); } @@ -278,7 +280,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis } else if (event.getAction() == KeyEvent.ACTION_UP) { pressBUpTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent B up pressBUpTime = " + pressBUpTime + "--差-" + (pressBUpTime - startPressTime) + "--pressADownTime = " + pressADownTime); - if ((pressBUpTime - startPressTime) < 350 && isCombinationKey != 3) { + if ((pressBUpTime - startPressTime) < clickTime && isCombinationKey != 3) { if (isShowToast) { ToastUtils.showShort("方块 单击B 0 "); } @@ -300,7 +302,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressCDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按C 无操作 time dif = " + (pressCDownTime - startPressTime)); - if ((pressCDownTime - startPressTime) > 1320) { + if ((pressCDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按C 无操作 "); } @@ -309,7 +311,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis pressCUpTime = System.currentTimeMillis(); isPressEnd = false; CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击C ← 向左变道 time dif = " + (pressCUpTime - startPressTime)); - if ((pressCUpTime - startPressTime) < 350) { + if ((pressCUpTime - startPressTime) < clickTime) { if (isShowToast) { ToastUtils.showShort("方块 单击C ← 向左变道 "); } @@ -321,7 +323,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressDDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按D 无操作 time dif = " + (pressDDownTime - startPressTime)); - if ((pressDDownTime - startPressTime) > 1320) { + if ((pressDDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按D 无操作 "); } @@ -330,7 +332,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis pressDUpTime = System.currentTimeMillis(); isPressEnd = false; CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 单击D → 向右变道 time dif = " + (pressDUpTime - startPressTime)); - if ((pressDUpTime - startPressTime) < 350) { + if ((pressDUpTime - startPressTime) < clickTime) { if (isShowToast) { ToastUtils.showShort("方块 单击D → 向右变道 "); } @@ -342,7 +344,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis if (event.getAction() == KeyEvent.ACTION_DOWN) { pressEDownTime = System.currentTimeMillis(); CallerLogger.INSTANCE.d(M_F + "MoFangManager", "dispatchKeyEvent 方块 长按E 鸣笛 time dif = " + (pressEDownTime - startPressTime)); - if ((pressEDownTime - startPressTime) > 1320) { + if ((pressEDownTime - startPressTime) > longPressTimeInterval) { if (isShowToast) { ToastUtils.showShort("方块 长按E 鸣笛 "); } @@ -362,7 +364,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis pressEUpTime = System.currentTimeMillis(); isPressEnd = false; CallerLogger.INSTANCE.d(M_F + "MoFangManager", "方块 单击E 开启自动驾驶 time dif = " + (pressEUpTime - startPressTime)); - if ((pressEUpTime - startPressTime) < 350) { + if ((pressEUpTime - startPressTime) < clickTime) { if (isShowToast) { ToastUtils.showShort("方块 单击E 开启自动驾驶 "); } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index d05a210dca..825cae187a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -37,7 +37,6 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.ProcessUtils; import com.mogo.eagle.core.utilcode.util.SPUtils; import com.mogo.map.MapApiPath; -import com.zhidao.support.obu.ami.AmiClientManager; import java.io.File; import java.lang.reflect.Field; @@ -60,7 +59,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { return; } start = System.currentTimeMillis(); - connectAmiIp(); // Crash 日志收集 initCrashConfig(); initLogConfig(); @@ -202,14 +200,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { OverviewDb.Companion.getDb(this); } - /** - * 连接ami - */ - private void connectAmiIp() { - String ipAddress = SharedPrefsMgr.getInstance(AbsMogoApplication.getApp().getBaseContext()).getString(MoGoConfig.OBU_IP, "192.168.1.199"); - AmiClientManager.getInstance().setObuIp(ipAddress); - } - private void initModules() { CallerLogger.INSTANCE.d(M_HMI + TAG, "initModules"); //och模块 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/debug_icon_bag_manager.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/debug_icon_bag_manager.png new file mode 100644 index 0000000000..8dc2dff73f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/debug_icon_bag_manager.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/download_fail_icon.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/download_fail_icon.png new file mode 100644 index 0000000000..809d7ee414 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/download_fail_icon.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/download_success_icon.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/download_success_icon.png new file mode 100644 index 0000000000..f6f1197a93 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/download_success_icon.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_be_updated.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_be_updated.png new file mode 100644 index 0000000000..b9268797cf Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_be_updated.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_hd_map.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_hd_map.png new file mode 100644 index 0000000000..ccbe7ffd56 Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_hd_map.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_corner_bg.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_corner_bg.xml new file mode 100644 index 0000000000..753149f4ea --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable/progressbar_corner_bg.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_offline_map.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_offline_map.xml new file mode 100644 index 0000000000..6ae72b0a13 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/dialog_offline_map.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index 21d86a2dc9..67a6cfcdd7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -198,57 +198,26 @@ app:layout_constraintTop_toBottomOf="@+id/viewLimitingVelocity" /> - - - - - - - @@ -256,7 +225,7 @@ android:id="@+id/viewDriverMsgBoxList" android:layout_width="864dp" android:layout_height="746dp" - app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver" + app:layout_constraintTop_toBottomOf="@id/viewDriverMsgBoxButton" app:layout_constraintRight_toRightOf="parent" android:layout_marginEnd="40dp" android:visibility="gone" @@ -266,7 +235,7 @@ android:id="@+id/viewDriverMsgBoxBubble" android:layout_width="864dp" android:layout_height="wrap_content" - app:layout_constraintTop_toBottomOf="@id/cbMsgBoxDriver" + app:layout_constraintTop_toBottomOf="@id/viewDriverMsgBoxButton" app:layout_constraintRight_toRightOf="parent" android:layout_marginEnd="40dp" android:visibility="gone" @@ -276,9 +245,9 @@ android:id="@+id/viewPassengerMsgBoxBubble" android:layout_width="650dp" android:layout_height="wrap_content" - app:layout_constraintBottom_toTopOf="@id/cbMsgBoxPassenger" - app:layout_constraintLeft_toLeftOf="@id/cbMsgBoxPassenger" - app:layout_constraintRight_toRightOf="@id/cbMsgBoxPassenger" + app:layout_constraintBottom_toTopOf="@id/viewPassengerMsgBoxButton" + app:layout_constraintLeft_toLeftOf="@id/viewPassengerMsgBoxButton" + app:layout_constraintRight_toRightOf="@id/viewPassengerMsgBoxButton" android:layout_marginBottom="20dp" android:visibility="gone" /> @@ -287,9 +256,9 @@ android:id="@+id/viewPassengerMsgBoxList" android:layout_width="650dp" android:layout_height="750dp" - app:layout_constraintBottom_toTopOf="@id/cbMsgBoxPassenger" - app:layout_constraintLeft_toLeftOf="@id/cbMsgBoxPassenger" - app:layout_constraintRight_toRightOf="@id/cbMsgBoxPassenger" + app:layout_constraintBottom_toTopOf="@id/viewPassengerMsgBoxButton" + app:layout_constraintLeft_toLeftOf="@id/viewPassengerMsgBoxButton" + app:layout_constraintRight_toRightOf="@id/viewPassengerMsgBoxButton" android:layout_marginBottom="20dp" android:visibility="gone" /> diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml index 5911e16c42..29e1165bfb 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_box_ipc_report.xml @@ -70,7 +70,7 @@ android:id="@+id/tvStatusSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="折叠" + android:text="展开" android:textColor="#FFFFFFFF" android:textSize="24dp" app:layout_constraintTop_toTopOf="parent" @@ -163,12 +163,26 @@ /> + + - + android:layout_marginBottom="7dp" + > - \ No newline at end of file + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml index ac287b1ca2..7bc6c8e3a8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_report.xml @@ -1,5 +1,6 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml index 8c1cb8475d..9888e42f87 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_msg_bubble_v2x.xml @@ -1,5 +1,6 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml index d7096b95b6..fbe95e1a36 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_v2x.xml @@ -1,5 +1,6 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index e1b518dd22..a821ce24f2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -171,6 +171,35 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_passenger_msg_box_button.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_passenger_msg_box_button.xml new file mode 100644 index 0000000000..8b2935a3f6 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_passenger_msg_box_button.xml @@ -0,0 +1,31 @@ + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml index e9830e19b0..53f1efd8ba 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml @@ -16,204 +16,231 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> + + - + - + - + - + - - + - + - + - - - - - - - - - - - - + android:text="V2I事件" + android:paddingTop="25dp" + android:paddingBottom="25dp" + android:scaleY="1.2" + android:scaleX="1.2" + app:layout_constraintTop_toBottomOf="@id/tbRainMode" + app:layout_constraintLeft_toRightOf="@id/verticalGuideLine" + app:layout_constraintRight_toRightOf="parent" + /> + + + + + + + + + + @@ -277,16 +304,6 @@ android:layout_marginStart="10dp" /> - - diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_system_version.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_system_version.xml index ce0064ad18..3972c865ff 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_system_version.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_system_version.xml @@ -82,7 +82,6 @@ android:visibility="gone" /> - + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml index 333b277f12..dc18d3181a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/color.xml @@ -74,4 +74,5 @@ #FF282F62 #FFFFFF + #E63B4577 \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml index 90c260be7e..6bae6b18ef 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml @@ -53,4 +53,12 @@ 是否绑定车机? 蘑菇星云 + 离线地图缓存提醒 + 是否缓存最新版本离线地图? + 离线地图下载中 + 离线地图下载成功 + 离线地图下载失败 + 当前已为最新版本 + 确定 + 重试 diff --git a/core/function-impl/mogo-core-function-map/build.gradle b/core/function-impl/mogo-core-function-map/build.gradle index 01e097ded7..70b7ff0853 100644 --- a/core/function-impl/mogo-core-function-map/build.gradle +++ b/core/function-impl/mogo-core-function-map/build.gradle @@ -60,7 +60,6 @@ dependencies { implementation rootProject.ext.dependencies.mogocustommap implementation rootProject.ext.dependencies.amapnavi3dmap - implementation rootProject.ext.dependencies.amaplocation implementation rootProject.ext.dependencies.androidxroomruntime kapt rootProject.ext.dependencies.androidxroomcompiler diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java index 74ebc44c12..68c36320b3 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/routeoverlay/MogoRouteOverlayManager.java @@ -124,4 +124,9 @@ public class MogoRouteOverlayManager implements @Override public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) {} + + @Override + public void onAutopilotRouteLineId(long lineId) { + + } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java index c8b5804dd4..5fe40afaf7 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapFragment.java @@ -196,4 +196,9 @@ public class SmallMapFragment extends BaseFragment public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { } + + @Override + public void onAutopilotRouteLineId(long lineId) { + + } } diff --git a/core/function-impl/mogo-core-function-obu-mogo/build.gradle b/core/function-impl/mogo-core-function-obu-mogo/build.gradle index 4c4e538ab2..7b8a0e75df 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/build.gradle +++ b/core/function-impl/mogo-core-function-obu-mogo/build.gradle @@ -66,7 +66,6 @@ dependencies { implementation project(':core:mogo-core-function-call') } - implementation rootProject.ext.dependencies.mogoobuold implementation rootProject.ext.dependencies.mogoobu } diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MoGoObuProvider.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MoGoObuProvider.kt index a4de8e25d8..81f35634ed 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MoGoObuProvider.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MoGoObuProvider.kt @@ -21,8 +21,8 @@ class MoGoObuProvider : IMoGoObuProvider { private val TAG = "MoGoObuProvider" private var mContext: Context? = null - private val busObuIp = "192.168.8.199" - private val taxiObuIp = "192.168.1.199" + private val taxiObuIp = "192.168.1.199" //taxi和bus网段统一 +// private val taxiObuIp = "192.168.0.53" //室内测试环境 override val functionName: String get() = TAG @@ -44,32 +44,14 @@ class MoGoObuProvider : IMoGoObuProvider { } else { mContext = context mContext?.let { - if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) { //bus 司机端 - val ipAddress = - SharedPrefsMgr.getInstance(context).getString(MoGoConfig.OBU_IP, busObuIp) - - //mogo obu - MogoPrivateObuNewManager.INSTANCE.connectObu( - it, - ipAddress, - CommonUtils.getIpAddressString() - ) - - //old obu - MogoPrivateObuManager.INSTANCE.init(context, ipAddress) - } else if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { //taxi 司机端和乘客端 - val ipAddress = - SharedPrefsMgr.getInstance(context).getString(MoGoConfig.OBU_IP, taxiObuIp) - //mogo obu - MogoPrivateObuNewManager.INSTANCE.connectObu( - it, - ipAddress, - CommonUtils.getIpAddressString() - ) - - //old obu - MogoPrivateObuManager.INSTANCE.init(context, ipAddress) - } + val ipAddress = + SharedPrefsMgr.getInstance(context).getString(MoGoConfig.OBU_IP, taxiObuIp) + //mogo obu + MogoPrivateObuNewManager.INSTANCE.connectObu( + it, + ipAddress, + CommonUtils.getIpAddressString() + ) } } } @@ -94,19 +76,19 @@ class MoGoObuProvider : IMoGoObuProvider { ipAddress, CommonUtils.getIpAddressString() ) - - //连接old obu - MogoPrivateObuManager.INSTANCE.connectObu(it, ipAddress) } } } override fun disConnect() { - MogoPrivateObuManager.INSTANCE.disConnectObu() + MogoPrivateObuNewManager.INSTANCE.disConnectObu() } override fun isConnected(): Boolean { - return MogoPrivateObuManager.INSTANCE.isConnected() + return MogoPrivateObuNewManager.INSTANCE.isConnected() } + override fun setObuLibLog(isSet: Boolean) { + MogoPrivateObuNewManager.INSTANCE.setObuLog(isSet) + } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt deleted file mode 100644 index ea71e56e3f..0000000000 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuManager.kt +++ /dev/null @@ -1,1009 +0,0 @@ -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.commons.voice.AIAssist -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.constants.MogoServicePaths -import com.mogo.eagle.core.data.enums.WarningDirectionEnum -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.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.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 -import com.zhidao.support.obu.model.* -import com.zhidao.support.obu.model.advance.Light -import org.json.JSONObject - -/** - * - * @author lixiaopeng - * @since 2021/8/8 - * @description OBU 管理 - */ -class MogoPrivateObuManager private constructor() { - companion object { - val INSTANCE: MogoPrivateObuManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { - MogoPrivateObuManager() - } - } - - 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) - //控制日志输出 - MogoObuManager.getInstance() - .init(MoGoAiCloudClientConfig.getInstance().getSn(), AppConfigInfo.toString()) - MogoObuManager.getInstance().registerListener(mogoObuListener) - } - - fun connectObu(context: Context, ipAddress: String) { - //自研obu初始化 - mObuStatusInfo.connectIP = ipAddress - mObuStatusInfo.obuSdkVersion = MogoObuManager.getInstance().versionName - if (!MogoObuManager.getInstance().isConnected) { - MogoObuManager.getInstance().connect(context, mObuStatusInfo.connectIP) - } else { - try { - MogoObuManager.getInstance().disConnect() - Thread.sleep(500) - } catch (e: Exception) { - e.printStackTrace() - } - MogoObuManager.getInstance().connect(context, mObuStatusInfo.connectIP) - } - } - - fun disConnectObu() { - try { - MogoObuManager.getInstance().disConnect() - } catch (e: Exception) { - e.printStackTrace() - } - - } - - fun isConnected(): Boolean { - return MogoObuManager.getInstance().isConnected - } - - private val mogoObuListener: OnMogoObuListener = object : OnMogoObuListener() { - // OBU连接成功 - override fun onConnected() { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onConnected ------> ") - mObuStatusInfo.obuStatus = true - CallerObuListenerManager.invokeListener(mObuStatusInfo) - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU", true) } - - //断开mogo obu - com.mogo.support.obu.MogoObuManager.getInstance().disconnect() - } - - // OBU连接失败 - override fun onConnectFail(isNeedReconnect: Boolean) { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onConnectFail ------> ") - mObuStatusInfo.obuStatus = false - mObuStatusInfo.obuHvStatus = false - mObuStatusInfo.obuRvStatus = false - CallerObuListenerManager.invokeListener(mObuStatusInfo) - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU", false) } - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_HV", false) } - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_RV", false) } - } - - // OBU断开连接 - override fun onDisconnect() { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onDisconnect ------> ") - mObuStatusInfo.obuStatus = false - mObuStatusInfo.obuHvStatus = false - mObuStatusInfo.obuRvStatus = false - CallerObuListenerManager.invokeListener(mObuStatusInfo) - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU", false) } - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_HV", false) } - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_RV", false) } - } - - // 接收到的原始数据 - override fun onReceiveOriginData(data: String) { - super.onReceiveOriginData(data) - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onReceiveOriginData ------> data = $data" - ) - - } - - // 发送的数据 - override fun onSendData(bytes: ByteArray) { - super.onSendData(bytes) - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onSendData ------> ") - } - - // CV2X系统信息 - override fun onCvxAppInitIndInfo(info: CvxAppInitIndInfo) { - super.onCvxAppInitIndInfo(info) - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxAppInitIndInfo ------> $info" - ) - if (info != null) { - if (!info.stack_info.isNullOrEmpty()) { - mObuStatusInfo.stackInfo = info.stack_info - } - - if (!info.app_info.isNullOrEmpty()) { - mObuStatusInfo.appInfo = info.app_info - } - - if (!info.hli_info.isNullOrEmpty()) { - mObuStatusInfo.hliInfo = info.hli_info - } - CallerObuListenerManager.invokeListener(mObuStatusInfo) - } - } - - // (2) 车辆信息:CVX_HV_INFO_IND - override fun onCvxHvInfoIndInfo(info: CvxHvInfoIndInfo?) { - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_HV", true) } - mObuStatusInfo.obuHvStatus = true - CallerObuListenerManager.invokeListener(mObuStatusInfo) - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxHvInfoIndInfo ------> $info") - if (info != null && info.basic_info != null && info.basic_info.position != null) { - val movingObjectInfo = info.basic_info - val position = movingObjectInfo.position - val data = JSONObject() - try { - data.putOpt("lon", position.longitude) - data.putOpt("lat", position.latitude) - data.putOpt("speed", movingObjectInfo.speed) - data.putOpt("heading", movingObjectInfo.heading) - if (info.acceleration_set != null) { - data.putOpt("acceleration", info.acceleration_set.lateral) - data.putOpt("yawRate", info.acceleration_set.yaw_rate) - } - try { - data.putOpt("systemTime", System.currentTimeMillis()) - } catch (e: Exception) { - e.printStackTrace() - } - try { - data.putOpt("satelliteTime", System.currentTimeMillis()) - } catch (e: Exception) { - e.printStackTrace() - } - - // 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU - if (2 == FunctionBuildConfig.gpsProvider) { - // 同步给MAP地图 - CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(data) - // 同步更新经纬度和系统时间至 AutoPilotStatusListener - CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( - System.currentTimeMillis() / 1000.0, - position.longitude, - position.latitude - ) - } - - } catch (e: Exception) { - e.printStackTrace() - } - } - } - - // (3) 远车信息:CVX_RV_INFO_IND - override fun onCvxRvInfoIndInfo(info: CvxRvInfoIndInfo) { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxRvInfoIndInfo ------> $info") - mObuStatusInfo.obuRvStatus = true - CallerObuListenerManager.invokeListener(mObuStatusInfo) - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU_RV", true) } - // 更新数据 - TrafficDataConvertUtils.cvxRvInfoIndInfo2TrafficData(info)?.let { - CallerMapUIServiceManager.getMarkerService()?.updateITrafficLocationInfo(it) - } - } - - // (3) 道路事件预警信息:CVX_RTI_THREAT_IND - override fun onCvxRtiThreatIndInfo(info: CvxRtiThreatIndInfo?) { -// if (HmiBuildConfig.isShowObuV2iView) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxRtiThreatIndInfo ------> $info" - ) - - if (info != null && info.threat_info != null && info.ext_info != null) { - var alertContent = "" - var ttsContent = "" - var appId = info.threat_info.app_id.toString() - val status = info.status - val level = info.threat_info.threat_level - val direction = - getMessageDirection(if (info.ext_info != null) info.ext_info.pos_classification else -1) - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxRtiThreatIndInfo direction = $direction -- pos_classification = ${info.ext_info.pos_classification}" - ) - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxRtiThreatIndInfo appId = $appId --status = $status --level = $level -- handleDirection = $direction --rtiType = ${info.ext_info.rti_type} --direction = $direction -- pos_classification = ${info.ext_info.pos_classification} " - ) - when (appId) { - // 道路危险情况预警 - EventTypeEnum.TYPE_USECASE_ID_HLW.poiType, - EventTypeEnum.TYPE_USECASE_ID_IVS.poiType - -> { - when (info.ext_info.rti_type) { - //急转弯 - 0x2 -> { - // 特殊处理左、右方向的 - when (direction) { - WarningDirectionEnum.ALERT_WARNING_LEFT, - WarningDirectionEnum.ALERT_WARNING_TOP_LEFT, - WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT -> { - appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_LEFT_SHARP.poiType - } - WarningDirectionEnum.ALERT_WARNING_RIGHT, - WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT, - WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT -> { - appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_RIGHT_SHARP.poiType - } - } - } - //施工 - 0x7 -> { - appId = EventTypeEnum.FOURS_ROAD_WORK.poiType - } - //限速 - 0xA -> { - appId = EventTypeEnum.TYPE_USECASE_ID_SLW.poiType - } - //事故 - 0xC -> { - appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType - } - //拥堵 - 0xD -> { - appId = EventTypeEnum.TYPE_USECASE_ID_TJW.poiType - } - //行人 - 0xF -> { - appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType - } - //禁止停车 - 0x13 -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_NO_PARKING.poiType - } - //学校 - 0x14 -> { - appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_SCHOOL.poiType - } - //桥梁 - 0x17 -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_HUMP_BRIDGE.poiType - } - //轻轨电车 - 0x18 -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_TRAMCAR.poiType - } - //人行横道 - 0x19 -> { - appId = - EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType - } - //减速慢行 - 0x1A -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_GIVE_WAY.poiType - } - //事故易发路段 - 0x1B -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType - } - //环岛行驶 - 0x1C -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_ROUNDABOUTPNG.poiType - } - //环岛行驶 - 0x1D -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_TEST_SECTION.poiType - } - //驼峰桥 - 0x1E -> { - appId = EventTypeEnum.TYPE_USECASE_ID_ROAD_HUMP_BRIDGE.poiType - } - } - alertContent = EventTypeEnum.getWarningContent(appId) - ttsContent = EventTypeEnum.getWarningTts(appId) - } - // 前方拥堵提醒 - EventTypeEnum.TYPE_USECASE_ID_TJW.poiType -> { - ttsContent = EventTypeEnum.getWarningTts(appId) - if (info.threat_info != null) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "ttsContent = $ttsContent --alertContent = $alertContent ---info.threat_info.distance = ${info.threat_info.distance} " - ) - if (info.threat_info.distance.toInt() != 0) { - alertContent = String.format( - EventTypeEnum.getWarningContent(appId), - info.threat_info.distance.toInt() - ) - } else { - alertContent = "前方拥堵,减速慢行" - } - } - - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "ttsContent = $ttsContent --alertContent = $alertContent" - ) - } - } - - when (status) { - // 添加 - ObuConstants.STATUS.ADD -> { - //不显示弹框,其它保留 - 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, - alertContent, - ttsContent) - ) - ) - CallerHmiManager.warningV2X( - appId, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } - }, - true, - 5000L - ) - } - - ObuConstants.STATUS.UPDATE -> { - //显示警告红边 TODO 需要确定是什么值 -// CallerHmiManager.showWarning(direction) - - // 更新数据 - TrafficDataConvertUtils.cvxRtiThreatIndInfo2TrafficData(info)?.let { - CallerObuListenerManager.invokeTrackerWarningInfo(it) - CallerMapUIServiceManager.getMarkerService() - ?.updateITrafficThreatLevelInfo(it) - } - } - - // 删除 - ObuConstants.STATUS.DELETE -> { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - // 移除顶部弹窗 -// CallerHmiManager.disableWarningV2X((appId + direction.direction).toString()) - // 更新数据 - TrafficDataConvertUtils.cvxRtiThreatIndInfo2TrafficData(info)?.let { - CallerObuListenerManager.removeTrackerWarningInfo(it) - // 事件结束,还原车辆颜色 - it.threatLevel = 0x01 - CallerMapUIServiceManager.getMarkerService() - ?.updateITrafficThreatLevelInfo(it) - } - } - } - } -// } - } - - // (4) V2I预警信息:CVX_IVP_THREAT_IND,红绿灯 - override fun onCvxIvpThreatIndInfo(info: CvxIvpThreatIndInfo?) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "CvxIvpThreatIndInfo ------> $info" - ) - if (info != null && info.ext_info != null - && info.threat_info != null - && info.ext_info.lights != null - && info.ext_info.lights.isNotEmpty() - ) { -// 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) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxPtcInfoIndInfo ------> $info" - ) - // 交通参与者类型 0x0:未知 UNKNOWN | 0x1:非机动车 NON_MOTOR | 0x2:行人 PEDESTRIAN 0x3:RSU - if (info != null && (info.ptc_type == 1 || info.ptc_type == 2)) { - //v2i数据传输延迟 -// val hvMillTime = info.threat_info.hv_time.millisecond -// val hvSecondMillTime = (info.threat_info.hv_time.second) * 1000 -// val hvTime = hvMillTime + hvSecondMillTime -// val currentTime = TimeUtils.getNowMills() % 60000 -// val delayTime = currentTime - hvTime - -// CallerObuListenerManager.invokeDelayTime(delayTime) -// CallerLogger.d( -// "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", -// "onCvxPtcInfoIndInfo ---delayTime---> $delayTime" -// ) - - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxPtcInfoIndInfo ---status---> ${info.status}" - ) - var v2xType = "" - if (info.ptc_type == 1) { //摩托车 - v2xType = EventTypeEnum.TYPE_USECASE_ID_VRUCW_MOTORBIKE.poiType - } else if (info.ptc_type == 2) { //行人 - v2xType = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType - } - val ttsContent = EventTypeEnum.getWarningTts(v2xType) - val alertContent = EventTypeEnum.getWarningContent(v2xType) - val direction = - getMessageDirection(if (info.ext_info != null) info.ext_info.target_classification else -1) - val level = if (info.threat_info != null) info.threat_info.threat_level else -1 - - when (info.status) { - // 添加 - ObuConstants.STATUS.ADD -> { - // 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 ") - if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) { - Log.d("MsgBox-PriObuManager5", "alertContent或ttsContent为空!") - } - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.OBU, - V2XMsg(v2xType, - alertContent, - ttsContent) - ) - ) - CallerHmiManager.warningV2X( - v2xType, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (v2xType + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - } - }, - true, - 5000L - ) -// } - - // 更新数据 - TrafficDataConvertUtils.cvxPtcThreatIndInfo2TrafficData(info)?.let { - CallerObuListenerManager.invokeTrackerWarningInfo(it) - CallerMapUIServiceManager.getMarkerService() - ?.updateITrafficThreatLevelInfo(it) - } - } - - ObuConstants.STATUS.UPDATE -> { - } - - // 删除 - ObuConstants.STATUS.DELETE -> { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - // 更新数据 - TrafficDataConvertUtils.cvxPtcThreatIndInfo2TrafficData(info)?.let { - CallerObuListenerManager.removeTrackerWarningInfo(it) - // 事件结束,还原交通参与者颜色 - it.threatLevel = 0x01 - CallerMapUIServiceManager.getMarkerService() - ?.updateITrafficThreatLevelInfo(it) - } -// CallerHmiManager.disableWarningV2X(ObuConstants.USE_CASE_ID.VRUCW.toString()) - } - } - - } -// } - } - - // (5) 限速预警信息:CVX_SLW_THREAT_IND - override fun onCvxSlwThreatIndInfo(info: CvxSlwThreatIndInfo?) { - //todo 限速走高精地图 屏蔽OBU限速\ -// CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxSlwThreatIndInfo ------> $info") -// if (info != null) { -// when (info.status) { -// // 添加 -// ObuConstants.STATUS.ADD, -// ObuConstants.STATUS.UPDATE -// -> { -// if (info.ext_info != null) { -// // 计算为千米每小时 TODO 这里需要做一下向上取整数,40,60,80,120等 -// CallerLogger.d( -// "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", -// "info.ext_info.speed_limit_max ------> ${info.ext_info.speed_limit_max}" -// ) -// CallerHmiManager.showLimitingVelocity((Math.round(((info.ext_info.speed_limit_max * 60 * 60) / 1000) / 10) * 10).toInt()) -// } -// } -// // 删除 -// ObuConstants.STATUS.DELETE -> { -// CallerHmiManager.disableLimitingVelocity() -// } -// } -// } - } - - - // (1) V2V预警信息:CVX_V2V_THREAT_IND - override fun onCvxV2vThreatIndInfo(info: CvxV2vThreatIndInfo?) { -// if (HmiBuildConfig.isShowObuV2vView) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxV2vThreatIndInfo ------> $info" - ) - info?.let { - //预警信息,预警类型 threat_level 2、3 - info.threat_info?.let { - //预警方位 - val direction = - getMessageDirection(if (info.ext_info != null) info.ext_info.target_classification else -1) - //处理预警类型 - val appId = info.threat_info.app_id - val level = info.threat_info.threat_level - val status = info.status - if (info.ext_info != null) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "onCvxV2vThreatIndInfo target_classification = ${ - getMessageDirection(info.ext_info.target_classification) - } --- direction = $direction --- appId = $appId ---level = $level -- status = $status" - ) - } - - handleSdkObu(appId, direction, status, level, info) - } - } - } -// } - } - - /** - * 返回OBU监听 - */ - fun getMogoObuListener(): OnMogoObuListener { - return mogoObuListener - } - - /** - * 获取消息的方位 车辆相关 - */ - private fun getMessageDirection(targetClassification: Int): WarningDirectionEnum { - CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "预警红边:预警方向->$targetClassification") - return when (targetClassification) { - ObuConstants.TARGET_CLASSIFICATION.TC_ONCOMING_IN_LANE, - ObuConstants.TARGET_CLASSIFICATION.TC_AHEAD_IN_LANE, - 0x04 -> WarningDirectionEnum.ALERT_WARNING_TOP //正前方 - - 0x03 -> WarningDirectionEnum.ALERT_WARNING_RIGHT //正右方 - - ObuConstants.TARGET_CLASSIFICATION.TC_BEHIND_IN_LANE, - 0x05 -> WarningDirectionEnum.ALERT_WARNING_BOTTOM //正后方 - - 0x02 -> WarningDirectionEnum.ALERT_WARNING_LEFT //正左方 - - ObuConstants.TARGET_CLASSIFICATION.TC_AHEAD_LEFT, - ObuConstants.TARGET_CLASSIFICATION.TC_AHEAD_FAR_LEFT, - ObuConstants.TARGET_CLASSIFICATION.TC_ONCOMING_LEFT, - ObuConstants.TARGET_CLASSIFICATION.TC_ONCOMING_FAR_LEFT, - ObuConstants.TARGET_CLASSIFICATION.TC_INTERSECTION_LEFT -> WarningDirectionEnum.ALERT_WARNING_TOP_LEFT //左前方 - - ObuConstants.TARGET_CLASSIFICATION.TC_ONCOMING_FAR_RIGHT, - ObuConstants.TARGET_CLASSIFICATION.TC_AHEAD_FAR_RIGHT, - ObuConstants.TARGET_CLASSIFICATION.TC_AHEAD_RIGHT, - ObuConstants.TARGET_CLASSIFICATION.TC_INTERSECTION_RIGHT, - ObuConstants.TARGET_CLASSIFICATION.TC_ONCOMING_RIGHT -> WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT //右前方 - - ObuConstants.TARGET_CLASSIFICATION.TC_BEHIND_LEFT, - ObuConstants.TARGET_CLASSIFICATION.TC_BEHIND_FAR_LEFT -> WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT //左后方 - - ObuConstants.TARGET_CLASSIFICATION.TC_BEHIND_RIGHT, - ObuConstants.TARGET_CLASSIFICATION.TC_BEHIND_FAR_RIGHT -> WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT //右后方 - - ObuConstants.TARGET_CLASSIFICATION.TC_UNCLASSIFIED -> WarningDirectionEnum.ALERT_WARNING_NON //未知 - else -> WarningDirectionEnum.ALERT_WARNING_ALL - } - } - - fun release() { - MogoObuManager.getInstance().unregisterListener() - } - - /** - * 处理红绿灯 - */ - private fun handlerTrafficLight(appId: Int, status: Int, lights: List, index: Int) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "handlerTrafficLight appId = $appId --- status = $status ---index = $index ---lights.size = ${lights.size} ---lights = $lights " - ) - when (status) { - // 添加 - ObuConstants.STATUS.ADD, - ObuConstants.STATUS.UPDATE - -> { - changeTrafficLightStatus(appId, lights, index) - } - // 删除 - ObuConstants.STATUS.DELETE -> { - // 移除顶部弹窗 - CallerHmiManager.disableWarningTrafficLight() -// CallerHmiManager.disableWarningV2X(appId.toString()) - } - } - } - - private var isRedLight = false - private var isGreenLight = false - - /** - * 修改红绿灯 - */ - @Synchronized - private fun changeTrafficLightStatus( - appId: Int, - lights: List, - index: Int - ) { - var ttsContent = "" - var alertContent = "" - //这里需要根据真实数据确定 index 取值方式 - if (index != -1 && lights.size >= index) { - val currentLight = lights[index] - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "currentLight = $currentLight ---currentLight.phase = ${currentLight.phase} ---rlvw_violation_type = ${currentLight.rlvw_violation_type} --- index = $index ---appId = $appId ---appId = $appId" - ) - // 闯红灯预警 - when (currentLight.rlvw_violation_type) { - 0x0 -> {//不可用 V2I_RLVW_VIOLATION_TYPE_UNAVAILABLE - } - 0x1 -> {//无违规 V2I_RLVW_VIOLATION_TYPE_NO_VIOLATION -// CallerHmiManager.disableWarningV2X(appId.toString()) - } - 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 ") - if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) { - Log.d("MsgBox-PriObuManager1", "alertContent或ttsContent为空!") - } - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.OBU, - V2XMsg(appId.toString(), alertContent, ttsContent) - ) - ) - CallerHmiManager.warningV2X( - appId.toString(), alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), null, true, 5000L - ) - } - 0x3 -> {//闯黄灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_YELLOW_LIGHT - } - } - - when (currentLight.phase) { - // 灯光不可用 - 0x0 -> { - CallerHmiManager.showWarningTrafficLight(0, 3) - } - // 红灯 - 0x1 -> { - if (!isRedLight) { -// CallerHmiManager.disableWarningV2X(appId.toString()) - isRedLight = true - } - isGreenLight = false - CallerHmiManager.showWarningTrafficLight(1, 3) - - val red = currentLight.count_down.toInt() - CallerHmiManager.changeCountdownRed(red) - CallerHmiManager.changeCountdownGreen(0) - CallerHmiManager.changeCountdownYellow(0) - - } - // 绿灯 - 0x2 -> { - if (!isGreenLight) { -// CallerHmiManager.disableWarningV2X(appId.toString()) - isGreenLight = true - } - isRedLight = false - CallerHmiManager.showWarningTrafficLight(3, 3) - val green = currentLight.count_down.toInt() - CallerHmiManager.changeCountdownGreen(green) - //防止数据出现问题的容错 - CallerHmiManager.changeCountdownRed(0) - CallerHmiManager.changeCountdownYellow(0) - // 拼接建议速度 - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "speed_min = ${currentLight.glosa_suggested_speed_min} --speed_max = ${currentLight.glosa_suggested_speed_max.toInt()}" - ) - val adviceSpeed = - "${currentLight.glosa_suggested_speed_min.toInt()} - ${currentLight.glosa_suggested_speed_max.toInt()}" - - val adviceSpeedTts = - "${currentLight.glosa_suggested_speed_min.toInt()}到${currentLight.glosa_suggested_speed_max.toInt()}" - - ttsContent = - String.format( - EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType), - adviceSpeedTts - ) - - alertContent = - String.format( - EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType), - adviceSpeed - ) - - 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 ") - if (alertContent.isNullOrEmpty() || ttsContent.isNullOrEmpty()) { - Log.d("MsgBox-PriObuManager2", "alertContent或ttsContent为空!") - } - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.OBU, - V2XMsg(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType, - alertContent, - ttsContent) - ) - ) - CallerHmiManager.warningV2X( - EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType, - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - appId.toString(), - null, - true, - 5000L - ) - } - } - // 黄灯 - 0x3 -> { -// CallerHmiManager.disableWarningV2X(appId.toString()) - CallerHmiManager.showWarningTrafficLight(2, 2) - val yellow = currentLight.count_down.toInt() - CallerHmiManager.changeCountdownYellow(yellow) - CallerHmiManager.changeCountdownGreen(0) - CallerHmiManager.changeCountdownRed(0) - } - } - } - - } - - - //todo 二期优化此处内容,注解参数 - /** - * 构造对应展示数据和场景 根据obu的场景,add change delete确定是否展示 - * - * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 - * - */ - private fun handleSdkObu( - appId: Int, - direction: WarningDirectionEnum, - status: Int, - level: Int, - info: CvxV2vThreatIndInfo - ) { - // 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnum 提供的 - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "handleSdkObu appId = $appId --- handleDirection = $direction ---level = $level ---status = $status" - ) - var alertContent: String? = null - var ttsContent: String? = null - var changeVisualAngle = false - when (appId.toString()) { - // 变道预警,注意左后车辆/注意右后车辆 - EventTypeEnum.TYPE_USECASE_ID_LCW.poiType -> { - EventTypeHelper.getLCW(appId, direction) { alert, tts -> - alertContent = alert - ttsContent = tts - } - } - //车辆失控预警 - EventTypeEnum.TYPE_USECASE_ID_CLW.poiType -> { - EventTypeHelper.getCLW(appId, direction) { alert, tts -> - alertContent = alert - ttsContent = tts - } - } - //左转辅助 - EventTypeEnum.TYPE_USECASE_ID_LTA.poiType -> { - EventTypeHelper.getLTA(appId) { alert, tts -> - alertContent = alert - ttsContent = tts - } - } - //异常车辆提醒 - EventTypeEnum.TYPE_USECASE_ID_AVW.poiType -> { - EventTypeHelper.getAVW(appId, direction) { alert, tts -> - alertContent = alert - ttsContent = tts - } - } - //盲区预警 - EventTypeEnum.TYPE_USECASE_ID_BSW.poiType -> { - EventTypeHelper.getBSW(appId, direction) { alert, tts, visualAngle -> - alertContent = alert - ttsContent = tts - changeVisualAngle = visualAngle - } - } - //前车急刹预警 - EventTypeEnum.TYPE_USECASE_ID_EBW.poiType -> { - EventTypeHelper.getEBW(appId) { alert, tts -> - alertContent = alert - ttsContent = tts - } - } - //前向碰撞预警 - EventTypeEnum.TYPE_USECASE_ID_FCW.poiType -> { - EventTypeHelper.getFCW(appId) { alert, tts -> - alertContent = alert - ttsContent = tts - } - } - //逆向超车预警 - EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType -> { - EventTypeHelper.getDNPW(appId) { alert, tts -> - alertContent = alert - ttsContent = tts - } - } - - // 这里处理固定的提示信息,包括了<紧急车辆提醒> - else -> { - ttsContent = EventTypeEnum.getWarningTts(appId.toString()) - alertContent = EventTypeEnum.getWarningContent(appId.toString()) - } - } - - when (status) { - // 添加,更新 add的时候,可能级别是2, - ObuConstants.STATUS.ADD, - ObuConstants.STATUS.UPDATE -> { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_OBU}", - "appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction" - ) - if (level == 2 || level == 3) { - //不显示顶部弹框,其它保留 - 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()) { - Log.d("MsgBox-PriObuManager3", "alertContent或ttsContent为空!") - } - CallerMsgBoxManager.saveMsgBox( - MsgBoxBean( - MsgBoxType.OBU, - V2XMsg(appId.toString(), - alertContent, - ttsContent) - ) - ) - CallerHmiManager.warningV2X( - appId.toString(), - alertContent, - ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (appId + direction.direction).toString(),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 - object : IMoGoWarningStatusListener { - - override fun onShow() { - super.onShow() - if (changeVisualAngle) { - CallerVisualAngleManager.changeVisualAngle(TooClose) - } - } - - override fun onDismiss() { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - if (changeVisualAngle) { - CallerVisualAngleManager.changeVisualAngle(Default()) - } - } - }, - true, - 5000L - ) - //显示警告红边 - CallerHmiManager.showWarning(direction) - } - //更新周边车辆进行预警颜色变换,车辆实时移动和变色 - TrafficDataConvertUtils.cvxV2vThreatIndInfo2TrafficData(info)?.let { - CallerObuListenerManager.invokeTrackerWarningInfo(it) - CallerMapUIServiceManager.getMarkerService()?.updateITrafficThreatLevelInfo(it) - } - } - // 删除 - ObuConstants.STATUS.DELETE -> { - // 关闭警告红边 - CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON) - // 移除顶部弹窗 -// CallerHmiManager.disableWarningV2X((appId + direction.direction).toString()) - //更新周边车辆进行预警颜色变换,车辆实时移动和变色 - TrafficDataConvertUtils.cvxV2vThreatIndInfo2TrafficData(info)?.let { - CallerObuListenerManager.removeTrackerWarningInfo(it) - it.threatLevel = 0x01 - CallerMapUIServiceManager.getMarkerService()?.updateITrafficThreatLevelInfo(it) - } - } - } - } - - -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt index e22a0d3f7e..3e47a0a414 100644 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/MogoPrivateObuNewManager.kt @@ -18,6 +18,7 @@ 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.CallerObuTrafficLightDisappearManager 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 @@ -29,10 +30,12 @@ import com.mogo.support.obu.MogoObuManager import com.mogo.support.obu.OnMogoObuListener import com.mogo.support.obu.constants.MogoObuComType import com.mogo.support.obu.constants.MogoObuConstants +import com.mogo.support.obu.constants.MogoObuLogLevel import com.mogo.support.obu.constants.MogoObuTopicId import com.mogo.support.obu.model.* import com.mogo.support.obu.model.advance.SpatLight import com.mogo.support.obu.option.MogoObuCom +import com.mogo.support.obu.option.MogoObuLog import com.mogo.support.obu.option.MogoObuOptions import org.json.JSONObject @@ -74,7 +77,7 @@ class MogoPrivateObuNewManager private constructor() { .build() //每次连接的时候如果连接连接了,先断开 - if (MogoObuManager.getInstance().connectStatus == 1) { + if (MogoObuManager.getInstance().connectStatus == MogoObuConstants.CONNECT_STATUS.CONNECTED) { try { MogoObuManager.getInstance().disconnect() } catch (e: Exception) { @@ -85,6 +88,35 @@ class MogoPrivateObuNewManager private constructor() { MogoObuManager.getInstance().connect(options) } + /** + * 断开新obu + */ + fun disConnectObu() { + try { + MogoObuManager.getInstance().disconnect() + } catch (e: Exception) { + e.printStackTrace() + } + } + + /** + * 新obu是否连接 + */ + fun isConnected(): Boolean { + return MogoObuManager.getInstance().connectStatus == MogoObuConstants.CONNECT_STATUS.CONNECTED + } + + fun setObuLog(isChecked: Boolean) { + MogoObuManager.getInstance().setEnableLog(isChecked) + + val builder: com.mogo.support.obu.option.MogoObuLog.Builder = + MogoObuLog.newBuilder().setEnableStdio(isChecked) + if (isChecked) { + builder.setStdioLevel(MogoObuLogLevel.DBG) + } + MogoObuManager.getInstance().logConfig(builder.build()) + } + fun getMogoObuListener(): OnMogoObuListener { return mogoObuListener } @@ -106,13 +138,6 @@ class MogoPrivateObuNewManager private constructor() { mObuStatusInfo.obuStatus = true CallerObuListenerManager.invokeListener(mObuStatusInfo) mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean("OBU", true) } - - //断开老obu - try { - com.zhidao.support.obu.MogoObuManager.getInstance().disConnect() - } catch (e: Exception) { - e.printStackTrace() - } } } @@ -170,10 +195,10 @@ class MogoPrivateObuNewManager private constructor() { */ override fun onMogoObuRvWarning(data: MogoObuRvWarningData) { super.onMogoObuRvWarning(data) -// if (HmiBuildConfig.isShowObuV2vView) { //TODO 临时需要关闭v2v开关 + if (HmiBuildConfig.isShowObuV2vView) { mObuStatusInfo.obuRvStatus = true CallerObuListenerManager.invokeListener(mObuStatusInfo) - if (!data.warningMsg.warningData.isNullOrEmpty()) { + if (data.warningMsg != null) { // 更新数据,远车数据,之前要匹配uuid TrafficDataConvertUtilsNew.cvxRvInfoIndInfo2TrafficData(data)?.let { CallerMapUIServiceManager.getMarkerService()?.updateITrafficLocationInfo(it) @@ -189,29 +214,26 @@ class MogoPrivateObuNewManager private constructor() { 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 - - //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 (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 + //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) - } + //拼凑数据 + if (appId != null) { + handleSdkObu(appId, direction, status, level, data) } } @@ -224,7 +246,7 @@ class MogoPrivateObuNewManager private constructor() { } } } -// } + } } /** @@ -233,13 +255,13 @@ class MogoPrivateObuNewManager private constructor() { override fun onMogoObuSpatWarning(data: MogoObuSpatWarningData) { super.onMogoObuSpatWarning(data) if (data != null) { -// if (HmiBuildConfig.isShowObuV2iView) { + if (HmiBuildConfig.isShowObuV2iView) { handlerTrafficLight( data.warningType, data.status, data.lights ) -// } + } } } @@ -253,7 +275,7 @@ class MogoPrivateObuNewManager private constructor() { */ 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 = "" @@ -499,7 +521,7 @@ class MogoPrivateObuNewManager private constructor() { } } } -// } + } } /** @@ -519,7 +541,7 @@ class MogoPrivateObuNewManager private constructor() { "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onMogoObuRsmWarning ------> ${data.toString()}" ) -// if (HmiBuildConfig.isShowObuV2iView) { + if (HmiBuildConfig.isShowObuV2iView) { if (HmiBuildConfig.isShowObuWeaknessTrafficView) { // 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu if (data != null && data.participant != null) { @@ -672,7 +694,7 @@ class MogoPrivateObuNewManager private constructor() { } } } -// } + } } /** @@ -765,30 +787,35 @@ class MogoPrivateObuNewManager private constructor() { // 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnumNew 提供的 var alertContent: String = "" var ttsContent: String = "" + var saveAppId: String = "" var changeVisualAngle = false when (appId) { - //交叉路口碰撞预警 + //前向碰撞预警 MogoObuConstants.V2X_WARNING_TYPE.FCW.toString() -> { alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType) ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_FCW.poiType } //交叉路口碰撞预警 MogoObuConstants.V2X_WARNING_TYPE.ICW.toString() -> { alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType) ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_ICW.poiType } //左转辅助预警 MogoObuConstants.V2X_WARNING_TYPE.LTA.toString() -> { alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType) ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_LTA.poiType } //盲区预警 MogoObuConstants.V2X_WARNING_TYPE.BSW.toString() -> { ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType) alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_BSW.poiType if ( direction == WarningDirectionEnum.ALERT_WARNING_LEFT || direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT || @@ -812,6 +839,7 @@ class MogoPrivateObuNewManager private constructor() { MogoObuConstants.V2X_WARNING_TYPE.LCW.toString() -> { alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType) ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_LCW.poiType if ( direction == WarningDirectionEnum.ALERT_WARNING_LEFT || direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT || @@ -833,12 +861,14 @@ class MogoPrivateObuNewManager private constructor() { MogoObuConstants.V2X_WARNING_TYPE.DNPW.toString() -> { alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType) ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_DNPW.poiType) + saveAppId = 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) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_EBW.poiType } //异常车辆提醒 @@ -847,6 +877,7 @@ class MogoPrivateObuNewManager private constructor() { ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType) alertContent = String.format(alertContent, direction.desc) ttsContent = String.format(ttsContent, direction.desc) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_AVW.poiType } //车辆失控预警 @@ -855,11 +886,13 @@ class MogoPrivateObuNewManager private constructor() { ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType) alertContent = String.format(alertContent, direction.desc) ttsContent = String.format(ttsContent, direction.desc) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_CLW.poiType } //车辆失控预警 MogoObuConstants.V2X_WARNING_TYPE.EVW.toString() -> { alertContent = EventTypeEnumNew.getWarningContent(EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType) ttsContent = EventTypeEnumNew.getWarningTts(EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType) + saveAppId = EventTypeEnumNew.TYPE_USECASE_ID_EVW.poiType } // 这里处理固定的提示信息,包括了<紧急车辆提醒> @@ -875,7 +908,7 @@ class MogoPrivateObuNewManager private constructor() { MogoObuConstants.STATUS.UPDATE -> { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "new handleSdkObu appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction" + "new handleSdkObu appId2 = $saveAppId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction" ) if (level == 2 || level == 3) { //不显示弹框,其它保留 @@ -883,7 +916,7 @@ class MogoPrivateObuNewManager private constructor() { MsgBoxBean( MsgBoxType.V2X, V2XMsg( - appId, + saveAppId, alertContent, ttsContent ) @@ -892,10 +925,10 @@ class MogoPrivateObuNewManager private constructor() { } ) CallerHmiManager.warningV2X( - appId, + saveAppId, alertContent, ttsContent,// 只有第一次才tts,防止更新的时候不断的提醒 - (appId + direction.direction),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 + (saveAppId + direction.direction),//使用当前事件类型+方向记录tag,当发生变化的时候关闭当前弹出新的 object : IMoGoWarningStatusListener { override fun onShow() { super.onShow() @@ -965,9 +998,7 @@ class MogoPrivateObuNewManager private constructor() { isShowGreenWave = false isShowRunRedLight = false isYellowLight = false -// lightCountDownRed = 1 -// lightCountDownGreen = 1 -// lightCountDownYellow = 1 + CallerObuTrafficLightDisappearManager.invokeObuTrafficLightDisappear() } } } @@ -978,11 +1009,6 @@ class MogoPrivateObuNewManager private constructor() { private var isShowGreenWave = false private var isShowRunRedLight = false -// private var lightCountDownRed : Int = 1 -// private var lightCountDownGreen : Int = 1 -// private var lightCountDownYellow : Int = 1 - - /** * 修改红绿灯 */ @@ -1051,15 +1077,13 @@ class MogoPrivateObuNewManager private constructor() { if (minSpeedTemp == maxSpeedTemp) { minSpeedTemp -= 5 } + if (minSpeedTemp < 0) { + minSpeedTemp = 1 + } 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(EventTypeEnumNew.TYPE_USECASE_ID_IVP_GREEN.poiType), @@ -1107,87 +1131,42 @@ class MogoPrivateObuNewManager private constructor() { } // 红灯 2, 3 -> { -// if (!isGreenLight) { //只有不是是绿灯,才能展示跳转到红灯 if (!isRedLight) { CallerHmiManager.disableWarningV2X(appId.toString()) isRedLight = true } isGreenLight = false isYellowLight = false -// lightCountDownYellow = 1 -// lightCountDownGreen = 1 - CallerObuTrafficLightListenerManager.invokeObuTrafficLight(1) val red = currentLight.countDown.toInt() -// Log.e("lixp", " ----11--- red --------- = $red ----lightCountDownRed = $lightCountDownRed ----isGreenLight = $isGreenLight") -// //记录当前红灯的上一帧的值 10,9,10 -// if (lightCountDownRed == 1) { //最后一个灯态是1 -// lightCountDownRed = red -// } -// -// if (lightCountDownRed < red) { //10 9 -// return -// } -// lightCountDownRed = red -// Log.e("lixp", " ----22--- red --------- = $red ----lightCountDownRed = $lightCountDownRed ----isGreenLight = $isGreenLight") CallerHmiManager.changeCountdownRed(red) -// } } // 绿灯 4, 5, 6 -> { -// if (!isYellowLight) { //只有不是黄灯的时候,才能跳转到绿灯 if (!isGreenLight) { CallerHmiManager.disableWarningV2X(appId.toString()) isGreenLight = true } isRedLight = false isYellowLight = false -// lightCountDownRed = 1 -// lightCountDownYellow = 1 CallerObuTrafficLightListenerManager.invokeObuTrafficLight(3) val green = currentLight.countDown.toInt() -// Log.e("lixp", " ----11--- green --------- = $green ---lightCountDownGreen = $lightCountDownGreen ----isYellowLight = $isYellowLight") -// if (lightCountDownGreen == 1) { -// lightCountDownGreen = green -// } -// -// if (lightCountDownGreen < green) { -// return -// } -// lightCountDownGreen = green -// Log.d("lixp", " ----22--- green --------- = $green ---lightCountDownGreen = $lightCountDownGreen ----isYellowLight = $isYellowLight") CallerHmiManager.changeCountdownGreen(green) -// } } // 黄灯 7, 8 -> { -// if (!isRedLight) { //黄灯只能跳转绿灯 if (!isYellowLight) { isYellowLight = true } isRedLight = false isGreenLight = false -// lightCountDownRed = 1 -// lightCountDownGreen = 1 - CallerHmiManager.disableWarningV2X(appId.toString()) CallerObuTrafficLightListenerManager.invokeObuTrafficLight(2) val yellow = currentLight.countDown.toInt() -// Log.e("lixp", " -----11-- yellow --------- = $yellow ---lightCountDownYellow = $lightCountDownYellow ----isYellowLight = $isYellowLight") -// if (lightCountDownYellow == 1) { -// lightCountDownYellow = yellow -// } -// -// if (lightCountDownYellow < yellow) { -// return -// } -// lightCountDownYellow = yellow -// Log.d("lixp", " -----22-- yellow --------- = $yellow ---lightCountDownYellow = $lightCountDownYellow ----isYellowLight = $isYellowLight") CallerHmiManager.changeCountdownYellow(yellow) } } -// } } diff --git a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/utils/TrafficDataConvertUtils.kt b/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/utils/TrafficDataConvertUtils.kt deleted file mode 100644 index 8e94bc8bc6..0000000000 --- a/core/function-impl/mogo-core-function-obu-mogo/src/main/java/com/mogo/eagle/core/function/obu/mogo/utils/TrafficDataConvertUtils.kt +++ /dev/null @@ -1,133 +0,0 @@ -package com.mogo.eagle.core.function.obu.mogo.utils - -import com.mogo.eagle.core.data.traffic.TrafficData -import com.mogo.eagle.core.data.enums.TrafficTypeEnum -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU -import com.zhidao.support.obu.constants.ObuConstants -import com.zhidao.support.obu.model.CvxPtcThreatIndInfo -import com.zhidao.support.obu.model.CvxRtiThreatIndInfo -import com.zhidao.support.obu.model.CvxRvInfoIndInfo -import com.zhidao.support.obu.model.CvxV2vThreatIndInfo - -/** - * @author xiaoyuzhou - * @date 2021/8/18 2:30 下午 - */ -object TrafficDataConvertUtils { - val TAG = "TrafficDataConvertUtils" - - /** - * OBU 远车 转换交通元素数据 - */ - fun cvxRvInfoIndInfo2TrafficData(info: CvxRvInfoIndInfo): TrafficData? { - if (info.basic_info == null || info.basic_info.position == null) { - CallerLogger.e("$M_OBU$TAG", "cvxRvInfoIndInfo2TrafficData 数据转换异常,请检查参数是否齐全") - return null - } - val trafficData = TrafficData() - trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE - trafficData.uuid = info.vehicle_id - trafficData.lat = info.basic_info.position.latitude - trafficData.lon = info.basic_info.position.longitude - trafficData.heading = info.basic_info.heading - trafficData.speed = info.basic_info.speed - - return trafficData - } - - /** - * OBU RSU道路事件预警信息 转换交通元素数据 - */ - fun cvxRtiThreatIndInfo2TrafficData(info: CvxRtiThreatIndInfo): TrafficData? { - // 这里只处理道路施工 - if(info.ext_info.rti_type != 0x7){ - return null - } - if (info.rti_id == null || info.ext_info == null - || info.zones_info == null || info.zones_info.first() == null - || info.zones_info.first().path_points.first() == null - || info.threat_info == null - ) { - CallerLogger.e("$M_OBU$TAG", "数据转换异常,请检查参数是否齐全") - return null - } - val trafficData = TrafficData() - trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_DAO_LU_SHI_GONG - trafficData.uuid = info.rti_id - - trafficData.lat = info.zones_info.first().path_points.first().latitude - trafficData.lon = info.zones_info.first().path_points.first().longitude - - trafficData.threatLevel = info.threat_info.threat_level - - return trafficData - } - - /** - * OBU 预警事件 转换交通元素数据 - */ - fun cvxV2vThreatIndInfo2TrafficData(info: CvxV2vThreatIndInfo): TrafficData? { - if (info.basic_info == null || info.basic_info.position == null || info.threat_info == null) { - CallerLogger.e("$M_OBU$TAG", "数据转换异常,请检查参数是否齐全") - return null - } - val trafficData = TrafficData() - trafficData.uuid = info.vehicle_id - trafficData.lat = info.basic_info.position.latitude - trafficData.lon = info.basic_info.position.longitude - trafficData.heading = info.basic_info.heading - trafficData.speed = info.basic_info.speed - // 判断车辆V2X预警级别,调整车辆颜色 - trafficData.threatLevel = info.threat_info.threat_level - - if (info.threat_info.app_id == ObuConstants.USE_CASE_ID.EVW) { - trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_SPECIAL_VEHICLE - } else { - trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_TA_CHE - } - - return trafficData - } - - /** - * OBU 弱势交通参与者信息 转换交通元素数据 TODO - */ - fun cvxPtcThreatIndInfo2TrafficData(info: CvxPtcThreatIndInfo): TrafficData? { - if (info.ptc_pos == null || info.threat_info == null) { - CallerLogger.e("$M_OBU$TAG", "数据转换异常,请检查参数是否齐全") - return null - } - val trafficData = TrafficData() - - trafficData.uuid = info.ptc_id - trafficData.lat = info.ptc_pos.latitude - trafficData.lon = info.ptc_pos.longitude -// trafficData.heading = info.ptc_pos.heading -// trafficData.speed = info.ptc_pos.speed - - when (info.ptc_type) { - // 未知 - 0x0 -> { - trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_WEI_ZHI - } - // 非机动车 - 0x1 -> { - trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_MOTO - } - // 行人 - 0x2 -> { - trafficData.type = TrafficTypeEnum.TYPE_TRAFFIC_ID_PEOPLE - } - } - - // 判断车辆V2X预警级别,调整车辆颜色 - if (info.threat_info != null) { - trafficData.threatLevel = info.threat_info.threat_level - } - - return trafficData - } - - -} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/LineUploadManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/LineUploadManager.kt new file mode 100644 index 0000000000..77fce2fd51 --- /dev/null +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/LineUploadManager.kt @@ -0,0 +1,78 @@ +package com.mogo.eagle.core.function.v2x + +import android.content.Context +import android.util.Log +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.constants.HostConst.DATA_CENTER_HOST +import com.mogo.eagle.core.data.v2x.LineUploadData +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.v2x.events.network.V2XRefreshModel +import com.mogo.eagle.core.function.v2x.road.V2XEventServiceApi +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers + +class LineUploadManager private constructor(context: Context) : IMoGoAutopilotStatusListener { + + companion object { + + private const val TAG = "LineUploadManager" + + @Volatile + private var lineUploadManager: LineUploadManager? = null + + @Synchronized + fun getInstance(context: Context): LineUploadManager? { + if (lineUploadManager == null) { + synchronized(V2XRefreshModel::class.java) { + if (lineUploadManager == null) { + lineUploadManager = LineUploadManager(context) + } + } + } + return lineUploadManager + } + } + + private var mContext: Context? = null + private var disposable: Disposable? = null + + init { + mContext = context + } + + fun init() { + Log.d("emArrow", "LineUploadManager addListener") + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + override fun onAutopilotRouteLineId(lineId: Long) { + super.onAutopilotRouteLineId(lineId) + if (lineId > 0) { + uploadLine(lineId) + } + } + + private fun uploadLine(lineId: Long) { + val lineUploadData = LineUploadData(lineId, MoGoAiCloudClientConfig.getInstance().sn) + disposable = MoGoRetrofitFactory.getInstance(DATA_CENTER_HOST) + .create(V2XEventServiceApi::class.java) + .uploadLineId(lineUploadData) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ data -> + Log.d("emArrow", " uploadLine : $data") + }, { + Log.d("emArrow", "e : ${it.message}") + }) + } + + fun onDestroy() { + mContext = null + disposable?.dispose() + CallerAutoPilotStatusListenerManager.removeListener(TAG) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt index 460656b069..db01053a32 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/V2XProvider.kt @@ -19,13 +19,21 @@ class V2XProvider : IV2XEventProvider { override val functionName: String get() = "V2XProvider" + + private var mContext:Context? = null + override fun init(context: Context) { + mContext = context CallerTrafficLightManager.getTrafficLightProvider().initTrafficLightServer(context) VipCarManager.INSTANCE.initServer(context) SpeedLimitDataManager.getInstance().start() TrafficLightDispatcher.INSTANCE.initServer(context) SpeedLimitDispatcher.INSTANCE.initLimit(context) + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + LineUploadManager.getInstance(context)?.init() + } + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { //不处理 } else { @@ -48,6 +56,12 @@ class V2XProvider : IV2XEventProvider { V2XEventManager.onDestroy() } + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + mContext?.let { + LineUploadManager.getInstance(it)?.onDestroy() + } + } + // RedLightWarningManager.INSTANCE.onDestroy() } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt index 12d03d56ac..e02afb9d09 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/V2XEventManager.kt @@ -7,6 +7,7 @@ import android.util.* import androidx.localbroadcastmanager.content.* import com.mogo.cloud.passport.* import com.mogo.commons.constants.HostConst +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.ServiceConst.CARD_TYPE_ROAD_CONDITION import com.mogo.commons.module.status.IMogoStatusChangedListener import com.mogo.commons.module.status.MogoStatusManager @@ -68,6 +69,7 @@ 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.mogo.storage.* import com.mogo.eagle.core.utilcode.util.* +import com.mogo.eagle.core.utilcode.util.BuildConfig import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.Utils import com.mogo.map.listener.* @@ -112,7 +114,7 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb V2XManager.init(V2XConfig.Builder().also { it.aiCloudConfig(MoGoAiCloudClientConfig.getInstance()) it.context(context) - it.loggable(true) + it.loggable(DebugConfig.isDebug()) it.distanceForTriggerRefresh(200f) //行驶超过200(包含)米,刷新道路周边信息(短链请求) it.durationForTriggerRefresh( 60, diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java index 7019f0601f..95c65ff2b7 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/alarm/V2XAlarmServer.java @@ -35,7 +35,6 @@ public class V2XAlarmServer { CopyOnWriteArrayList v2XRoadEventEntityList, MogoLocation currentLocation) { try { - Log.d("RWJ", "getDriveFrontAlarmEvent --- 1 ---" + currentLocation ); if (!showedEvents.isEmpty()) { Iterator iterator = showedEvents.iterator(); while (iterator.hasNext()) { @@ -52,7 +51,6 @@ public class V2XAlarmServer { } } } - Log.d("RWJ", "getDriveFrontAlarmEvent --- 2 ---" + currentLocation); if (currentLocation != null && v2XRoadEventEntityList != null) { // 因为集合是按照距离排序后的所以这里检索出来第一个就发出警告 for (V2XRoadEventEntity v2XRoadEventEntity : v2XRoadEventEntityList) { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/marker/MarkerManager.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/marker/MarkerManager.kt index 01387ee060..032df3a43f 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/marker/MarkerManager.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/marker/MarkerManager.kt @@ -96,43 +96,39 @@ object MarkerManager { } val currentLocation = carLoc.get() val lastLocation = if (marker.coordinateType == 0) lastCarLocation.get() else lastGpsLocation.get() - - if (marker.coordinateType == 0) { - lastCarLocation.set(currentLocation) - } else { - lastGpsLocation.set(currentLocation) - } if (currentLocation != null && lastLocation != null) { val delta = CoordinateUtils.calculateLineDistance(currentLocation.longitude, currentLocation.latitude, lastLocation.longitude, lastLocation.latitude) - Log.d(TAG, "--- checkTask --- 4 ---:delta:$delta") + 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}") + 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}") + 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}") + Log.e(TAG, "--- checkTask --- remove line error:${t.message}, id: ${marker.id}") } } if (!removeLineError && !removeMarkerError) { @@ -186,6 +182,7 @@ object MarkerManager { fun addMarker(marker: MarkerWrapper) { + Log.d(TAG, "=== addMarker ====: $marker") synchronized(showedMarkers) { showedMarkers.offer(marker) } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XRefreshModel.java b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XRefreshModel.java index 5f0d5a63e8..e2e061f259 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XRefreshModel.java +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/network/V2XRefreshModel.java @@ -27,7 +27,7 @@ import okhttp3.RequestBody; public class V2XRefreshModel { private Context mContext; - private static V2XRefreshModel mV2XRefreshModel; + private static volatile V2XRefreshModel mV2XRefreshModel; private V2XRefreshModel() { } diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt index dfbf16bf89..06bc9193de 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/events/scenario/scene/airoad/AiRoadMarker.kt @@ -144,8 +144,8 @@ class AiRoadMarker { if (line != null) { wrapper.addLine(line) } - MarkerManager.addMarker(wrapper) } + MarkerManager.addMarker(wrapper) } private fun removeLine() { diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventServiceApi.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventServiceApi.kt index 5b73866375..d24d0cdce1 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventServiceApi.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/road/V2XEventServiceApi.kt @@ -1,11 +1,18 @@ package com.mogo.eagle.core.function.v2x.road +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.v2x.LineUploadData import io.reactivex.Observable -import retrofit2.http.GET -import retrofit2.http.Query +import retrofit2.http.* interface V2XEventServiceApi { @GET("/eagleEye-mis/config/queryV2NInformation") fun queryAllV2XEventsByLineId(@Query("lineId") lineId: String, @Query("sn") sn: String): Observable + + @Headers("Content-type:application/json;charset=UTF-8" ) + @POST( "/yycp-data-center-service/carTrack/receiveCarTrack/") + fun uploadLineId(@Body lineId: LineUploadData): Observable + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/TrafficLightDispatcher.kt index 03ca1b2c9d..97700be14c 100644 --- a/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/TrafficLightDispatcher.kt +++ b/core/function-impl/mogo-core-function-v2x/src/main/java/com/mogo/eagle/core/function/v2x/trafficlight/core/TrafficLightDispatcher.kt @@ -2,13 +2,14 @@ package com.mogo.eagle.core.function.v2x.trafficlight.core import android.content.Context import android.os.Handler -import android.util.Log 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.IMoGoObuTrafficLightDisapperListener 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.CallerObuTrafficLightDisappearManager import com.mogo.eagle.core.function.call.obu.CallerObuTrafficLightListenerManager import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.v2x.trafficlight.TrafficLightHMIManager @@ -21,7 +22,7 @@ import perception.TrafficLightOuterClass.TrafficLight * @since: 2022/4/28 */ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLightListener, - IMoGoObuTrafficLightListener { + IMoGoObuTrafficLightListener, IMoGoObuTrafficLightDisapperListener { companion object { const val TAG = "TrafficLightDispatcher" @@ -50,6 +51,8 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight CallerAutopilotIdentifyListenerManager.addListener(TAG, this) //obu红绿灯数据 CallerObuTrafficLightListenerManager.registerObuTrafficLightListener(TAG, this) + //obu红绿灯数据消失 + CallerObuTrafficLightDisappearManager.registerObuTrafficLightListener(TAG, this) } /** @@ -94,7 +97,9 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight //黑灯,隐藏红绿灯显示 TrafficLightHMIManager.INSTANCE.hideTrafficLight() } - else -> {} + else -> { + TrafficLightHMIManager.INSTANCE.hideTrafficLight() + } } } @@ -148,11 +153,14 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight * obu 红绿灯数据 */ override fun onObuTrafficLight(light: Int) { - super.onObuTrafficLight(light) hasObuLightStatus = true CallerHmiManager.showWarningTrafficLight(light, 3) } + override fun onObuLightDisapper() { + hasObuLightStatus = false + } + fun destroy() { //取消注册监听AI云获取红绿灯状态 CallerTrafficLightListenerManager.unRegisterTrafficLightListener(TAG) diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt index 1a43eab9b8..b92c85dfb9 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/app/AppConfigInfo.kt @@ -58,7 +58,7 @@ object AppConfigInfo { var netMode: Int = 3 // 角色 - var role: Int = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) + var role: Int = 0 // 是否可以网络连接 var isConnectNet: Boolean = false diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagDescriptionEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagDescriptionEntity.kt new file mode 100644 index 0000000000..823e6dfb24 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagDescriptionEntity.kt @@ -0,0 +1,12 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description bag附加信息(录音,备注,接管信息) + * @since: 2023/2/2 + */ +data class BagDescriptionEntity(var description: String,// bag接管描述或重命名信息 + var hasAudio: Boolean,// 此bag是否具有录音文件 + var audioUrl: String,// bag附加录音文件的文件名 + var reportBI: Boolean //上报BI状态 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagInfoEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagInfoEntity.kt new file mode 100644 index 0000000000..8b15aee887 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagInfoEntity.kt @@ -0,0 +1,20 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 单个key值对应的包信息 + * @since: 2023/2/1 + */ +class BagInfoEntity(){ + var key: Long = 0// bag key值 + var totalSize: Long = 0// 所有子包或合并后的包的总大小 + var timestamp: String = ""// 时间戳 + var bagPath: String ?= null// bag所在路径 + var mergeStat: Boolean = false// 合并状态 + var uploadStat: Boolean = false// 上传cos桶状态 + var description: BagDescriptionEntity ?= null// 包描述信息 + var subBags: ArrayList =ArrayList()// 子包信息 + var selectStatus: Boolean = false //Bag包勾选状态,默认为未勾选 + var itemType: Int = 0 //0是正常Bag包,1为时间Title + var timeStr: String = "" +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagManagerEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagManagerEntity.kt new file mode 100644 index 0000000000..21bf91c857 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagManagerEntity.kt @@ -0,0 +1,15 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 包管理请求 + * @since: 2023/2/1 + */ +class BagManagerEntity(){ + var reqType: Int = 1// 请求类型:0-invalid 1-获取空间使用信息 2-遍历所有bag 3-上传cos 4-删除bag 5-为bag添加附加信息 + var keyReq: Long =0// 要操作的包的key值,发送请求且reqType=(3,4,5)时有效 + var descReq: BagDescriptionEntity ?= null// 更新包附加信息,发送请求且reqType=5时有效 + var spaceInfoResp: List = ArrayList()// 空间使用信息,获取响应且reqType=1时有效 + val bagsInfoResp: MutableList = ArrayList()// 包信息列表,获取响应且reqType=2时有效 + var uploadCosResp: UploadCosStatEntity ?=null//反馈上传cos桶结果,获取响应且reqType=3时有效 +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagSpaceInfoEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagSpaceInfoEntity.kt new file mode 100644 index 0000000000..ce7651e0f2 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagSpaceInfoEntity.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description bag目录空间使用情况 + * @since: 2023/2/1 + */ +data class BagSpaceInfoEntity(var host: String,// 主机名 + var diskSpaceInfo: SpaceInfoEntity,// 硬盘空间信息 + var BagDirsSpaceInfo: List// /home/mogo/data/bags下各子空间信息 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SpaceInfoEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SpaceInfoEntity.kt new file mode 100644 index 0000000000..fdf174bf4e --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SpaceInfoEntity.kt @@ -0,0 +1,13 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 车端BadCase存储空间使用情况 + * @since: 2023/2/1 + */ +data class SpaceInfoEntity( + var directory: String,// 路径名,为空表示总空间,否则表示对应的/home/mogo/data/bags下的子目录 + var total: Long,// 总空间 + var free: Long,// 可用空间 + var used: Long // 已用空间 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SubBagEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SubBagEntity.kt new file mode 100644 index 0000000000..c52c375ab5 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SubBagEntity.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 各主机上报的包信息 + * @since: 2023/2/1 + */ +data class SubBagEntity(var key: Long,//bag key值 + var host: String,//主机名 + var size: Long //此子包的大小 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/UploadCosStatEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/UploadCosStatEntity.kt new file mode 100644 index 0000000000..ae8d276ace --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/UploadCosStatEntity.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 上传cos桶状态 + * @since: 2023/2/1 + */ +data class UploadCosStatEntity(var key: Long, + var stat: Int,// 0-成功 1-执行中 2-copy过程失败 3-合并过程失败 4-上传过程失败 + var message: String// 失败时的具体描述 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt index ffeb84a730..d623504d63 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt @@ -78,6 +78,15 @@ object FunctionBuildConfig { @JvmField var isRomaMode = true + /** + * 开启roma自由/循迹路线 + * 0:自由模式 + * 1:循迹模式 + */ + @Volatile + @JvmField + var romaModeStyle = 0 + /** * 是否开启感知物替换颜色功能 * 默认关闭 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt index f156f8b981..1f551208f2 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/HmiBuildConfig.kt @@ -105,14 +105,14 @@ object HmiBuildConfig { */ @JvmField @Volatile - var isShowObuV2vView = false + var isShowObuV2vView = true /** * 是否展示obu的v2i */ @JvmField @Volatile - var isShowObuV2iView = false + var isShowObuV2iView = true /** * 是否展示obu通过工控机展示的v2i diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/OperationMsg.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/OperationMsg.kt index 230e98dca5..75e7be26bd 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/OperationMsg.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/OperationMsg.kt @@ -1,8 +1,16 @@ package com.mogo.eagle.core.data.msgbox +import android.util.Log +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import java.io.Serializable /** * 运营消息:-1表示初始值 */ -data class OperationMsg(val timestamp : Long, val content: String, val type: Int = -1): Serializable +data class OperationMsg(val timestamp : Long, val content: String, val type: Int = -1): Serializable { + init { + if (content.isEmpty()) { + CallerLogger.e("MsgBox", Log.getStackTraceString(Throwable())) + } + } +} diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/V2XMsg.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/V2XMsg.kt index 374c545563..b4f98777f5 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/V2XMsg.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/V2XMsg.kt @@ -1,5 +1,7 @@ package com.mogo.eagle.core.data.msgbox +import android.util.Log +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import java.io.Serializable data class V2XMsg(var type: String = "", var content: String? = "", var tts: String? = ""): Serializable { @@ -9,5 +11,8 @@ data class V2XMsg(var type: String = "", var content: String? = "", var tts: Str init { timeStamp = System.currentTimeMillis() + if (content.isNullOrEmpty()) { + CallerLogger.e("MsgBox", Log.getStackTraceString(Throwable())) + } } } \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/obu/ObuStatusInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/obu/ObuStatusInfo.kt index b0206c4d42..cbf40c1031 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/obu/ObuStatusInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/obu/ObuStatusInfo.kt @@ -6,8 +6,6 @@ package com.mogo.eagle.core.data.obu * OBU 相关的状态信息数据 */ class ObuStatusInfo { - // 当前链接的IP地址, 默认地址 192.168.1.199 - var connectIP: String = "192.168.1.199" var obuSdkVersion = "" diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/v2x/LineUploadData.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/v2x/LineUploadData.kt new file mode 100644 index 0000000000..8700029ed9 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/v2x/LineUploadData.kt @@ -0,0 +1,6 @@ +package com.mogo.eagle.core.data.v2x + +/** + * 路线上报 + */ +data class LineUploadData(val lineId:Long,val sn:String) \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotActionsListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotActionsListener.kt index ed661bbed4..0d6f64c173 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotActionsListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotActionsListener.kt @@ -1,6 +1,5 @@ package com.mogo.eagle.core.function.api.autopilot -import com.zhidao.support.adas.high.bean.AutopilotAbility interface IMoGoAutopilotActionsListener { @@ -8,5 +7,5 @@ interface IMoGoAutopilotActionsListener { /** * pnc actions 决策 驾驶的意图 */ - fun onAutopilotAbility(ability: AutopilotAbility?) + fun onAutopilotAbility(isAutopilotAbility: Boolean, unableAutopilotReason: String?) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt index edb38584ed..40e69e6be4 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.api.autopilot import chassis.SpecialVehicleTaskCmdOuterClass import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.trafficlight.TrafficLightResult import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider @@ -187,6 +188,12 @@ interface IMoGoAutopilotProvider : IMoGoFunctionServerProvider { */ fun getBadCaseConfig(reqType: Int,recordType: Int,topicsNeedToCache: List): Boolean + /** + * 获取Bag包管理信息 + * @param bagManagerEntity 包管理请求实体类 + */ + fun sendBagManagerCmd(bagManagerEntity: BagManagerEntity): Boolean + /** * 发送工控机所有节点重启命令 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt index e622e30726..4cca4b7e3d 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.api.autopilot +import bag_manager.BagManagerOuterClass import mogo.telematics.pad.MessagePad import record_cache.RecordPanelOuterClass @@ -20,4 +21,9 @@ interface IMoGoAutopilotRecordListener { */ fun onAutopilotRecordConfig(config: MessagePad.RecordDataConfig){} + /** + * 录包任务管理应答 + */ + fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager){} + } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt index 73aa0a4baa..4bb3e99cfe 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotStatusListener.kt @@ -45,7 +45,12 @@ interface IMoGoAutopilotStatusListener { /** * 工控机主动查询 AdasManager#sendStatusQueryReq(),后会收到如下回调 */ - fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) { } + fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {} + + /** + * 自动驾驶路线ID回调 + */ + fun onAutopilotRouteLineId(lineId: Long){} companion object { /** diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoStartAutopilotFailedListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoStartAutopilotFailedListener.kt index 8a8a83a4c3..f1f75862f6 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoStartAutopilotFailedListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoStartAutopilotFailedListener.kt @@ -1,6 +1,5 @@ package com.mogo.eagle.core.function.api.autopilot -import com.zhidao.support.adas.high.bean.AutopilotAbility import mogo_msg.MogoReportMsg diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index a0ada685ff..b1c5ccd203 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -100,6 +100,11 @@ interface IDevaToolsProvider : IProvider { */ fun showFeedbackWindow(ctx: Context) + /** + * 展示录包管理页面 + */ + fun showBadCaseManagerView(context: Context) + /** * 获取升级版本Urls */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt index 6927c467f3..bc1a7dadbb 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/warning/IMoGoWaringProvider.kt @@ -89,6 +89,11 @@ interface IMoGoWaringProvider : IMoGoHmiViewProxy { */ fun toggleSOPView() + /** + * 开关Bag包任务管理页面 + */ + fun toggleBagManagerView() + /** * 展示VR下V2X预警 * @@ -302,16 +307,6 @@ interface IMoGoWaringProvider : IMoGoHmiViewProxy { */ fun updateStatusBarLeftView(insert: Boolean, tag: String, viewGroup: ViewGroup) - /** - * 设置司机端消息盒子是否展示 - */ - fun updateDriverMsgBoxTipView(show: Boolean) - - /** - * 设置乘客端消息盒子是否展示 - */ - fun updatePassengerMsgBoxTipView(show: Boolean) - /** * 更新(添加/删除)下载进度 */ @@ -322,4 +317,5 @@ interface IMoGoWaringProvider : IMoGoHmiViewProxy { */ fun updateMfStatus(tag: String, status: Boolean) + fun updateHDDataCacheStatus(isCached: Boolean) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/msgbox/IMsgBoxEventListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/msgbox/IMsgBoxEventListener.kt index cebfca9d9b..8cd6469ae6 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/msgbox/IMsgBoxEventListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/msgbox/IMsgBoxEventListener.kt @@ -1,9 +1,25 @@ package com.mogo.eagle.core.function.api.msgbox + +import com.mogo.eagle.core.data.msgbox.MsgBoxBean + /** * @author XuXinChao * @date 2023/1/16 * 消息盒子事件监听回调 */ interface IMsgBoxEventListener { + //汇总事件点击监听 fun onSummaryClickEvent() + + //更新提示红点视图 + fun onUpdateTipEvent(isShow: Boolean) + + //气泡态运营平台事件点击监听 + fun onBubbleOperationClickEvent(msgBoxBean: MsgBoxBean) + + //气泡态V2X消息事件点击监听 + fun onBubbleV2XClickEvent(msgBoxBean: MsgBoxBean) + + //气泡态上报消息事件点击监听 + fun onBubbleReportClickEvent(msgBoxBean: MsgBoxBean) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuProvider.kt index 7f07c4f11e..9bafd7eca7 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuProvider.kt @@ -14,4 +14,6 @@ interface IMoGoObuProvider : IMoGoFunctionServerProvider { fun disConnect() fun isConnected(): Boolean + + fun setObuLibLog(isSet: Boolean) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightDisapperListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightDisapperListener.kt new file mode 100644 index 0000000000..a5297714cd --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightDisapperListener.kt @@ -0,0 +1,12 @@ +package com.mogo.eagle.core.function.api.obu + + +/** + * @author lixiaopeng + * @date 2022/1/30 10:28 下午 + * OBU 灯态信息 消失 + */ +interface IMoGoObuTrafficLightDisapperListener { + + fun onObuLightDisapper() +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightListener.kt index 1b4be4e95c..de5b5aee6a 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/obu/IMoGoObuTrafficLightListener.kt @@ -11,5 +11,4 @@ interface IMoGoObuTrafficLightListener { * @param light 灯的信息 */ fun onObuTrafficLight(light: Int){} - } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt index cfa4f96652..21ae85a9b2 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.call.autopilot import android.os.SystemClock import chassis.SpecialVehicleTaskCmdOuterClass import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig @@ -269,6 +270,19 @@ object CallerAutoPilotManager { } } + /** + * 获取Bag包管理信息 + * @param bagManagerEntity 包管理请求实体类 + */ + fun sendBagManagerCmd(bagManagerEntity: BagManagerEntity): Boolean?{ + // 司机屏才能查询数据采集的配置 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + return providerApi?.sendBagManagerCmd(bagManagerEntity) + }else{ + return false + } + } + /** * 向左变道 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt index 60056dc1a2..e35b7565e3 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt @@ -10,6 +10,7 @@ import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg import system_master.* import java.util.concurrent.ConcurrentHashMap +import kotlin.properties.Delegates /** * @author xiaoyuzhou @@ -22,6 +23,16 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { @Volatile private var mAutopilotStatusInfo: AutopilotStatusInfo = AutopilotStatusInfo() + private var lineId: Long? by Delegates.observable(0) { _, _, newValue -> + if(newValue == null){ + return@observable + } + M_AUTOPILOT_STATUS_LISTENERS.forEach { + val listener = it.value + listener.onAutopilotRouteLineId(newValue) + } + } + // 存储所有注册了监听的对象,invokeXXXX进行遍历回调,将信息同步 private val M_AUTOPILOT_STATUS_LISTENERS: ConcurrentHashMap = ConcurrentHashMap() @@ -209,6 +220,7 @@ object CallerAutoPilotStatusListenerManager : CallerBase() { */ fun updateAutopilotControlParameters(autopilotControlParameters: AutopilotControlParameters? = null) { mAutopilotStatusInfo.autopilotControlParameters = autopilotControlParameters + lineId = autopilotControlParameters?.autoPilotLine?.lineId invokeAutoPilotStatus(mAutopilotStatusInfo) } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotActionsListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotActionsListenerManager.kt index 5310098bda..b4cf3fa996 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotActionsListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotActionsListenerManager.kt @@ -3,7 +3,6 @@ package com.mogo.eagle.core.function.call.autopilot import androidx.annotation.Nullable import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotActionsListener import com.mogo.eagle.core.function.call.base.CallerBase -import com.zhidao.support.adas.high.bean.AutopilotAbility import java.util.concurrent.ConcurrentHashMap @@ -51,10 +50,10 @@ object CallerAutopilotActionsListenerManager : CallerBase() { } @Synchronized - fun invokeAutopilotAbility(ability: AutopilotAbility?) { + fun invokeAutopilotAbility(isAutopilotAbility: Boolean, unableAutopilotReason: String?) { M_AUTOPILOT_ACTIONS_LISTENER.forEach { val listener = it.value - listener.onAutopilotAbility(ability) + listener.onAutopilotAbility(isAutopilotAbility, unableAutopilotReason) } } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt index b1280cb09a..1059c60836 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.call.autopilot import androidx.annotation.Nullable +import bag_manager.BagManagerOuterClass import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.call.base.CallerBase import mogo.telematics.pad.MessagePad @@ -78,5 +79,16 @@ object CallerAutopilotRecordListenerManager : CallerBase() { } } + /** + * 录包任务管理应答 + */ + fun invokeBagManagerResult(bagManager: BagManagerOuterClass.BagManager){ + M_AUTOPILOT_RECORD_LISTENERS.forEach{ + val tag = it.key + val listener = it.value + listener.onBagManagerResult(bagManager) + } + } + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index 2e5e7a44e2..9c2fb1d3bd 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -134,6 +134,13 @@ object CallerDevaToolsManager { devaToolsProviderApi?.showFeedbackWindow(ctx) } + /** + * 展示录包管理页面 + */ + fun showBadCaseManagerView(context: Context){ + devaToolsProviderApi?.showBadCaseManagerView(context) + } + /** * 获取升级版本Urls */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt index e256ba1691..38c385b3e9 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerHmiManager.kt @@ -484,20 +484,6 @@ object CallerHmiManager : CallerBase() { waringProviderApi?.updateStatusBarLeftView(insert, tag, viewGroup) } - /** - * 设置司机端消息盒子是否展示 - */ - fun updateDriverMsgBoxTipView(show: Boolean = false){ - waringProviderApi?.updateDriverMsgBoxTipView(show) - } - - /** - * 设置乘客端消息盒子是否展示 - */ - fun updatePassengerMsgBoxTipView(show: Boolean = false){ - waringProviderApi?.updatePassengerMsgBoxTipView(show) - } - /** * 更新(添加/删除)状态栏右侧元素 */ @@ -512,6 +498,7 @@ object CallerHmiManager : CallerBase() { waringProviderApi?.updateMfStatus(tag, status) } - - + fun updateHDDataCacheStatus(isCached: Boolean) { + waringProviderApi?.updateHDDataCacheStatus(isCached) + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt index 2c2698f641..180dcaa281 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapUIServiceManager.kt @@ -5,6 +5,7 @@ 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.base.CallerBase +import com.mogo.map.hdcache.IHdCacheListener import com.mogo.map.listener.IMogoHosListenerRegister import com.mogo.map.location.IMogoLocationClient import com.mogo.map.marker.IMogoMarkerManager @@ -42,4 +43,16 @@ object CallerMapUIServiceManager { fun getMarkerService(): IMogoMarkerService? { return serviceProvider?.markerService } + + fun cacheHDDataByCity(listener: IHdCacheListener) { + serviceProvider?.mapUIController?.cacheHDDataByCity(listener) + } + + fun isCityDataCached(): Boolean { + return serviceProvider?.mapUIController?.isCityDataCached ?: false + } + + fun cancelDownloadCacheData() { + serviceProvider?.mapUIController?.cancelDownloadCacheData() + } } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt index a3c5cd7144..a078973f73 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerVisualAngleManager.kt @@ -242,6 +242,7 @@ object CallerVisualAngleManager { PriorityQueue() } + @Volatile private var mLevel:Boolean = false fun updateLongSightLevel(level:Boolean){ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxEventListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxEventListenerManager.kt index 3696e0f471..3860afa41f 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxEventListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxEventListenerManager.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.call.msgbox import androidx.annotation.Nullable +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.msgbox.IMsgBoxEventListener import com.mogo.eagle.core.function.call.base.CallerBase import java.util.concurrent.ConcurrentHashMap @@ -56,9 +57,9 @@ object CallerMsgBoxEventListenerManager: CallerBase() { } /** - * 触发监听 + * 触发汇总报告点击事件监听 */ - fun invokeListener(){ + fun invokeSummaryListener(){ statusListeners.forEach { val tag = it.key val listener = it.value @@ -66,5 +67,49 @@ object CallerMsgBoxEventListenerManager: CallerBase() { } } + /** + * 更新消息提示View展示状态 + */ + fun invokeUpdateTipListener(isShow: Boolean){ + statusListeners.forEach { + val tag = it.key + val listener = it.value + listener.onUpdateTipEvent(isShow) + } + } + + /** + * 气泡态运营平台事件点击监听 + **/ + fun invokeBubbleOperationListener(msgBoxBean: MsgBoxBean){ + statusListeners.forEach{ + val tag = it.key + val listener = it.value + listener.onBubbleOperationClickEvent(msgBoxBean) + } + } + + /** + * 气泡态V2X消息事件点击监听 + */ + fun invokeBubbleV2XListener(msgBoxBean: MsgBoxBean){ + statusListeners.forEach{ + val tag = it.key + val listener = it.value + listener.onBubbleV2XClickEvent(msgBoxBean) + } + } + + /** + * 气泡态上报消息事件点击监听 + */ + fun invokeBubbleReportListener(msgBoxBean: MsgBoxBean){ + statusListeners.forEach{ + val tag = it.key + val listener = it.value + listener.onBubbleReportClickEvent(msgBoxBean) + } + } + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerOBUManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerOBUManager.kt index 3dd265e6c8..a561e5bbe7 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerOBUManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerOBUManager.kt @@ -41,4 +41,11 @@ object CallerOBUManager { return providerApi.isConnected() } + /** + * 设置obu sdk的 日志 + */ + fun setObuLog(isSet: Boolean) { + providerApi.setObuLibLog(isSet) + } + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightDisappearManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightDisappearManager.kt new file mode 100644 index 0000000000..6985c8501a --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightDisappearManager.kt @@ -0,0 +1,61 @@ +package com.mogo.eagle.core.function.call.obu + +import com.mogo.eagle.core.function.api.obu.IMoGoObuTrafficLightDisapperListener +import com.mogo.eagle.core.function.api.obu.IMoGoObuTrafficLightListener +import java.util.concurrent.ConcurrentHashMap + +object CallerObuTrafficLightDisappearManager { + + private val M_OBU_TRAFFIC_LIGHT_LISTENER: ConcurrentHashMap = + ConcurrentHashMap() + + /** + * 添加监听 + * @param tag 标记,用来注销监听使用 + * @param listener 监听回调 + */ + fun registerObuTrafficLightListener( + tag: String, + listener: IMoGoObuTrafficLightDisapperListener + ) { + if (M_OBU_TRAFFIC_LIGHT_LISTENER.containsKey(tag)) { + return + } + M_OBU_TRAFFIC_LIGHT_LISTENER[tag] = listener + } + + /** + * 删除监听 + * @param tag 标记,用来注销监听使用 + */ + fun unRegisterObuTrafficLightListener(tag: String) { + if (!M_OBU_TRAFFIC_LIGHT_LISTENER.containsKey(tag)) { + return + } + M_OBU_TRAFFIC_LIGHT_LISTENER.remove(tag) + } + + /** + * 删除监听 + * @param listener 要删除的监听对象 + */ +// fun unRegisterObuTrafficLightListener(listener: IMoGoObuTrafficLightListener) { +// if (!M_OBU_TRAFFIC_LIGHT_LISTENER.containsValue(listener)) { +// return +// } +// M_OBU_TRAFFIC_LIGHT_LISTENER.forEach { +// if (it.value == listener) { +// M_OBU_TRAFFIC_LIGHT_LISTENER.remove(it.key) +// } +// } +// } + + fun invokeObuTrafficLightDisappear() { + M_OBU_TRAFFIC_LIGHT_LISTENER.forEach { + val tag = it.key + val listener = it.value + listener.onObuLightDisapper() + } + } + +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightListenerManager.kt index a53d5b350e..a3759c6710 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/obu/CallerObuTrafficLightListenerManager.kt @@ -8,8 +8,6 @@ object CallerObuTrafficLightListenerManager { private val M_OBU_TRAFFIC_LIGHT_LISTENER: ConcurrentHashMap = ConcurrentHashMap() - var mLight: Int = 0 - /** * 添加监听 * @param tag 标记,用来注销监听使用 @@ -22,7 +20,6 @@ object CallerObuTrafficLightListenerManager { if (M_OBU_TRAFFIC_LIGHT_LISTENER.containsKey(tag)) { return } - listener.onObuTrafficLight(mLight) M_OBU_TRAFFIC_LIGHT_LISTENER[tag] = listener } @@ -53,7 +50,6 @@ object CallerObuTrafficLightListenerManager { } fun invokeObuTrafficLight(light: Int) { - this.mLight = light M_OBU_TRAFFIC_LIGHT_LISTENER.forEach { val tag = it.key val listener = it.value diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/RoundCanClickConstraintLayout.java b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/RoundCanClickConstraintLayout.java new file mode 100644 index 0000000000..86f6939aa0 --- /dev/null +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/RoundCanClickConstraintLayout.java @@ -0,0 +1,70 @@ +package com.mogo.eagle.core.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +public class RoundCanClickConstraintLayout extends ConstraintLayout { + + private float roundLayoutRadius = 14f; + private Path roundPath; + private RectF rectF; + + public RoundCanClickConstraintLayout(@NonNull Context context) { + super(context); + } + + public RoundCanClickConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundLayout); + roundLayoutRadius = typedArray.getDimensionPixelSize(R.styleable.RoundLayout_roundLayoutRadius, (int) roundLayoutRadius); + typedArray.recycle(); + + init(); + } + + public RoundCanClickConstraintLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + private void init() { + setWillNotDraw(false);//如果你继承的是ViewGroup,注意此行,否则draw方法是不会回调的; + roundPath = new Path(); + rectF = new RectF(); + } + + private void setRoundPath() { + //添加一个圆角矩形到path中, 如果要实现任意形状的View, 只需要手动添加path就行 + roundPath.reset(); + roundPath.addRoundRect(rectF, roundLayoutRadius, roundLayoutRadius, Path.Direction.CW); + } + + public void setRoundLayoutRadius(float roundLayoutRadius) { + this.roundLayoutRadius = roundLayoutRadius; + setRoundPath(); + postInvalidate(); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + rectF.set(0f, 0f, getMeasuredWidth(), getMeasuredHeight()); + setRoundPath(); + } + + @Override + public void draw(Canvas canvas) { + if (roundLayoutRadius > 0f) { + canvas.clipPath(roundPath); + } + super.draw(canvas); + } + +} diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java index d4168cb1d5..42298f91dc 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/constants/HostConst.java @@ -12,6 +12,7 @@ public class HostConst { public static final String CAMERA_STREAM_HOST = "http://dzt-smartTransportationAiCloud.zhidaozhixing.com"; public static final String OPEN_CAMERA_STREAM_HOST = "http://10.0.16.6:18080"; + public static final String DATA_CENTER_HOST = "http://dzt-data-center.zhidaozhixing.com"; public static final String CITY_HOST = "http://dzt-city.zhidaozhixing.com"; public static final String SOCKET_CENTER_DOMAIN = "socketRegion"; diff --git a/gradle.properties b/gradle.properties index 3e8a59fb97..462afee43a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -63,7 +63,7 @@ BIZCONFIG_VERSION=1.3.2 SERVICE_BIZ_VERSION=1.2.4 ################ 外部依赖引用 ################ # loglib -LOGLIB_VERSION=1.5.9 +LOGLIB_VERSION=1.5.11 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION MOGO_NETWORK_VERSION=1.4.3.32 @@ -85,7 +85,7 @@ MOGO_LOCATION_VERSION=1.4.3.32 MOGO_TELEMATIC_VERSION=1.4.3.32 ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=2.9.0.14_test_06 +MAP_SDK_VERSION=2.10.0.9 MAP_SDK_OPERATION_VERSION=1.1.4.1 # websocket WEBSOCKET_VERSION=1.1.7 @@ -93,8 +93,8 @@ WEBSOCKET_VERSION=1.1.7 applicationId=com.mogo.launcer applicationName=IntelligentPilot # RoboBus司机端:2.5.1;RoboTaxi司机端:2.5.1;RoboTaxi乘客端:1.0.0 -versionCode=2130200 -versionName=2.13.2 +versionCode=2140000 +versionName=2.14.0 ################# 新架构模块Maven版本管理 ################# MOGO_CORE_FUNCTION_AUTOPILOT_VERSION=0.0.58.10 @@ -131,10 +131,8 @@ MOGO_MODULE_V2X_VERSION=2.1.16.10 MOGO_MODULE_OBU_MOGO_VERSION=2.1.16.10 # bugly CRASHREPORT_VERSION=2.1.16.10 -CRASHREPORT_BUGLY_VERSION=2.1.16.10 CRASHREPORT_NOOP_VERSION=2.1.16.10 CRASHREPORT_APMBYTE_VERSION=2.1.16.10 -CRASHREPORT_UPGRADE_VERSION=2.1.16.10 ## tts TTS_BASE_VERSION=2.1.16.10 TTS_DI_VERSION=2.1.16.10 diff --git a/libraries/mogo-adas-data/src/main/proto/bag_manager.proto b/libraries/mogo-adas-data/src/main/proto/bag_manager.proto new file mode 100644 index 0000000000..448e1bfdb9 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/proto/bag_manager.proto @@ -0,0 +1,69 @@ +syntax = "proto2"; +package bag_manager; + +enum BagStat{ + SUCCEED = 0; + EXECUTING = 1; + EXECUTEERROR = 2; + COPYERROR = 3; + MERGEERROR = 4; + UPLOADCOSERROR = 5; +} + +// 上传cos桶状态 +message UploadCosStat{ + required uint64 key = 1; + required uint32 stat = 2; // 0-成功 1-执行中 2-copy过程失败 3-合并过程失败 4-上传过程失败 + optional string message = 3; // 失败时的具体描述 +} + +//空间使用情况 +message SpaceInfo{ + optional string directory = 1; // 路径名,为空表示总空间,否则表示对应的/home/mogo/data/bags下的子目录 + optional uint64 total = 2; // 总空间 + optional uint64 free = 3; // 可用空间 + optional uint64 used = 4; // 已用空间 +} +// bag目录空间使用情况 +message BagSpaceInfo{ + optional string host = 1; // 主机名 + optional SpaceInfo diskSpaceInfo = 2; // 硬盘空间信息 + repeated SpaceInfo BagDirsSpaceInfo = 3; // /home/mogo/data/bags下各子空间信息 +} + +// bag附加信息(录音,备注,接管信息) +message BagDescription{ + optional string description = 1; // bag接管描述或重命名信息 + optional bool hasAudio = 2; // 此bag是否具有录音文件 + optional string audioUrl = 3; // bag附加录音文件的文件名 + optional bool reportBI = 4; //上报BI状态 +} + +// 各主机上报的包信息 +message SubBag { + required uint64 key = 1; // bag key值 + required string host = 2; // 主机名 + optional uint64 size = 3; // 此子包的大小 +} + +// 单个key值对应的包信息 +message BagInfo{ + required uint64 key = 1; // bag key值 + optional uint64 totalSize = 2; // 所有子包或合并后的包的总大小 + optional string timestamp = 3; // 时间戳 + optional string bagPath = 4; // bag所在路径 + optional bool mergeStat = 5; // 合并状态 + optional bool uploadStat = 6; // 上传cos桶状态 + optional BagDescription description = 7; // 包描述信息 + repeated SubBag subBags = 8; // 子包信息 +} + +// 包管理请求 +message BagManager{ + required uint32 reqType = 1; // 请求类型:0-invalid 1-获取空间使用信息 2-遍历所有bag 3-上传cos 4-删除bag 5-为bag添加附加信息 + optional uint64 keyReq = 2; // 要操作的包的key值,发送请求且reqType=(3,4,5)时有效 + optional BagDescription descReq = 3; // 更新包附加信息,发送请求且reqType=5时有效 + repeated BagSpaceInfo spaceInfoResp = 4; // 空间使用信息,获取响应且reqType=1时有效 + repeated BagInfo bagsInfoResp = 5; // 包信息列表,获取响应且reqType=2时有效 + optional UploadCosStat uploadCosResp = 6; //反馈上传cos桶结果,获取响应且reqType=3时有效 +} \ No newline at end of file diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index 465b5a675d..f96fe6fa96 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -6,7 +6,7 @@ import "geometry.proto"; enum ProtocolVersion { Defaultver = 0; - CurrentVersion = 9; //每次修改proto文件增加1 + CurrentVersion = 10; //每次修改proto文件增加1 } enum MessageType @@ -58,6 +58,8 @@ enum MessageType MsgTypeSpecialVehicleTaskCmd = 0x10118; //特种车辆命令 MsgTypeSetParamReq = 0x10119; //设置参数命令 MsgTypeTripInfoEvent = 0x1011a; //行程信息 + MsgTypeBagManagerCmd = 0x1011b; //bag管理 + MsgTypePlanningCmd = 0x1011c; //给planning的指令 } message Header @@ -455,11 +457,30 @@ enum DrivingState START_UP = 9; //起步状态: driving_action:1 表示正常启动;driving_action:2 表示择机起步 PULL_OVER = 10; //靠边停车状态: driving_action:1 表示正常靠边停车;driving_action:2 表示择机靠边停车 UN_PROTECTED_INTERSECTION = 11; //路口预测响应状态: driving_action:1 表示触发了预测响应 + AUTO_LANE_CHANGE_LEFT_V2N = 12; //V2N主动向左变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 AUTO_LANE_CHANGE_RIGHT_V2N = 13; //V2N主动向右变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 LANE_AVOID_LEFT_V2N = 14; //V2N主动向左绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 LANE_AVOID_RIGHT_V2N = 15; //V2N主动向右绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 WAITING_V2N = 16; //V2N正在等待变道避让施工场景/静止障碍物: driving_action:1 表示正在等待;driving_action:2 表示等待超时请求平行驾驶; + + AUTO_LANE_CHANGE_LEFT_RSI = 17; //V2N RSI主动向左变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 + AUTO_LANE_CHANGE_RIGHT_RSI = 18; //V2N RSI主动向右变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 + LANE_AVOID_LEFT_RSI = 19; //V2N RSI主动向左绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + LANE_AVOID_RIGHT_RSI = 20; //V2N RSI主动向右绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + WAITING_RSI = 21; //V2N RSI正在等待变道避让施工场景/静止障碍物: driving_action:1 表示正在等待;driving_action:2 表示等待超时请求平行驾驶; + + AUTO_LANE_CHANGE_LEFT_RSM = 22; //V2N RSM主动向左变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 + AUTO_LANE_CHANGE_RIGHT_RSM = 23; //V2N RSM主动向右变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 + LANE_AVOID_LEFT_RSM = 24; //V2N RSM主动向左绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + LANE_AVOID_RIGHT_RSM = 25; //V2N RSM主动向右绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + WAITING_RSM = 26; //V2N RSM正在等待变道避让施工场景/静止障碍物: driving_action:1 表示正在等待;driving_action:2 表示等待超时请求平行驾驶; + + AUTO_LANE_CHANGE_LEFT_RSI_TRIANGLE = 27; //V2N 三角锥主动向左变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 + AUTO_LANE_CHANGE_RIGHT_RSI_TRIANGLE = 28; //V2N 三角锥主动向右变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成 + LANE_AVOID_LEFT_RSI_TRIANGLE = 29; //V2N 三角锥主动向左绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + LANE_AVOID_RIGHT_RSI_TRIANGLE = 30; //V2N 三角锥主动向右绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + WAITING_RSI_TRIANGLE = 31; //V2N 三角锥正在等待变道避让施工场景/静止障碍物: driving_action:1 表示正在等待;driving_action:2 表示等待超时请求平行驾驶 } enum DrivingAction @@ -469,6 +490,11 @@ enum DrivingAction DRIVING_ACTION_STATE_TWO = 2; DRIVING_ACTION_STATE_THREE = 3; DRIVING_ACTION_STATE_FOUR = 4; + DRIVING_ACTION_STATE_FIVE = 5; + DRIVING_ACTION_STATE_SIX = 6; + DRIVING_ACTION_STATE_SEVEN = 7; + DRIVING_ACTION_STATE_EIGHT = 8; + DRIVING_ACTION_STATE_NINE = 9; } message DrivingActionMsg @@ -477,10 +503,36 @@ message DrivingActionMsg DrivingAction driving_action = 2; } +enum ParkScenarioDrivingState +{ + PARK_SENARIO_NO_AUTODRIVING = 0; //不在自动驾驶状态 + PARK_SENARIO_LANKE_KEEP = 1; //车道保持状态 + PARK_SENARIO_LANE_AVOID_LEFT = 2; //主动向左绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + PARK_SENARIO_LANE_AVOID_RIGHT = 3; //主动向右绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成 + PARK_SENARIO_START_UP = 4; //起步状态: driving_action:1 表示正常启动;driving_action:2 表示择机起步; + PARK_SENARIO_PULL_OVER = 5; //站点停车状态: driving_action:1 表示正常站点停车;driving_action:2 表示择机站点停车; + PARK_SENARIO_FORCE_PULL_OVER_ON = 6; //响应触发靠边停车状态: driving_action:1 表示开始靠边停车;driving_action:2 表示靠边停车成功;3:靠边停车失败; + PARK_SENARIO_FORCE_PULL_OVER_OFF = 7; //不响应触发靠边停车状态: driving_action:1 表示距离前方站点100m;driving_action:2 表示距离路口100m;3: 正在变道 。。。 +} + +message ParkScenarioDrivingAction +{ + ParkScenarioDrivingState driving_state = 1; //决策场景 + DrivingAction driving_action = 2; //决策场景状态 +} + +message ParkScenarioPlanningAction +{ + ParkScenarioDrivingAction action_msg = 1; //决策场景(包含场景以及响应状态) + double destination_acc = 2; //驾驶的意图(规划期望的加速或者减速值) +} + message PlanningActionMsg { DrivingActionMsg action_msg = 1; double destination_acc = 2; //驾驶的意图(规划期望的加速或者减速值) + + ParkScenarioPlanningAction park_scenario_action = 3; } //message definition for MsgTypeSpecialVehicleTaskCmd @@ -520,4 +572,18 @@ message TripInfoEvent //message definition for MsgTypeObuWarningData //refer to obu_warning_event.proto for details +//message definition for MsgTypeBagManagerCmd +//refer to bag_manager.proto for details + +//message definition for MsgTypePlanningCmd +message PullOverCmd +{ + uint32 cmd = 1; //0: default 1: 靠边停车 2:重新起步 +} + +message PlanningCmd +{ + PullOverCmd pullOverCmd = 1; +} + diff --git a/libraries/mogo-adas-data/src/main/proto/obu_warning_event.proto b/libraries/mogo-adas-data/src/main/proto/obu_warning_event.proto index 5dd9552082..a0fc6b36f8 100644 --- a/libraries/mogo-adas-data/src/main/proto/obu_warning_event.proto +++ b/libraries/mogo-adas-data/src/main/proto/obu_warning_event.proto @@ -112,6 +112,6 @@ message ObuWarningData{ RsiWarningData rsiEvent = 3; RsmWarningData rsmEvent = 4; SpatWarningData spatEvent = 5; - MapMatchData mapMatchData = 6; + MapMatchData mapMatchData = 6; } diff --git a/libraries/mogo-adas-data/src/main/proto/robo_sweeper_task_index.proto b/libraries/mogo-adas-data/src/main/proto/robo_sweeper_task_index.proto index 5d442b3ae6..9f78494d75 100644 --- a/libraries/mogo-adas-data/src/main/proto/robo_sweeper_task_index.proto +++ b/libraries/mogo-adas-data/src/main/proto/robo_sweeper_task_index.proto @@ -17,4 +17,8 @@ message RoboSweeperTaskIndex { double ref_edge_point_lon = 10; // 投影边沿点经度 double ref_edge_point_lat = 11; // 投影边沿点纬度 double dist_to_ref_edge_point = 12; // 自车到投影边沿点的距离 正值为在投影边沿点的右边 ,负值为在投影边沿点的右边 -} \ No newline at end of file + + uint32 clean_mode = 13; // 清扫作业模式 1–纯扫 2--洗扫, 3--纯洗, 4--纯吸 + uint32 clean_direction = 14; // 清扫方向 1--两侧, 2--左侧, 3--右侧 + uint32 clean_intensity= 15; // 作业强度 1–标准 2--强力 +} diff --git a/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto b/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto index 850a8ae307..b3d273c353 100644 --- a/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto +++ b/libraries/mogo-adas-data/src/main/proto/special_vehicle_task_cmd.proto @@ -24,8 +24,26 @@ message RoboVanSkywellTaskCmd { optional uint32 horn_cmd = 2 [default = 0]; //1:开始鸣笛 2:停止鸣笛 } +message RoboBusJinlvM1Cmd { + optional uint32 air_conditioner_cmd = 1; //0: default, 1: 开启空调, 2: 关闭空调 + optional uint32 air_conditioner_mode_cmd = 2; //模式 0: default, 1: 自动模式, 2: 制冷模式, 3: 通风模式(仅送风,无温度) + optional uint32 air_conditioner_wind_speed_cmd = 3; //风速 0: default, 1: 1档,2: 2档,3:3档 + optional uint32 air_conditioner_temperature_cmd = 4; //温度 0: default, 16-26: 温度 + + optional uint32 header_cmd = 5; //0: default, 1: 开启暖风机, 2: 关闭暖风机 + optional uint32 header_wind_speed_cmd = 6; //风速 0: default, 1: 1档,2: 2档 + + optional uint32 main_lamp1_cmd = 7; //0: default, 1: 开启顶灯1, 2: 关闭顶灯1 + optional uint32 main_lamp2_cmd = 8; //0: default, 1: 开启顶灯2, 2: 关闭顶灯2 + optional uint32 small_lamp_cmd = 9; //0: default, 1: 开启小灯(氛围灯), 2: 关闭小灯(氛围灯) + + optional uint32 front_door_cmd = 10; //0: default, 1: 开启车门, 2: 关闭车门 +} + + message SpecialVehicleTaskCmd { optional common.Header header = 1; optional RoboSweeperFuTianTaskCmd robo_sweeper_futian_task_cmd = 2; // 福田清扫车业务指令 optional RoboVanSkywellTaskCmd robo_van_skywell_task_cmd = 3; // 开沃小巴业务指令 + optional RoboBusJinlvM1Cmd robo_bus_jinlv_m1_cmd = 4; //金旅定制车m1指令 } diff --git a/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto b/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto index ac6fbc96cc..de1b6f386b 100644 --- a/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto +++ b/libraries/mogo-adas-data/src/main/proto/vehicle_state.proto @@ -49,6 +49,45 @@ message SweeperFuTianCleanSystemState { optional float secu_sweepdisk_speed = 41 [default = 0]; // 扫盘转速 } +message RoboTaxiState { + optional bool veh_rta_recover = 1 [default = false]; // 车辆可进入自动驾驶标志位,不可进入时一定时间内恢复可自动进入 + optional bool veh_rta_no_recover = 2 [default = false]; // 车辆可进入自动驾驶标志位,不可进入时恢复无法自动进入 +} + +message RoboBusState { + optional bool reserved = 1; // 预留 +} + +message AirConditionerState { + optional bool is_on = 1; //是否开启 + optional uint32 mode = 2; //模式, 1: 自动模式, 2: 制冷模式, 3: 通风模式(仅送风,无温度) + optional uint32 temperature = 3; //温度 + optional uint32 wind_speed = 4; //风速, 1-3: 1-3档 +} + +message HeaterState { + optional bool is_on = 1; //是否开启 + optional uint32 wind_speed = 2; //风速, 1-2: 1-2档 +} + +message DoorState { + optional bool is_on = 1; //是否开启 +} + +message LightState { + optional bool is_on = 1; //是否开启 + optional uint32 color = 2; //颜色 +} + +message RoboBusJinlvM1State { + optional AirConditionerState air_conditioner_state = 1; //空调 + optional HeaterState heater_state = 2; //暖风机 + optional DoorState front_door_state = 3; //车门 + optional LightState main_lamp1_state = 4; //顶灯1 + optional LightState main_lamp2_state = 5; //顶灯2 + optional LightState small_lamp_state = 6; //小灯(氛围灯) +} + message VehicleState { optional common.Header header = 1; optional chassis.PilotMode pilot_mode = 2 [default = MODE_MANUAL]; @@ -90,14 +129,15 @@ message VehicleState { optional float rightFrontWheelAngle = 34 [default = 0]; //右前轮角度(deg),左负右正 optional chassis.EPBWorkStatus epb = 35 [default = EPBSTATUS_NONE]; // EPB工作状态 - optional chassis.VehicleTakeOverStatus vehicletakeoverstatus = 36 [default = None_TakeOver]; // 车辆人工接管状态 optional bool Emergency_Stop_Switch = 37 [default = false]; // 急停开关状态 optional chassis.VehicleFaultLevel vehiclefaultlevel = 38 [default = None_Fault]; // 整车故障状态 optional float bms_soc = 40 [default = 0]; // 电量百分比范围 0~100 - - reserved 41 to 199; + optional float fuel_value = 41 [default = 0]; // 油车剩余油量 optional SweeperFuTianCleanSystemState sweeper_futian_clean_system_state = 200; // 福田清扫车上装状态信息 + optional RoboTaxiState robo_taxi_state = 201; // taxi状态 + optional RoboBusState robo_bus_state = 202; // bus状态 + optional RoboBusJinlvM1State robo_bus_jinlv_m1_state = 203; //金旅定制车m1状态 } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index ea191071e4..0759550895 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -12,6 +12,8 @@ import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_LINK_ADAS; import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_LINK_LOG_CONNECT_STATUS; import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT; +import android.os.Handler; +import android.os.Message; import android.os.SystemClock; import android.text.TextUtils; @@ -21,7 +23,6 @@ import androidx.annotation.Nullable; import com.google.protobuf.InvalidProtocolBufferException; import com.zhidao.support.adas.high.bean.AutopilotStatistics; import com.zhidao.support.adas.high.bean.VersionCompatibility; -import com.zhidao.support.adas.high.common.AutopilotAbilityManager; import com.zhidao.support.adas.high.common.AutopilotReview; import com.zhidao.support.adas.high.common.ByteUtil; import com.zhidao.support.adas.high.common.Constants; @@ -32,6 +33,7 @@ import com.zhidao.support.adas.high.common.MessageType; import com.zhidao.support.adas.high.common.ProtocolStatus; import com.zhidao.support.adas.high.common.ReceiveTimeoutManager; import com.zhidao.support.adas.high.common.RegexUtils; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.msg.IMsg; import com.zhidao.support.adas.high.msg.MyMessageFactory; import com.zhidao.support.adas.high.protocol.RawData; @@ -55,6 +57,7 @@ import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.atomic.AtomicInteger; +import bag_manager.BagManagerOuterClass; import chassis.SpecialVehicleTaskCmdOuterClass; import common.HeaderOuterClass; import mogo.telematics.pad.MessagePad; @@ -78,6 +81,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec private RawUnpack rawUnpack;//业务数据拆包 private RawPack rawPack;//数据打包 private DispatchHandler defaultDispatchHandler;//默认分发线程分发 + private DispatchHandler statusQueryRespDispatchHandler;//状态查询应答分发线程分发 private final Map dispatchHandlers = new HashMap<>();//其他分发线程 private Timer checkCompatibilityTimer;//检查版本兼容性定时器 连接成功后5秒内等待工控机发送配置信息 private int seqSpecialVehicle = 0;//特种车辆命令发送次数 @@ -125,6 +129,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec * 乘客屏无法进行注册或取消注册,因为乘客屏无法感知司机屏与工控机连接状态。无法重置已注册或未注册接口列表 */ private SubscribeInterface subscribeInterface; + private Timer carConfigReqTimer;//车辆基础信息请求 多次请求防止无法收到基础信息情况出现 public void setOnMultiDeviceListener(OnMultiDeviceListener onMultiDeviceListener) { this.onMultiDeviceListener = onMultiDeviceListener; @@ -180,6 +185,12 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec //启用线程分发 defaultDispatchHandler = new DispatchHandler(MessagePad.MessageType.MsgTypeDefault, this);//默认分发线程 不要添加到Map中 initOtherDispatchHandler(); + AutopilotAbilityManager.getInstance().setOnAutopilotAbilityListener(new AutopilotAbilityManager.OnAutopilotAbilityListener() { + @Override + public void onStatusQuery() { + statusQueryRespDispatchHandler.start(); + } + }); } /** @@ -230,8 +241,9 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec // dispatchHandlers.put(MessagePad.MessageType.MsgTypeWarn, new DispatchHandler(MessagePad.MessageType.MsgTypeWarn, this)); //到站提醒 // dispatchHandlers.put(MessagePad.MessageType.MsgTypeArrivalNotification, new DispatchHandler(MessagePad.MessageType.MsgTypeArrivalNotification, this)); - //状态查询应答 -// dispatchHandlers.put(MessagePad.MessageType.MsgTypeStatusQueryResp, new DispatchHandler(MessagePad.MessageType.MsgTypeStatusQueryResp, this)); + //状态查询应答 TODO 此线程更新频率目前为3秒,但是由于会在此接口中做一些其他数据处理,所以单独开启线程 + statusQueryRespDispatchHandler = new DispatchHandler(MessagePad.MessageType.MsgTypeStatusQueryResp, this); + dispatchHandlers.put(MessagePad.MessageType.MsgTypeStatusQueryResp, statusQueryRespDispatchHandler); //数据采集配置 // dispatchHandlers.put(MessagePad.MessageType.MsgTypeRecordDataConfigResp, new DispatchHandler(MessagePad.MessageType.MsgTypeRecordDataConfigResp, this)); //Planning决策状态 @@ -395,6 +407,20 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec } } + @Override + public void onHandler(MessagePad.MessageType type, Handler handler) { + if (type == MessagePad.MessageType.MsgTypeStatusQueryResp) { + AutopilotAbilityManager.getInstance().setHandler(handler); + } + } + + @Override + public void onHandleMessage(MessagePad.MessageType type, Message msg) { + if (type == MessagePad.MessageType.MsgTypeStatusQueryResp) { + AutopilotAbilityManager.getInstance().onHandleMessage(msg); + } + } + /** * 分发和解析 * @@ -494,7 +520,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec @Override public void onWebSocketConnectSuccess(String ipAddress, int port) { - sendCarConfigReq(); + startCarConfigReq(); ipcConnectedIp = ipAddress; ipcConnectedPort = port; subscribeInterface = new SubscribeInterface(this); @@ -616,6 +642,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec } else { AutopilotAbilityManager.getInstance().stop(); stopCheckCompatibility(); + stopCarConfigReq(); } if (status == Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { AdasManager.getInstance().setCarConfig(null); @@ -733,6 +760,40 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec CupidLogUtils.setEnableLog(isEnableLog); } + //车辆基础信息请求 + private void startCarConfigReq() { + if (carConfigReqTimer == null) { + carConfigReqTimer = new Timer(); + carConfigReqTimer.schedule(new TimerTask() { + int num = 0; + + @Override + public void run() { + if (getIpcConnectionStatus() == Constants.IPC_CONNECTION_STATUS.CONNECTED) { + if (AdasManager.getInstance().getCarConfig() == null) { + num++; + if (num > 3) { + CupidLogUtils.i(TAG, "最后一次也未获取到车机基础信息"); + stopCarConfigReq(); + } else { + CupidLogUtils.i(TAG, "第" + num + "次获取车机基础信息"); + sendCarConfigReq(); + } + } else { + stopCarConfigReq(); + } + } + } + }, 10, 2000L); + } + } + + private synchronized void stopCarConfigReq() { + if (carConfigReqTimer != null) { + carConfigReqTimer.cancel(); + carConfigReqTimer = null; + } + } /**************************************************************************************************************************/ /** @@ -1375,5 +1436,17 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec return sendPBMessage(MessageType.TYPE_SEND_TRIP_INFO_REQ.typeCode, req.toByteArray()); } + /** + * 发送包管理请求 + * + * @param bagManager 包管理参数 + * @return boolean + */ + @Override + public boolean sendBagManagerCmd(BagManagerOuterClass.BagManager bagManager) { + return sendPBMessage(MessageType.TYPE_SEND_BAG_MANAGER_CMD.typeCode, bagManager.toByteArray()); + } + + } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java index 52a2c2c294..bcdcf03590 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java @@ -15,6 +15,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import bag_manager.BagManagerOuterClass; import chassis.SpecialVehicleTaskCmdOuterClass; import mogo.telematics.pad.MessagePad; @@ -706,6 +707,17 @@ public class AdasManager implements IAdasNetCommApi { return mChannel != null && mChannel.sendTripInfoReq(type, lineName, departureStopName, arrivalStopName, isLastStop); } + /** + * 发送包管理请求 + * + * @param bagManager 包管理参数 + * @return boolean + */ + @Override + public boolean sendBagManagerCmd(BagManagerOuterClass.BagManager bagManager) { + return mChannel != null && mChannel.sendBagManagerCmd(bagManager); + } + /** * 获取工控机固定IP列表 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java index a3b82d5391..62bee3e4fb 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasOptions.java @@ -1,5 +1,6 @@ package com.zhidao.support.adas.high; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.subscribe.SubscribeInterfaceOptions; import java.util.HashSet; @@ -124,6 +125,17 @@ public class AdasOptions { return this; } + /** + * 身份/车型 + * + * @param identityMode 车型 + * @return + */ + public Builder setIdentityMode(int identityMode) { + options.setIdentityMode(identityMode); + return this; + } + public AdasOptions build() { return options; } @@ -141,6 +153,7 @@ public class AdasOptions { options.ipcAssignIP = null; options.ipcFixationIP = null; options.subscribeInterfaceOptions = null; + options.setIdentityMode(0x00); return options; } @@ -183,4 +196,8 @@ public class AdasOptions { public void setSubscribeInterfaceOptions(SubscribeInterfaceOptions subscribeInterfaceOptions) { this.subscribeInterfaceOptions = subscribeInterfaceOptions; } + + public void setIdentityMode(int identityMode) { + AutopilotAbilityManager.getInstance().setIdentityMode(identityMode); + } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java index ccc6a0acf9..ce88e086dd 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java @@ -10,6 +10,7 @@ import com.zhidao.support.adas.high.common.MessageType; import java.util.List; import java.util.Set; +import bag_manager.BagManagerOuterClass; import chassis.SpecialVehicleTaskCmdOuterClass; import mogo.telematics.pad.MessagePad; @@ -420,6 +421,13 @@ public interface IAdasNetCommApi { */ boolean sendTripInfoReq(int type, String lineName, String departureStopName, String arrivalStopName, boolean isLastStop); + /** + * 发送包管理请求 + * + * @param bagManager 包管理参数 + * @return boolean + */ + boolean sendBagManagerCmd(BagManagerOuterClass.BagManager bagManager); // TODO 需求暂停 待讨论 // boolean getRoutes(); diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java index 5f0b6395e8..fc37b60c33 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java @@ -1,9 +1,9 @@ package com.zhidao.support.adas.high; -import com.zhidao.support.adas.high.bean.AutopilotAbility; import com.zhidao.support.adas.high.bean.AutopilotStatistics; import com.zhidao.support.adas.high.common.ProtocolStatus; +import bag_manager.BagManagerOuterClass; import chassis.VehicleStateOuterClass; import mogo.telematics.pad.MessagePad; import mogo.v2x.ObuWarningEvent; @@ -189,12 +189,21 @@ public interface OnAdasListener { */ void onObuWarningData(MessagePad.Header header, ObuWarningEvent.ObuWarningData obuWarningData); + /** + * Bag管理应答 + * + * @param header 头 + * @param bagManager 数据 + */ + void onBagManagerCmd(MessagePad.Header header, BagManagerOuterClass.BagManager bagManager); + /** * 是否有能力启动自动驾驶 * - * @param ability 是否可以启动自动驾驶 + * @param isAutopilotAbility 是否能启动自动驾驶 + * @param unableAutopilotReason 不能启动自动驾驶原因 */ - void onAutopilotAbility(AutopilotAbility ability); + void onAutopilotAbility(boolean isAutopilotAbility, String unableAutopilotReason); /** * 启动自动驾驶失败回调 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java deleted file mode 100644 index c9e3dc9fa1..0000000000 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotAbility.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.zhidao.support.adas.high.bean; - -import chassis.Chassis; -import system_master.SystemStatusInfo; - -/** - * 自动驾驶能力 能否启动自动驾驶 - * 未赋值表示接口通讯异常或者工控机相关节点异常 如果回调持续都是未赋值的状态表示此问题是持久性的 - */ -public class AutopilotAbility { - /** - * 刹车踏板开度 0~100 - * -1表示未赋值 - * 值为0时表示 制动踏板未踩下 - */ - public final float brake; - /** - * 挡位 - * null表示未赋值 - * 挡位处于P挡和R挡时不能启动自动驾驶 - */ - public final Chassis.GearPosition gear; - /** - * 状态查询结果 - * null表示未赋值 - * 不能启动自动驾驶的判断 - * statusInfo.getHealthInfoList().get().getState()== SystemStatusInfo.HealthState.FAULT - * statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_STARTING - * statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_EXITING - * statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_FAULT - */ - public final SystemStatusInfo.StatusInfo statusInfo; - - public AutopilotAbility(float brake, Chassis.GearPosition gear, SystemStatusInfo.StatusInfo statusInfo) { - this.brake = brake; - this.gear = gear; - this.statusInfo = statusInfo; - - - } -} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotStatistics.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotStatistics.java index c6acda417b..cba060b13e 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotStatistics.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/bean/AutopilotStatistics.java @@ -15,7 +15,6 @@ public class AutopilotStatistics { * 0 成功 * 1 失败 * 2 取消 - * 3 超时 * {@link com.zhidao.support.adas.high.common.Constants.AUTOPILOT_START_STATUS} */ @Define.AutopilotStartStatus diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotAbilityManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotAbilityManager.java deleted file mode 100644 index 02d90a102d..0000000000 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotAbilityManager.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.zhidao.support.adas.high.common; - -import com.zhidao.support.adas.high.AdasManager; -import com.zhidao.support.adas.high.OnAdasListener; -import com.zhidao.support.adas.high.bean.AutopilotAbility; - -import java.util.Timer; -import java.util.TimerTask; - -import chassis.Chassis; -import chassis.VehicleStateOuterClass; -import system_master.SystemStatusInfo; - -/** - * 是否可以启动自动驾驶能力检测 - * 目前监控了底盘的一些状态和查询节点状态应答的数据 - * 没有使用监控事件报告的原因是因为,部分异常没进行正常恢复通知,例如收到了异常监控数据,但是异常恢复之后没有恢复的通知 - * - * 此定时器不能停止 鹰眼中存在UI更新依赖循环查询系统状态 - */ -public class AutopilotAbilityManager { - private static final String TAG = AutopilotAbilityManager.class.getSimpleName(); - private static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测时间 - private static volatile AutopilotAbilityManager INSTANCE; - - private OnAdasListener listener; - private volatile Timer timer; - - private VehicleStateOuterClass.VehicleState vehicleState; - - public void setOnAdasListener(OnAdasListener listener) { - this.listener = listener; - } - - private AutopilotAbilityManager() { - } - - public static AutopilotAbilityManager getInstance() { - if (INSTANCE == null) { - synchronized (AutopilotAbilityManager.class) { - if (INSTANCE == null) { - INSTANCE = new AutopilotAbilityManager(); - } - } - } - return INSTANCE; - } - - public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) { - if (listener != null) { - float brake = -1; - Chassis.GearPosition gear = null; - if (vehicleState != null) { - brake = vehicleState.getBrake(); - gear = vehicleState.getGear(); - } - listener.onAutopilotAbility(new AutopilotAbility(brake, gear, statusInfo)); - } - } - - public void setVehicleState(VehicleStateOuterClass.VehicleState vehicleState) { - this.vehicleState = vehicleState; - } - - public synchronized void start() { - if (timer == null) { - timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - AdasManager.getInstance().sendStatusQueryReq(); - } - }, 2000L, DEFAULT_DETECTION_TIME);//延迟执行,避免刚连接成功后底盘信息无法及时同步 - } - } - - public synchronized void stop() { - if (timer != null) { - timer.cancel(); - timer = null; - } - this.vehicleState = null; - } - - -} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotReview.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotReview.java index c1825605ab..6cc2224baa 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotReview.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/AutopilotReview.java @@ -16,13 +16,6 @@ import mogo_msg.MogoReportMsg; * 自动驾驶状态检查/统计 */ public class AutopilotReview { - /** - * 默认启动自驾超时时间 - */ - private static final long DEFAULT_TIMEOUT = 15 * 1000L; - - - private Timer timer; /** * 下发的启动自动驾驶命令 */ @@ -45,7 +38,6 @@ public class AutopilotReview { } private void onCallback(@Define.AutopilotStartStatus int status) { - stopTimer(); long usedTime = SystemClock.elapsedRealtime() - startTime; if (listener != null) { listener.onReview(new AutopilotStatistics(status, usedTime, startReq, failedMessage)); @@ -55,27 +47,6 @@ public class AutopilotReview { failedMessage = null; } - - private void startTimer() { - if (timer == null) { - timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - //超时 - onCallback(Constants.AUTOPILOT_START_STATUS.TIMEOUT); - } - }, DEFAULT_TIMEOUT); - } - } - - private void stopTimer() { - if (timer != null) { - timer.cancel(); - timer = null; - } - } - /** * 自动驾命令 * @@ -86,7 +57,6 @@ public class AutopilotReview { //启动自动驾驶 startReq = req; startTime = SystemClock.elapsedRealtime(); - startTimer(); } else { onCallback(Constants.AUTOPILOT_START_STATUS.CANCEL); } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Constants.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Constants.java index 55b42ed75a..2d700e797c 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Constants.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Constants.java @@ -126,10 +126,6 @@ public class Constants { * 取消 */ int CANCEL = 2; - /** - * 超时 - */ - int TIMEOUT = 3; } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Define.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Define.java index 4ea9eec593..4ef4b6830c 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Define.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/Define.java @@ -49,8 +49,7 @@ public final class Define { @IntDef(flag = true, value = {Constants.AUTOPILOT_START_STATUS.SUCCESSFUL, Constants.AUTOPILOT_START_STATUS.FAILED, - Constants.AUTOPILOT_START_STATUS.CANCEL, - Constants.AUTOPILOT_START_STATUS.TIMEOUT}) + Constants.AUTOPILOT_START_STATUS.CANCEL}) @Retention(RetentionPolicy.SOURCE) public @interface AutopilotStartStatus { } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java index 2de37de94f..92f1d31659 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java @@ -16,13 +16,15 @@ public enum MessageType { TYPE_RECEIVE_TRAJECTORY(MessagePad.MessageType.MsgTypeTrajectory, "车前引导线"), TYPE_RECEIVE_TRACKED_OBJECTS(MessagePad.MessageType.MsgTypeTrackedObjects, "障碍物信息"), TYPE_RECEIVE_GNSS_INFO(MessagePad.MessageType.MsgTypeGnssInfo, "惯导信息"), - TYPE_RECEIVE_VEHICLE_STATE(MessagePad.MessageType.MsgTypeVehicleState, "底盘信息"), + TYPE_RECEIVE_VEHICLE_STATE(MessagePad.MessageType.MsgTypeVehicleState, "老底盘状态"), TYPE_RECEIVE_AUTOPILOT_STATE(MessagePad.MessageType.MsgTypeAutopilotState, "自动驾驶状态"), TYPE_RECEIVE_REPORT_MESSAGE(MessagePad.MessageType.MsgTypeReportMessage, "监控事件报告"), TYPE_RECEIVE_PERCEPTION_TRAFFIC_LIGHT(MessagePad.MessageType.MsgTypePerceptionTrafficLight, "感知红绿灯"), TYPE_RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY(MessagePad.MessageType.MsgTypePredictionObstacleTrajectory, "他车轨迹预测"), TYPE_RECEIVE_POINT_CLOUD(MessagePad.MessageType.MsgTypePointCloud, "点云透传"), TYPE_RECEIVE_PLANNING_OBJECTS(MessagePad.MessageType.MsgTypePlanningObjects, "Planning障碍物"), + TYPE_RECEIVE_CHASSIS_STATES(MessagePad.MessageType.MsgTypeChassisStates, "底盘状态"), + TYPE_RECEIVE_FUNCTION_STATES(MessagePad.MessageType.MsgTypeFunctionStates, "重构后功能状态"), TYPE_RECEIVE_BASIC_INFO_REQ(MessagePad.MessageType.MsgTypeBasicInfoReq, "自动驾驶设备基础信息请求"), TYPE_SEND_BASIC_INFO_RESP(MessagePad.MessageType.MsgTypeBasicInfoResp, "自动驾驶设备基础信息应答"), @@ -36,6 +38,7 @@ public enum MessageType { TYPE_SEND_SET_AUTOPILOT_SPEED_REQ(MessagePad.MessageType.MsgTypeSetAutopilotSpeedReq, "设置自动驾驶最大速度"), TYPE_SEND_GLOBAL_PATH_REQ(MessagePad.MessageType.MsgTypeGlobalPathReq, "自动驾驶路径请求"), TYPE_RECEIVE_GLOBAL_PATH_RESP(MessagePad.MessageType.MsgTypeGlobalPathResp, "自动驾驶路径应答"), + @Deprecated//MAP290开始此接口弃用 TYPE_SEND_TRAFFIC_LIGHT_DATA(MessagePad.MessageType.MsgTypeTrafficLightData, "发送红绿灯数据到工控机"), @Deprecated TYPE_RECEIVE_WARN(MessagePad.MessageType.MsgTypeWarn, "预警数据"), @@ -45,16 +48,21 @@ public enum MessageType { TYPE_SEND_STATUS_QUERY_REQ(MessagePad.MessageType.MsgTypeStatusQueryReq, "状态查询请求"), TYPE_RECEIVE_STATUS_QUERY_RESP(MessagePad.MessageType.MsgTypeStatusQueryResp, "状态查询应答"), TYPE_SEND_SET_RAIN_MODE_REQ(MessagePad.MessageType.MsgTypeSetRainModeReq, "设置雨天模式"), - TYPE_SEND_OPERATOR_CMD_REQ(MessagePad.MessageType.MsgTypeOperatorCmdReq, "操控指令"), TYPE_SEND_RECORD_DATA_CONFIG_REQ(MessagePad.MessageType.MsgTypeRecordDataConfigReq, "数据采集配置查询"), TYPE_RECEIVE_RECORD_DATA_CONFIG_RESP(MessagePad.MessageType.MsgTypeRecordDataConfigResp, "数据采集配置"), + TYPE_SEND_OPERATOR_CMD_REQ(MessagePad.MessageType.MsgTypeOperatorCmdReq, "操控指令"), TYPE_SEND_SUBSCRIBE_DATA_REQ(MessagePad.MessageType.MsgTypeSubscribeDataReq, "数据订阅、取消订阅请求"), + TYPE_SEND_SPECIAL_VEHICLE_TASK_CMD(MessagePad.MessageType.MsgTypeSpecialVehicleTaskCmd, "特种车辆命令"), TYPE_SEND_SET_PARAM_REQ(MessagePad.MessageType.MsgTypeSetParamReq, "设置参数命令"), TYPE_SEND_TRIP_INFO_REQ(MessagePad.MessageType.MsgTypeTripInfoEvent, "行程信息"), - TYPE_SEND_SPECIAL_VEHICLE_TASK_CMD(MessagePad.MessageType.MsgTypeSpecialVehicleTaskCmd, "特种车辆命令"), - //透传 原始pb文件中不存在以下type。由于Java中无法强转所以在mogo-adas-data message_pad.proto中放开注释 + TYPE_SEND_BAG_MANAGER_CMD(MessagePad.MessageType.MsgTypeBagManagerCmd, "Bag管理请求"), + TYPE_RECEIVE_BAG_MANAGER_CMD(MessagePad.MessageType.MsgTypeBagManagerCmd, "Bag管理应答"), + TYPE_SEND_PLANNING_CMD(MessagePad.MessageType.MsgTypePlanningCmd, "给Planning指令"), + //TODO 透传原始pb文件中不存在以下type。由于Java中无法强转,所以在mogo-adas-data/message_pad.proto中放开注释 TYPE_RECEIVE_PLANNING_DECISION_STATE(MessagePad.MessageType.MsgTypePlanningDecisionState, "Planning决策状态"), - TYPE_RECEIVE_OBU_WARNING_DATA(MessagePad.MessageType.MsgTypeObuWarningData, "OBU预警事件"); + TYPE_RECEIVE_SWEEPER_TASK_INDEX_DATA(MessagePad.MessageType.MsgTypeSweeperTaskIndexData, "清扫车指标数据"), + TYPE_RECEIVE_OBU_WARNING_DATA(MessagePad.MessageType.MsgTypeObuWarningData, "OBU预警事件"), + ; /** diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MogoReport.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MogoReport.java index 0ba915d384..3365f70734 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MogoReport.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MogoReport.java @@ -2,7 +2,7 @@ package com.zhidao.support.adas.high.common; /** * 监控事件报告中定义的事件以及解释 - * 根据MAP2.10.0消息定义编写 + * 根据MAP2.11.0消息定义编写 */ public class MogoReport { public static final String RESULT_AUTOPILOT_SYSTEM_UNSTARTED = "RESULT_AUTOPILOT_SYSTEM_UNSTARTED"; @@ -12,33 +12,15 @@ public class MogoReport { public static final String RESULT_REMOTEPILOT_INFERIOR = "RESULT_REMOTEPILOT_INFERIOR"; public static final String RESULT_SHOW_WARNING = "RESULT_SHOW_WARNING"; -// private static final String RESULT_DISCONNECTED_WITH_PAD = "RESULT_DISCONNECTED_WITH_PAD"; -// private static final String RESULT_PAD_CANNOT_CONNECT_TELEMATICS = "RESULT_PAD_CANNOT_CONNECT_TELEMATICS"; -// private static final String RESULT_PAD_INFO_LOST = "RESULT_PAD_INFO_LOST"; -// private static final String RESULT_PAD_CANNOT_GET_AUTOPILOT_STATUS = "RESULT_PAD_CANNOT_GET_AUTOPILOT_STATUS"; -// private static final String RESULT_PAD_CANNOT_GET_GNS_CHASSIS_STATUS = "RESULT_PAD_CANNOT_GET_GNS_CHASSIS_STATUS"; -// private static final String RESULT_PAD_CANNOT_GET_OBSTACLE_INFO = "RESULT_PAD_CANNOT_GET_OBSTACLE_INFO"; -// private static final String RESULT_NO_CONNECTION_TO_AICLOUD = "RESULT_NO_CONNECTION_TO_AICLOUD"; -// private static final String RESULT_AICLOUD_INFO_LOST = "RESULT_AICLOUD_INFO_LOST"; -// private static final String RESULT_CANNOT_CHANGE_LIGHT = "RESULT_CANNOT_CHANGE_LIGHT"; public enum Result { AUTOPILOT_SYSTEM_UNSTARTED(RESULT_AUTOPILOT_SYSTEM_UNSTARTED, "自动驾驶系统启动过程中出错,pad可能无法连接,云端监控可能无法上报"), AUTOPILOT_DISABLE(RESULT_AUTOPILOT_DISABLE, "无法启动自动驾驶"), - AUTOPILOT_INFERIOR(RESULT_AUTOPILOT_INFERIOR, "自动驾驶部分功能受影响,演示模式可以考虑强行启动,需联系人员排查问题。\n例如定位偏移,camera无数据,算法严重丢帧,属于自动驾驶可以启动,但是效果受影响。"), + AUTOPILOT_INFERIOR(RESULT_AUTOPILOT_INFERIOR, "自动驾驶部分功能受严重影响,演示模式可以考虑强行启动,非演示模式下建议停止自动驾驶,联系人员排查问题。\n例如定位偏移,camera无数据,算法非常严重的丢帧,属于自动驾驶可以启动,但是效果受影响。"), REMOTEPILOT_DISABLE(RESULT_REMOTEPILOT_DISABLE, "无法启动远程驾驶"), REMOTEPILOT_INFERIOR(RESULT_REMOTEPILOT_INFERIOR, "远程驾驶部分功能受影响。例如网络高延迟"), SHOW_WARNING(RESULT_SHOW_WARNING, "一般为过渡状态,存在不确定因素,有可能对自动驾驶有微弱影响,需要在pad端显示为黄色告警。\n如果偶尔上报该result可忽略,如果频繁上报需联系人员进行排查。 目前仅有RTK无法确认状态事件。"); -// DISCONNECTED_WITH_PAD(RESULT_DISCONNECTED_WITH_PAD, "未检测到来自pad的链接,如果只报了这个result,可以通过后台/远程驾驶启动自动驾驶"), -// PAD_CANNOT_CONNECT_TELEMATICS(RESULT_PAD_INFO_LOST, "Pad无法连接到工控机"), -// PAD_INFO_LOST(RESULT_PAD_CANNOT_CONNECT_TELEMATICS, "Pad工控机之间指令信息丢失"), -// PAD_CANNOT_GET_AUTOPILOT_STATUS(RESULT_PAD_CANNOT_GET_AUTOPILOT_STATUS, "Pad端无法拿到自动驾驶状态信息"), -// PAD_CANNOT_GET_GNS_CHASSIS_STATUS(RESULT_PAD_CANNOT_GET_GNS_CHASSIS_STATUS, "Pad端无法拿到自车状态和底盘状态信息"), -// PAD_CANNOT_GET_OBSTACLE_INFO(RESULT_PAD_CANNOT_GET_OBSTACLE_INFO, "Pad端无法拿到障碍物信息"), -// NO_CONNECTION_TO_AICLOUD(RESULT_NO_CONNECTION_TO_AICLOUD, "无法和云端通信"), -// AICLOUD_INFO_LOST(RESULT_AICLOUD_INFO_LOST, "云端工控机之间信息丢失"), -// CANNOT_CHANGE_LIGHT(RESULT_CANNOT_CHANGE_LIGHT, "变灯失败"); /** * 消息result code @@ -69,25 +51,6 @@ public class MogoReport { return REMOTEPILOT_INFERIOR.desc; case RESULT_SHOW_WARNING: return SHOW_WARNING.desc; - -// case RESULT_DISCONNECTED_WITH_PAD: -// return DISCONNECTED_WITH_PAD.desc; -// case RESULT_PAD_CANNOT_CONNECT_TELEMATICS: -// return PAD_CANNOT_CONNECT_TELEMATICS.desc; -// case RESULT_PAD_INFO_LOST: -// return PAD_INFO_LOST.desc; -// case RESULT_PAD_CANNOT_GET_AUTOPILOT_STATUS: -// return PAD_CANNOT_GET_AUTOPILOT_STATUS.desc; -// case RESULT_PAD_CANNOT_GET_GNS_CHASSIS_STATUS: -// return PAD_CANNOT_GET_GNS_CHASSIS_STATUS.desc; -// case RESULT_PAD_CANNOT_GET_OBSTACLE_INFO: -// return PAD_CANNOT_GET_OBSTACLE_INFO.desc; -// case RESULT_NO_CONNECTION_TO_AICLOUD: -// return NO_CONNECTION_TO_AICLOUD.desc; -// case RESULT_AICLOUD_INFO_LOST: -// return AICLOUD_INFO_LOST.desc; -// case RESULT_CANNOT_CHANGE_LIGHT: -// return CANNOT_CHANGE_LIGHT.desc; default: return resultCode; @@ -104,6 +67,7 @@ public class MogoReport { public static final String ACTION_CHECK_GEAR = "ACTION_CHECK_GEAR"; public static final String ACTION_CHECK_NETWORK = "ACTION_CHECK_NETWORK"; public static final String ACTION_TRY_AGAIN_LATER = "ACTION_TRY_AGAIN_LATER"; + public static final String ACTION_REMOTEPILOT_REQUEST = "ACTION_REMOTEPILOT_REQUEST"; public enum Action { @@ -114,7 +78,8 @@ public class MogoReport { REBOOT_VEHICLE(ACTION_REBOOT_VEHICLE, "重启车辆"), CHECK_GEAR(ACTION_CHECK_GEAR, "检查车辆档位等影响自动驾驶的因素"), CHECK_NETWORK(ACTION_CHECK_NETWORK, "检查网络连接和路由器等影响通信的因素"), - TRY_AGAIN_LATER(ACTION_TRY_AGAIN_LATER, "请稍后重试"); + TRY_AGAIN_LATER(ACTION_TRY_AGAIN_LATER, "请稍后重试"), + REMOTEPILOT_REQUEST(ACTION_REMOTEPILOT_REQUEST, "请求远程驾驶"); /** * 消息Action code @@ -303,6 +268,20 @@ public class MogoReport { String TASK_CONFIG_EMPTY = "ERECORD_TASK_CONFIG_EMPTY";//配置为空 String TASK_QUEUE_EMPTY = "ERECORD_TASK_QUEUE_EMPTY";//数据队列为空 } + + /** + * 平行驾驶相关异常 + */ + interface EPARALLEL { + String AICLOUD_CONNECTION_ERROR = "EPARALLEL_AICLOUD_CONNECTION_ERROR";//平行驾驶长连接异常 + } + + /** + * 车辆处于困境,等待平行驾驶接管 + */ + interface EVEHICLE { + String IN_TROUBLE = "EVEHICLE_IN_TROUBLE";//planning 检测到车处于困境,把困境状态汇报给 SSM,ssm 发出该事件,等待驾舱端开始平行驾驶 + } } /** @@ -344,9 +323,10 @@ public class MogoReport { } /** - * 系统状态 常规信息 + * 系统状态 */ interface ISYS { + /*******常规信息*******/ String STARTING = "ISYS_STARTING";//系统启动中 String RUNNING = "ISYS_RUNNING";//所有Xavier启动完成 String EXITING = "ISYS_EXITING";//系统退出中 @@ -362,19 +342,14 @@ public class MogoReport { String SYSTEM_IN_IDLE = "ISYS_SYSTEM_IN_IDLE";//系统进入空闲状态 String SYSTEM_OUT_IDLE = "ISYS_SYSTEM_OUT_IDLE";//系统退出空闲状态 - String FUNC_YY_START = "ISYS_FUNC_YY_START";//产品状态检查开始 - String FUNC_YY_FINISH = "ISYS_FUNC_YY_FINISH";//产品状态达成(第一次ready) - String FUNC_YY_TIMEOUT = "ISYS_FUNC_YY_TIMEOUT";//产品状态检查超时 - String FUNC_YY_ABORT = "ISYS_FUNC_YY_ABORT";//产品状态检查中止 - String FUNC_YY_UNREADY = "ISYS_FUNC_YY_UNREADY";//产品状态未就绪 - String FUNC_YY_READY = "ISYS_FUNC_YY_READY";//产品状态就绪 - + /*******轨迹下载相关*******/ String INIT_TRAJECTORY_START = "ISYS_INIT_TRAJECTORY_START";//轨迹管理_轨迹开始下载 String INIT_TRAJECTORY_SUCCESS = "ISYS_INIT_TRAJECTORY_SUCCESS";//轨迹管理_轨迹下载成功 String INIT_TRAJECTORY_FAILURE = "ISYS_INIT_TRAJECTORY_FAILURE";//轨迹管理_轨迹下载失败,本地无对应轨迹 String INIT_TRAJECTORY_WARNING = "ISYS_INIT_TRAJECTORY_WARNING";//轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功 String INIT_TRAJECTORY_TIMEOUT = "ISYS_INIT_TRAJECTORY_TIMEOUT";//轨迹管理_轨迹下载超时 + /*******配置更新相关*******/ String CONFIG_UPDATE_HADMAP = "ISYS_CONFIG_UPDATE_HADMAP";//需要重启升级高精地图 String CONFIG_UPDATE_AI_MODEL = "ISYS_CONFIG_UPDATE_AI_MODEL";//需要重启升级AI模型 String CONFIG_UPDATE_SLAM_MAP = "ISYS_CONFIG_UPDATE_SLAM_MAP";//需要重启升级SLAM地图 @@ -390,13 +365,65 @@ public class MogoReport { interface ISSM { String INIT = "ISSM_INIT";//SSM系统上电初始化 String RESTARTED = "ISSM_RESTARTED";//SSM系统发生重启 - String MODE_XX_START = "ISSM_MODE_XX_START";//SSM变更模式开始 - String MODE_XX_FINISH = "ISSM_MODE_XX_FINISH";//SSM变更模式完成(第一次ready - String MODE_XX_ABORT = "ISSM_MODE_XX_ABORT";//SSM变更模式中止 - String MODE_XX_TIMEOUT = "ISSM_MODE_XX_TIMEOUT";//SSM变更模式超时 - String MODE_XX_READY = "ISSM_MODE_XX_READY";//SSM模式就绪 - String MODE_XX_UNREADY = "ISSM_MODE_XX_UNREADY";//SSM未就绪 +// String MODE_XX_START = "ISSM_MODE_XX_START";//SSM变更模式开始 +// String MODE_XX_FINISH = "ISSM_MODE_XX_FINISH";//SSM变更模式完成(第一次ready +// String MODE_XX_ABORT = "ISSM_MODE_XX_ABORT";//SSM变更模式中止 +// String MODE_XX_TIMEOUT = "ISSM_MODE_XX_TIMEOUT";//SSM变更模式超时 +// String MODE_XX_READY = "ISSM_MODE_XX_READY";//SSM模式就绪 +// String MODE_XX_UNREADY = "ISSM_MODE_XX_UNREADY";//SSM未就绪 + + //以上6组被注释掉的字段 中的MODE_XX分别替换成MODE_RUN、MODE_IDLE、MODE_STOP + + String MODE_RUN_START = "ISSM_MODE_RUN_START";//SSM变更模式开始 + String MODE_RUN_FINISH = "ISSM_MODE_RUN_FINISH";//SSM变更模式完成(第一次ready + String MODE_RUN_ABORT = "ISSM_MODE_RUN_ABORT";//SSM变更模式中止 + String MODE_RUN_TIMEOUT = "ISSM_MODE_RUN_TIMEOUT";//SSM变更模式超时 + String MODE_RUN_READY = "ISSM_MODE_RUN_READY";//SSM模式就绪 + String MODE_RUN_UNREADY = "ISSM_MODE_RUN_UNREADY";//SSM未就绪 + + String MODE_IDLE_START = "ISSM_MODE_IDLE_START";//SSM变更模式开始 + String MODE_IDLE_FINISH = "ISSM_MODE_IDLE_FINISH";//SSM变更模式完成(第一次ready + String MODE_IDLE_ABORT = "ISSM_MODE_IDLE_ABORT";//SSM变更模式中止 + String MODE_IDLE_TIMEOUT = "ISSM_MODE_IDLE_TIMEOUT";//SSM变更模式超时 + String MODE_IDLE_READY = "ISSM_MODE_IDLE_READY";//SSM模式就绪 + String MODE_IDLE_UNREADY = "ISSM_MODE_IDLE_UNREADY";//SSM未就绪 + + String MODE_STOP_START = "ISSM_MODE_STOP_START";//SSM变更模式开始 + String MODE_STOP_FINISH = "ISSM_MODE_STOP_FINISH";//SSM变更模式完成(第一次ready + String MODE_STOP_ABORT = "ISSM_MODE_STOP_ABORT";//SSM变更模式中止 + String MODE_STOP_TIMEOUT = "ISSM_MODE_STOP_TIMEOUT";//SSM变更模式超时 + String MODE_STOP_READY = "ISSM_MODE_STOP_READY";//SSM模式就绪 + String MODE_STOP_UNREADY = "ISSM_MODE_STOP_UNREADY";//SSM未就绪 + +// String FUNC_YY_START = "ISSM_FUNC_YY_START";//产品状态检查开始 +// String FUNC_YY_FINISH = "ISSM_FUNC_YY_FINISH";//产品状态达成(第一次ready) +// String FUNC_YY_TIMEOUT = "ISSM_FUNC_YY_TIMEOUT";//产品状态检查超时 +// String FUNC_YY_ABORT = "ISSM_FUNC_YY_ABORT";//产品状态检查中止 +// String FUNC_YY_UNREADY = "ISSM_FUNC_YY_UNREADY";//产品状态未就绪 +// String FUNC_YY_READY = "ISSM_FUNC_YY_READY";//产品状态就绪 + + //以上6组被注释掉的字段 中的FUNC_YY分别替换成FUNC_COLD_START、FUNC_AUTO_PILOT、FUNC_REMOTE_PILOT + String FUNC_COLD_START_START = "ISSM_FUNC_COLD_START_START";//产品状态检查开始 + String FUNC_COLD_START_FINISH = "ISSM_FUNC_COLD_START_FINISH";//产品状态达成(第一次ready) + String FUNC_COLD_START_TIMEOUT = "ISSM_FUNC_COLD_START_TIMEOUT";//产品状态检查超时 + String FUNC_COLD_START_ABORT = "ISSM_FUNC_COLD_START_ABORT";//产品状态检查中止 + String FUNC_COLD_START_UNREADY = "ISSM_FUNC_COLD_START_UNREADY";//产品状态未就绪 + String FUNC_COLD_START_READY = "ISSM_FUNC_COLD_START_READY";//产品状态就绪 + + String FUNC_AUTO_PILOT_START = "ISSM_FUNC_AUTO_PILOT_START";//产品状态检查开始 + String FUNC_AUTO_PILOT_FINISH = "ISSM_FUNC_AUTO_PILOT_FINISH";//产品状态达成(第一次ready) + String FUNC_AUTO_PILOT_TIMEOUT = "ISSM_FUNC_AUTO_PILOT_TIMEOUT";//产品状态检查超时 + String FUNC_AUTO_PILOT_ABORT = "ISSM_FUNC_AUTO_PILOT_ABORT";//产品状态检查中止 + String FUNC_AUTO_PILOT_UNREADY = "ISSM_FUNC_AUTO_PILOT_UNREADY";//产品状态未就绪 + String FUNC_AUTO_PILOT_READY = "ISSM_FUNC_AUTO_PILOT_READY";//产品状态就绪 + + String FUNC_REMOTE_PILOT_START = "ISSM_FUNC_REMOTE_PILOT_START";//产品状态检查开始 + String FUNC_REMOTE_PILOT_FINISH = "ISSM_FUNC_REMOTE_PILOT_FINISH";//产品状态达成(第一次ready) + String FUNC_REMOTE_PILOT_TIMEOUT = "ISSM_FUNC_REMOTE_PILOT_TIMEOUT";//产品状态检查超时 + String FUNC_REMOTE_PILOT_ABORT = "ISSM_FUNC_REMOTE_PILOT_ABORT";//产品状态检查中止 + String FUNC_REMOTE_PILOT_UNREADY = "ISSM_FUNC_REMOTE_PILOT_UNREADY";//产品状态未就绪 + String FUNC_REMOTE_PILOT_READY = "ISSM_FUNC_REMOTE_PILOT_READY";//产品状态就绪 } interface IAGENT { @@ -427,6 +454,20 @@ public class MogoReport { String TASK_AUTO = "IRECORDER_TASK_AUTO";//自动录包任务创建 String TASK_CMD = "IRECORDER_TASK_CMD";//指令录包任务创建 } + + /** + * 平行驾驶相关 + */ + interface IPARALLEL { + String AICLOUD_CONNECTION_OK = "IPARALLEL_AICLOUD_CONNECTION_OK";//长连接连接恢复后, 5s 内如果长连状态一直 ok 的话,会触发该事件 建议鹰眼展示该事件 + } + + /** + * 车辆处于困境相关 + */ + interface IVEHICLE { + String NOT_IN_TROUBLE = "IVEHICLE_NOT_IN_TROUBLE";//车辆脱离困境,恢复正常,可继续开始自动驾驶了 触发频率:处于困境中,触发一次; 脱困后,触发一次 云端驾舱会接入该事件 建议鹰眼也接入,展示困境状态/脱困状态 + } } } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility230.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility230.java new file mode 100644 index 0000000000..588f741e14 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility230.java @@ -0,0 +1,109 @@ +package com.zhidao.support.adas.high.common.autopilot.ability; + +import com.zhidao.support.adas.high.OnAdasListener; + +import java.util.Timer; +import java.util.TimerTask; +import java.util.regex.Pattern; + +import chassis.Chassis; +import chassis.ChassisStatesOuterClass; + +/** + * 是否可以启动自动驾驶能力检测 工控机版本>=230&& <250 使用此类 + * 目前监控了底盘的一些状态和查询节点状态应答的数据 + * 没有使用监控事件报告的原因是因为,部分异常没进行正常恢复通知,例如收到了异常监控数据,但是异常恢复之后没有恢复的通知 + *

+ * 此定时器不能停止 鹰眼中存在UI更新依赖循环查询系统状态 + */ +public class AutopilotAbility230 { + private static final String TAG = AutopilotAbility230.class.getSimpleName(); + private static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测时间 + private volatile Timer timer; + private ChassisStatesOuterClass.ChassisStates chassisStates; + + public AutopilotAbility230() { + } + + + public void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) { + this.chassisStates = chassisStates; + } + + private void onCallback() { + //金旅、开沃小巴乘客端 不能启动自动驾驶 + if (AutopilotAbilityManager.getInstance().isBus() && AutopilotAbilityManager.getInstance().isPassenger()) { + return; + } + boolean isAutopilotAbility = true;//是否能启动自动驾驶 + String unableAutopilotReason = null;//不能启动自动驾驶原因 + //检测底盘相关 + if (chassisStates != null) { + if (chassisStates.hasBrakeSystemStates()) { + float brake = chassisStates.getBrakeSystemStates().getBrakePedalResponsePosition(); + if (brake > 0) { + isAutopilotAbility = false; + unableAutopilotReason = "制动踏板被踩下"; + } + } + if (isAutopilotAbility) { + /** + * 档位状态判断 目前判断的车型包括 东风Taxi 红旗Taxi 金旅Bus + */ + if (chassisStates.hasGearSystemStates()) { + Chassis.GearPosition gear = chassisStates.getGearSystemStates().getGearPosition(); + //金旅Bus和清扫车 档位不正常 + if (AutopilotAbilityManager.getInstance().isBus()) { + if (gear == Chassis.GearPosition.GEAR_N || gear == Chassis.GearPosition.GEAR_R) { + isAutopilotAbility = false; + unableAutopilotReason = "档位不正常"; + } + } else { + //东风Taxi和红旗 司机端和乘客端 档位不正常 + if (gear == Chassis.GearPosition.GEAR_P || gear == Chassis.GearPosition.GEAR_R) { + isAutopilotAbility = false; + unableAutopilotReason = "档位不正常"; + } + } + } + } + + //TODO 关于手刹:不同车型的实现不同所以目前没法使用此字段 +// if (isAutopilotAbility) { +// //电子驻车制动系统 +// if (chassisStates.hasEpbSystemStates()) { +// ChassisStatesOuterClass.EPBSystemStates epb = chassisStates.getEpbSystemStates(); +// if (epb.hasEpbEnableState()){ +// epb.getEpbWorkState(); +// } +// } +// } + } + if (AutopilotAbilityManager.getInstance().getListener() != null) { + AutopilotAbilityManager.getInstance().getListener().onAutopilotAbility(isAutopilotAbility, unableAutopilotReason); + } + } + + public synchronized void start() { + if (timer == null) { + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + onCallback(); + } + }, 2000L, DEFAULT_DETECTION_TIME);//延迟执行,避免刚连接成功后底盘信息无法及时同步 + } + } + + public synchronized void stop() { + if (timer != null) { + timer.cancel(); + timer = null; + } + this.chassisStates = null; + } + + + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility250.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility250.java new file mode 100644 index 0000000000..18143ec8b0 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbility250.java @@ -0,0 +1,198 @@ +package com.zhidao.support.adas.high.common.autopilot.ability; + +import android.os.Message; + +import com.zhidao.support.adas.high.AdasManager; + +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + +import chassis.Chassis; +import chassis.ChassisStatesOuterClass; +import system_master.SystemStatusInfo; + +/** + * 是否可以启动自动驾驶能力检测 工控机版本>=250使用此类 + * 目前监控了底盘的一些状态和查询节点状态应答的数据 + * 没有使用监控事件报告的原因是因为,部分异常没进行正常恢复通知,例如收到了异常监控数据,但是异常恢复之后没有恢复的通知 + *

+ * 此定时器不能停止 鹰眼中存在UI更新依赖循环查询系统状态 + */ +public class AutopilotAbility250 { + private static final String TAG = AutopilotAbility250.class.getSimpleName(); + private static final int WHAT_TIMEOUT = 0; + private static final int DEFAULT_TIMEOUT = 1500; + private static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测时间 + private static final String[] NODE_INFO_STATE = {"未知状态 ", "依赖未就绪 ", "启动中 ", "运行 ", "停止 ", "无法启动状态 ", "人为启动状态 ", "人为关闭状态 "}; + private volatile Timer timer; + private ChassisStatesOuterClass.ChassisStates chassisStates; + + public AutopilotAbility250() { + } + + + public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) { + if (AutopilotAbilityManager.getInstance().getHandler() != null) { + if (AutopilotAbilityManager.getInstance().getHandler().hasMessages(WHAT_TIMEOUT)) + AutopilotAbilityManager.getInstance().getHandler().removeMessages(WHAT_TIMEOUT); + } + onCallback(statusInfo); + } + + public void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) { + this.chassisStates = chassisStates; + } + + private void onCallback(SystemStatusInfo.StatusInfo statusInfo) { + //金旅、开沃小巴乘客端 不能启动自动驾驶 + if (AutopilotAbilityManager.getInstance().isBus() && AutopilotAbilityManager.getInstance().isPassenger()) { + return; + } + boolean isAutopilotAbility = true;//是否能启动自动驾驶 + String unableAutopilotReason = null;//不能启动自动驾驶原因 + //检测节点状态相关 + if (statusInfo != null) { + int version = -1; + if (statusInfo.hasMasterVersion()) { + //截取Master Version + String masterVersion = statusInfo.getMasterVersion(); + version = AutopilotAbilityManager.getInstance().parseVersion(false, masterVersion); + } + //如果 maser version 大于1,还需要判断AutoPilotReady字段是否存在,以确保MAP版本和SSM Maser版本不陪配情况逻辑能正常执行 + if (version > 1 && statusInfo.hasAutoPilotReady()) { + isAutopilotAbility = statusInfo.getAutoPilotReady(); + if (!isAutopilotAbility) { + SystemStatusInfo.NodeFaultList nodeFaultList = statusInfo.getAutoPilotUnreadyList(); + if (nodeFaultList.getSum() > 0) { + List list = nodeFaultList.getNodeList(); + StringBuilder builder = new StringBuilder(); + for (SystemStatusInfo.NodeInfo info : list) { + builder.append(info.getNodeName()); + int state = info.getState(); + if (state < NODE_INFO_STATE.length) { + builder.append(NODE_INFO_STATE[state]); + } else { + builder.append("未知异常 "); + } + } + unableAutopilotReason = builder.toString(); + } else { + unableAutopilotReason = "未知异常节点"; + } + } + } else { + SystemStatusInfo.SystemState systemState = statusInfo.getSysState(); + if (systemState != SystemStatusInfo.SystemState.SYS_RUNNING && systemState != SystemStatusInfo.SystemState.PILOT_READY) { + isAutopilotAbility = false; + if (systemState == SystemStatusInfo.SystemState.SYS_STARTING) { + unableAutopilotReason = "系统正在启动"; + } else if (systemState == SystemStatusInfo.SystemState.SYS_EXITING) { + unableAutopilotReason = "系统正在关闭"; + } else if (systemState == SystemStatusInfo.SystemState.SYS_FAULT) { + unableAutopilotReason = "系统异常"; + } else if (systemState == SystemStatusInfo.SystemState.AUTO_PILOT_STARTING) { + //如果第一次下发了启动自动驾驶,没起来或者存在干预 此时systemState是AUTO_PILOT_STARTING 需要二次下发启动自驾命令 所以需要排除此状态 + isAutopilotAbility = true; + //unableAutopilotReason = "正在开始自动驾驶"; + } else if (systemState == SystemStatusInfo.SystemState.AUTO_PILOT_RUNNING) { + unableAutopilotReason = "自动驾驶运行中"; + } else if (systemState == SystemStatusInfo.SystemState.REMOTE_PILOT_STARTING) { + unableAutopilotReason = "平行驾驶启动中"; + } else if (systemState == SystemStatusInfo.SystemState.REMOTE_PILOT_RUNNING) { + unableAutopilotReason = "平行驾驶运行中"; + } else { + unableAutopilotReason = "未知系统状态"; + } + } + } + } else { + isAutopilotAbility = false;//是否能启动自动驾驶 + unableAutopilotReason = "SSM状态查询超时无响应";//不能启动自动驾驶原因 + } + //检测底盘相关 + if (chassisStates != null) { + if (isAutopilotAbility) { + if (chassisStates.hasBrakeSystemStates()) { + float brake = chassisStates.getBrakeSystemStates().getBrakePedalResponsePosition(); + if (brake > 0) { + isAutopilotAbility = false; + unableAutopilotReason = "制动踏板被踩下"; + } + } + } + if (isAutopilotAbility) { + /** + * 档位状态判断 目前判断的车型包括 东风Taxi 红旗Taxi 金旅Bus + */ + if (chassisStates.hasGearSystemStates()) { + Chassis.GearPosition gear = chassisStates.getGearSystemStates().getGearPosition(); + //金旅Bus和清扫车 档位不正常 + if (AutopilotAbilityManager.getInstance().isBus()) { + if (gear == Chassis.GearPosition.GEAR_N || gear == Chassis.GearPosition.GEAR_R) { + isAutopilotAbility = false; + unableAutopilotReason = "档位不正常"; + } + } else { + //东风Taxi和红旗 司机端和乘客端 档位不正常 + if (gear == Chassis.GearPosition.GEAR_P || gear == Chassis.GearPosition.GEAR_R) { + isAutopilotAbility = false; + unableAutopilotReason = "档位不正常"; + } + } + } + } + + //TODO 关于手刹:不同车型的实现不同所以目前没法使用此字段 +// if (isAutopilotAbility) { +// //电子驻车制动系统 +// if (chassisStates.hasEpbSystemStates()) { +// ChassisStatesOuterClass.EPBSystemStates epb = chassisStates.getEpbSystemStates(); +// if (epb.hasEpbEnableState()){ +// epb.getEpbWorkState(); +// } +// } +// } + } + if (AutopilotAbilityManager.getInstance().getListener() != null) { + AutopilotAbilityManager.getInstance().getListener().onAutopilotAbility(isAutopilotAbility, unableAutopilotReason); + } + } + + public synchronized void start() { + if (timer == null) { + timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + if (AutopilotAbilityManager.getInstance().getOnAutopilotAbilityListener() != null) { + AutopilotAbilityManager.getInstance().getOnAutopilotAbilityListener().onStatusQuery(); + } + AdasManager.getInstance().sendStatusQueryReq(); + if (AutopilotAbilityManager.getInstance().getHandler() != null) { + if (AutopilotAbilityManager.getInstance().getHandler().hasMessages(WHAT_TIMEOUT)) + AutopilotAbilityManager.getInstance().getHandler().removeMessages(WHAT_TIMEOUT); + AutopilotAbilityManager.getInstance().getHandler().sendEmptyMessageDelayed(WHAT_TIMEOUT, DEFAULT_TIMEOUT); + } + } + }, 2000L, DEFAULT_DETECTION_TIME);//延迟执行,避免刚连接成功后底盘信息无法及时同步 + } + } + + public synchronized void stop() { + if (timer != null) { + timer.cancel(); + timer = null; + } + this.chassisStates = null; + } + + + public void onHandleMessage(Message msg) { + if (msg.what == WHAT_TIMEOUT) { + onCallback(null); + } + } + + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java new file mode 100644 index 0000000000..43e8b0cb3a --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/autopilot/ability/AutopilotAbilityManager.java @@ -0,0 +1,242 @@ +package com.zhidao.support.adas.high.common.autopilot.ability; + +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; + +import com.zhidao.support.adas.high.AdasManager; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.Constants; +import com.zhidao.support.adas.high.common.CupidLogUtils; + +import java.util.Timer; +import java.util.TimerTask; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import chassis.ChassisStatesOuterClass; +import mogo.telematics.pad.MessagePad; +import system_master.SystemStatusInfo; + +/** + * 是否可以启动自动驾驶能力检测 + * 目前监控了底盘的一些状态和查询节点状态应答的数据 + * 没有使用监控事件报告的原因是因为,部分异常没进行正常恢复通知,例如收到了异常监控数据,但是异常恢复之后没有恢复的通知 + *

+ * 此定时器不能停止 鹰眼中存在UI更新依赖循环查询系统状态 + */ +public class AutopilotAbilityManager { + private static final String TAG = AutopilotAbilityManager.class.getSimpleName(); + private static volatile AutopilotAbilityManager INSTANCE; + private OnAdasListener listener; + private final Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+"); + private Handler handler; + private OnAutopilotAbilityListener onAutopilotAbilityListener; + private int dockerVersion = -1;//工控机版本 + private AutopilotAbility230 autopilotAbility230; + private AutopilotAbility250 autopilotAbility250; + private Timer startTimer; + /** + * 身份/车型 + */ + private int identityMode; + + public interface OnAutopilotAbilityListener { + void onStatusQuery();//查询是被调用 + } + + private AutopilotAbilityManager() { + } + + public static AutopilotAbilityManager getInstance() { + if (INSTANCE == null) { + synchronized (AutopilotAbilityManager.class) { + if (INSTANCE == null) { + INSTANCE = new AutopilotAbilityManager(); + } + } + } + return INSTANCE; + } + + + public void setIdentityMode(int identityMode) { + this.identityMode = identityMode; + } + + public void setCarConfig(MessagePad.CarConfigResp carConfig) { + if (dockerVersion == -1) { + String v = carConfig.getDockVersion(); + int version = parseVersion(true, v); + if (version != -1) { + stopTimer(); + dockerVersion = version; + Log.i("dddd", "工控机版本=" + dockerVersion); + initAutopilotAbility(); + } + } + } + + public void setOnAdasListener(OnAdasListener listener) { + this.listener = listener; + } + + public OnAdasListener getListener() { + return listener; + } + + public void setHandler(Handler handler) { + this.handler = handler; + } + + public Handler getHandler() { + return handler; + } + + public void setOnAutopilotAbilityListener(OnAutopilotAbilityListener onAutopilotAbilityListener) { + this.onAutopilotAbilityListener = onAutopilotAbilityListener; + } + + public OnAutopilotAbilityListener getOnAutopilotAbilityListener() { + return onAutopilotAbilityListener; + } + + + public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) { + if (autopilotAbility250 != null) { + autopilotAbility250.setStatusInfo(statusInfo); + } + + } + + public void setChassisStates(ChassisStatesOuterClass.ChassisStates chassisStates) { + if (autopilotAbility230 != null) { + autopilotAbility230.setChassisStates(chassisStates); + } + if (autopilotAbility250 != null) { + autopilotAbility250.setChassisStates(chassisStates); + } + } + + + public void onHandleMessage(Message msg) { + if (autopilotAbility250 != null) { + autopilotAbility250.onHandleMessage(msg); + } + } + + + private void initAutopilotAbility() { + if (dockerVersion >= 250) { + stop230(); + if (autopilotAbility250 == null) { + autopilotAbility250 = new AutopilotAbility250(); + autopilotAbility250.start(); + } + } else { + stop250(); + if (autopilotAbility230 == null) { + autopilotAbility230 = new AutopilotAbility230(); + autopilotAbility230.start(); + } + + } + } + + private void stop230() { + if (autopilotAbility230 != null) { + autopilotAbility230.stop(); + autopilotAbility230 = null; + } + } + + private void stop250() { + if (autopilotAbility250 != null) { + autopilotAbility250.stop(); + autopilotAbility250 = null; + } + } + + private void stopTimer() { + if (startTimer != null) { + startTimer.cancel(); + startTimer = null; + } + } + + /** + * 连接工控机成功调用此函数,如果dockerVersion还未获取到将启动最低版本的启动自动驾驶能力检测 + * 此函数为保险措施 以防无法获取工控机版本时 也能 正常执行逻辑 + */ + public synchronized void start() { + if (startTimer == null) { + startTimer = new Timer(); + startTimer.schedule(new TimerTask() { + @Override + public void run() { + if (dockerVersion == -1 && AdasManager.getInstance().getIpcConnectionStatus() == Constants.IPC_CONNECTION_STATUS.CONNECTED) { + dockerVersion = 230; + initAutopilotAbility(); + } + } + }, 8000L);//延迟执行,避免刚连接成功后底盘信息无法及时同步 + } + + } + + public synchronized void stop() { + stopTimer(); + stop230(); + stop250(); + handler = null; + dockerVersion = -1; + } + + + /** + * 接线板 格式 xxx.xxx.xxx(x的数量不固定) + * + * @param isUserAll 是否使用全部截取数据 true:表示 12.34.56 截取之后 123456 false:表示12.34.56 截取之后 12 + * @param ver 版本字符串 + * @return -1表示解析失败 + */ + public int parseVersion(boolean isUserAll, String ver) { + int version = -1; + if (!TextUtils.isEmpty(ver)) { + try { + Matcher matcher = pattern.matcher(ver); + if (matcher.find()) { + String group = matcher.group(); + if (!TextUtils.isEmpty(group)) { + if (isUserAll) { + group = group.replace(".", ""); + } else { + group = group.split("\\.")[0]; + } + version = Integer.parseInt(group); + } + } + } catch (Exception e) { + CupidLogUtils.e(TAG, "版本解析失败=" + ver, e); + } + } + return version; + } + + public boolean isDriver() { + return (identityMode & 0x01) != 0x01; + } + + public boolean isPassenger() { + return (identityMode & 0x01) == 0x01; + } + + public boolean isBus() { + return (identityMode & 0xA0) == 0xA0; + } + + public boolean isTaxi() { + return (identityMode & 0xA0) != 0xA0; + } +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/BagManagerMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/BagManagerMessage.java new file mode 100644 index 0000000000..d4717f7c86 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/BagManagerMessage.java @@ -0,0 +1,33 @@ +package com.zhidao.support.adas.high.msg; + +import android.os.SystemClock; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.AdasChannel; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.protocol.RawData; + +import bag_manager.BagManagerOuterClass; + +/** + * Bag管理应答 + */ +public class BagManagerMessage extends MyAbstractMessageHandler { + + public BagManagerMessage() { + } + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + BagManagerOuterClass.BagManager bagManager = BagManagerOuterClass.BagManager.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + AdasChannel.calculateTimeConsumingOnDispatchRaw("Bag管理应答", raw.receiveTime); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + adasListener.onBagManagerCmd(raw.getHeader(), bagManager); + } + AdasChannel.calculateTimeConsumingBusiness("Bag管理应答", nowTime); + } +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java index 61c6d1b9f4..7a63aed0b6 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java @@ -7,6 +7,7 @@ import com.zhidao.support.adas.high.AdasChannel; import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.OnAdasListener; import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.protocol.RawData; import mogo.telematics.pad.MessagePad; @@ -20,6 +21,7 @@ public class CarConfigRespMessage extends MyAbstractMessageHandler { public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { MessagePad.CarConfigResp carConfigResp = MessagePad.CarConfigResp.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); AdasChannel.calculateTimeConsumingOnDispatchRaw("车机基础信息应答", raw.receiveTime); + AutopilotAbilityManager.getInstance().setCarConfig(carConfigResp); AdasManager.getInstance().setCarConfig(carConfigResp); long nowTime = 0; if (CupidLogUtils.isEnableLog()) diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java index db9df5b63e..9d0b11daed 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java @@ -32,6 +32,7 @@ public class MyMessageFactory implements IMyMessageFactory { private IMsg recordDataConfigRespMessage;//数据采集配置应答 private IMsg planningDecisionStateMessage;//planning决策状态 private IMsg obuWarningDataMessage;//工控机透传OBU V2I数据 + private IMsg bagManagerMessage;//Bag管理应答 private final AutopilotReview autopilotReview; @@ -155,6 +156,12 @@ public class MyMessageFactory implements IMyMessageFactory { obuWarningDataMessage = new ObuWarningDataMessage(); } return obuWarningDataMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_BAG_MANAGER_CMD.typeCode) { + //Bag管理应答 + if (bagManagerMessage == null) { + bagManagerMessage = new BagManagerMessage(); + } + return bagManagerMessage; } else { //MessageType.TYPE_DEFAULT.typeCode return null; diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java index 7baa2838cd..e146fca77c 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java @@ -10,7 +10,8 @@ import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.common.MogoReport; import com.zhidao.support.adas.high.protocol.RawData; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import mogo_msg.MogoReportMsg; @@ -19,9 +20,28 @@ import mogo_msg.MogoReportMsg; */ public class ReportMessage extends MyAbstractMessageHandler { private final AutopilotReview autopilotReview; + private final Set startAutopilotFailCode = new HashSet();//启动自驾失败Code public ReportMessage(AutopilotReview autopilotReview) { this.autopilotReview = autopilotReview; + initStartAutopilotFailCode(); + } + + private void initStartAutopilotFailCode() { + //ssm_master的失败事件 + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.AUTOPILOT_FAILED);//在尝试启动自动驾驶,但是超过指定时间后底盘未进入,会发送此事件 + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.ROUTING_REQ_TIMEOUT);//算路请求响应超时或轨迹加载超时 + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.PLANNING_CHANGE_FAILIED);//planning切换失败(仅df hq有此事件) + startAutopilotFailCode.add(MogoReport.Code.Error.ESYS.CHECK_TRAJECTORY_FAILURE);//轨迹下载检查不可用 + //controller的失败事件 EMAP_ENTRY_AUTOPILOT_XXX 底盘启动失败 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_CANADAPTER_TIMEOUT);//can_adapter消息超时未进入自驾 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_PLANNING_TIMEOUT);//PLANNING消息超时未进自驾 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_LOCATION_TIMEOUT);//定位消息超时未进自驾 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_BRAKE);//制动踏板干预未进自驾 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_ACCEL);//加速踏板干预未进自驾 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_STEER);//方向盘干预未进自驾 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_GEAR_SWITCH);//档位切换干预未进自驾 + startAutopilotFailCode.add(MogoReport.Code.Error.EMAP.ENTRY_AUTOPILOT_FOR_OTHER_CTL);//其他干预未进自驾,请检查仪表盘和开关项(如双闪,制动灯灯等 可在msg中补充原因信息) } @Override @@ -36,8 +56,8 @@ public class ReportMessage extends MyAbstractMessageHandler { } AdasChannel.calculateTimeConsumingBusiness("监控事件报告", nowTime); //分发自动驾驶启动失败相关回调 - List results = mogoReportMessage.getResultList(); - if (!results.isEmpty() && results.contains(MogoReport.RESULT_AUTOPILOT_DISABLE)) { + String code = mogoReportMessage.getCode(); + if (startAutopilotFailCode.contains(code)) { if (adasListener != null) { adasListener.onStartAutopilotFailed(mogoReportMessage);//启动自动驾驶失败回调 } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java index be81f42258..2d37f3ced7 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/StatusQueryRespMessage.java @@ -5,7 +5,7 @@ import android.os.SystemClock; import com.google.protobuf.InvalidProtocolBufferException; import com.zhidao.support.adas.high.AdasChannel; import com.zhidao.support.adas.high.OnAdasListener; -import com.zhidao.support.adas.high.common.AutopilotAbilityManager; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.protocol.RawData; diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java index ccfc0ec84d..5a94481d6a 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java @@ -5,11 +5,14 @@ import android.os.SystemClock; import com.google.protobuf.InvalidProtocolBufferException; import com.zhidao.support.adas.high.AdasChannel; import com.zhidao.support.adas.high.OnAdasListener; -import com.zhidao.support.adas.high.common.AutopilotAbilityManager; +import com.zhidao.support.adas.high.common.autopilot.ability.AutopilotAbilityManager; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.protocol.RawData; +import chassis.Chassis; +import chassis.ChassisStatesOuterClass; import chassis.VehicleStateOuterClass; +import common.HeaderOuterClass; /** * 底盘信息, 透传底盘状态,pb参考底盘 @@ -20,7 +23,7 @@ public class VehicleStateMessage extends MyAbstractMessageHandler { public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { VehicleStateOuterClass.VehicleState vehicleState = VehicleStateOuterClass.VehicleState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); AdasChannel.calculateTimeConsumingOnDispatchRaw("底盘信息", raw.receiveTime); - AutopilotAbilityManager.getInstance().setVehicleState(vehicleState); + compatibility(vehicleState); long nowTime = 0; if (CupidLogUtils.isEnableLog()) nowTime = SystemClock.elapsedRealtime(); @@ -30,4 +33,291 @@ public class VehicleStateMessage extends MyAbstractMessageHandler { AdasChannel.calculateTimeConsumingBusiness("底盘信息", nowTime); // CupidLogUtils.e("底盘信息--->" + vehicleState.toString()); } + + /** + * 将老地盘数据转换成新地盘数据 + * 字段注释中 鹰眼已用 的 已和底盘相关开发 确认过,其他字段均为确认对应关系 + * 新底盘中未找到字段: + * parking_brake longitude_driving_mode eps_steering_mode + * steering_sign location_missing trajectory_missing + * chassis_status_missing pilot_mode_condition_met vehicletakeoverstatus + * fuel_value robo_taxi_state robo_bus_state + * robo_bus_jinlv_m1_state + */ + private ChassisStatesOuterClass.ChassisStates compatibility(VehicleStateOuterClass.VehicleState vehicleState) throws InvalidProtocolBufferException { + /**************老地盘转换成新地盘PB***************/ + ChassisStatesOuterClass.ChassisStates.Builder builder = ChassisStatesOuterClass.ChassisStates.newBuilder(); + //工控机所用Header + if (vehicleState.hasHeader()) { + builder.setHeader(HeaderOuterClass.Header.parseFrom(vehicleState.getHeader().toByteArray())); + } + setBCMSystemStates(builder, vehicleState); + setSteerSystemStates(builder, vehicleState); + setGearSystemStates(builder, vehicleState); + setVehicleMotionStates(builder, vehicleState); + setDrivingSystemStates(builder, vehicleState); + setBrakeSystemStates(builder, vehicleState); + setChassisAutopilotAssistanceInformation(builder, vehicleState); + //电子驻车制动系统 + if (vehicleState.hasEpb()) { + Chassis.EPBWorkStatus old = vehicleState.getEpb(); + ChassisStatesOuterClass.EPBWorkStates epb = null; + if (old == Chassis.EPBWorkStatus.EPBSTATUS_NONE) { + epb = ChassisStatesOuterClass.EPBWorkStates.EPB_STATE_NONE; + } else if (old == Chassis.EPBWorkStatus.EPBSTATUS_LOCKED) { + epb = ChassisStatesOuterClass.EPBWorkStates.EPB_STATE_LOCKED; + } else if (old == Chassis.EPBWorkStatus.EPBSTATUS_RELEASED) { + epb = ChassisStatesOuterClass.EPBWorkStates.EPB_STATE_RELEASED; + } else if (old == Chassis.EPBWorkStatus.EPBSTATUS_LOCKED_FAIL) { + epb = ChassisStatesOuterClass.EPBWorkStates.EPB_STATE_LOCKED_FAIL; + } else if (old == Chassis.EPBWorkStatus.EPBSTATUS_RELEASE_FAIL) { + epb = ChassisStatesOuterClass.EPBWorkStates.EPB_STATE_RELEASE_FAIL; + } else if (old == Chassis.EPBWorkStatus.EPBSTATUS_FAULT) { + epb = ChassisStatesOuterClass.EPBWorkStates.EPB_STATE_FAULT; + } + if (epb != null) { + builder.setEpbSystemStates(ChassisStatesOuterClass.EPBSystemStates.newBuilder() + .setEpbWorkState(epb)); + } + } + // 整车故障状态 + if (vehicleState.hasVehiclefaultlevel()) { + Chassis.VehicleFaultLevel vehicleFaultLevel = vehicleState.getVehiclefaultlevel(); + ChassisStatesOuterClass.VehicleFaultLevels vehicleFaultLevels = null; + if (vehicleFaultLevel == Chassis.VehicleFaultLevel.None_Fault) { + vehicleFaultLevels = ChassisStatesOuterClass.VehicleFaultLevels.NONE_FAULT; + } else if (vehicleFaultLevel == Chassis.VehicleFaultLevel.General_Fault) { + vehicleFaultLevels = ChassisStatesOuterClass.VehicleFaultLevels.GENERAL_FAULT; + } else if (vehicleFaultLevel == Chassis.VehicleFaultLevel.Serious_Fault) { + vehicleFaultLevels = ChassisStatesOuterClass.VehicleFaultLevels.SERIOUS_FAULT; + } else if (vehicleFaultLevel == Chassis.VehicleFaultLevel.Critical_Fault) { + vehicleFaultLevels = ChassisStatesOuterClass.VehicleFaultLevels.CRITICAL_FAULT; + } + if (vehicleFaultLevels != null) { + builder.setVehicleChassisFaultInformation(ChassisStatesOuterClass.VehicleChassisFaultInformation.newBuilder() + .setVehiclefaultlevel(vehicleFaultLevels)); + } + } + //电量 + if (vehicleState.hasBmsSoc()) { + builder.setBmsSystemStates(ChassisStatesOuterClass.BMSSystemStates.newBuilder().setBmsSoc(vehicleState.getBmsSoc())); + } + //清扫车(福田)清扫控制系统状态 + if (vehicleState.hasSweeperFutianCleanSystemState()) { + byte[] bytes = vehicleState.getSweeperFutianCleanSystemState().toByteArray(); + builder.setTaskSystemStates(ChassisStatesOuterClass.TaskSystemStates.newBuilder() + .setSweeperFutianTaskSystemStates(ChassisStatesOuterClass.SweeperFuTianTaskSystemStates.parseFrom(bytes)));//鹰眼已用 清扫车专用 + } + ChassisStatesOuterClass.ChassisStates chassisStates = builder.build(); + AutopilotAbilityManager.getInstance().setChassisStates(chassisStates); + return chassisStates; + } + + + private void setChassisAutopilotAssistanceInformation(ChassisStatesOuterClass.ChassisStates.Builder builder, VehicleStateOuterClass.VehicleState vehicleState) { + ChassisStatesOuterClass.ChassisAutopilotAssistanceInformation.Builder chassisAutopilotAssistanceInformation = null; + if (vehicleState.hasPilotMode()) { + chassisAutopilotAssistanceInformation = ChassisStatesOuterClass.ChassisAutopilotAssistanceInformation.newBuilder(); + chassisAutopilotAssistanceInformation.setChassisPilotModeState(vehicleState.getPilotMode()); + } + if (vehicleState.hasEmergencyStopSwitch()) { + if (chassisAutopilotAssistanceInformation == null) { + chassisAutopilotAssistanceInformation = ChassisStatesOuterClass.ChassisAutopilotAssistanceInformation.newBuilder(); + } + // 急停开关状态 + chassisAutopilotAssistanceInformation.setEmergencyStopSwitchState(vehicleState.getEmergencyStopSwitch()); + } + if (chassisAutopilotAssistanceInformation != null) { + builder.setChassisAutopilotAssistanceInformation(chassisAutopilotAssistanceInformation); + } + } + + /** + * 档位 + */ + private void setGearSystemStates(ChassisStatesOuterClass.ChassisStates.Builder builder, VehicleStateOuterClass.VehicleState vehicleState) { + ChassisStatesOuterClass.GearSystemStates.Builder gearSystemStates = null; + if (vehicleState.hasGear()) { + gearSystemStates = ChassisStatesOuterClass.GearSystemStates.newBuilder(); + //档位数据 + gearSystemStates.setGearPosition(vehicleState.getGear());//鹰眼已用 + } + if (vehicleState.hasGearSwitchInference()) { + if (gearSystemStates == null) { + gearSystemStates = ChassisStatesOuterClass.GearSystemStates.newBuilder(); + } + //档位干预 + gearSystemStates.setGearSwitchInferenceState(vehicleState.getGearSwitchInference()); + } + if (gearSystemStates != null) { + builder.setGearSystemStates(gearSystemStates); + } + } + + /** + * 油门 + */ + private void setDrivingSystemStates(ChassisStatesOuterClass.ChassisStates.Builder builder, VehicleStateOuterClass.VehicleState vehicleState) { + ChassisStatesOuterClass.DrivingSystemStates.Builder drivingSystemStates = null; + if (vehicleState.hasThrottle()) { + drivingSystemStates = ChassisStatesOuterClass.DrivingSystemStates.newBuilder(); + //油门 + drivingSystemStates.setThrottleResponsePosition(vehicleState.getThrottle());//鹰眼已用 + } + if (vehicleState.hasAccelInference()) { + if (drivingSystemStates == null) { + drivingSystemStates = ChassisStatesOuterClass.DrivingSystemStates.newBuilder(); + } + //加速踏板干预 + drivingSystemStates.setAccelerationPedalInferenceState(vehicleState.getAccelInference()); + } + if (drivingSystemStates != null) { + builder.setDrivingSystemStates(drivingSystemStates); + } + } + + /** + * 刹车 + */ + private void setBrakeSystemStates(ChassisStatesOuterClass.ChassisStates.Builder builder, VehicleStateOuterClass.VehicleState vehicleState) { + ChassisStatesOuterClass.BrakeSystemStates.Builder brakeSystemStates = null; + if (vehicleState.hasBrake()) { + brakeSystemStates = ChassisStatesOuterClass.BrakeSystemStates.newBuilder(); + //刹车 + brakeSystemStates.setBrakePedalResponsePosition(vehicleState.getBrake());//鹰眼已用 + } + if (vehicleState.hasBrakeInference()) { + if (brakeSystemStates == null) { + brakeSystemStates = ChassisStatesOuterClass.BrakeSystemStates.newBuilder(); + } + //刹车干预 + brakeSystemStates.setBrakePedalInferenceState(vehicleState.getBrakeInference()); + } + if (brakeSystemStates != null) { + builder.setBrakeSystemStates(brakeSystemStates); + } + } + + /** + * 方向盘 + */ + private void setSteerSystemStates(ChassisStatesOuterClass.ChassisStates.Builder builder, VehicleStateOuterClass.VehicleState vehicleState) { + ChassisStatesOuterClass.SteerSystemStates.Builder steerSystemStates = null; + if (vehicleState.hasSteering()) { + steerSystemStates = ChassisStatesOuterClass.SteerSystemStates.newBuilder(); + //方向盘转向角数据 + steerSystemStates.setSteeringWheelAngle(vehicleState.getSteering());//鹰眼已用 + } + if (vehicleState.hasSteerInference()) { + if (steerSystemStates == null) { + steerSystemStates = ChassisStatesOuterClass.SteerSystemStates.newBuilder(); + } + //方向盘干预 + steerSystemStates.setSteeringWheelInferenceState(vehicleState.getSteerInference()); + } + if (vehicleState.hasSteeringSpd()) { + if (steerSystemStates == null) { + steerSystemStates = ChassisStatesOuterClass.SteerSystemStates.newBuilder(); + } + steerSystemStates.setSteeringWheelSpeed(vehicleState.getSteeringSpd()); + } + if (vehicleState.hasLeftFrontWheelAngle()) { + if (steerSystemStates == null) { + steerSystemStates = ChassisStatesOuterClass.SteerSystemStates.newBuilder(); + } + steerSystemStates.setFrontLeftWheelAngle(vehicleState.getLeftFrontWheelAngle()); + } + if (vehicleState.hasRightFrontWheelAngle()) { + if (steerSystemStates == null) { + steerSystemStates = ChassisStatesOuterClass.SteerSystemStates.newBuilder(); + } + steerSystemStates.setFrontRightWheelAngle(vehicleState.getRightFrontWheelAngle()); + } + if (steerSystemStates != null) { + builder.setSteerSystemStates(steerSystemStates); + } + } + + private void setVehicleMotionStates(ChassisStatesOuterClass.ChassisStates.Builder builder, VehicleStateOuterClass.VehicleState vehicleState) { + ChassisStatesOuterClass.VehicleMotionStates.Builder vehicleMotionStates = null; + if (vehicleState.hasSpeed()) { + vehicleMotionStates = ChassisStatesOuterClass.VehicleMotionStates.newBuilder(); + vehicleMotionStates.setSpeed(vehicleState.getSpeed()); + } + if (vehicleState.hasAccel()) { + if (vehicleMotionStates == null) { + vehicleMotionStates = ChassisStatesOuterClass.VehicleMotionStates.newBuilder(); + } + //加速度 + vehicleMotionStates.setAcceleration(vehicleState.getAccel());//鹰眼已用 + } + if (vehicleMotionStates != null) { + builder.setVehicleMotionStates(vehicleMotionStates); + } + } + + /** + * 车身控制模块 + */ + private void setBCMSystemStates(ChassisStatesOuterClass.ChassisStates.Builder builder, VehicleStateOuterClass.VehicleState vehicleState) { + ChassisStatesOuterClass.BCMSystemStates.Builder bcmSystemStates = null; + if (vehicleState.hasLight()) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + //转向灯数据 + bcmSystemStates.setTurnLightState(vehicleState.getLight());//鹰眼已用 + } + if (vehicleState.hasBrakeLightStatus()) { + if (bcmSystemStates == null) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + } + //刹车灯数据 + bcmSystemStates.setBrakeLightState(vehicleState.getBrakeLightStatus() ? 1 : 0);//鹰眼已用 + } + if (vehicleState.hasHorn()) { + if (bcmSystemStates == null) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + } + //鸣笛 + bcmSystemStates.setHornState(vehicleState.getHorn() ? 1 : 0); + } + if (vehicleState.hasHighbeam()) { + if (bcmSystemStates == null) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + } + //远光灯 + bcmSystemStates.setHighbeamState(vehicleState.getHighbeam() ? 1 : 0); + } + if (vehicleState.hasLowbeam()) { + if (bcmSystemStates == null) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + } + //近光灯 + bcmSystemStates.setLowbeamState(vehicleState.getLowbeam() ? 1 : 0); + } + if (vehicleState.hasFoglight()) { + if (bcmSystemStates == null) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + } + //雾灯 新底盘分前后雾灯 老地盘只有一个 所以同时赋值 + bcmSystemStates.setFrontFoglightState(vehicleState.getFoglight() ? 1 : 0); + bcmSystemStates.setBackFoglightState(vehicleState.getFoglight() ? 1 : 0); + } + if (vehicleState.hasClearanceLamps()) { + if (bcmSystemStates == null) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + } + //示廓灯 + bcmSystemStates.setClearanceLampsState(vehicleState.getClearanceLamps() ? 1 : 0); + } + if (vehicleState.hasWarnLight()) { + if (bcmSystemStates == null) { + bcmSystemStates = ChassisStatesOuterClass.BCMSystemStates.newBuilder(); + } + //报警灯 + bcmSystemStates.setAlarmLightState(vehicleState.getWarnLight() ? 1 : 0); + } + if (bcmSystemStates != null) { + builder.setBcmSystemStates(bcmSystemStates); + } + } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/thread/DispatchHandler.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/thread/DispatchHandler.java index b33334ba03..0ed67b9cc9 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/thread/DispatchHandler.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/thread/DispatchHandler.java @@ -22,11 +22,16 @@ import mogo.telematics.pad.MessagePad; public class DispatchHandler { private final MessagePad.MessageType messageType; private final OnDispatchHandlerListener listener; + private static final int WHAT_DISPATCH = 999999; private HandlerThread mThread; private BaseHandler mBaseHandler; public interface OnDispatchHandlerListener { - void onDispatchRaw(MessagePad.MessageType name, RawData raw); + void onHandler(MessagePad.MessageType type, Handler handler); + + void onHandleMessage(MessagePad.MessageType type, Message msg); + + void onDispatchRaw(MessagePad.MessageType type, RawData raw); } @@ -35,6 +40,16 @@ public class DispatchHandler { this.messageType = messageType; } + public void start() { + if (mThread == null) { + String name = "Dispatch-" + messageType.name().replace("MsgType", ""); + mThread = new HandlerThread(name); + mThread.start(); + initHandler(mThread.getLooper()); + listener.onHandler(messageType, mBaseHandler); + } + } + public void stop() { if (mBaseHandler != null) { mBaseHandler.removeCallbacksAndMessages(null); @@ -47,14 +62,10 @@ public class DispatchHandler { } public void sendRawMessage(RawData raw) { - if (mThread == null) { - String name = "Dispatch-" + messageType.name().replace("MsgType", ""); - mThread = new HandlerThread(name); - mThread.start(); - initHandler(mThread.getLooper()); - } + start(); Message msg = Message.obtain(); msg.obj = raw; + msg.what = WHAT_DISPATCH; mBaseHandler.sendMessage(msg); } @@ -67,16 +78,19 @@ public class DispatchHandler { * @param msg */ protected void handleMessage(Message msg) { - //TODO 计算耗时 临时测试 - if (CupidLogUtils.isEnableLog()) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (mThread != null) { - MessageQueue queue = mThread.getLooper().getQueue(); - CupidLogUtils.i("TimeConsuming", mThread.getName() + " 当前消息队列是否处于空闲状态=" + queue.isIdle()); + if (msg.what == WHAT_DISPATCH) { + //TODO 计算耗时 临时测试 + if (CupidLogUtils.isEnableLog()) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (mThread != null) { + MessageQueue queue = mThread.getLooper().getQueue(); + CupidLogUtils.i("TimeConsuming", mThread.getName() + " 当前消息队列是否处于空闲状态=" + queue.isIdle()); + } } - - } - listener.onDispatchRaw(messageType, (RawData) msg.obj); + listener.onDispatchRaw(messageType, (RawData) msg.obj); + } else { + listener.onHandleMessage(messageType, msg); + } } /** diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/hdcache/IHdCacheListener.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/hdcache/IHdCacheListener.kt new file mode 100644 index 0000000000..9492c60ba7 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/hdcache/IHdCacheListener.kt @@ -0,0 +1,7 @@ +package com.mogo.map.hdcache + +interface IHdCacheListener { + fun onMapHdCacheProgress(cityId: Int, progress: Double) + + fun onMapHdCacheResult(cityId: Int, state: Int)// 0失败,1成功 +} \ No newline at end of file diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index 09ebf694d4..920e4b64cb 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -10,6 +10,7 @@ import androidx.annotation.RawRes; import com.mogo.eagle.core.data.map.CenterLine; import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.map.hdcache.IHdCacheListener; import org.json.JSONObject; @@ -340,4 +341,13 @@ public interface IMogoMapUIController { */ void setAllGesturesEnabled(boolean isEnable); + void cacheHDDataByCity(IHdCacheListener listener); + + /** + * 当前城市离线数据是否已缓存 + * @return + */ + boolean isCityDataCached(); + + void cancelDownloadCacheData(); } diff --git a/libraries/mogo-map/build.gradle b/libraries/mogo-map/build.gradle index f4e1bf9862..de2755fc0f 100644 --- a/libraries/mogo-map/build.gradle +++ b/libraries/mogo-map/build.gradle @@ -49,7 +49,8 @@ dependencies { // 高精地图 implementation rootProject.ext.dependencies.mogocustommap // 高德地图 - api rootProject.ext.dependencies.amaplocation +// api rootProject.ext.dependencies.amaplocation + api rootProject.ext.dependencies.amapnavi3dmap if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.mogo_core_utils diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index e1266b96c7..8fab38a2af 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -26,6 +26,7 @@ import android.util.Log; import android.view.MotionEvent; import android.view.View; +import androidx.annotation.MainThread; import androidx.annotation.NonNull; import com.mogo.commons.constants.SharedPrefsConstants; @@ -46,7 +47,9 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; +import com.mogo.map.hdcache.IHdCacheListener; import com.mogo.map.listener.MogoMapListenerHandler; +import com.mogo.map.location.GDLocationClient; import com.mogo.map.navi.MogoCarLocationChangedListenerRegister; import com.mogo.map.uicontroller.CarCursorOption; import com.mogo.map.uicontroller.EnumMapUI; @@ -54,12 +57,14 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.MapCameraPosition; import com.mogo.map.uicontroller.MapControlResult; import com.mogo.map.uicontroller.VisualAngleMode; +import com.mogo.map.utils.HDMapUtils; import com.mogo.map.utils.MogoMapUtils; import com.mogo.map.utils.ObjectUtils; import com.mogo.map.utils.ResIdCache; import com.zhidaoauto.map.sdk.open.MapAutoApi; import com.zhidaoauto.map.sdk.open.abs.MapStatusListener; import com.zhidaoauto.map.sdk.open.abs.OnCameraChangeListener; +import com.zhidaoauto.map.sdk.open.abs.OnHdDataDownByCityListener; import com.zhidaoauto.map.sdk.open.abs.OnMapClickListener; import com.zhidaoauto.map.sdk.open.abs.OnMapLoadedListener; import com.zhidaoauto.map.sdk.open.abs.OnMapStyleListener; @@ -70,6 +75,7 @@ import com.zhidaoauto.map.sdk.open.abs.log.ILog; import com.zhidaoauto.map.sdk.open.camera.CameraPosition; import com.zhidaoauto.map.sdk.open.camera.CameraUpdateFactory; import com.zhidaoauto.map.sdk.open.camera.LatLngBounds; +import com.zhidaoauto.map.sdk.open.data.CityInfo; import com.zhidaoauto.map.sdk.open.data.MapDataApi; import com.zhidaoauto.map.sdk.open.location.LocationClient; import com.zhidaoauto.map.sdk.open.location.LocationListener; @@ -126,6 +132,7 @@ public class AMapViewWrapper implements IMogoMapView, private boolean mIsDelayed = false; private final LocationListener mGpsLocationListener = location -> CallerMapLocationListenerManager.INSTANCE.invokeMapLocationChangeListener(ObjectUtils.fromLocation(location), 0, true); + private IHdCacheListener hdCacheListener; public AMapViewWrapper(MapAutoView mMapView) { CallerLogger.INSTANCE.i(M_MAP + TAG, "autoop--AMapViewWrapper: init"); @@ -1169,4 +1176,72 @@ public class AMapViewWrapper implements IMogoMapView, mMapView.getMapAutoViewHelper().setAllGesturesEnabled(isEnable); } } + + @Override + public void cacheHDDataByCity(IHdCacheListener listener) { + if (mMapView.getMapAutoViewHelper() != null) { + String gdCityCode = GDLocationClient.getInstance(getContext()).getLastCityCode(); + Integer id = HDMapUtils.getHDCityCode(gdCityCode); + if (id != null) { + hdCacheListener = listener; + mMapView.getMapAutoViewHelper().cacheHDDataByCity(id, new OnHdDataDownByCityListener() { + @Override + public void onMapHDDataCacheProgressByCity(int cityId, double progress) { + if (Thread.currentThread() == Looper.getMainLooper().getThread()) { + if (hdCacheListener != null) { + hdCacheListener.onMapHdCacheProgress(cityId, progress * 100); + } + } else { + UiThreadHandler.post(() -> { + if (hdCacheListener != null) { + hdCacheListener.onMapHdCacheProgress(cityId, progress * 100); + } + }); + } + } + + @Override + public void onMapHDDataCacheStateByCity(int i, int state) {// 0失败,1成功 + if (Thread.currentThread() == Looper.getMainLooper().getThread()) { + if (hdCacheListener != null) { + hdCacheListener.onMapHdCacheResult(i, state); + } + } else { + UiThreadHandler.post(() -> { + if (hdCacheListener != null) { + hdCacheListener.onMapHdCacheResult(i, state); + } + }); + } + } + }); + } + } + } + + @Override + public boolean isCityDataCached() { + if (mMapView.getMapAutoViewHelper() != null) { + String gdCityCode = GDLocationClient.getInstance(getContext()).getLastCityCode(); + Integer id = HDMapUtils.getHDCityCode(gdCityCode); + if (id != null) { + List cityInfoList = mMapView.getMapAutoViewHelper().getAllCityCode(); + if (cityInfoList != null) { + for (CityInfo cityInfo : cityInfoList) { + if (id == cityInfo.getCityCode()) { + return cityInfo.isCache; + } + } + } + } + } + return false; + } + + @Override + public void cancelDownloadCacheData() { + if (mMapView.getMapAutoViewHelper() != null) { + mMapView.getMapAutoViewHelper().cancelCacheHDData(); + } + } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java index 431623fe4e..90eead43e5 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java @@ -3,14 +3,13 @@ package com.mogo.map; import android.graphics.Point; import android.graphics.Rect; import android.location.Location; -import android.util.Log; import android.view.View; import com.mogo.eagle.core.data.map.CenterLine; import com.mogo.eagle.core.data.map.MogoLatLng; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.map.hdcache.IHdCacheListener; import com.mogo.map.uicontroller.CarCursorOption; -import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.MapCameraPosition; import com.mogo.map.uicontroller.MapControlResult; @@ -444,4 +443,26 @@ public class MogoMapUIController implements IMogoMapUIController { mDelegate.setAllGesturesEnabled(isEnable); } } + + @Override + public void cacheHDDataByCity(IHdCacheListener listener) { + if (mDelegate != null) { + mDelegate.cacheHDDataByCity(listener); + } + } + + @Override + public boolean isCityDataCached() { + if (mDelegate != null) { + return mDelegate.isCityDataCached(); + } + return false; + } + + @Override + public void cancelDownloadCacheData() { + if (mDelegate != null) { + mDelegate.cancelDownloadCacheData(); + } + } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.java b/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.java index cc23b9af97..9e251665b4 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/location/GDLocationClient.java @@ -27,26 +27,34 @@ public class GDLocationClient implements AMapLocationListener { } //声明LocationClient对象 - private final AMapLocationClient mLocationClient; + private AMapLocationClient mLocationClient; private String mCityCode; private GDLocationClient(Context context) { - mLocationClient = new AMapLocationClient(context); - //初始化定位参数 - //声明mLocationOption对象 - AMapLocationClientOption mLocationOption = new AMapLocationClientOption(); - //设置定位监听 - mLocationClient.setLocationListener(this); - //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 - mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); - //设置定位间隔,单位毫秒,默认为2000ms - mLocationOption.setInterval(1000); - //设置定位参数 - mLocationClient.setLocationOption(mLocationOption); + AMapLocationClient.updatePrivacyShow(context, true, true); + AMapLocationClient.updatePrivacyAgree(context, true); + try { + mLocationClient = new AMapLocationClient(context); + //初始化定位参数 + //声明mLocationOption对象 + AMapLocationClientOption mLocationOption = new AMapLocationClientOption(); + //设置定位监听 + mLocationClient.setLocationListener(this); + //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式 + mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); + //设置定位间隔,单位毫秒,默认为2000ms + mLocationOption.setInterval(1000); + //设置定位参数 + mLocationClient.setLocationOption(mLocationOption); + } catch (Exception e) { + e.printStackTrace(); + } } public void start() { - mLocationClient.startLocation(); + if(mLocationClient != null){ + mLocationClient.startLocation(); + } } @Override diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java index 7b75cd8e64..793df718de 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/uicontroller/AMapUIController.java @@ -8,6 +8,7 @@ import android.view.View; import com.mogo.eagle.core.data.map.CenterLine; import com.mogo.eagle.core.data.map.MogoLatLng; +import com.mogo.map.hdcache.IHdCacheListener; import com.zhidaoauto.map.sdk.open.MapAutoApi; import org.json.JSONObject; @@ -375,4 +376,26 @@ public class AMapUIController implements IMogoMapUIController { mClient.setAllGesturesEnabled(isEnable); } } + + @Override + public void cacheHDDataByCity(IHdCacheListener listener) { + if (mClient != null) { + mClient.cacheHDDataByCity(listener); + } + } + + @Override + public boolean isCityDataCached() { + if (mClient != null) { + return mClient.isCityDataCached(); + } + return false; + } + + @Override + public void cancelDownloadCacheData() { + if (mClient != null) { + mClient.cancelDownloadCacheData(); + } + } } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/HDMapUtils.kt b/libraries/mogo-map/src/main/java/com/mogo/map/utils/HDMapUtils.kt new file mode 100644 index 0000000000..72e8eadaa5 --- /dev/null +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/HDMapUtils.kt @@ -0,0 +1,28 @@ +package com.mogo.map.utils + +object HDMapUtils { + private val cityCodeMap by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { + val map = HashMap() + // TODO:("高精地图自己去做") + map["0831"] = 5115// 宜宾市 + map["0512"] = 3205// 苏州市 + map["0872"] = 5329// 大理市 + map["0711"] = 4207// 鄂州市 + map["028"] = 5101// 成都市 + map["0931"] = 6201// 兰州市 + map["0535"] = 3706// 烟台市 + map["027"] = 4201// 武汉市 + map["010"] = 1101// 北京市 + map["0734"] = 4304// 衡阳市 + map + } + + /** + * gdCityCode: 高德CityCode + * return: 高精地图CityCode + */ + @JvmStatic + fun getHDCityCode(gdCityCode: String?): Int? { + return cityCodeMap[gdCityCode] + } +} \ No newline at end of file diff --git a/modules.txt b/modules.txt index b952d62967..c4137f974f 100644 --- a/modules.txt +++ b/modules.txt @@ -19,7 +19,6 @@ :test:crashreport :test:crashreport-apm :test:crashreport-noop -:test:crashreport-upgrade :core:function-impl:mogo-core-function-obu-mogo :core:function-impl:mogo-core-function-check :services:mogo-service diff --git a/settings.gradle b/settings.gradle index f0b654ad1f..044d6a962e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -76,9 +76,7 @@ include ':tts:tts-pad' // 测试DEBUG include ':test:crashreport' -//include ':test:crashreport-bugly' include ':test:crashreport-noop' -include ':test:crashreport-upgrade' include ':test:crashreport-apmbyte' //OCH 业务模块 diff --git a/test/crashreport-bugly/.gitignore b/test/crashreport-bugly/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/test/crashreport-bugly/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/test/crashreport-bugly/build.gradle b/test/crashreport-bugly/build.gradle deleted file mode 100644 index aa854f978a..0000000000 --- a/test/crashreport-bugly/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' - id 'kotlin-android-extensions' - id 'kotlin-kapt' - id 'com.alibaba.arouter' -} - - -android { - compileSdkVersion rootProject.ext.android.compileSdkVersion - // buildToolsVersion rootProject.ext.android.buildToolsVersion - defaultConfig { - minSdkVersion rootProject.ext.android.minSdkVersion - targetSdkVersion rootProject.ext.android.targetSdkVersion - versionCode Integer.valueOf(VERSION_CODE) - versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") - - ndk { - // 设置支持的SO库架构 - abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' - } - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles 'consumer-rules.pro' - - //ARouter apt 参数 - kapt { - useBuildCache = false - arguments { - arg("AROUTER_MODULE_NAME", project.getName()) - } - } - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation rootProject.ext.dependencies.androidxappcompat - - implementation rootProject.ext.dependencies.arouter - kapt rootProject.ext.dependencies.aroutercompiler - - if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { - api rootProject.ext.dependencies.crashreport - implementation rootProject.ext.dependencies.mogo_core_utils - implementation rootProject.ext.dependencies.mogocommons - } else { - api project(":test:crashreport") - implementation project(':core:mogo-core-utils') - implementation project(":foudations:mogo-commons") - } - - implementation 'com.tencent.bugly:crashreport_upgrade:latest.release' - //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9 - implementation 'com.tencent.bugly:nativecrashreport:latest.release' - //其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0 -} - -apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() \ No newline at end of file diff --git a/test/crashreport-bugly/consumer-rules.pro b/test/crashreport-bugly/consumer-rules.pro deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/crashreport-bugly/gradle.properties b/test/crashreport-bugly/gradle.properties deleted file mode 100644 index 6b451eda5d..0000000000 --- a/test/crashreport-bugly/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -GROUP=com.mogo.test -POM_ARTIFACT_ID=crashreport-bugly -VERSION_CODE=1 diff --git a/test/crashreport-bugly/proguard-rules.pro b/test/crashreport-bugly/proguard-rules.pro deleted file mode 100644 index 481bb43481..0000000000 --- a/test/crashreport-bugly/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/test/crashreport-bugly/src/main/AndroidManifest.xml b/test/crashreport-bugly/src/main/AndroidManifest.xml deleted file mode 100644 index d9f7357150..0000000000 --- a/test/crashreport-bugly/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - / - \ No newline at end of file diff --git a/test/crashreport-bugly/src/main/java/com/mogo/test/crashreport/bugly/BuglyCrashReportProvider.java b/test/crashreport-bugly/src/main/java/com/mogo/test/crashreport/bugly/BuglyCrashReportProvider.java deleted file mode 100644 index 549dee35e9..0000000000 --- a/test/crashreport-bugly/src/main/java/com/mogo/test/crashreport/bugly/BuglyCrashReportProvider.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.mogo.test.crashreport.bugly; - -import android.content.Context; -import android.text.TextUtils; - -import com.alibaba.android.arouter.facade.annotation.Route; -import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.eagle.core.utilcode.util.AppUtils; -import com.mogo.test.crashreport.CrashReportConstants; -import com.mogo.test.crashreport.ITestCrashReportProvider; -import com.tencent.bugly.Bugly; -import com.tencent.bugly.crashreport.CrashReport; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - - -/** - * @author congtaowang - * @since 2020/9/9 - * - * 描述 - */ -//@Route(path = CrashReportConstants.PATH) -public class BuglyCrashReportProvider implements ITestCrashReportProvider { - - private static final String TAG = "BuglyCrashReportProvider"; - - @Override - public void init(Context context) { - String packageName = context.getPackageName(); - String processName = getProcessName(android.os.Process.myPid()); - CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context); - strategy.setUploadProcess(processName == null || processName.equals(packageName)); - //该用户本次启动后的异常日志用户ID都将是 sn - CrashReport.setUserId(MoGoAiCloudClientConfig.getInstance().getSn()); - String productFlavor = DebugConfig.getProductFlavor(); - strategy.setAppChannel(productFlavor); - Bugly.init(context, CrashReportConstants.buglyAppID, true, strategy); - Bugly.putUserData(context, "serial", MoGoAiCloudClientConfig.getInstance().getSn()); - String mapSDKVersion = AppUtils.getCustomMapSDKVersion(context); - Bugly.putUserData(context, "MAP_SDK_VERSION", mapSDKVersion); - } - - /** - * 获取进程号对应的进程名 - * - * @param pid 进程号 - * @return 进程名 - */ - private static String getProcessName(int pid) { - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline")); - String processName = reader.readLine(); - if (!TextUtils.isEmpty(processName)) { - processName = processName.trim(); - } - return processName; - } catch (Throwable throwable) { - throwable.printStackTrace(); - } finally { - try { - if (reader != null) { - reader.close(); - } - } catch (IOException exception) { - exception.printStackTrace(); - } - } - return null; - } -} - diff --git a/test/crashreport-upgrade/.gitignore b/test/crashreport-upgrade/.gitignore deleted file mode 100644 index 42afabfd2a..0000000000 --- a/test/crashreport-upgrade/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/test/crashreport-upgrade/build.gradle b/test/crashreport-upgrade/build.gradle deleted file mode 100644 index 75b79de321..0000000000 --- a/test/crashreport-upgrade/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -plugins { - id 'com.android.library' - id 'kotlin-android' - id 'kotlin-android-extensions' - id 'kotlin-kapt' - id 'com.alibaba.arouter' -} - -android { - compileSdkVersion rootProject.ext.android.compileSdkVersion - defaultConfig { - minSdkVersion rootProject.ext.android.minSdkVersion - targetSdkVersion rootProject.ext.android.targetSdkVersion - versionCode Integer.valueOf(VERSION_CODE) - versionName getValueFromRootProperties("${project.name.replace("-", "_").toUpperCase()}_VERSION") - - ndk { - // 设置支持的SO库架构 - abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' - } - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles 'consumer-rules.pro' - - //ARouter apt 参数 - kapt { - useBuildCache = false - arguments { - arg("AROUTER_MODULE_NAME", project.getName()) - } - } - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: "libs", include: ["*.jar"]) - implementation rootProject.ext.dependencies.androidxappcompat - - implementation rootProject.ext.dependencies.arouter - kapt rootProject.ext.dependencies.aroutercompiler - - if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { - api rootProject.ext.dependencies.crashreport - implementation rootProject.ext.dependencies.mogo_core_utils - implementation rootProject.ext.dependencies.mogocommons - } else { - api project(":test:crashreport") - implementation project(':core:mogo-core-utils') - implementation project(":foudations:mogo-commons") - } - - implementation 'com.tencent.bugly:crashreport_upgrade:latest.release' - //其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.0 -} - -apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString() \ No newline at end of file diff --git a/test/crashreport-upgrade/consumer-rules.pro b/test/crashreport-upgrade/consumer-rules.pro deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/test/crashreport-upgrade/gradle.properties b/test/crashreport-upgrade/gradle.properties deleted file mode 100644 index bcb33e8a94..0000000000 --- a/test/crashreport-upgrade/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -GROUP=com.mogo.test -POM_ARTIFACT_ID=crashreport-upgrade -VERSION_CODE=1 diff --git a/test/crashreport-upgrade/proguard-rules.pro b/test/crashreport-upgrade/proguard-rules.pro deleted file mode 100644 index 68dec0863c..0000000000 --- a/test/crashreport-upgrade/proguard-rules.pro +++ /dev/null @@ -1,24 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile --dontwarn com.tencent.bugly.** --keep public class com.tencent.bugly.**{*;} --keep class android.support.**{*;} diff --git a/test/crashreport-upgrade/src/main/AndroidManifest.xml b/test/crashreport-upgrade/src/main/AndroidManifest.xml deleted file mode 100644 index 9f5b88a7f2..0000000000 --- a/test/crashreport-upgrade/src/main/AndroidManifest.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportConstants.java b/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportConstants.java deleted file mode 100644 index 8e2b0380b8..0000000000 --- a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportConstants.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.mogo.test.crashreport.upgrade; - - -/** - * @author donghongyu - * @since 2020/9/9 - *

- * 描述 - */ -public class UpgradeReportConstants { - - public static final String PATH = "/upgradereport/api"; - - public static final String NAME = "UpgradeReportApi"; -} diff --git a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportProvider.java b/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportProvider.java deleted file mode 100644 index 4dc27958a7..0000000000 --- a/test/crashreport-upgrade/src/main/java/com/mogo/test/crashreport/upgrade/UpgradeReportProvider.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.mogo.test.crashreport.upgrade; - -import android.content.Context; -import android.text.TextUtils; - -import com.alibaba.android.arouter.facade.annotation.Route; -import com.alibaba.android.arouter.facade.template.IProvider; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.util.AppUtils; -import com.mogo.test.crashreport.CrashReportConstants; -import com.tencent.bugly.Bugly; -import com.tencent.bugly.crashreport.CrashReport; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; - - -/** - * @author donghongyu - * @since 2020/9/9 - *

- * 升级模块 - */ -@Route(path = UpgradeReportConstants.PATH) -public class UpgradeReportProvider implements IProvider { - - private static final String TAG = "UpgradeReportProvider"; - - @Override - public void init(Context context) { - String packageName = context.getPackageName(); - String processName = getProcessName(android.os.Process.myPid()); - CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context); - strategy.setUploadProcess(processName == null || processName.equals(packageName)); - - String productFlavor = DebugConfig.getProductFlavor(); - strategy.setAppChannel(productFlavor); - Bugly.init(context, CrashReportConstants.buglyAppID, true, strategy); - String sn = SharedPrefsMgr.getInstance(context).getString("sn"); - if (sn != null && !sn.isEmpty()) { - Bugly.putUserData(context, "serial", sn); - } - String mapSDKVersion = AppUtils.getCustomMapSDKVersion(context); - Bugly.putUserData(context, "MAP_SDK_VERSION", mapSDKVersion); - } - - /** - * 获取进程号对应的进程名 - * - * @param pid 进程号 - * @return 进程名 - */ - private static String getProcessName(int pid) { - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline")); - String processName = reader.readLine(); - if (!TextUtils.isEmpty(processName)) { - processName = processName.trim(); - } - return processName; - } catch (Throwable throwable) { - throwable.printStackTrace(); - } finally { - try { - if (reader != null) { - reader.close(); - } - } catch (IOException exception) { - exception.printStackTrace(); - } - } - return null; - } -} - diff --git a/test/crashreport-upgrade/src/main/res/xml/provider_paths.xml b/test/crashreport-upgrade/src/main/res/xml/provider_paths.xml deleted file mode 100644 index 1b4e49502c..0000000000 --- a/test/crashreport-upgrade/src/main/res/xml/provider_paths.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file