diff --git a/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java b/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java index 84d8af86be..3a89eaa247 100644 --- a/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java @@ -548,6 +548,9 @@ public class OrderModel { clearBusStationDatas(); queryBusRoutes(); removeTipRunnables(); + CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot(); + // 取消自驾 + setTrajectoryStation(null,null,-1L); // startOrStopQueryPassengerWriteOff(false); } } diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/BusProvider.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/BusProvider.java index 38a3fbd0b2..998d7b5d4b 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/BusProvider.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/BusProvider.java @@ -79,7 +79,7 @@ public class BusProvider implements IMogoOCH { @NotNull @Override public String getFunctionName() { - return null; + return TAG; } @Nullable diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index 657e6857d1..076371db78 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -293,10 +293,6 @@ public class BusPresenter extends Presenter runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus()); } - @Override - public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { - } - @Override public void onAutopilotDockerInfo(@NonNull String dockerVersion) { } diff --git a/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java b/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java index 7219b7b20d..0a80b20be0 100644 --- a/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java +++ b/OCH/bus/driver/src/main/java/com/mogo/och/bus/view/SlidePanelView.java @@ -66,8 +66,8 @@ public class SlidePanelView extends View { private static int BLOCK_START_Y = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),15); private static int NORMAL_TEXT_MARGIN_LEFT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),40); private static int NORMAL_TEXT_MARGIN_RIGHT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),60); - private static int SHORT_TEXT_MARGIN_LEFT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),60);; - private static int SHORT_TEXT_MARGIN_RIGHT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),70);; + private static int SHORT_TEXT_MARGIN_LEFT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),60); + private static int SHORT_TEXT_MARGIN_RIGHT = AutoSizeUtils.dp2px(AbsMogoApplication.getApp(),70); private int textMarginLeft = NORMAL_TEXT_MARGIN_LEFT; private int textMarginRight = NORMAL_TEXT_MARGIN_RIGHT; @@ -247,10 +247,10 @@ public class SlidePanelView extends View { } private void startBlockBackAnim() { - ObjectAnimator blockBackanimator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0); - blockBackanimator.setInterpolator(new DecelerateInterpolator()); - blockBackanimator.setDuration(1000L * blockOffset / getWidth()); - blockBackanimator.start(); + ObjectAnimator blockBackAnimator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0); + blockBackAnimator.setInterpolator(new DecelerateInterpolator()); + blockBackAnimator.setDuration(1000L * blockOffset / getWidth()); + blockBackAnimator.start(); lastX = 0; } @@ -263,7 +263,7 @@ public class SlidePanelView extends View { gradientMatrix.setTranslate(matrixTranslate, 0); textGradient.setLocalMatrix(gradientMatrix); canvas.save(); - canvas.drawText(blockText, (float) (blockWidth + BLOCK_START_X + textMarginLeft), textOffset, textPaint); + canvas.drawText(blockText, (float) (blockWidth + BLOCK_START_X + textMarginLeft), (float) textOffset, textPaint); canvas.restore(); // 画滑块 canvas.drawBitmap(bmBlock, (float) (BLOCK_START_X + blockOffset), (float) BLOCK_START_Y, blockPaint); diff --git a/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java b/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java index cf1643aa61..336ba9d4c3 100644 --- a/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java +++ b/OCH/bus/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java @@ -57,7 +57,7 @@ public class MogoOCHBusPassenger implements IMogoOCH { @NotNull @Override public String getFunctionName() { - return null; + return TAG; } @Override diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index a5dee16a6a..afa4cbcab6 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -632,6 +632,7 @@ class DriverM1Model { if (data != null && data.code == 0){ mOrderCallback?.updateReturnCarStatus(true) queryCurrentServiceStatus() + CallerAutoPilotControlManager.cancelAutoPilot() } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/AmapNaviToDestinationModel.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/AmapNaviToDestinationModel.java index a5bea903ec..0451f89777 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/AmapNaviToDestinationModel.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/map/AmapNaviToDestinationModel.java @@ -46,7 +46,7 @@ public class AmapNaviToDestinationModel implements AMapNaviListener { protected final List eList = new ArrayList(); protected List mWayPointList = new ArrayList(); private volatile ICommonNaviChangedCallback mNaviChangedCallback; - private AtomicInteger errorCount = new AtomicInteger(0); + private final AtomicInteger errorCount = new AtomicInteger(0); private boolean isPlay; public static AmapNaviToDestinationModel getInstance(Context context) { diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java index 7b3ddd377a..8b8a303d7d 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/sfv/FrameSurfaceView.java @@ -1,5 +1,7 @@ package com.mogo.och.common.module.wigets.sfv; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI; + import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -12,6 +14,8 @@ import android.os.Handler; import android.os.HandlerThread; import android.util.AttributeSet; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; + import java.io.InputStream; import java.util.ArrayList; import java.util.List; @@ -21,6 +25,7 @@ import java.util.concurrent.atomic.AtomicInteger; * a SurfaceView which draws bitmaps one after another like frame animation */ public class FrameSurfaceView extends BaseSurfaceView { + private static final String TAG = "FrameSurfaceView"; public static final int INVALID_INDEX = Integer.MAX_VALUE; private final int bufferSize = 3; public static final String DECODE_THREAD_NAME = "DecodingThread"; @@ -320,6 +325,7 @@ public class FrameSurfaceView extends BaseSurfaceView { decodedBitmaps.put(linkedBitmap); } catch (InterruptedException e) { e.printStackTrace(); + CallerLogger.e(M_HMI + TAG, "decodeAndPutBitmap error"); } } @@ -338,6 +344,7 @@ public class FrameSurfaceView extends BaseSurfaceView { bitmap = drawnBitmaps.take(); } catch (InterruptedException e) { e.printStackTrace(); + CallerLogger.e(M_HMI + TAG, "getDrawnBitmap error"); } return bitmap; } @@ -354,6 +361,7 @@ public class FrameSurfaceView extends BaseSurfaceView { bitmap = decodedBitmaps.take(); } catch (InterruptedException e) { e.printStackTrace(); + CallerLogger.e(M_HMI + TAG, "getDecodedBitmap error"); } return bitmap; } diff --git a/OCH/mogo-och-data/src/main/java/com/mogo/och/data/bean/BusRoutesResult.java b/OCH/mogo-och-data/src/main/java/com/mogo/och/data/bean/BusRoutesResult.java index 59b6a1cc87..3e9a4cffc5 100644 --- a/OCH/mogo-och-data/src/main/java/com/mogo/och/data/bean/BusRoutesResult.java +++ b/OCH/mogo-och-data/src/main/java/com/mogo/och/data/bean/BusRoutesResult.java @@ -57,7 +57,7 @@ public class BusRoutesResult { } public void setSite(List site) { - this.sites = sites; + this.sites = site; } public long getTaskTime() { diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/BusProvider.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/BusProvider.java index 38a3fbd0b2..998d7b5d4b 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/BusProvider.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/BusProvider.java @@ -79,7 +79,7 @@ public class BusProvider implements IMogoOCH { @NotNull @Override public String getFunctionName() { - return null; + return TAG; } @Nullable diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java index e6a847f71b..b43791e1c5 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java @@ -605,6 +605,8 @@ public class OrderModel { clearBusStationDatas(); queryBusRoutes(); removeTipRunnables(); + // 取消自驾 + CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot(); // startOrStopQueryPassengerWriteOff(false); } } @@ -698,7 +700,7 @@ public class OrderModel { beanPre.setLeaving(false); sites.set(currentIndex -1,beanPre); } - busRoutesResult.setSite(sites); + //busRoutesResult.setSite(sites); pushCacheTransferData(busRoutesResult); diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index 057d2948b9..300e9fe8f4 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -11,7 +11,6 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; -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.function.api.autopilot.IMoGoAutopilotStatusListener; @@ -34,7 +33,6 @@ import com.mogo.och.common.module.biz.constant.LoginStatusManager; import com.mogo.och.common.module.manager.autopilotmanager.OCHAdasAbilityManager; import com.mogo.och.common.module.voice.VoiceNotice; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -55,7 +53,7 @@ public class BusPresenter extends Presenter private static final String TAG = "BusPresenter"; - private List mStationList = new ArrayList<>(); + private final List mStationList = new ArrayList<>(); private int mCurrentStation = 0; public BusPresenter(BusFragment view) { @@ -164,10 +162,6 @@ public class BusPresenter extends Presenter public void onAutopilotSNRequest() { } - @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - } - @Override public void onAutopilotStatusResponse(int state) { switch (state) { @@ -206,7 +200,7 @@ public class BusPresenter extends Presenter @Override public void onCarLocationChanged(MogoLocation location) { if (null != location) { - runOnUIThread(() -> mView.updateSpeedView((float) location.getGnssSpeed())); + runOnUIThread(() -> mView.updateSpeedView(location.getGnssSpeed())); } } @@ -237,9 +231,7 @@ public class BusPresenter extends Presenter * 测试使用 */ public void debugAutoPilotStatus(int status) { - AutopilotStatusInfo info = new AutopilotStatusInfo(); - info.setState(status); - onAutopilotStatusResponse(info); + onAutopilotStatusResponse(status); } @Override diff --git a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java index b996d96f58..8613bdfb37 100644 --- a/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ b/OCH/shuttle/passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -532,11 +532,6 @@ public class BusPassengerModel { private boolean arriveAtEnd = false; //乘客app专用字段 - @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - - } - @Override public void onAutopilotSNRequest() { @@ -570,6 +565,9 @@ public class BusPassengerModel { public synchronized void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { // CallerLogger.d(M_BUS_P + TAG, "onAutopilotRotting = " // + GsonUtil.jsonFromObject(routeList)); + if(routeList == null){ + return; + } List routePoints = routeList.getWayPointsList(); if(globalPathTruncation!=null&&!globalPathTruncation.isDisposed()){ diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java index 18970bfd11..0c58b0d95a 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java @@ -13,7 +13,6 @@ import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.module.status.IMogoStatusChangedListener; import com.mogo.commons.module.status.MogoStatusManager; import com.mogo.commons.module.status.StatusDescriptor; -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; @@ -694,11 +693,6 @@ public class SweeperCloudTaskModel implements IMoGoSweeperFutianCloudTaskListene return MoGoAiCloudClientConfig.getInstance().getSn(); } - @Override - public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { - - } - @Override public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) { DebugView.Companion.printInfoMsg("[MAP到站通知] 上报到站,endLocation=(" diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt index 0a783ad174..fb2f439f69 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt @@ -8,7 +8,6 @@ import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import chassis.Chassis.GearPosition -import chassis.Chassis.LightSwitch import chassis.ChassisStatesOuterClass.BMSSystemStates import chassis.ChassisStatesOuterClass.SweeperFuTianTaskSystemStates import com.elegant.utils.UiThreadHandler @@ -27,7 +26,6 @@ import kotlin.math.roundToInt */ class SweeperCloudTrafficDataView : ConstraintLayout, IMoGoBatteryManagementSystemListener, - IMoGoChassisLamplightListener, IMoGoChassisGearStateListener, IMoGoSweeperFutianCleanSystemListener { private var tapPositionView //方向盘下方的档位 @@ -78,8 +76,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, super.onAttachedToWindow() //电量 CallerBatteryManagementSystemListenerManager.addListener(TAG, this) - //转向灯 - CallerChassisLamplightListenerManager.addListener(TAG, this) //档位 CallerChassisGearStateListenerManager.addListener(TAG, this) //清扫车相关数据接口 @@ -89,7 +85,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, override fun onDetachedFromWindow() { super.onDetachedFromWindow() CallerBatteryManagementSystemListenerManager.removeListener(TAG) - CallerChassisLamplightListenerManager.removeListener(TAG) CallerChassisGearStateListenerManager.removeListener(TAG) CallerSweeperFutianCleanSystemListenerManager.removeListener(TAG) } @@ -127,14 +122,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, } } - /** - * 车辆转向灯 - * @param directionLight - */ - override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { - //转向灯状态 0是正常 1是左转 2是右转 - } - /** * 设置自动驾驶状态 */ @@ -163,14 +150,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, } } - /** - * 刹车灯 - * @param brakeLight - */ - override fun onAutopilotBrakeLightData(brakeLight: Boolean) { - d(TAG, "刹车灯:$brakeLight") - } - /** * 方向盘下方的档位 * @param gear diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java index 6e3f828250..924e86a90c 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/fragment/BaseSweeperOperateTabFragment.java @@ -518,7 +518,7 @@ public abstract class BaseSweeperOperateTabFragment public void onAutopilotRouteLineId(long lineId) { } - @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - } - @Override public void onAutopilotStatusResponse(int state) { SweeperOperateTaskModel.getInstance().setAutopilotState(state); @@ -183,7 +178,7 @@ public class SweeperOperatePresenter extends Presenter @Override public void onCarLocationChanged(MogoLocation location) { if (null != location) { - ThreadUtils.runOnUiThread(() -> mView.updateSpeedView((float) location.getGnssSpeed())); + ThreadUtils.runOnUiThread(() -> mView.updateSpeedView(location.getGnssSpeed())); ThreadUtils.runOnUiThread(() -> mView.setCurrentLocation(location)); } } @@ -216,9 +211,7 @@ public class SweeperOperatePresenter extends Presenter * 测试使用 */ public void debugAutoPilotStatus(int status) { - AutopilotStatusInfo info = new AutopilotStatusInfo(); - info.setState(status); - onAutopilotStatusResponse(info); + onAutopilotStatusResponse(status); } @Override @@ -372,7 +365,7 @@ public class SweeperOperatePresenter extends Presenter } public static String format(double value) { - BigDecimal bd = new BigDecimal(value); + BigDecimal bd = BigDecimal.valueOf(value); bd = bd.setScale(2, RoundingMode.HALF_UP); return bd.toString(); } diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SlidePanelView.java b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SlidePanelView.java index b9e86e6284..4fac50cc31 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SlidePanelView.java +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SlidePanelView.java @@ -49,6 +49,7 @@ public class SlidePanelView extends View { NORMAL_TEXT_MARGIN_RIGHT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_NORMAL_TEXT_MARGIN_RIGHT, NORMAL_TEXT_MARGIN_RIGHT); SHORT_TEXT_MARGIN_LEFT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_SHORT_TEXT_MARGIN_LEFT, SHORT_TEXT_MARGIN_LEFT); SHORT_TEXT_MARGIN_RIGHT = (int) mTypedArray.getDimension(R.styleable.SlidePanelView_SHORT_TEXT_MARGIN_RIGHT, SHORT_TEXT_MARGIN_RIGHT); + mTypedArray.recycle(); init(); } @@ -87,7 +88,7 @@ public class SlidePanelView extends View { private ObjectAnimator matrixAnim; private String blockText = STRING_SLIDE_TO_RIGHT; - private Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics(); + private final Paint.FontMetrics blockTextMetrics = new Paint.FontMetrics(); private static final int GRADIENT_OFFSET = 200; @@ -239,10 +240,10 @@ public class SlidePanelView extends View { } private void startBlockBackAnim() { - ObjectAnimator blockBackanimator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0); - blockBackanimator.setInterpolator(new DecelerateInterpolator()); - blockBackanimator.setDuration(1000 * blockOffset / getWidth()); - blockBackanimator.start(); + ObjectAnimator blockBackAnimator = ObjectAnimator.ofInt(this, "blockOffset", blockOffset, 0); + blockBackAnimator.setInterpolator(new DecelerateInterpolator()); + blockBackAnimator.setDuration(1000L * blockOffset / getWidth()); + blockBackAnimator.start(); lastX = 0; } @@ -255,10 +256,10 @@ public class SlidePanelView extends View { gradientMatrix.setTranslate(matrixTranslate, 0); textGradient.setLocalMatrix(gradientMatrix); canvas.save(); - canvas.drawText(blockText, blockWidth + BLOCK_START_X + textMarginLeft, textOffset, textPaint); + canvas.drawText(blockText, (float) (blockWidth + BLOCK_START_X + textMarginLeft), (float) textOffset, textPaint); canvas.restore(); // 画滑块 - canvas.drawBitmap(bmBlock, BLOCK_START_X + blockOffset, BLOCK_START_Y, blockPaint); + canvas.drawBitmap(bmBlock, (float) (BLOCK_START_X + blockOffset), (float) BLOCK_START_Y, blockPaint); } public interface OnSlidePanelMoveToEndListener { diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt index c11778b7ce..7c686d8bfa 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt @@ -131,9 +131,10 @@ class SweeperOperateTrafficDataView : ConstraintLayout, tvBattery?.text = "${states.bmsSoc.roundToInt()}%" } } + /** * 车辆转向灯 - * @param directionLight + * @param lightSwitch */ override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { //转向灯状态 0是正常 1是左转 2是右转 @@ -142,13 +143,6 @@ class SweeperOperateTrafficDataView : ConstraintLayout, } } - /** - * 刹车灯 - * @param brakeLight - */ - override fun onAutopilotBrakeLightData(brakeLight: Boolean) { - d(TAG, "刹车灯:$brakeLight") - } /** * 方向盘下方的档位 * @param gear diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/SweeperProvider.java b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/SweeperProvider.java new file mode 100644 index 0000000000..e69de29bb2 diff --git a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/SweeperProvider.java b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/SweeperProvider.java new file mode 100644 index 0000000000..e69de29bb2 diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/TaxiProvider.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/TaxiProvider.java index 793ef8c8e1..4e8031561a 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/TaxiProvider.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/TaxiProvider.java @@ -79,7 +79,7 @@ class TaxiProvider implements IMogoOCH { @NotNull @Override public String getFunctionName() { - return null; + return TAG; } @Nullable diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index 97d23806fc..662e2aceaf 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -1210,10 +1210,6 @@ public class TaxiModel { TaxiTrajectoryManager.getInstance().onAutopilotGuardian(guardianInfo); } - @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - } - @Override public void onAutopilotStatusResponse(int state) { if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiGrabOrderFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiGrabOrderFragment.java index 9ae6438b8f..8850cc35ef 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiGrabOrderFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiGrabOrderFragment.java @@ -83,7 +83,6 @@ public class TaxiGrabOrderFragment extends BaseTaxiUIFragment implements View.On }else if (v.getId() == R.id.grab_order_tv){ if (!mOrderGrabBt.getText().toString().equals("抢单中...")){ getOchTaxiFragment().grabOrder(); - return; } } } @@ -151,7 +150,7 @@ public class TaxiGrabOrderFragment extends BaseTaxiUIFragment implements View.On } mGrabSuccessAnim.start(); //开启动画结束的监听 - long delayMillis = mGrabSuccessAnim.getDuration(0) * mGrabSuccessAnim.getNumberOfFrames(); + long delayMillis = (long) mGrabSuccessAnim.getDuration(0) * mGrabSuccessAnim.getNumberOfFrames(); UiThreadHandler.postDelayed(new Runnable() { @Override public void run() { @@ -174,7 +173,7 @@ public class TaxiGrabOrderFragment extends BaseTaxiUIFragment implements View.On mGrabFailureAnim = (AnimationDrawable)mGrabResultAnimView.getDrawable(); mGrabFailureAnim.start(); //开启动画结束的监听 - long delayMillis = mGrabFailureAnim.getDuration(0) * mGrabFailureAnim.getNumberOfFrames(); + long delayMillis = (long) mGrabFailureAnim.getDuration(0) * mGrabFailureAnim.getNumberOfFrames(); UiThreadHandler.postDelayed(new Runnable() { @Override public void run() { diff --git a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java index e9a8752287..4286999c29 100644 --- a/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java +++ b/OCH/taxi/driver/src/main/java/com/mogo/och/taxi/ui/TaxiPersonalDialogFragment.java @@ -68,12 +68,11 @@ public class TaxiPersonalDialogFragment extends private ViewPager mOperationViewPager; private OrderAdapter mAdapter; private ConstraintLayout mNoDatas; - private List orders = new ArrayList<>(); - private String[] mTabTitles = {"在线时长","订单完成数"}; - private List fragments = new ArrayList<>(); + private final List orders = new ArrayList<>(); + private final String[] mTabTitles = {"在线时长","订单完成数"}; + private final List fragments = new ArrayList<>(); private int mNextPage = 1;//订单列表分页从1开始 - private int mPerPageSize = 10; - private static TaxiFragment mTaxiFragment; + private final int mPerPageSize = 10; private static boolean serverHadNoData = false; @NonNull @@ -177,7 +176,6 @@ public class TaxiPersonalDialogFragment extends } } mOperationTab.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onTabSelected(TabLayout.Tab tab) { mOperationViewPager.setCurrentItem(tab.getPosition()); @@ -185,7 +183,6 @@ public class TaxiPersonalDialogFragment extends fragments.get(tab.getPosition()).setmType(tab.getPosition()); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onTabUnselected(TabLayout.Tab tab) { changeOperationTabLayoutTabUI(tab,false); @@ -311,17 +308,14 @@ public class TaxiPersonalDialogFragment extends public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == ORDER_DETAIL_ITEM){ View view = LayoutInflater.from(context).inflate(R.layout.taxi_orders_list_item,parent,false); - OrderDetailViewHolder viewHolder = new OrderDetailViewHolder(view); - return viewHolder; + return new OrderDetailViewHolder(view); }else if (viewType == DAY_GROUP_ITEM){ View view = LayoutInflater.from(context).inflate(R.layout.taxi_orders_list_day_item,parent,false); - DayGroupViewHolder viewHolder = new DayGroupViewHolder(view); - return viewHolder; + return new DayGroupViewHolder(view); } return null; } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { OrderQueryRespBean.Result queryRespBean = orders.get(position); @@ -383,8 +377,7 @@ public class TaxiPersonalDialogFragment extends String currentDate = DateTimeUtil.getYMDTime(orders.get(position).createTime);//获取当前订单时间 int nextIndex = position + 1; String preDate = DateTimeUtil.getYMDTime(orders.get(nextIndex).createTime); - boolean isDifferent = preDate.equals(currentDate);//订单跟后一个订单是否是同一天 - return isDifferent;//一样有划分线, 不一样没有划分线 + return preDate.equals(currentDate);//一样有划分线, 不一样没有划分线 } } @@ -393,7 +386,6 @@ public class TaxiPersonalDialogFragment extends return orders.size(); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private void bindOrderDetailData(OrderQueryRespBean.Result queryRespBean, TextView orderTimeTv, TextView startStationTv, TextView endStationTv, Button orderStatusBt, Button orderTypeBt, TextView orderNumTv){ Calendar calendar= Calendar.getInstance(); @@ -406,7 +398,6 @@ public class TaxiPersonalDialogFragment extends orderNumTv.setText("订单编号:"+String.valueOf(queryRespBean.orderNo)); } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private String getOrderStatus(int status, Button button){ TaxiOrderStatusEnum orderStatus = TaxiOrderStatusEnum.valueOf(status); switch (orderStatus){ @@ -422,7 +413,6 @@ public class TaxiPersonalDialogFragment extends } } - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private String getOrderType(int type, Button button){ if (type == TaxiOrderTypeEnum.Reserved.getType()){ button.setBackground(context.getDrawable(R.drawable.taxi_order_button_type_reserver_bg)); diff --git a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java index a0c0677371..018eefbf95 100644 --- a/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java +++ b/OCH/taxi/passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java @@ -82,7 +82,7 @@ class MogoOCHTaxiPassenger implements IMogoOCH { @NotNull @Override public String getFunctionName() { - return null; + return TAG; } @Nullable diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskWithOrderCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskWithOrderCallback.kt index 1cfc6109b2..d22671f0e2 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskWithOrderCallback.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/callback/ITaxiTaskWithOrderCallback.kt @@ -4,6 +4,7 @@ import com.mogo.och.taxi.bean.QueryCurrentTaskRespBean import com.mogo.och.taxi.bean.TrajectoryListRespBean interface ITaxiTaskWithOrderCallback { + fun onTaskWithOrderQuerySuccess(timeMillis: Long) fun onTaskWithOrderDataChanged(taskWithOrder: QueryCurrentTaskRespBean.Result?) fun onTaskCompleted(result: QueryCurrentTaskRespBean.Result?) fun onTaskStarted(result: QueryCurrentTaskRespBean.Result?) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/debug/DebugView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/debug/DebugView.kt index 25556b87a0..d8499cdd83 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/debug/DebugView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/debug/DebugView.kt @@ -42,10 +42,12 @@ import kotlinx.android.synthetic.main.taxi_debug_order.view.currentLineId import kotlinx.android.synthetic.main.taxi_debug_order.view.currentOrder import kotlinx.android.synthetic.main.taxi_debug_order.view.currentOrderStopInfo import kotlinx.android.synthetic.main.taxi_debug_order.view.currentOrderTrajectoryInfo +import kotlinx.android.synthetic.main.taxi_debug_order.view.currentOrderTrajectoryTime import kotlinx.android.synthetic.main.taxi_debug_order.view.currentStatus import kotlinx.android.synthetic.main.taxi_debug_order.view.currentTaskType import kotlinx.android.synthetic.main.taxi_debug_order.view.debugLogHistoryTextView import kotlinx.android.synthetic.main.taxi_debug_order.view.debugLogTitleTextView +import kotlinx.android.synthetic.main.taxi_debug_order.view.lastQuerySuccessDataTimestamps import kotlinx.android.synthetic.main.taxi_debug_order.view.orderEndSiteInfo import kotlinx.android.synthetic.main.taxi_debug_order.view.orderNo import kotlinx.android.synthetic.main.taxi_debug_order.view.orderPreLoadLines @@ -126,6 +128,16 @@ public class DebugView @JvmOverloads constructor( DateTimeUtil.yyyy_MM_dd_HH_mm_ss ) } + + private fun formatDateTimeString(timeMillis: Long): String { + if (timeMillis <= 0L) { + return "" + } + return DateTimeUtil.formatCalendarToString( + DateTimeUtil.formatLongToCalendar(timeMillis), + DateTimeUtil.yyyy_MM_dd_HH_mm_ss + ) + } } private val broadcastReceiver = object : BroadcastReceiver() { @@ -198,6 +210,7 @@ public class DebugView @JvmOverloads constructor( initCurrentBusinessMode() initViewByTaskData(TaxiTaskModel.getCurrentTaskWithOrder()) initDebugLogTextViewTitle() + initLastTaskDataQuerySuccess(0L) } private fun initCurrentBusinessMode() { @@ -207,11 +220,16 @@ public class DebugView @JvmOverloads constructor( "当前业务模式:${if (isRoutingVerifyMode) "自主算路验证模式" else "无人化运营流程模式"}" } + private fun initLastTaskDataQuerySuccess(timeMillis: Long) { + lastQuerySuccessDataTimestamps.text = + "【最新数据查询成功时间】${formatDateTimeString(timeMillis)}" + } + private fun initViewByTaskData(data: QueryCurrentTaskRespBean.Result?) { //release包下隐藏Mock按钮,避免司机误操作 btnContainer.visibility = if (AppUtils.isAppDebug()) View.VISIBLE else View.INVISIBLE val curContrail = TaxiTaskModel.getCurrentTaskTrajectory() - currentDataTimestamps.text = "【当前数据返回时间】${currentDateTimeString()}" + currentDataTimestamps.text = "【当前数据更新时间】${currentDateTimeString()}" currentCarStatus.text = "【当前车辆状态】${data?.servingStatus} --> ${if (data?.servingStatus == 1) "开始接单" else "暂停接单"}" currentTaskType.text = @@ -233,10 +251,12 @@ public class DebugView @JvmOverloads constructor( "【订单终点】${data?.order?.orderEndSite?.siteName} siteId=${data?.order?.orderEndSite?.siteId}" orderPreLoadLines.text = "【接驾任务预加载lineIds】${GsonUtil.jsonFromObject(data?.order?.planningLines)}" + currentOrderTrajectoryTime.text = + "【当前任务轨迹保存时间】contrailSaveTime=${formatDateTimeString(curContrail?.contrailSaveTime ?: 0L)} , contrailSaveTimeDPQP=${formatDateTimeString(curContrail?.contrailSaveTimeDPQP ?: 0L)}" currentOrderTrajectoryInfo.text = - "【当前任务Traj信息】TrajMd5=${curContrail?.csvFileMd5} , TrajDPQPMd5=${curContrail?.csvFileMd5DPQP}" + "【当前任务轨迹Traj信息】TrajMd5=${curContrail?.csvFileMd5} , TrajDPQPMd5=${curContrail?.csvFileMd5DPQP}" currentOrderStopInfo.text = - "【当前任务Stop信息】StopMd5=${curContrail?.txtFileMd5}, StopDPQPMd5=${curContrail?.txtFileMd5DPQP}" + "【当前任务轨迹Stop信息】StopMd5=${curContrail?.txtFileMd5}, StopDPQPMd5=${curContrail?.txtFileMd5DPQP}" } private fun initDebugLogTextViewTitle() { @@ -246,6 +266,10 @@ public class DebugView @JvmOverloads constructor( if (isRoutingVerifyMode) "自主算路验证模式关键节点日志(司机端)" else "无人化运营流程关键节点日志(司机端)" } + override fun onTaskWithOrderQuerySuccess(timeMillis: Long) { + initLastTaskDataQuerySuccess(timeMillis) + } + override fun onTaskWithOrderDataChanged(taskWithOrder: QueryCurrentTaskRespBean.Result?) { d(TAG, "onTaskWithOrderDataChanged") initViewByTaskData(taskWithOrder) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt index 7df5e66270..7e65cb6535 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiCurrentTaskViewModel.kt @@ -232,6 +232,9 @@ class TaxiCurrentTaskViewModel : BaseViewModel(), } } + override fun onTaskWithOrderQuerySuccess(timeMillis: Long) { + } + override fun onTaskWithOrderDataChanged(result: QueryCurrentTaskRespBean.Result?) { d(TAG, "onTaskWithOrderChanged = result = " + GsonUtil.jsonFromObject(result)) DebugView.printInfoMsg("[查询TaskWithOrder信息] 更新数据, 刷新UI") diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt index 05adb6f86b..8b29762713 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/taxi/ui/task/TaxiTaskModel.kt @@ -466,7 +466,7 @@ object TaxiTaskModel { startFailedCode: String, startFailedMessage: String ) { - DebugView.printInfoMsg("[启自驾] 执行失败,code=$startFailedCode, msg=$startFailedMessage") + DebugView.printErrorMsg("[启自驾] 执行失败,code=$startFailedCode, msg=$startFailedMessage") TaxiAnalyticsManager.getInstance() .triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage) if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode) { @@ -723,6 +723,12 @@ object TaxiTaskModel { object : OchCommonServiceCallback { override fun onSuccess(data: QueryCurrentTaskRespBean?) { //DebugView.printInfoMsg("[查询TaskWithOrder信息] success") + val currentTimeStamp = System.currentTimeMillis() + mTaxiTaskWithOrderCallbackMap.forEach { + val listener = it.value + listener.onTaskWithOrderQuerySuccess(currentTimeStamp) + } + if (data?.data == null) { d( TAG, diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_debug_order.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_debug_order.xml index e56f833b6c..876a2b1e1a 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_debug_order.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/taxi_debug_order.xml @@ -17,7 +17,7 @@ android:id="@+id/unmanedTaskOrderContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_10"> + android:layout_marginTop="@dimen/dp_5"> + + + + diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java index 7d3b5ed99f..2f93c78131 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/taxi/passenger/MogoOCHTaxiPassenger.java @@ -78,7 +78,7 @@ public class MogoOCHTaxiPassenger implements IMogoOCH { @NotNull @Override public String getFunctionName() { - return null; + return TAG; } @Nullable diff --git a/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java new file mode 100644 index 0000000000..4fa3bdd617 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/ViewPressedStateLancet.java @@ -0,0 +1,225 @@ +package com.mogo.launcher.lancet; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.TypedArray; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.StateListDrawable; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.core.graphics.drawable.DrawableCompat; +import androidx.core.view.ViewCompat; +import com.knightboost.lancet.api.Origin; +import com.knightboost.lancet.api.Scope; +import com.knightboost.lancet.api.annotations.Group; +import com.knightboost.lancet.api.annotations.ImplementedInterface; +import com.knightboost.lancet.api.annotations.Insert; +import com.knightboost.lancet.api.annotations.ReplaceInvoke; +import com.knightboost.lancet.api.annotations.TargetClass; +import com.knightboost.lancet.api.annotations.TargetMethod; +import com.knightboost.lancet.api.annotations.Weaver; +import com.mogo.launcher.R; + +@Weaver +@Group("view_pressed_state") +public class ViewPressedStateLancet { + + @TargetClass(value = "android.view.View", scope = Scope.ALL) + @TargetMethod(methodName = "setOnClickListener") + @ReplaceInvoke + public static void setOnClickListener(View view, View.OnClickListener listener) { + if (view == null) { + return; + } + Object tag = view.getTag(R.id.click_pressed_attr_id); + checkSetBgIfNeed(view, tag == null ? null : (AttributeSet) tag); + view.setOnClickListener(listener); + } + + @TargetClass(value = "android.view.View", scope = Scope.ALL) + @TargetMethod(methodName = "setOnLongClickListener") + @ReplaceInvoke + public static void setOnLongClickListener(View view, View.OnLongClickListener listener) { + if (view == null) { + return; + } + Object tag = view.getTag(R.id.click_pressed_attr_id); + checkSetBgIfNeed(view, tag == null ? null : (AttributeSet) tag); + view.setOnLongClickListener(listener); + } + + @ImplementedInterface(value = "android.view.LayoutInflater$Factory", scope = Scope.LEAF) + @Insert(mayCreateSuper = true) + @TargetMethod(methodName = "onCreateView") + public View onCreateView(String name, Context context, AttributeSet attrs) { + View view = (View) Origin.call(); + checkSetBgIfNeed(view, attrs); + return view; + } + + @ImplementedInterface(value = "android.view.LayoutInflater$Factory2", scope = Scope.LEAF) + @Insert(mayCreateSuper = true) + @TargetMethod(methodName = "onCreateView") + public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { + View view = (View) Origin.call(); + checkSetBgIfNeed(view, attrs); + return view; + } + + private static void checkSetBgIfNeed(View view, AttributeSet attr) { + try { + TypedArray t = null; + float alpha; + boolean enabled; + try { + if (view == null) { + return; + } + Context context = view.getContext(); + if (context == null) { + return; + } + if (attr == null) { + return; + } + t = context.obtainStyledAttributes(attr, R.styleable.ClickPressedStyle); + enabled = t.getBoolean(R.styleable.ClickPressedStyle_pressed_enabled, true); + if (!enabled) { + return; + } + alpha = t.getFloat(R.styleable.ClickPressedStyle_pressed_alpha, 0.6f); + if (alpha < 0.0f || alpha > 1.0f) { + throw new AssertionError("view custom attr \\'alpha\\' must be in [0.0, 1.0]"); + } + view.setTag(R.id.click_pressed_attr_id, attr); + } finally { + if (t != null) { + t.recycle(); + } + } + if (view instanceof ImageView) { + ImageView image = (ImageView) view; + Drawable replaced = checkAndReplaceDrawable(image.getBackground(), alpha); + if (replaced != null) { + ViewCompat.setBackground(image, replaced); + return; + } + replaced = checkAndReplaceDrawable(image.getDrawable(), alpha); + if (replaced != null) { + image.setImageDrawable(replaced); + return; + } + return; + } + if (view instanceof TextView) { + TextView text = (TextView) view; + Drawable replaced = checkAndReplaceDrawable(text.getBackground(), alpha); + if (replaced != null) { + ViewCompat.setBackground(text, replaced); + return; + } + ColorStateList textColor = text.getTextColors(); + if (textColor != null) { + int pressed = textColor.getColorForState(new int[]{ android.R.attr.state_pressed }, Integer.MIN_VALUE); + if (pressed != Integer.MIN_VALUE) { + return; + } + int color = textColor.getColorForState(new int[] { android.R.attr.state_enabled }, Integer.MIN_VALUE); + int defaultColor = color; + if (color == Integer.MIN_VALUE) { + defaultColor = textColor.getDefaultColor(); + } + int pressedColor = Color.argb((int)(Color.alpha(defaultColor) * alpha), Color.red(defaultColor), Color.green(defaultColor), Color.blue(defaultColor)); + int disableColor = textColor.getColorForState(new int[] { -android.R.attr.state_enabled }, Integer.MIN_VALUE); + int size = 2; + if (disableColor != Integer.MIN_VALUE) { + size += 1; + } + int[][] states = new int[size][1]; + int[] colors = new int[size]; + states[0] = new int[] { android.R.attr.state_pressed }; + colors[0] = pressedColor; + if (size > 2) { + states[1] = new int[] { -android.R.attr.state_enabled }; + colors[1] = disableColor; + states[2] = new int[] { android.R.attr.state_enabled }; + colors[2] = defaultColor; + } else { + states[1] = new int[] { -android.R.attr.state_pressed }; + colors[1] = defaultColor; + } + ColorStateList newColor = new ColorStateList(states, colors); + text.setTextColor(newColor); + } + return; + } + Drawable replaced = checkAndReplaceDrawable(view.getBackground(), alpha); + if (replaced != null) { + ViewCompat.setBackground(view, replaced); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + + private static Drawable checkAndReplaceDrawable(Drawable old, float alpha) { + if (old == null) { + return null; + } + if (old instanceof StateListDrawable) { + StateListDrawable drawable = (StateListDrawable) old; + int[] states = drawable.getState(); + boolean hasPressed = false; + int index = 0; + int targetIndex = -1; + for (int state : states) { + if (!hasPressed && state == android.R.attr.state_pressed) { + hasPressed = true; + } + if (targetIndex == -1 && state != -android.R.attr.state_enabled) { + targetIndex = index; + } + if (hasPressed && targetIndex != -1) { + break; + } + index ++; + } + if (hasPressed) { + return null; + } + if (targetIndex != -1) { + Drawable origin= null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + origin = drawable.getStateDrawable(targetIndex); + } else { + origin = drawable.getCurrent(); + } + if (origin != null) { + Drawable.ConstantState constantState = origin.getConstantState(); + if (constantState != null) { + Drawable pressed = DrawableCompat.wrap(constantState.newDrawable().mutate()); + pressed.setAlpha((int)(255 * alpha)); + drawable.addState(new int[] {android.R.attr.state_pressed}, pressed); + return drawable; + } + } + return null; + } + return null; + } + Drawable.ConstantState constantState = old.getConstantState(); + if (constantState != null) { + StateListDrawable result = new StateListDrawable(); + result.addState(new int[] { -android.R.attr.state_pressed }, old); + Drawable pressed = DrawableCompat.wrap(constantState.newDrawable().mutate()); + pressed.setAlpha((int)(255 * alpha)); + result.addState(new int[] { android.R.attr.state_pressed }, pressed); + return result; + } + return null; + } +} diff --git a/config.gradle b/config.gradle index 79f837af88..bb0e778323 100644 --- a/config.gradle +++ b/config.gradle @@ -221,7 +221,7 @@ ext { weak_network : "com.mogo.weak:network:1.0.1", btrace : "com.bytedance.btrace:rhea-core:2.0.0", - mofang_runtime : "com.mogo.eagle.core.mofang:runtime:2.0.7", + mofang_runtime : "com.mogo.eagle.core.mofang:runtime:2.0.10", log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.30", // 安全证书 diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt index c418329316..a0962857bd 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/dispatch/DispatchAutoPilotManager.kt @@ -113,7 +113,7 @@ class DispatchAutoPilotManager private constructor() : } @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, nodeAliasCode = ChainConstant.CHAIN_CODE_DISPATCH_RECEIVE, paramIndexes = [0] @@ -140,7 +140,7 @@ class DispatchAutoPilotManager private constructor() : } @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, nodeAliasCode = ChainConstant.CHAIN_CODE_DISPATCH_START, paramIndexes = [-1] @@ -348,7 +348,7 @@ class DispatchAutoPilotManager private constructor() : AIAssist.getInstance(mContext).speakTTSVoice("云调度完成,车辆已到达${it.endLocAddress}") } }else{ - V2XBizTrace.onAck(M_BIZ + TAG, mapOf("arriveErrorMsg" to "不在到站距离范围内", "ArriveAtStation" to arrivalNotification, "distanceFromSelf" to distanceFromSelf)) + V2XBizTrace.onAck(M_BIZ + TAG, mapOf("arriveErrorMsg" to "不在到站距离范围内", "ArriveAtStation" to arrivalNotification, "distanceFromSelf" to distanceFromSelf), true) } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/V2XBizTrace.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/V2XBizTrace.kt index 5eec21a195..ff285e32a1 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/V2XBizTrace.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/V2XBizTrace.kt @@ -1,24 +1,45 @@ package com.mogo.eagle.function.biz.v2x import android.util.* +import com.mogo.eagle.core.data.deva.chain.ChainCommon import com.mogo.eagle.core.data.deva.chain.ChainConstant -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X -import com.mogo.eagle.core.utilcode.util.* +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.zhjt.service.chain.ChainLog class V2XBizTrace { companion object { + fun onAck(data: Any, data1: Any, param: Boolean = false) { + Log.d("V2X", "tag:$data, msg: $data1") + if (param) { + val cal = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val lineId = CallerAutoPilotStatusListenerManager.getLineId() + realParamAction(data, data1, ChainCommon(cal.latitude, cal.longitude, lineId)) + } else { + realAction(data, data1) + } + } + @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, nodeAliasCode = ChainConstant.CHAIN_CODE_V2X_MSG, paramIndexes = [0, 1] ) - fun onAck(data: Any, data1: Any) { - Log.d("V2X", "tag:$data, msg: $data1") + private fun realAction(data: Any, data1: Any) { + + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, + nodeAliasCode = ChainConstant.CHAIN_CODE_V2X_MSG, + paramIndexes = [0, 1, 2] + ) + private fun realParamAction(data: Any, data1: Any, chainCommon: ChainCommon) { + } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt index a02c9210c8..e12c0b4ef1 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XEventManager.kt @@ -9,7 +9,7 @@ import com.mogo.eagle.core.data.config.* import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_V2X_MSG import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_ADAS import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_CLOUD -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_V2X +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_STATUS import com.mogo.eagle.core.data.enums.* import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew.Companion.isRoadEvent @@ -115,7 +115,7 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, V2XScenarioManager.getInstance().handlerMessage(v2XMessageEntity) V2XBizTrace.onAck("巡航处理 handlerMessage v2XMessageEntity", " $v2XMessageEntity") }else{ - V2XBizTrace.onAck("事件未触发,巡航处理", mapOf("roadEvent" to v2XRoadEventEntity, "distance" to distance)) + V2XBizTrace.onAck("事件未触发,巡航处理", mapOf("roadEvent" to v2XRoadEventEntity, "distance" to distance), true) } } } @@ -147,7 +147,7 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, * V2XEvent事件回调 */ @ChainLog( - linkChainLog = CHAIN_TYPE_V2X, + linkChainLog = CHAIN_TYPE_STATUS, linkCode = CHAIN_SOURCE_CLOUD, nodeAliasCode = CHAIN_CODE_V2X_MSG, paramIndexes = [0] @@ -173,22 +173,22 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, if (!AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) || !FunctionBuildConfig.v2nMainSwitch || !FunctionBuildConfig.isNewV2NData) { handleRoadMarkerEvent(event.data.toRoadMarker()) }else{ - V2XBizTrace.onAck("事件未触发,被开关拦截",mapOf("roadEvent" to event, "v2nMainSwitch" to FunctionBuildConfig.v2nMainSwitch,"isNewV2NData" to FunctionBuildConfig.isNewV2NData)) + V2XBizTrace.onAck("事件未触发,被开关拦截",mapOf("roadEvent" to event, "v2nMainSwitch" to FunctionBuildConfig.v2nMainSwitch,"isNewV2NData" to FunctionBuildConfig.isNewV2NData), true) } } else -> { - V2XBizTrace.onAck("事件未触发,不识别的新事件",mapOf("roadEvent" to event)) + V2XBizTrace.onAck("事件未触发,不识别的新事件",mapOf("roadEvent" to event), true) } } } @RequiresApi(Build.VERSION_CODES.N) - @ChainLog( - linkChainLog = CHAIN_TYPE_V2X, - linkCode = CHAIN_SOURCE_ADAS, - nodeAliasCode = CHAIN_CODE_V2X_MSG, - paramIndexes = [0] - ) +// @ChainLog( +// linkChainLog = CHAIN_TYPE_STATUS, +// linkCode = CHAIN_SOURCE_ADAS, +// nodeAliasCode = CHAIN_CODE_V2X_MSG, +// paramIndexes = [0] +// ) override fun onAutopilotIdentifyPlanningObj(planningObjects: List?) { super.onAutopilotIdentifyPlanningObj(planningObjects) planningObjects?.let { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/alarm/V2XAlarmServer.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/alarm/V2XAlarmServer.java index 0bc5ac915d..6c11973b88 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/alarm/V2XAlarmServer.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/alarm/V2XAlarmServer.java @@ -1,10 +1,12 @@ package com.mogo.eagle.function.biz.v2x.v2n.alarm; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BIZ; + import com.mogo.eagle.core.data.enums.EventTypeEnumNew; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.data.map.entity.MarkerLocation; import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; import com.mogo.eagle.function.biz.v2x.V2XBizTrace; @@ -39,7 +41,7 @@ public class V2XAlarmServer { CopyOnWriteArrayList v2XRoadEventEntityList, MogoLocation currentLocation) { try { - Logger.d(TAG, "getDriveFrontAlarmEvent --- 1 ---" + currentLocation ); + CallerLogger.d(M_BIZ + TAG, "getDriveFrontAlarmEvent --- 1 ---" + currentLocation ); if (!showedEvents.isEmpty()) { Iterator iterator = showedEvents.iterator(); while (iterator.hasNext()) { @@ -56,18 +58,18 @@ public class V2XAlarmServer { } } } - Logger.d(TAG, "getDriveFrontAlarmEvent --- 2 ---" + currentLocation); + CallerLogger.d(M_BIZ + TAG, "getDriveFrontAlarmEvent --- 2 ---" + currentLocation); if (currentLocation != null && v2XRoadEventEntityList != null) { // 因为集合是按照距离排序后的所以这里检索出来第一个就发出警告 for (V2XRoadEventEntity v2XRoadEventEntity : v2XRoadEventEntityList) { // 0、道路事件必须有朝向,角度>=0; - //Logger.d(TAG, "entity:" + v2XRoadEventEntity.getLocation()); + //CallerLogger.d(M_BIZ + TAG, "entity:" + v2XRoadEventEntity.getLocation()); if (v2XRoadEventEntity.getLocation().getAngle() >= 0) { // 计算车辆距离指定气泡的距离 MarkerLocation eventLocation = v2XRoadEventEntity.getLocation(); // 1、判断是否到达了触发距离,20 ~ 500, double distance = v2XRoadEventEntity.getDistance(); - Logger.d(TAG, "distance:" + distance + ",poiType:" + v2XRoadEventEntity.getPoiType()); + CallerLogger.d(M_BIZ + TAG, "distance:" + distance + ",poiType:" + v2XRoadEventEntity.getPoiType()); if (distance <= 500) { if (EventTypeEnumNew.GHOST_PROBE.getPoiType().equals(v2XRoadEventEntity.getPoiType())) { if (distance > 25) { @@ -78,7 +80,7 @@ public class V2XAlarmServer { double carBearing = currentLocation.getHeading(); double eventBearing = eventLocation.getAngle(); double diffAngle = DrivingDirectionUtils.getAngleDiff(carBearing, eventBearing); - Logger.d(TAG, "car_bearing:" + carBearing + ",eventBearing:" + eventBearing + ",diffAngle:" + diffAngle); + CallerLogger.d(M_BIZ + TAG, "car_bearing:" + carBearing + ",eventBearing:" + eventBearing + ",diffAngle:" + diffAngle); if (diffAngle <= 30) { // 3、计算当前车辆行驶方向与事件位置之间夹角《20度,保证道路事件在车辆前方 double eventAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( @@ -89,31 +91,31 @@ public class V2XAlarmServer { (int) currentLocation.getHeading() ); - Logger.d(TAG, "eventAngle:" + eventAngle); + CallerLogger.d(M_BIZ + TAG, "eventAngle:" + eventAngle); if (0 <= eventAngle && eventAngle <= 25) { if (showedEvents.contains(v2XRoadEventEntity)) { return null; } - Logger.d(TAG, "showed---"); + CallerLogger.d(M_BIZ + TAG, "showed---"); showedEvents.add(v2XRoadEventEntity); return v2XRoadEventEntity; } }else{ HashMap map = new HashMap(); map.put("diffAngle",diffAngle); - V2XBizTrace.Companion.onAck("事件未触发,未达到触发角度",map); + V2XBizTrace.Companion.onAck("事件未触发,未达到触发角度",map,true); } }else{ HashMap map = new HashMap(); map.put("distance",distance); - V2XBizTrace.Companion.onAck("事件未触发,未达到触发距离",map); + V2XBizTrace.Companion.onAck("事件未触发,未达到触发距离",map,true); } } } } } catch (Exception e) { e.printStackTrace(); - Logger.w(TAG, "error: " + e.getMessage()); + CallerLogger.w(M_BIZ + TAG, "error: " + e.getMessage()); } return null; } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/network/V2XRefreshModel.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/network/V2XRefreshModel.kt index cbf3207f39..f722e49601 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/network/V2XRefreshModel.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/network/V2XRefreshModel.kt @@ -18,6 +18,8 @@ import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.DeviceUtils +import com.mogo.eagle.function.biz.v2x.V2XBizTrace +import com.mogo.eagle.function.biz.v2x.v2n.V2XPoiLoader import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers @@ -102,7 +104,7 @@ internal class V2XRefreshModel { CallerLogger.d(SceneConstant.M_V2X + TAG, "请求成功,size为:${it.result?.v2XEventList?.size}") return@map it.result?.v2XEventList } else { - CallerLogger.d(SceneConstant.M_V2X + TAG, "请求失败,code为:${it.code}") + V2XBizTrace.onAck("${SceneConstant.M_V2X}$TAG", mapOf("v2xEventsSummaryError" to it.code), true) return@map ArrayList() } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt index 3ba30d6dfe..f06b170ccf 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/pnc/V2NIdentifyDrawer.kt @@ -1,26 +1,35 @@ package com.mogo.eagle.function.biz.v2x.v2n.pnc -import android.os.* -import androidx.core.util.* -import com.mogo.eagle.core.data.config.* -import com.mogo.eagle.core.data.enums.* +import android.os.Handler +import android.os.HandlerThread +import android.os.Message +import androidx.core.util.Pair +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.enums.CommunicationType import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.enums.WarningDirectionEnum.ALERT_WARNING_TOP -import com.mogo.eagle.core.data.map.entity.* -import com.mogo.eagle.core.data.msgbox.* +import com.mogo.eagle.core.data.map.entity.MarkerExploreWay +import com.mogo.eagle.core.data.map.entity.MarkerLocation +import com.mogo.eagle.core.data.map.entity.V2XRoadEventEntity +import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType.V2X +import com.mogo.eagle.core.data.msgbox.V2XMsg import com.mogo.eagle.core.function.angle.scenes.Default import com.mogo.eagle.core.function.angle.scenes.RoadEvent -import com.mogo.eagle.core.function.api.autopilot.* -import com.mogo.eagle.core.function.api.hmi.warning.* -import com.mogo.eagle.core.function.call.autopilot.* -import com.mogo.eagle.core.function.call.hmi.* -import com.mogo.eagle.core.function.call.map.* +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager +import com.mogo.eagle.core.function.call.map.CallerVisualAngleManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox -import com.mogo.eagle.core.utilcode.mogo.* -import com.mogo.eagle.core.utilcode.util.* +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.util.CoordinateTransform +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils import com.mogo.eagle.function.biz.v2x.V2XBizTrace -import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.* +import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker import com.mogo.eagle.function.biz.v2x.v2n.scenario.scene.airoad.AiRoadMarker.Marker import com.mogo.eagle.function.biz.v2x.v2n.utils.V2XEventAnalyticsManager import mogo.telematics.pad.MessagePad.Header @@ -36,22 +45,28 @@ internal object V2NIdentifyDrawer { private const val TAG = "V2NIdentifyDataSubscriber" private const val MSG_WHAT_DRAW_SHIGONE = 0x1010 // 道路施工 - private const val MSG_WHAT_DRAW_SHIGU = 0x1011 // 交通事故 - private const val MSG_WHAT_DRAW_YONGDU = 0x1012 // 交通拥堵 + private const val MSG_WHAT_DRAW_SHIGU = 0x1011 // 交通事故 + private const val MSG_WHAT_DRAW_YONGDU = 0x1012 // 交通拥堵 private val callback = Handler.Callback { msg -> if (msg.what == MSG_WHAT_DRAW_SHIGONE || msg.what == MSG_WHAT_DRAW_SHIGU) { val events = msg.obj as? List<*> if (events == null || events.isEmpty()) { - V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu" to "")) + V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu" to ""), true) return@Callback true } val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() val filtered = events.filterIsInstance(TrackedObject::class.java).filter { itx -> - DrivingDirectionUtils.getDegreeOfCar2Poi(car.longitude, car.latitude, itx.longitude, itx.latitude, car.heading.toInt()) < 90 + DrivingDirectionUtils.getDegreeOfCar2Poi( + car.longitude, + car.latitude, + itx.longitude, + itx.latitude, + car.heading.toInt() + ) < 90 } if (filtered.isEmpty()) { - V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu-filter" to "")) + V2XBizTrace.onAck(TAG, mapOf("shiGong-shiGu-filter" to ""), true) return@Callback true } filtered.forEach { itx -> @@ -60,68 +75,121 @@ internal object V2NIdentifyDrawer { AiRoadMarker().apply { val poiType = getPoiType(itx.type).poiType val polygon = itx.polygonList.map { Pair.create(it.longitude, it.latitude) } - marker(Marker(id, poiType, itx.latitude,itx.longitude, itx.heading, polygon, null, + marker(Marker(id, + poiType, + itx.latitude, + itx.longitude, + itx.heading, + polygon, + null, V2XRoadEventEntity().also { e -> e.poiType = poiType - e.location = MarkerLocation().also { l -> - val p = CoordinateTransform.WGS84ToGCJ02(itx.longitude, itx.latitude) - l.lon = p[0] - l.lat = p[1] - l.angle = itx.heading - } - e.noveltyInfo = MarkerExploreWay().also { - it.poiType = poiType - it.location = e.location - it.polygon = polygon - } - }), true, isDrawRoadLine(poiType)) + e.location = MarkerLocation().also { l -> + val p = CoordinateTransform.WGS84ToGCJ02( + itx.longitude, + itx.latitude + ) + l.lon = p[0] + l.lat = p[1] + l.angle = itx.heading + } + e.noveltyInfo = MarkerExploreWay().also { + it.poiType = poiType + it.location = e.location + it.polygon = polygon + } + }), true, isDrawRoadLine(poiType) + ) - val distance = CoordinateUtils.calculateLineDistance(itx.longitude, itx.latitude, car.longitude, car.latitude) + val distance = CoordinateUtils.calculateLineDistance( + itx.longitude, + itx.latitude, + car.longitude, + car.latitude + ) val alertContent = getAlertContent(poiType, distance.toDouble()) val ttsContent = getTtsContent(poiType, distance.toDouble()) - V2XBizTrace.onAck(TAG,"绘制poi事件:$poiType") - saveMsgBox(MsgBoxBean(V2X, V2XMsg(poiType, alertContent, ttsContent,CommunicationType.V2N.name))) - CallerHmiManager.warningV2X(poiType, alertContent, ttsContent, object : IMoGoWarningStatusListener { - override fun onShow() { - super.onShow() - CallerVisualAngleManager.changeAngle(RoadEvent(itx.longitude, itx.latitude, itx.angle)) - } + V2XBizTrace.onAck(TAG, "绘制poi事件:$poiType") + saveMsgBox( + MsgBoxBean( + V2X, + V2XMsg( + poiType, + alertContent, + ttsContent, + CommunicationType.V2N.name + ) + ) + ) + CallerHmiManager.warningV2X( + poiType, + alertContent, + ttsContent, + object : IMoGoWarningStatusListener { + override fun onShow() { + super.onShow() + CallerVisualAngleManager.changeAngle( + RoadEvent( + itx.longitude, + itx.latitude, + itx.angle + ) + ) + } - override fun onDismiss() { - super.onDismiss() - CallerVisualAngleManager.changeAngle(Default()) - } - }, ALERT_WARNING_TOP, 10000, false) + override fun onDismiss() { + super.onDismiss() + CallerVisualAngleManager.changeAngle(Default()) + } + }, + ALERT_WARNING_TOP, + 10000, + false + ) //消息埋点 - V2XEventAnalyticsManager.triggerV2XEvent(poiType, alertContent, ttsContent, - DataSourceType.AICLOUD,CommunicationType.V2N) + V2XEventAnalyticsManager.triggerV2XEvent( + poiType, alertContent, ttsContent, + DataSourceType.AICLOUD, CommunicationType.V2N + ) } }.receive() } } else if (msg.what == MSG_WHAT_DRAW_YONGDU) { val events = msg.obj as? List<*> if (events == null || events.isEmpty()) { - V2XBizTrace.onAck(TAG, mapOf("yongDu" to "")) + V2XBizTrace.onAck(TAG, mapOf("yongDu" to ""), true) return@Callback true } val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() val filtered = events.filterIsInstance(MogoV2X.RTEData_PB::class.java).filter { itx -> - val eventLon = itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } ?: 0.0 - val eventLat = itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } ?: 0.0 - DrivingDirectionUtils.getDegreeOfCar2Poi(car.longitude, car.latitude, eventLon, eventLat, car.heading.toInt()) < 90 + val eventLon = + itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } + ?: 0.0 + val eventLat = + itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } + ?: 0.0 + DrivingDirectionUtils.getDegreeOfCar2Poi( + car.longitude, + car.latitude, + eventLon, + eventLat, + car.heading.toInt() + ) < 90 } if (filtered.isEmpty()) { - V2XBizTrace.onAck(TAG, mapOf("yongDu-filter" to "")) + V2XBizTrace.onAck(TAG, mapOf("yongDu-filter" to ""), true) return@Callback true } filtered.forEach { itx -> val id = itx.rteId.toString() - val lon = itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } ?: 0.0 - val lat = itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } ?: 0.0 + val lon = itx.eventPos?.offsetLL?.positionLatLon?.lon?.let { it * 1.0 / 10_000_000 } + ?: 0.0 + val lat = itx.eventPos?.offsetLL?.positionLatLon?.lat?.let { it * 1.0 / 10_000_000 } + ?: 0.0 AiRoadMarker.aiMakers.getOrPut(id) { AiRoadMarker().apply { val poiType = getPoiType(itx.eventType).poiType - marker(Marker(id, poiType, lat, lon, car.heading, null, null, + marker(Marker(id, poiType, lat, lon, car.heading, null, null, V2XRoadEventEntity().also { e -> e.poiType = poiType e.location = MarkerLocation().also { l -> @@ -135,27 +203,59 @@ internal object V2NIdentifyDrawer { it.location = e.location it.polygon = emptyList() } - }), true, isDrawRoadLine(poiType)) + }), true, isDrawRoadLine(poiType) + ) - val distance = CoordinateUtils.calculateLineDistance(lon, lat, car.longitude, car.latitude) + val distance = CoordinateUtils.calculateLineDistance( + lon, + lat, + car.longitude, + car.latitude + ) val alertContent = getAlertContent(poiType, distance.toDouble()) val ttsContent = getTtsContent(poiType, distance.toDouble()) - V2XBizTrace.onAck(TAG,"绘制poi事件:$poiType") - saveMsgBox(MsgBoxBean(V2X, V2XMsg(poiType, alertContent, ttsContent,CommunicationType.V2N.name))) - CallerHmiManager.warningV2X(poiType, alertContent, ttsContent, object : IMoGoWarningStatusListener { - override fun onShow() { - super.onShow() - CallerVisualAngleManager.changeAngle(RoadEvent(lon, lat, car.heading)) - } + V2XBizTrace.onAck(TAG, "绘制poi事件:$poiType") + saveMsgBox( + MsgBoxBean( + V2X, + V2XMsg( + poiType, + alertContent, + ttsContent, + CommunicationType.V2N.name + ) + ) + ) + CallerHmiManager.warningV2X( + poiType, + alertContent, + ttsContent, + object : IMoGoWarningStatusListener { + override fun onShow() { + super.onShow() + CallerVisualAngleManager.changeAngle( + RoadEvent( + lon, + lat, + car.heading + ) + ) + } - override fun onDismiss() { - super.onDismiss() - CallerVisualAngleManager.changeAngle(Default()) - } - }, ALERT_WARNING_TOP, 10000, false) + override fun onDismiss() { + super.onDismiss() + CallerVisualAngleManager.changeAngle(Default()) + } + }, + ALERT_WARNING_TOP, + 10000, + false + ) //消息埋点 - V2XEventAnalyticsManager.triggerV2XEvent(poiType, alertContent, ttsContent, - DataSourceType.AICLOUD,CommunicationType.V2N) + V2XEventAnalyticsManager.triggerV2XEvent( + poiType, alertContent, ttsContent, + DataSourceType.AICLOUD, CommunicationType.V2N + ) } }.receive() } @@ -181,7 +281,7 @@ internal object V2NIdentifyDrawer { } private fun getAlertContent(poiType: String, distance: Double): String { - return when(poiType) { + return when (poiType) { EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType -> { "前方${distance.toInt()}米道路施工" } @@ -201,7 +301,10 @@ internal object V2NIdentifyDrawer { return EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType == poiType } - private fun getPoiType(type: Int): EventTypeEnumNew = if (type == 501 || type == 502) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG else if (type == 13) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU else if (type == 102) EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION else throw AssertionError("error!!!") + private fun getPoiType(type: Int): EventTypeEnumNew = + if (type == 501 || type == 502) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG else if (type == 13) EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGU else if (type == 102) EventTypeEnumNew.TYPE_SOCKET_ROAD_CONGESTION else throw AssertionError( + "error!!!" + ) private val handler by lazy { val thread = HandlerThread("v2n_identify_drawer") @@ -225,12 +328,7 @@ internal object V2NIdentifyDrawer { override fun onAutopilotV2nCongestionEvent(header: Header, rsi: RSI_PB) { super.onAutopilotV2nCongestionEvent(header, rsi) - try { - V2XBizTrace.onAck("onAutopilotV2nCongestionEvent", rsi) - } catch (t: Throwable) { - t.printStackTrace() - } - + V2XBizTrace.onAck("onAutopilotV2nCongestionEvent", rsi) rsi.rsiFrame?.rtes?.rteDataList?.filter { it.eventType == 102 }?.takeIf { @@ -242,7 +340,7 @@ internal object V2NIdentifyDrawer { } private fun drawShiGong(events: List) { - if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { + if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode) && FunctionBuildConfig.v2nMainSwitch && FunctionBuildConfig.isNewV2NData) { handler.removeMessages(MSG_WHAT_DRAW_SHIGONE) handler.sendMessage(Message.obtain(handler, MSG_WHAT_DRAW_SHIGONE, events)) } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt index 82a986e606..a421d6ea73 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/airoad/AiRoadMarker.kt @@ -136,11 +136,11 @@ class AiRoadMarker { return@post } if (l1 == null || l2 == null) { - V2XBizTrace.onAck("$TAG -marker-3-line null return ----", "") + V2XBizTrace.onAck("$TAG -marker-3-line null return ----", "", true) return@post } if (l1.points.isEmpty() || l2.points.isEmpty()) { - V2XBizTrace.onAck("$TAG -marker-3-line points null return ----", "") + V2XBizTrace.onAck("$TAG -marker-3-line points null return ----", "", true) return@post } V2XBizTrace.onAck("$TAG -marker-4-l2:", l2) diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java index 5040ac2840..9e60f5fa38 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventMarker.java @@ -36,10 +36,10 @@ public class V2XRoadEventMarker implements IV2XMarker { IMoGoOverlayManager overlayManager = CallerMapUIServiceManager.INSTANCE.getOverlayManager(); if (overlayManager != null) { if (entity != null) { - V2XBizTrace.Companion.onAck("V2XRoadEventMarker -> poiType : ", entity.getPoiType()); + V2XBizTrace.Companion.onAck("V2XRoadEventMarker -> poiType : ", entity.getPoiType(), false); if (isAiRoadEvent(entity.getPoiType())) { MarkerExploreWay noveltyInfo = entity.getNoveltyInfo(); - V2XBizTrace.Companion.onAck("V2XRoadEventMarker -> noveltyInfo : ",noveltyInfo.toString()); + V2XBizTrace.Companion.onAck("V2XRoadEventMarker -> noveltyInfo : ",noveltyInfo.toString(), false); Pair gpsLocation = noveltyInfo.getGpsLocation(); List> polygons = noveltyInfo.getPolygon(); if (gpsLocation != null && polygons != null) { @@ -57,7 +57,7 @@ public class V2XRoadEventMarker implements IV2XMarker { .set3DMode(true) .icon3DRes(EventTypeEnumNew.getMarker3DRes(entity.getPoiType())).build(),DEFAULT); if (point != null) { - V2XBizTrace.Companion.onAck("V2XRoadEventMarker -> --- add Marker type: ", entity.getPoiType()); + V2XBizTrace.Companion.onAck("V2XRoadEventMarker -> --- add Marker type: ", entity.getPoiType(), false); ArrayList markers = new ArrayList<>(); markers.add(point); String id = entity.getLocation().getLon() + "_" + entity.getLocation().getLat(); diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java index fbc3095148..76074b309b 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/scenario/scene/road/V2XRoadEventScenario.java @@ -48,7 +48,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void init(V2XMessageEntity v2XMessageEntity) { try { - V2XBizTrace.Companion.onAck("v2XMessageEntity",v2XMessageEntity); + V2XBizTrace.Companion.onAck("v2XMessageEntity",v2XMessageEntity,false); V2XRoadEventEntity v2XRoadEventEntity = v2XMessageEntity.getContent(); if (v2XRoadEventEntity != null) { if (!isSameScenario(v2XMessageEntity)) { diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt index dce13bd7be..08b55b7ed7 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/vip/VipCarManager.kt @@ -123,7 +123,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } if (trafficLightResult.currentRoadTrafficLight() == null) { - V2XBizTrace.onAck("$M_V2X$TAG", "vip获取到灯态,但没找到对应车道数据 trafficLight:$$trafficLightResult") + V2XBizTrace.onAck("$M_V2X$TAG", "vip获取到灯态,但没找到对应车道数据 trafficLight:$$trafficLightResult", true) result = null return } @@ -258,7 +258,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe ",crossId:${result?.crossId}" + ",bearing:$bearing" + ",controlTime:$controlTime" - ) + ,true) ToastUtils.showLong("服务异常,请稍后重试") }) } diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index ab77257189..5d4ae62052 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -828,7 +828,7 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param rsi 数据 */ @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, nodeAliasCode = ChainConstant.CHAIN_CODE_V2X_MSG, paramIndexes = [0, 1] @@ -848,7 +848,7 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param parkingViolation 违停 ---包含 静态障碍车 */ @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, nodeAliasCode = ChainConstant.CHAIN_CODE_V2X_MSG, paramIndexes = [0] diff --git a/core/function-impl/mogo-core-function-devatools/build.gradle b/core/function-impl/mogo-core-function-devatools/build.gradle index dd29601f0e..704be88b02 100644 --- a/core/function-impl/mogo-core-function-devatools/build.gradle +++ b/core/function-impl/mogo-core-function-devatools/build.gradle @@ -80,6 +80,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxroomruntime kapt rootProject.ext.dependencies.androidxroomcompiler implementation rootProject.ext.dependencies.rxandroid + implementation rootProject.ext.dependencies.androidxcardview implementation rootProject.ext.dependencies.androidxroomktx implementation rootProject.ext.dependencies.protobuf_java implementation rootProject.ext.dependencies.androidxappcompat 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 000169af02..3ea8339543 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 @@ -288,6 +288,13 @@ class DevaToolsProvider : IDevaToolsProvider { BadCaseManager.onReceiveBadCaseRecord(msgBoxBean, activity, countdown) } + /** + * 魔方开启主动录包 + */ + override fun startRecordByMoFang() { + BadCaseManager.startRecordByMoFang() + } + override fun showFeedbackWindow(ctx: Context) { BadCaseManager.showBadCaseConfigWindow(ctx) } @@ -400,4 +407,8 @@ class DevaToolsProvider : IDevaToolsProvider { override fun block(): IMoGoBlockProvider? = block override fun usage(): IMoGoCpuUsageProvider? = usage + + override fun setNetworkMode(isDebug: Boolean) { + WeakNetworkStrategy.setDebug(isDebug) + } } \ 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/apm/ApmEnvProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt index d9e3bc01e4..1eb915f91b 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt @@ -69,8 +69,12 @@ class ApmEnvProviderImpl: IApmEnvProvider, CoroutineScope { var dockerVersionChanged = false val version = ApmEnvConfig.getDockerVersion() if (!TextUtils.isEmpty(version) && !TextUtils.isEmpty(dockerVersion) && version != dockerVersion) { - dockerVersionChanged = true - ApmEnvConfig.setDockerVersion(dockerVersion) + val f1 = version?.endsWith("release", true) == true + val f2 = dockerVersion.endsWith("release", true) + dockerVersionChanged = if (f1 && f2) false else f1 || f2 + if (dockerVersionChanged) { + ApmEnvConfig.setDockerVersion(dockerVersion) + } } var isFirstDockerVersionSet = false if (TextUtils.isEmpty(version) && !TextUtils.isEmpty(dockerVersion)) { 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 efa0e4a5f8..f2d2c83040 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 @@ -5,25 +5,40 @@ import android.app.Activity import android.content.Context import android.view.View import android.view.WindowManager +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle.Event import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.module.status.IMogoStatusChangedListener +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.data.msgbox.FMInfoMsg 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.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.toast.TipToast import com.mogo.eagle.core.utilcode.util.* +import com.mogo.eagle.core.utilcode.util.FileUtils.millis2String import com.mogo.tts.base.SpeechUtils import com.zhjt.mogo_core_function_devatools.badcase.biz.* import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig @@ -31,8 +46,11 @@ import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPi import com.zhjt.mogo_core_function_devatools.ext.enqueuePop import me.jessyan.autosize.utils.AutoSizeUtils import record_cache.RecordPanelOuterClass +import kotlin.math.abs -internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener { +internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener, + IMoGoChassisLocationGCJ02Listener, IMsgBoxListener, IMoGoDevaToolsListener, + IMogoStatusChangedListener { const val TAG = "BadCase" @@ -44,6 +62,66 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis fun init(context: Context) { CallerAutopilotRecordListenerManager.addListener(TAG, this) SpeechUtils.init(context) + //定位监听, 传false是高德坐标系 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 1, this) + //消息盒子监听,获取FM和Report信息 + CallerMsgBoxListenerManager.addListener(TAG,this) + CallerDevaToolsListenerManager.addListener(TAG, this) + // 云socket连接状态 + MogoStatusManager.getInstance() + .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + checkDelete() + } + + /** + * 检查删除录包记录在本地的信息 + */ + private fun checkDelete(){ + //获取当天时间 + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) + //和上次启动时间做对比,如果不是一天,则判断主动、采集和录包失败列表数量,数量过多的时候进行清除 + if(BadCaseConfig.getStartTime() != currentDay){ + if(BadCaseConfig.getInitiativeRecordSet().size > 190){ + BadCaseConfig.getInitiativeRecordSet().clear() + } + if(BadCaseConfig.getAiDataSet().size > 190){ + BadCaseConfig.getAiDataSet().clear() + } + if(BadCaseConfig.getRecordFailSet().size >190){ + BadCaseConfig.getRecordFailSet().clear() + } + BadCaseConfig.setStartTime(currentDay) + } + } + + /** + * 魔方开启主动录包 + */ + fun startRecordByMoFang(){ + if (NetworkUtils.isConnected()){ + if (BadCaseConfig.dockerVersion != null){ + val activity = AppStateManager.currentActivity() + if (activity !is AppCompatActivity) { + return + } + ThreadUtils.runOnUiThread { + val initiativeBadCaseWindow = InitiativeBadCaseWindow(activity) + initiativeBadCaseWindow.setClickListener(object : + InitiativeBadCaseWindow.ClickListener { + override fun closeWindow() { + initiativeBadCaseWindow.hideFloatWindow() + } + + }) + initiativeBadCaseWindow.showFloatWindow(null) + + } + }else { + ToastUtils.showShort("工控机连接状态异常") + } + }else { + ToastUtils.showShort("网络异常,请检查网络") + } } /** @@ -217,6 +295,11 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis ) } bag录制失败" ) + //获取录包失败集合 + val recordFail = BadCaseConfig.getRecordFailSet() + //录包失败时,保存录包失败状态 + recordFail.add(recordPanel.key.toString()) + BadCaseConfig.setRecordFailSet(recordFail) } return } @@ -269,4 +352,36 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis } + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + mogoLocation?.let { + BadCaseConfig.currentSpeed = (abs(it.gnssSpeed) * 3.6f).toInt() + } + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + if(category == MsgCategory.SYS_INFO){ + //上报 + BadCaseConfig.newReportEntity = msgBoxList.bean as ReportEntity + }else if(category == MsgCategory.FM_INFO){ + //FM + BadCaseConfig.newFMInfoMsg = msgBoxList.bean as FMInfoMsg + } + + } + + override fun gpsStatus(status: Boolean) { + super.gpsStatus(status) + BadCaseConfig.gpsStatus = "GPS${if (status) "正常" else "异常"}" + } + + override fun tracingStatus(status: Boolean) { + super.tracingStatus(status) + BadCaseConfig.tracingStatus = "寻迹算路${if (status) "正常" else "异常"}" + } + + override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) { + BadCaseConfig.socketStatus = "云Socket连接${if (isTrue) "正常" else "异常"}" + } + + } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt index 3297dcf31b..91ba40f715 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt @@ -12,6 +12,9 @@ import androidx.recyclerview.widget.RecyclerView import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.deva.badcase.AiDataEntity +import com.mogo.eagle.core.data.deva.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.deva.badcase.BagInfoEntity +import com.mogo.eagle.core.data.deva.badcase.BagManagerEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.api.devatools.badcase.BadCaseNetListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager @@ -39,6 +42,7 @@ import org.json.JSONObject import record_cache.RecordPanelOuterClass import java.lang.StringBuilder import java.util.* +import kotlin.collections.ArrayList /** * @author XuXinChao @@ -63,15 +67,18 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener private lateinit var tvCollectCancel: TextView //取消按钮 private var collectReason: StringBuilder = StringBuilder() + private var collectList = ArrayList() private var aiDataListAdapter: AiDataListAdapter?= null @Volatile - private var recordKey: String? = null //录制bag包key + private var recordKey: Long = 0 //录制bag包key @Volatile private var recordFileName: String? = null //录制文件包名 + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() + private lateinit var mFloatLayout: View private var mInViewX = 0f private var mInViewY = 0f @@ -110,13 +117,6 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}" //采集结果回调监听 CallerAutopilotRecordListenerManager.addListener(this.hashCode().toString(), this) - //开始录制AI数据采集Bag包 - CallerAutoPilotControlManager.recordPackage( - 99, - Random(SystemClock.elapsedRealtime()).nextInt(), - 20, - 12 - ) val linearLayoutManager = LinearLayoutManager(mActivity) linearLayoutManager.orientation = LinearLayoutManager.VERTICAL rvCollectList?.layoutManager = linearLayoutManager @@ -124,31 +124,44 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener aiDataListAdapter?.setListener(object: AiDataListAdapter.AiDataClickListener{ override fun onClick(reason: String, isChecked: Boolean) { if(isChecked){ - collectReason.append(reason) + if(!collectList.contains(reason)){ + collectList.add(reason) + } }else{ - val index = collectReason.indexOf(reason) - collectReason.delete(index,index+reason.length) + if(collectList.contains(reason)){ + collectList.remove(reason) + } } } }) rvCollectList?.adapter = aiDataListAdapter //注册网络接口获取数据监听 - CallerDevaToolsNetManager.addListener(TAG,this) + CallerDevaToolsNetManager.addListener(this.hashCode().toString(),this) //获取数据 BadCaseNetManager.badCaseNetManager.getAiData() //上报 tvCollectReport.setOnClickListener { - if(collectReason.isBlank()){ + if(collectList.isEmpty()){ ToastUtils.showShort("请选择最少一个原因") return@setOnClickListener } + collectReason.clear() + for(index in collectList.indices){ + if(index!=0){ + collectReason.append("&") + } + collectReason.append(collectList[index]) + } + //上报到工控机 + CallerAutoPilotControlManager.recordCause(recordKey.toString(),recordFileName,"", + collectReason.toString()) GlobalScope.launch { val uploadResult = presenter.upload(mutableMapOf().also { itx -> itx["carLicense"] = AppConfigInfo.plateNumber ?: "" //车牌号 itx["filename"] = recordFileName ?: "" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 - itx["key"] = recordKey ?: "" //key + itx["key"] = recordKey.toString() //key itx["reason"] = collectReason.toString() //采集原因 itx["duration"] = "20" //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) @@ -166,6 +179,14 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener TipToast.shortTip("上报失败") } else { TipToast.shortTip("上报成功") + //将上报BI的结果同步给工控机记录保存 + recordKey?.let { + val descReqEntity = BagDescriptionEntity(collectReason.toString(),false,"",true) + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = it + bagManagerEntity.descReq = descReqEntity + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } BadCaseConfig.windowNum-- clickListener?.closeWindow() } @@ -197,9 +218,14 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel") ThreadUtils.runOnUiThread { - if (recordKey == null) { - recordKey = recordPanel.key.toString() + recordKey = recordPanel.key + //开始录制 + if(recordPanel.stat == 300){ BadCaseConfig.recordKeyList.add(recordPanel.key) + val aiDataSet = BadCaseConfig.getAiDataSet() + //保存录包状态 + aiDataSet.add(recordPanel.key.toString()) + BadCaseConfig.setAiDataSet(aiDataSet) } if (recordFileName == null) { recordFileName = recordPanel.filename @@ -242,13 +268,36 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight() - 950 mWindowManager!!.addView(mFloatLayout, mWindowParams) } + //开始录制AI数据采集Bag包 + CallerAutoPilotControlManager.recordPackage( + 99, + Random(SystemClock.elapsedRealtime()).nextInt(), + 20, + 12 + ) + } + + 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 + recordFileName = it.bagPath + } } fun hideFloatWindow() { //注销采集结果回调监听 CallerAutopilotRecordListenerManager.removeListener(this.hashCode().toString()) //注销网络接口监听 - CallerDevaToolsNetManager.removeListener(this) + CallerDevaToolsNetManager.removeListener(this.hashCode().toString()) // 移除 ADAS车辆状态&定位 监听 CallerChassisLocationWGS84ListenerManager.removeListener(this.hashCode().toString()) if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout) 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 index 75100b5784..91a9798b34 100644 --- 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 @@ -8,6 +8,8 @@ import android.os.Handler import android.util.AttributeSet import android.view.LayoutInflater import android.view.View +import android.view.inputmethod.InputMethodManager +import android.widget.EditText import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import bag_manager.BagManagerOuterClass @@ -25,6 +27,7 @@ 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 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.* @@ -50,6 +53,7 @@ class BadCaseManagerView @JvmOverloads constructor( private var bagManagerEntity: BagManagerEntity = BagManagerEntity() private var clickListener: ClickListener? = null private var bagUploadDialog: BagUploadDialog ?= null + private var recordScreenDialog: RecordScreenDialog ?= null private var spaceTotal: Long = 0 //总空间 private var spaceUsed: Long = 0 //已用空间 @@ -181,7 +185,7 @@ class BadCaseManagerView @JvmOverloads constructor( } override fun uploadBI(bagInfoEntity: BagInfoEntity) { - //展示上报弹窗 + //展示主动上报弹窗 val initiativeBadCaseWindow = InitiativeBadCaseWindow(context as Activity) initiativeBadCaseWindow.setClickListener(object: InitiativeBadCaseWindow.ClickListener{ override fun closeWindow() { @@ -191,6 +195,18 @@ class BadCaseManagerView @JvmOverloads constructor( initiativeBadCaseWindow.showReportBIWindow(bagInfoEntity) } + override fun upLoadAiData(bagInfoEntity: BagInfoEntity) { + //展示AI数据采集上报弹窗 + val aiDataCollectWindow = AIDataCollectWindow(context as Activity) + aiDataCollectWindow.setClickListener(object : + AIDataCollectWindow.ClickListener { + override fun closeWindow() { + aiDataCollectWindow.hideFloatWindow() + } + }) + aiDataCollectWindow.showReportBIWindow(bagInfoEntity) + } + override fun editDescription(key: Long, description: BagDescriptionEntity) { //编辑Bag包描述信息 isNameModify = true @@ -208,14 +224,35 @@ class BadCaseManagerView @JvmOverloads constructor( //延迟播放 Handler().postDelayed({ //音频文件播放 - Audition.getInstance().playOrStop("${audioSavePath}${key}.wav") + try { + Audition.getInstance().playOrStop("${audioSavePath}${key}.wav") + }catch (e: Exception){ + CallerLogger.i(M_DEVA + TAG,"playOrStop=${e}") + } }, 1500) } + override fun lookMapScreen(key: Long) { + //打开高精地图截图对话框 + if(recordScreenDialog == null){ + recordScreenDialog = RecordScreenDialog(context) + } + recordScreenDialog?.show() + recordScreenDialog?.showScreenImage(key) + } + + override fun startEdit(editText: EditText) { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? + imm?.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT) + } + }) val linearLayoutManager = LinearLayoutManager(context) rvBagList.layoutManager = linearLayoutManager rvBagList.adapter = bagManagerListAdapter + bagManagerListAdapter?.setRecordSet(BadCaseConfig.getInitiativeRecordSet(), + BadCaseConfig.getAiDataSet(),BadCaseConfig.getRecordFailSet()) + //音频文件播放 // Audition.getInstance().playOrStop("/mnt/sdcard/mogo/test.wav") 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 a8fdeab7f5..7cadeb932d 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 @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.google.protobuf.ProtocolStringList; import com.mogo.eagle.core.data.deva.badcase.RecordCaseEntity; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; @@ -99,19 +100,14 @@ public class CaseListDialog extends Dialog implements IMoGoAutopilotRecordListen if(config.getRecordTypesCount()>0){ for(int index=0;index topicList = new ArrayList<>(); -// TODO java.lang.IndexOutOfBoundsException: Index: 38, Size: 38 -// for(int position=0;index0){ - recordTypeEntityArrayList.add(new RecordCaseEntity(0,"自定义A",BadCaseConfig.customTopicList)); + recordTypeEntityArrayList.add(new RecordCaseEntity(0,"自定义A", (ProtocolStringList) BadCaseConfig.customTopicList)); } caseListAdapter.setData(recordTypeEntityArrayList); caseListAdapter.notifyDataSetChanged(); 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 3606bd8045..7e1db01243 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 @@ -2,9 +2,10 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz import android.annotation.SuppressLint import android.app.Activity +import android.graphics.Bitmap import android.graphics.PixelFormat import android.os.Bundle -import android.os.CountDownTimer +import android.os.Environment import android.os.Handler import android.os.SystemClock import android.util.DisplayMetrics @@ -32,10 +33,14 @@ import com.mogo.eagle.core.data.deva.badcase.RecordCaseEntity import com.mogo.eagle.core.data.deva.badcase.RecordOptionEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.api.devatools.badcase.BadCaseNetListener +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84 import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsNetManager +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager 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.mogo.toast.TipToast @@ -58,6 +63,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseNetManager import com.zhjt.mogo_core_function_devatools.badcase.repository.store.BadCaseReasonStore +import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.json.JSONArray @@ -66,6 +72,7 @@ import org.json.JSONObject import record_cache.RecordPanelOuterClass import java.io.File import java.util.* +import kotlin.collections.ArrayList /** @@ -74,7 +81,7 @@ import java.util.* * @since: 2022/7/13 */ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchListener, - IMoGoAutopilotRecordListener, BadCaseNetListener { + IMoGoAutopilotRecordListener, BadCaseNetListener, IMoGoMapScreenListener { companion object { const val TAG = "InitiativeBadCaseWindow" @@ -92,7 +99,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private lateinit var viewAudioBg: ImageView private lateinit var viewAudioButton: ImageView - private lateinit var tvAudioCountDown: TextView + private lateinit var viewAudioStart: ImageView + private lateinit var tvAudioResult: TextView private lateinit var tvInitiativeReport: TextView private lateinit var tvInitiativeCancel: TextView @@ -104,7 +112,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var audioFileName:String?=null //录音文件名称 private var uploadReason: StringBuilder = StringBuilder() //上报原因,标签 - private var reasonDetail: String ?= null //语音转写 + private var uploadList = ArrayList() //上报原因列表 + private var reasonDetail: String = "" //语音转写 private var uploadReasonTotal: String = "" @Volatile private var recordKey: Long = 0 //录制bag包key @@ -112,6 +121,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var recordFileName: String?=null //录制文件包名 private var receiveTime: String?= null private var uploadStamp: String = System.currentTimeMillis().toString() + private var screenSavePath: String ?= null //截图保存路径 private var bagManagerEntity: BagManagerEntity = BagManagerEntity() @@ -158,7 +168,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList viewAudioBg = mFloatLayout.findViewById(R.id.viewAudioBg) viewAudioButton = mFloatLayout.findViewById(R.id.viewAudioButton) - tvAudioCountDown = mFloatLayout.findViewById(R.id.tvAudioCountDown) + viewAudioStart = mFloatLayout.findViewById(R.id.viewAudioStart) + tvAudioResult = mFloatLayout.findViewById(R.id.tvAudioResult) tvInitiativeReport = mFloatLayout.findViewById(R.id.tvInitiativeReport) tvInitiativeCancel = mFloatLayout.findViewById(R.id.tvInitiativeCancel) @@ -171,10 +182,13 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList badReasonListAdapter?.setListener(object: BadReasonListAdapter.ReasonClickListener{ override fun onClick(reason: String, isChecked: Boolean) { if(isChecked){ - uploadReason.append(reason) + if(!uploadList.contains(reason)){ + uploadList.add(reason) + } }else{ - val index = uploadReason.indexOf(reason) - uploadReason.delete(index,index+reason.length) + if(uploadList.contains(reason)){ + uploadList.remove(reason) + } } } }) @@ -192,7 +206,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList */ BadCaseNetManager.badCaseNetManager.getRecordOption(1,AppConfigInfo.iPCMacAddress) // BadCaseNetManager.badCaseNetManager.getRecordOption(1,"48:b0:2d:3a:9c:8f") - + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(this.hashCode().toString(),this) //采集结果回调监听 CallerAutopilotRecordListenerManager.addListener(this.hashCode().toString(),this) //主动录包采集原因回调监听 @@ -204,10 +219,17 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList //上报 tvInitiativeReport.setOnClickListener { - if(uploadReason.isBlank()){ + if(uploadList.isEmpty()){ ToastUtils.showShort("请选择最少一个原因") return@setOnClickListener } + uploadReason.clear() + for(index in uploadList.indices){ + if(index!=0){ + uploadReason.append("&") + } + uploadReason.append(uploadList[index]) + } tvInitiativeReport.text = "上报中..." if(audioStatus){ audioStatus = false @@ -218,11 +240,10 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() uploadAudio() } } @@ -233,7 +254,6 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList clickListener?.closeWindow() } - mWindowParams = WindowManager.LayoutParams() mWindowManager = mActivity.windowManager mWindowParams?.let { @@ -313,10 +333,11 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } Log.i(TAG, "语音内容=$resultBuffer") reasonDetail = resultBuffer.toString() + if(reasonDetail.isNotEmpty()){ + tvAudioResult.text = reasonDetail + } } - var countDownTimer: CountDownTimer?=null - private fun setAudio(status: Boolean){ if(status){ //开始录音 @@ -339,35 +360,17 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList ) scaleAnimation.duration = 1000 scaleAnimation.repeatCount = -1 - viewAudioButton.startAnimation(scaleAnimation) - - tvAudioCountDown.visibility = View.VISIBLE - //开始倒计时 - if(countDownTimer==null){ - countDownTimer = object : CountDownTimer(60000, 1000) { - - override fun onTick(millisUntilFinished: Long) { - tvAudioCountDown.text = "${millisUntilFinished/1000}S" - } - - override fun onFinish() { - tvAudioCountDown.visibility = View.GONE - //结束录音 - RecordManager.getInstance().stop() - //结束动画 - viewAudioButton.clearAnimation() - } - } - countDownTimer?.start() - } + viewAudioButton.visibility = View.GONE + viewAudioStart.visibility = View.VISIBLE + viewAudioStart.startAnimation(scaleAnimation) + tvAudioResult.text = "..." }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() } } @@ -430,11 +433,14 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList */ private fun upload(downloadUrl: String?){ GlobalScope.launch{ - uploadReasonTotal = if(reasonDetail.isNullOrEmpty()){ + uploadReasonTotal = if(reasonDetail.isEmpty()){ uploadReason.toString() }else{ "$uploadReason 语音内容:$reasonDetail" } + //上报到工控机 + CallerAutoPilotControlManager.recordCause(recordKey.toString(),recordFileName,"", + "$uploadReason:$reasonDetail") val uploadResult = presenter.upload(mutableMapOf().also { itx -> itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号 itx["filename"] = recordFileName?:"" //bag包文件地址 @@ -467,6 +473,10 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList bagManagerEntity.descReq = descReqEntity CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) } + //删除截图 + screenSavePath?.let { + RecordBitmapUtils.deleteReportedImage(it) + } val loc = getChassisLocationWGS84() BadCaseAnalyticsManager.bagRecordUpload(recordKey.toString(),recordFileName?:"",uploadStamp, "100",AppConfigInfo.plateNumber,BadCaseConfig.totalDuration.toString(),MoGoAiCloudClientConfig.getInstance().sn, @@ -561,6 +571,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList CallerAutopilotRecordListenerManager.removeListener(this.hashCode().toString()) //注销采集原因回调监听 CallerDevaToolsNetManager.removeListener(this.hashCode().toString()) + //注销高精地图截图监听回调 + CallerMapScreenListenerManager.removeListener(this.hashCode().toString()) if (mFloatLayout.parent != null){ mWindowManager!!.removeView(mFloatLayout) @@ -570,10 +582,18 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel") ThreadUtils.runOnUiThread { - if(recordKey==null){ - recordKey = recordPanel.key + recordKey = recordPanel.key + //开始录制 + if(recordPanel.stat == 300){ + BadCaseConfig.recordKeyList.add(recordPanel.key) + //获取当前主动录包集合 + val recordSet = BadCaseConfig.getInitiativeRecordSet() + //保存录包状态 + recordSet.add(recordPanel.key.toString()) + BadCaseConfig.setInitiativeRecordSet(recordSet) + //开启高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() } - BadCaseConfig.recordKeyList.add(recordPanel.key) if(recordFileName==null){ recordFileName = recordPanel.filename } @@ -642,4 +662,48 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } } + /** + * 高精地图截图回调 + */ + override fun onMapScreen(bitmap: Bitmap) { + //在截图上保存即时信息 + val time = "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}" + val lineId = "路线ID:${CallerAutoPilotStatusListenerManager.getLineId()}" + val state = when(CallerAutoPilotStatusListenerManager.getState()){ + 0->"自驾状态:不可自驾" + 1->"自驾状态:可自驾" + 2->"自驾状态:自驾中" + 7->"自驾状态:平行驾驶中" + else->"自驾状态:未知" + } + val speed = "当前车速:${BadCaseConfig.currentSpeed}" + val site = if(CallerAutoPilotStatusListenerManager.getLineStartName().isNullOrEmpty() || CallerAutoPilotStatusListenerManager.getLineEndName().isNullOrEmpty()){ + "路线起始点:无" + }else{ + "路线起点:${CallerAutoPilotStatusListenerManager.getLineStartName()};终点:${CallerAutoPilotStatusListenerManager.getLineEndName()}" + } + + val outBitmap = RecordBitmapUtils.drawTextOnBitmap(bitmap,time,lineId,state,speed,site, + BadCaseConfig.gpsStatus,BadCaseConfig.tracingStatus,BadCaseConfig.socketStatus + ,BadCaseConfig.newFMInfoMsg,BadCaseConfig.newReportEntity) + + //图片保存本地 + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) + val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+ + "MapScreen" + File.separator+ currentDay + File.separator + val fileName = "$recordKey.png" + val path = fileDir + fileName + if (!File(fileDir).exists()) { + File(fileDir).mkdirs() + } + if(outBitmap != null){ + RecordBitmapUtils.bitmap2Path(outBitmap,path) + }else{ + RecordBitmapUtils.bitmap2Path(bitmap,path) + } + screenSavePath = path + //遍历是否有非当日的文件并删除 + RecordBitmapUtils.deleteExpiredFile(currentDay) + } + } \ 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/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index 8b982a16a1..7c9a477c5b 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 @@ -2,23 +2,20 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz import android.annotation.SuppressLint import android.app.Activity -import android.graphics.Color +import android.graphics.Bitmap import android.graphics.PixelFormat import android.os.Bundle -import android.os.CountDownTimer +import android.os.Environment import android.os.Handler import android.util.DisplayMetrics import android.util.Log import android.view.* import android.view.animation.Animation import android.view.animation.ScaleAnimation -import android.widget.CheckBox -import android.widget.CompoundButton import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.google.android.flexbox.FlexboxLayout import com.iflytek.cloud.ErrorCode import com.iflytek.cloud.InitListener import com.iflytek.cloud.RecognizerListener @@ -34,9 +31,13 @@ import com.mogo.eagle.core.data.deva.badcase.RecordOptionEntity import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.devatools.badcase.BadCaseNetListener +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsNetManager +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA @@ -57,13 +58,12 @@ import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager import com.zhjt.mogo_core_function_devatools.badcase.biz.adapter.BadReasonListAdapter import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseNetManager import com.zhjt.mogo_core_function_devatools.badcase.repository.store.BadCaseReasonStore -import me.jessyan.autosize.utils.AutoSizeUtils +import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils import org.greenrobot.eventbus.EventBus import org.json.JSONArray import org.json.JSONException import org.json.JSONObject import java.io.File -import java.lang.Exception import java.lang.StringBuilder /** @@ -72,7 +72,7 @@ import java.lang.StringBuilder * @since: 2022/7/17 */ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListener, - BadCaseNetListener { + BadCaseNetListener , IMoGoMapScreenListener { companion object { const val TAG = "PassiveBadCaseWindow" @@ -89,6 +89,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var bagManagerEntity: BagManagerEntity = BagManagerEntity() private var uploadReason: StringBuilder = StringBuilder() //上报原因,标签 + private var uploadList = ArrayList() //上报原因列表 private var recordKey: String?=null //录制bag包key private var recordFileName: String?=null //录制文件包名 private var receiveTime: String ?= null //接收时间 @@ -99,6 +100,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private lateinit var rvPassiveList : RecyclerView private var badReasonListAdapter: BadReasonListAdapter?= null + private var screenSavePath: String ?= null //截图保存路径 private var mInViewX = 0f private var mInViewY = 0f @@ -108,7 +110,6 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var mInScreenY = 0f private var clickListener: ClickListener? = null - var countDownTimer: CountDownTimer?=null private lateinit var tvPassiveNum: TextView private lateinit var tvPassiveTime: TextView @@ -116,7 +117,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private lateinit var viewAudioBg: ImageView private lateinit var viewAudioButton: ImageView - private lateinit var tvAudioCountDown: TextView + private lateinit var viewAudioStart: ImageView + private lateinit var tvAudioResult: TextView private lateinit var tvPassiveReport: TextView private lateinit var tvPassiveCancel: TextView @@ -129,7 +131,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene // 用HashMap存储听写结果 private val mIatResults: HashMap = LinkedHashMap() - private var reasonDetail: String ?= null //语音转写 + private var reasonDetail: String = "" //语音转写 private var uploadReasonTotal: String = "" private var isUploadCos = false //是否在上传Cos操作 @@ -156,8 +158,9 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene tvPassiveTime = mFloatLayout.findViewById(R.id.tvPassiveTime) tvPassiveIdentity = mFloatLayout.findViewById(R.id.tvPassiveIdentity) viewAudioBg = mFloatLayout.findViewById(R.id.viewAudioBg) + tvAudioResult = mFloatLayout.findViewById(R.id.tvAudioResult) viewAudioButton = mFloatLayout.findViewById(R.id.viewAudioButton) - tvAudioCountDown = mFloatLayout.findViewById(R.id.tvAudioCountDown) + viewAudioStart = mFloatLayout.findViewById(R.id.viewAudioStart) tvPassiveReport = mFloatLayout.findViewById(R.id.tvPassiveReport) tvPassiveCancel = mFloatLayout.findViewById(R.id.tvPassiveCancel) rvPassiveList = mFloatLayout.findViewById(R.id.rvPassiveList) @@ -169,10 +172,13 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene override fun onClick(reason: String, isChecked: Boolean) { hasOperated = true if(isChecked){ - uploadReason.append(reason) + if(!uploadList.contains(reason)){ + uploadList.add(reason) + } }else{ - val index = uploadReason.indexOf(reason) - uploadReason.delete(index,index+reason.length) + if(uploadList.contains(reason)){ + uploadList.remove(reason) + } } } }) @@ -183,6 +189,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene */ BadCaseNetManager.badCaseNetManager.getRecordOption(2,AppConfigInfo.iPCMacAddress) // BadCaseNetManager.badCaseNetManager.getRecordOption(2,"48:b0:2d:3a:9c:8f") + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(this.hashCode().toString(),this) CallerDevaToolsNetManager.addListener(this.hashCode().toString(),this) if(BadCaseConfig.windowNum<1){ BadCaseConfig.windowNum = 1 @@ -199,10 +207,17 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene tvPassiveReport.setOnClickListener { hasOperated = true - if(uploadReason.isEmpty()){ + if(uploadList.isEmpty()){ TipToast.shortTip("请选择至少一个Case") return@setOnClickListener } + uploadReason.clear() + for(index in uploadList.indices){ + if(index!=0){ + uploadReason.append("&") + } + uploadReason.append(uploadList[index]) + } tvPassiveReport.text = "上报中..." if(audioStatus){ audioStatus = !audioStatus @@ -213,11 +228,10 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() uploadAudio() } //删除记录 @@ -314,6 +328,9 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } Log.i(TAG, "语音内容=$resultBuffer") reasonDetail = resultBuffer.toString() + if(reasonDetail.isNotEmpty()){ + tvAudioResult.text = reasonDetail + } } @@ -339,35 +356,17 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene ) scaleAnimation.duration = 1000 scaleAnimation.repeatCount = -1 - viewAudioButton.startAnimation(scaleAnimation) - - tvAudioCountDown.visibility = View.VISIBLE - //开始倒计时 - if(countDownTimer==null){ - countDownTimer = object : CountDownTimer(60000, 1000) { - - override fun onTick(millisUntilFinished: Long) { - tvAudioCountDown.text = "${millisUntilFinished/1000}S" - } - - override fun onFinish() { - tvAudioCountDown.visibility = View.GONE - //结束录音 - RecordManager.getInstance().stop() - //结束动画 - viewAudioButton.clearAnimation() - } - } - countDownTimer?.start() - } + viewAudioButton.visibility = View.GONE + viewAudioStart.visibility = View.VISIBLE + viewAudioStart.startAnimation(scaleAnimation) + tvAudioResult.text = "..." }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() } } @@ -430,11 +429,15 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene */ private fun upload(downloadUrl: String?){ GlobalScope.launch{ - uploadReasonTotal = if(reasonDetail.isNullOrEmpty()){ + uploadReasonTotal = if(reasonDetail.isEmpty()){ uploadReason.toString() }else{ "$uploadReason 语音内容:$reasonDetail" } + //上报到工控机 + CallerAutoPilotControlManager.recordCause(recordKey,recordFileName,"", + "$uploadReason:$reasonDetail" + ) val uploadResult = presenter.upload(mutableMapOf().also { itx -> itx["carLicense"] = AppConfigInfo.plateNumber //车牌号 itx["filename"] = recordFileName?:"" //bag包文件地址 @@ -468,6 +471,10 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene bagManagerEntity.descReq = descReqEntity CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) } + //删除截图 + screenSavePath?.let { + RecordBitmapUtils.deleteReportedImage(it) + } //被动上报埋点统计 val loc = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() BadCaseAnalyticsManager.bagRecordUpload(recordKey?:"",recordFileName?:"",receiveTime?:System.currentTimeMillis().toString(), @@ -535,6 +542,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene fun hideFloatWindow() { + //注销高精地图截图监听回调 + CallerMapScreenListenerManager.removeListener(this.hashCode().toString()) //注销采集原因回调监听 CallerDevaToolsNetManager.removeListener(this.hashCode().toString()) // 移除 ADAS车辆状态&定位 监听 @@ -555,6 +564,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene recordFileName = recordBagMsg.fileName receiveTime = msgBoxBean.timestamp.toString() stat = recordBagMsg.stat.toString() + //获取高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() } fun setClickListener(clickListener: ClickListener) { @@ -617,4 +628,47 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } } + /** + * 高精地图截图回调 + */ + override fun onMapScreen(bitmap: Bitmap) { + //在截图上保存即时信息 + val time = "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}" + val lineId = "路线ID:${CallerAutoPilotStatusListenerManager.getLineId()}" + val state = when(CallerAutoPilotStatusListenerManager.getState()){ + 0->"自驾状态:不可自驾" + 1->"自驾状态:可自驾" + 2->"自驾状态:自驾中" + 7->"自驾状态:平行驾驶中" + else->"自驾状态:未知" + } + val speed = "当前车速:${BadCaseConfig.currentSpeed}" + val site = if(CallerAutoPilotStatusListenerManager.getLineStartName().isNullOrEmpty() || CallerAutoPilotStatusListenerManager.getLineEndName().isNullOrEmpty()){ + "路线起始点:无" + }else{ + "路线起点:${CallerAutoPilotStatusListenerManager.getLineStartName()};终点:${CallerAutoPilotStatusListenerManager.getLineEndName()}" + } + + val outBitmap = RecordBitmapUtils.drawTextOnBitmap(bitmap,time,lineId,state,speed,site, + BadCaseConfig.gpsStatus,BadCaseConfig.tracingStatus,BadCaseConfig.socketStatus + ,BadCaseConfig.newFMInfoMsg,BadCaseConfig.newReportEntity) + //图片保存本地 + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) + val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+ + "MapScreen" + File.separator+ currentDay + File.separator + val fileName = "$recordKey.png" + val path = fileDir + fileName + if (!File(fileDir).exists()) { + File(fileDir).mkdirs() + } + if(outBitmap != null){ + RecordBitmapUtils.bitmap2Path(outBitmap,path) + }else{ + RecordBitmapUtils.bitmap2Path(bitmap,path) + } + screenSavePath = path + //遍历是否有非当日的文件并删除 + RecordBitmapUtils.deleteExpiredFile(currentDay) + } + } \ 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/RecordScreenDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/RecordScreenDialog.java new file mode 100644 index 0000000000..2998bb7142 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/RecordScreenDialog.java @@ -0,0 +1,66 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz; + +import static com.mogo.eagle.core.utilcode.util.FileUtils.millis2String; +import static com.mogo.eagle.core.utilcode.util.TimeUtils.getMdFormat; + +import android.app.Dialog; +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.view.WindowManager; +import android.widget.ImageView; + +import androidx.annotation.NonNull; + +import com.zhjt.mogo_core_function_devatools.R; + +import java.io.File; + +/** + * 录包时鹰眼截图查看对话框 + */ +public class RecordScreenDialog extends Dialog { + + private ImageView ivScreen; //截图展示 + private ImageView ivScreenClose; //关闭按钮 + + private Context mContext; + + public RecordScreenDialog(@NonNull Context context) { + super(context, R.style.bad_case_dialog); + mContext = context; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_record_screen); + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.height = 1013; + params.width = 1708; + getWindow().setAttributes(params);//向WindowManager设置属性 + setCanceledOnTouchOutside(false); + init(); + initEvent(); + } + + private void init(){ + ivScreen = findViewById(R.id.ivScreen); + ivScreenClose = findViewById(R.id.ivScreenClose); + } + + private void initEvent(){ + //关闭当前弹窗 + ivScreenClose.setOnClickListener(view -> dismiss()); + } + + public void showScreenImage(Long recordKey){ + String imagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator+ + "MapScreen" + File.separator+ millis2String(System.currentTimeMillis(),getMdFormat()) + File.separator+recordKey+".png"; + Uri imageUri = Uri.parse(imagePath); + + ivScreen.setImageURI(imageUri); + } + +} 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 index e8b1f34210..f8e597809a 100644 --- 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 @@ -1,5 +1,6 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz.adapter +import android.os.Build import android.text.Editable import android.text.TextWatcher import android.view.LayoutInflater @@ -12,9 +13,12 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.data.deva.badcase.BagDescriptionEntity import com.mogo.eagle.core.data.deva.badcase.BagInfoEntity +import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils import java.text.DecimalFormat + /** * @author XuXinChao * @description Bag包管理列表适配器 @@ -26,20 +30,33 @@ class BagManagerListAdapter: RecyclerView.Adapter() { private var bagClickListener: BagClickListener ?= null private val format = DecimalFormat("0.00") + private var initiativeSet: HashSet ?= null //录包来源为主动录包集合 + private var aiDataSet: HashSet ?= null //录包来源为AI数据采集集合 + private var recordFailSet: HashSet ?= null //录包失败集合 + fun setData(data: List?){ this.data = data notifyDataSetChanged() } + /** + * 设置录包缓存信息 + */ + fun setRecordSet(initiative: HashSet,aiData: HashSet,recordFail: HashSet){ + initiativeSet = initiative + aiDataSet = aiData + recordFailSet = recordFail + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - if(viewType == 1){ + return if(viewType == 1){ val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_bag_time_title,parent,false) - return BagTimeTitleHolder(view) + BagTimeTitleHolder(view) }else{ val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_bag_manager, parent, false) - return BagManagerListHolder(view) + BagManagerListHolder(view) } } @@ -92,18 +109,60 @@ class BagManagerListAdapter: RecyclerView.Adapter() { bagInfoEntity.description?.let { des-> - if(des.reportBI){ - //已上报 - holder.tvBagReportStatus.text = "已上报" + if(!recordFailSet.isNullOrEmpty() && recordFailSet!!.contains(bagInfoEntity.key.toString())){ + //如果在录包失败列表中找到该Bag包,则该包为录包失败状态 + holder.tvBagReportStatus.text = "录包失败" holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_reported_button_bg) holder.tvBagReportStatus.isClickable = false + //已上报的Bag不支持再查看,图标置为灰色,并且不可点击 + holder.ivMapScreen.alpha = 0.5f + holder.ivMapScreen.isClickable = false }else{ - //未上报 - holder.tvBagReportStatus.text = "上报" - holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_report_button_bg) - holder.tvBagReportStatus.isClickable = true - holder.tvBagReportStatus.setOnClickListener { - bagClickListener?.uploadBI(bagInfoEntity) + if(des.reportBI){ + //已上报 + holder.tvBagReportStatus.text = "已上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_reported_button_bg) + holder.tvBagReportStatus.isClickable = false + //已上报的Bag不支持再查看,图标置为灰色,并且不可点击 + holder.ivMapScreen.alpha = 0.5f + holder.ivMapScreen.isClickable = false + //已上报的Bag不能再进行编辑,编辑图标置灰,并且不可点击 + holder.ivEditReason.alpha = 0.5f + holder.ivEditReason.isClickable = false + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + holder.etBagNameEdit.focusable = View.NOT_FOCUSABLE + } + }else{ + //未上报 + holder.tvBagReportStatus.text = "上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_report_button_bg) + holder.tvBagReportStatus.isClickable = true + holder.tvBagReportStatus.setOnClickListener { + if(!aiDataSet.isNullOrEmpty() && aiDataSet!!.contains(bagInfoEntity.key.toString())){ + bagClickListener?.upLoadAiData(bagInfoEntity) + }else{ + bagClickListener?.uploadBI(bagInfoEntity) + } + } + holder.ivMapScreen.setOnClickListener { + bagInfoEntity.description?.let { + //查找是否有截图文件 + if(RecordBitmapUtils.checkHasImage(bagInfoEntity.key)){ + bagClickListener?.lookMapScreen(bagInfoEntity.key) + }else{ + ToastUtils.showShort("该截图录制失败或已删除") + } + } + } + + //编辑文字按钮 + holder.ivEditReason.setOnClickListener { + holder.etBagNameEdit.requestFocus() + holder.etBagNameEdit.performClick() + //调起软键盘 + bagClickListener?.startEdit(holder.etBagNameEdit) + } + } } if(des.description.isEmpty()){ @@ -113,6 +172,24 @@ class BagManagerListAdapter: RecyclerView.Adapter() { } } + //录包来源:自动 or 人工 or 采集 + if(!initiativeSet.isNullOrEmpty() && initiativeSet!!.contains(bagInfoEntity.key.toString())){ + //在该列表中找到Bag包的Key则代表该Bag为人工录包 + holder.tvBagResource.text = "人工" + holder.tvBagResource.setBackgroundResource(R.drawable.bag_artificial_button_bg) + }else if(!aiDataSet.isNullOrEmpty() && aiDataSet!!.contains(bagInfoEntity.key.toString())){ + //AI数据采集 + holder.tvBagResource.text = "采集" + holder.tvBagResource.setBackgroundResource(R.drawable.bag_artificial_button_bg) + //AI数据采集不显示截图播放按钮 + holder.ivMapScreen.visibility = View.INVISIBLE + }else{ + //自动录包 + holder.tvBagResource.text = "自动" + holder.tvBagResource.setBackgroundResource(R.drawable.bag_auto_button_bg) + } + + if(bagInfoEntity.description?.hasAudio == true){ holder.ivBagAudio.visibility = View.VISIBLE @@ -139,6 +216,7 @@ class BagManagerListAdapter: RecyclerView.Adapter() { e.printStackTrace() } } + } } } @@ -161,6 +239,9 @@ class BagManagerListAdapter: RecyclerView.Adapter() { var ivBagAudio: ImageView = itemView.findViewById(R.id.ivBagAudio) var tvBagTime: TextView = itemView.findViewById(R.id.tvBagTime) var tvBagSize: TextView = itemView.findViewById(R.id.tvBagSize) + var ivMapScreen: ImageView = itemView.findViewById(R.id.ivMapScreen) + var tvBagResource: TextView = itemView.findViewById(R.id.tvBagResource) + var ivEditReason: ImageView = itemView.findViewById(R.id.ivEditReason) } fun setListener(listener: BagClickListener){ @@ -172,10 +253,16 @@ class BagManagerListAdapter: RecyclerView.Adapter() { fun onClick(bagInfoEntity: BagInfoEntity, isChecked: Boolean) //上报BI平台 fun uploadBI(bagInfoEntity: BagInfoEntity) + //AI数据采集上报 + fun upLoadAiData(bagInfoEntity: BagInfoEntity) //编辑Bag包描述信息 fun editDescription(key: Long,description: BagDescriptionEntity) //听录音 fun bagAudio(key: Long,audioUrl: String) + //查看高精地图截图 + fun lookMapScreen(key: Long) + //点击按钮调起编辑Bag包信息 + fun startEdit(editText: EditText) } } \ 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 29b7741383..b5868dbb3d 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,6 +1,9 @@ package com.zhjt.mogo_core_function_devatools.badcase.consts import com.mogo.eagle.core.data.deva.badcase.BagInfoEntity +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.utilcode.util.SPUtils /** * @author XuXinChao @@ -29,6 +32,23 @@ object BadCaseConfig { //工控机版本 @JvmField var dockerVersion:String ?= null + //当前车速 + @JvmField + var currentSpeed: Int = 0 + //最新的上报消息 + @JvmField + var newReportEntity: ReportEntity ?= null + //最新的FM消息 + @JvmField + var newFMInfoMsg: FMInfoMsg ?= null + //GPS状态 + @JvmField + var gpsStatus: String ?= null + //寻迹算路 + @JvmField + var tracingStatus: String ?= null + //云Socket连接状态 + var socketStatus: String ?= null @JvmField var recordKeyList:ArrayList = ArrayList() //自定义Topic清单列表 @@ -38,4 +58,64 @@ object BadCaseConfig { @JvmField var bagManagerList: ArrayList = ArrayList() + private const val resourceInitiative = "RESOURCE_INITIATIVE" //录包来源为主动录包 + private const val resourceAiData = "RESOURCE_AI_DATA" //录包来源为AI数据采集 + private const val recordFail = "RECORD_FAIL" //录包失败 + private const val startTime = "RECORD_START_TIME" //启动时间 + + /** + * 获取上一次启动日期 + */ + fun getStartTime(): String{ + return SPUtils.getInstance().getString(startTime,"") + } + + /** + * 记录启动日期 + */ + fun setStartTime(startDay: String){ + SPUtils.getInstance().put(startTime,startDay) + } + + /** + * 获取主动录包集合 + */ + fun getInitiativeRecordSet(): HashSet{ + return SPUtils.getInstance().getStringSet(resourceInitiative,HashSet()) as HashSet + } + + /** + * 保存主动录包集合 + */ + fun setInitiativeRecordSet(initiativeSet: Set){ + SPUtils.getInstance().put(resourceInitiative,initiativeSet) + } + + /** + * 获取AI数据采集集合 + */ + fun getAiDataSet(): HashSet{ + return SPUtils.getInstance().getStringSet(resourceAiData,HashSet()) as HashSet + } + + /** + * 保存AI数据采集集合 + */ + fun setAiDataSet(aiDataSet: Set){ + SPUtils.getInstance().put(resourceAiData,aiDataSet) + } + + /** + * 获取录包失败集合 + */ + fun getRecordFailSet(): HashSet{ + return SPUtils.getInstance().getStringSet(recordFail,HashSet()) as HashSet + } + + /** + * 保存录包失败集合 + */ + fun setRecordFailSet(recordFailSet: Set){ + SPUtils.getInstance().put(recordFail,recordFailSet) + } } \ 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/util/RecordBitmapUtils.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt new file mode 100644 index 0000000000..b65884d61d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt @@ -0,0 +1,141 @@ +package com.zhjt.mogo_core_function_devatools.badcase.util + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.os.Environment +import android.util.Log +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.utilcode.util.FileUtils.millis2String +import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.zhjt.mogo_core_function_devatools.badcase.biz.InitiativeBadCaseWindow +import java.io.File +import java.io.FileOutputStream +import java.io.OutputStream + +object RecordBitmapUtils { + + /** + * 将Bitmap保存到本地 + */ + fun bitmap2Path(bitmap: Bitmap, path: String?): String? { + try { + val os: OutputStream = FileOutputStream(path) + bitmap.compress(Bitmap.CompressFormat.PNG, 50, os) + os.flush() + os.close() + } catch (e: java.lang.Exception) { + Log.e(InitiativeBadCaseWindow.TAG, "bitmap2Path Exception", e) + } + return path + } + + /** + * 删除过期文件夹 + */ + fun deleteExpiredFile(currentDay: String){ + val checkFileName = Environment.getExternalStorageDirectory().absolutePath + File.separator+ "MapScreen" + val checkFileFolder = File(checkFileName) + if(checkFileFolder.exists()){ + checkFileFolder.listFiles()?.forEach {dir-> + if(dir.name != currentDay && dir.isDirectory){ + dir.listFiles()?.forEach { file-> + file.delete() + } + dir.delete() + } + } + } + } + + fun deleteReportedImage(path: String){ + val screenFile = File(path) + if(screenFile.exists()){ + screenFile.delete() + } + } + + fun checkHasImage(recordKey: Long): Boolean{ + var checkResult = false + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) + val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+ + "MapScreen" + File.separator+ currentDay + File.separator + val fileName = "$recordKey.png" + val path = fileDir + fileName + val file = File(path) + if(file.exists()){ + checkResult = true + } + return checkResult + } + + /** + * 在指定Bitmap中绘制文字 + */ + fun drawTextOnBitmap(bitmap: Bitmap, time: String,lineId: String,state: String,currentSpeed: String, + site: String,gpsStatus: String?,tracingStatus: String?,socketStatus: String? + ,fm: FMInfoMsg?,report: ReportEntity? + ): Bitmap? { + val mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true) + val canvas = Canvas(mutableBitmap) + val paint = Paint() + paint.color = Color.WHITE + paint.textSize = 50f + paint.isAntiAlias = true + canvas.drawText(time, 100f, 100f, paint) + canvas.drawText(lineId,100f,200f,paint) + canvas.drawText(state,100f,300f,paint) + canvas.drawText(currentSpeed,100f,400f,paint) + canvas.drawText(site,100f,500f,paint) + + gpsStatus?.let { + canvas.drawText(it,1000f,100f,paint) + } + tracingStatus?.let { + canvas.drawText(it,1000f,200f,paint) + } + socketStatus?.let { + canvas.drawText(it,1000f,300f,paint) + } + + fm?.let { + canvas.drawText("FM:${MsgFmData.getFmPolicyName(it.policyCode)}",100f,600f,paint) + canvas.drawText("故障策略:${MsgFmData.getFmPolicyName(it.policyCode)}(${it.policyCode})",100f,700f,paint) + //故障原因 + if(it.fmInfoList.isNullOrEmpty()){ + canvas.drawText("故障原因:暂无",100f,800f,paint) + }else{ + val fmFaultReason = StringBuilder() + fmFaultReason.append("故障原因:") + for((index,info) in it.fmInfoList!!.withIndex()){ + fmFaultReason.append(info.faultName) + if(info.faultId.isNotBlank()){ + fmFaultReason.append("(") + fmFaultReason.append(info.faultId) + fmFaultReason.append(")") + } + if(index!=(it.fmInfoList!!.size-1)){ + fmFaultReason.append("/") + } + } + canvas.drawText(fmFaultReason.toString(),100f,800f,paint) + } + } + report?.let { + var resultStr = "上报类型:" + for (result in it.resultList) { + resultStr = + "${resultStr}${CallerAutoPilotControlManager.getReportResultDesc(result)}" + } + canvas.drawText(resultStr,100f,1000f,paint) + canvas.drawText("原因:${it.msg}",100f,1100f,paint) + canvas.drawText("消息来源:${it.src}",100f,1200f,paint) + } + return mutableBitmap + } + +} \ 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/binding/BindingCarNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt index 778cc13a1e..fd16b4f50e 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarNetWorkManager.kt @@ -4,10 +4,10 @@ import android.content.Context import com.mogo.commons.constants.HostConst import com.mogo.commons.constants.SharedPrefsConstants import com.mogo.commons.debug.DebugConfig +import com.mogo.eagle.core.data.config.HdMapBuildConfig import com.mogo.eagle.core.data.deva.bindingcar.BindingCarInfo import com.mogo.eagle.core.data.deva.bindingcar.BindingCarRequest import com.mogo.eagle.core.data.deva.bindingcar.ModifyBindingcarInfo -import com.mogo.eagle.core.data.config.HdMapBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showBindingCarDialog import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showModifyBindingCarDialog @@ -74,8 +74,19 @@ class BindingCarNetWorkManager private constructor() { .subscribe(object : Observer { override fun onSubscribe(d: Disposable) {} override fun onNext(info: BindingCarInfo) { - if (info != null && info.getData() != null) { - bindLog(mapOf("bindResult" to true,"carType" to getDefaultId(),"msg" to info)) + if (info?.getData() != null) { + if ((info.code != 0 && info.code != 200)) { + bindLog(mapOf("bindResult" to false, "msg" to info.toString())) + return + } + + bindLog( + mapOf( + "bindResult" to true, + "carType" to getDefaultId(), + "msg" to info + ) + ) SharedPrefsMgr.getInstance(context).putString( SharedPrefsConstants.CAR_INFO, GsonUtils.toJson(info.getData()) @@ -87,15 +98,22 @@ class BindingCarNetWorkManager private constructor() { } updateCarVrIconRes(info.getData().brandId) } else { - SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, "") - e(SceneConstant.M_DEVA + TAG, "getBindingCarInfo data = null ---getDefaultId() : ${getDefaultId()} ") + SharedPrefsMgr.getInstance(context) + .putString(SharedPrefsConstants.CAR_INFO, "") + e( + SceneConstant.M_DEVA + TAG, + "getBindingCarInfo data = null ---getDefaultId() : ${getDefaultId()} " + ) } } override fun onError(e: Throwable) { SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, "") - bindLog(mapOf("bindResult" to false,"msg" to e.toString())) - e(SceneConstant.M_DEVA + TAG, "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message + "---getDefaultId() : ${getDefaultId()}") + bindLog(mapOf("bindResult" to false, "msg" to e.toString())) + e( + SceneConstant.M_DEVA + TAG, + "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message + "---getDefaultId() : ${getDefaultId()}" + ) } override fun onComplete() {} @@ -131,14 +149,18 @@ class BindingCarNetWorkManager private constructor() { override fun onSubscribe(d: Disposable) {} override fun onNext(info: ModifyBindingcarInfo) { if (info != null) { + if ((info.code != 0 && info.code != 200)) { + bindLog(mapOf("bindingStatus" to false, "bindMsg" to info.toString())) + return + } callBack.invoke(info) - bindLog(mapOf("bindingStatus" to true,"bindMsg" to info)) + bindLog(mapOf("bindingStatus" to true, "bindMsg" to info)) updateCarVrIconRes(info.data.brandId) } } override fun onError(e: Throwable) { - bindLog(mapOf("bindingStatus" to false,"bindMsg" to e.toString())) + bindLog(mapOf("bindingStatus" to false, "bindMsg" to e.toString())) } override fun onComplete() {} @@ -147,7 +169,7 @@ class BindingCarNetWorkManager private constructor() { private fun updateCarVrIconRes(brandId: String?) { d(SceneConstant.M_DEVA + TAG, "CarModelChange : ${DebugConfig.isCarModelChange()}") - if(!DebugConfig.isCarModelChange()){ + if (!DebugConfig.isCarModelChange()) { return } if (brandId == null || brandId.isEmpty()) { @@ -188,7 +210,7 @@ class BindingCarNetWorkManager private constructor() { nodeAliasCode = ChainConstant.CHAIN_CODE_BINDING_CAR, paramIndexes = [0] ) - private fun bindLog(msg:Map){ + private fun bindLog(msg: Map) { d(SceneConstant.M_DEVA + TAG, "bindLog : $msg") } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt index b2e9732364..50a6404f54 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt @@ -38,12 +38,12 @@ class FuncConfigNetWorkModel { if (error == null) { error = onError } - map["sn"] = MoGoAiCloudClientConfig.getInstance().sn - map["mac"] = DeviceUtils.getMacAddress() - map["channelVersion"] = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) } loader { apiCall { + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["mac"] = DeviceUtils.getMacAddress() + map["channelVersion"] = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) getNetWorkApi().funcConfig(map) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt index fd9b3442a6..de503482f7 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt @@ -7,6 +7,7 @@ import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.data.config.* import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.* import com.zhjt.mogo.adas.data.bean.MogoReport.Code.Info.IMF @@ -57,6 +58,7 @@ internal class MoFangCommandExecutor { private const val MSG_WHAT_KEY_CODE_D = 0x06 private const val MSG_WHAT_KEY_CODE_E = 0x07 private const val MSG_WHAT_KEY_CODE_EL = 0x08 + private const val MSG_WHAT_KEY_CODE_BL = 0x09 } @Volatile @@ -232,6 +234,27 @@ internal class MoFangCommandExecutor { } } } + MSG_WHAT_KEY_CODE_BL -> { + try { + Log.d(TAG, "--- 长按录包 ---") + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf( + EVENT_EXECUTE_PARAMS_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_TYPE to (getInputTypeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_LON to location.longitude, + EVENT_EXECUTE_PARAMS_LAT to location.latitude, + EVENT_EXECUTE_PARAMS_SPEED to location.gnssSpeed, + EVENT_EXECUTE_PARAMS_ACC to location.acceleration, + EVENT_EXECUTE_PARAMS_HEADING to location.heading, + EVENT_EXECUTE_PARAMS_LINE_ID to CallerAutoPilotStatusListenerManager.getLineId(), + EVENT_EXECUTE_PARAMS_DOCKER_VERSION to (CallerAutoPilotStatusListenerManager.getDockerVersion() ?: "") + )) + linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $msg")) + CallerDevaToolsManager.startRecordByMoFang() + } catch (t: Throwable) { + t.printStackTrace() + Log.e(TAG, "error: ${t.message}, msg-> $msg") + } + } } true } @@ -266,6 +289,9 @@ internal class MoFangCommandExecutor { MSG_WHAT_KEY_CODE_E -> { "单击键E->开启自驾$extra" } + MSG_WHAT_KEY_CODE_BL -> { + "长按键B->录包$extra" + } MSG_WHAT_KEY_CODE_EL -> { "长按键E->鸣笛$extra" } @@ -276,7 +302,7 @@ internal class MoFangCommandExecutor { private fun getKeycodeByWhat(what: Int): String? { return when(what) { MSG_WHAT_KEY_CODE_A, MSG_WHAT_KEY_CODE_AL -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A) - MSG_WHAT_KEY_CODE_B -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B) + MSG_WHAT_KEY_CODE_B, MSG_WHAT_KEY_CODE_BL -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B) MSG_WHAT_KEY_CODE_AB -> "${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A)},${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B)}" MSG_WHAT_KEY_CODE_C -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_C) MSG_WHAT_KEY_CODE_D -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_D) @@ -294,7 +320,7 @@ internal class MoFangCommandExecutor { MSG_WHAT_KEY_CODE_E -> { "1" } - MSG_WHAT_KEY_CODE_AL,MSG_WHAT_KEY_CODE_EL -> { + MSG_WHAT_KEY_CODE_AL, MSG_WHAT_KEY_CODE_BL, MSG_WHAT_KEY_CODE_EL -> { "2" } MSG_WHAT_KEY_CODE_AB -> { @@ -387,6 +413,15 @@ internal class MoFangCommandExecutor { }) linkedLog?.record(mapOf("发送[EL]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_EL)}")) } + + if (keyCode == KeyEvent.KEYCODE_B) { + Log.d(TAG, "--- 长按键B --- 触发录包 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_BL) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_BL + }) + linkedLog?.record(mapOf("发送[BL]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_BL)}")) + } } fun handleCombineClick(vararg keyCodes: Int) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt index a9af35d89d..2d2326d988 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt @@ -253,14 +253,6 @@ internal class OverViewImpl(ctx: Context) : IFlow(ctx), } } - /** - * 工控机连接状态 - */ - override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { - super.onAutopilotIpcConnectStatusChanged(status, reason) - } - - override fun onDestroy() { super.onDestroy() // CallerDevaToolsListenerManager.removeListener(TAG) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt index 93d36a30de..1dfae49417 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/rtk/RTKImpl.kt @@ -1,7 +1,6 @@ package com.zhjt.mogo_core_function_devatools.status.flow.rtk import android.content.Context -import android.util.Log import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener @@ -66,7 +65,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu check?.takeIf { it.isActive }?.cancel() isOldVersion.set(false) val info = status.healthInfoList?.find { "localization".equals(it.name, true) } - Log.d(TAG, "info: $info") + CallerLogger.d("$M_DEVA$TAG", "info: $info") if (info != null) { healthInfo.set(info) send(RTKStatus(getDesc(), getCode())) @@ -77,7 +76,7 @@ internal class RTKImpl(ctx: Context): IFlow(ctx), IMoGoAutopilotStatu check?.takeIf { it.isActive }?.cancel() isOldVersion.set(false) val info = statusInf.healthInfoList?.find { "localization".equals(it.name, true) } - Log.d(TAG, "info: $info") + CallerLogger.d("$M_DEVA$TAG", "info: $info") if (info != null) { healthInfo.set(info) send(RTKStatus(getDesc(), getCode())) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt index 94361fcdef..00d5559ec1 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/TraceManager.kt @@ -74,8 +74,6 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_TRAFFIC_LIGHT) fwBuildMap[ChainConstant.CHAIN_TYPE_ANR_LEAK] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_ANR) - fwBuildMap[ChainConstant.CHAIN_TYPE_V2X] = - FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_V2X) fwBuildMap[ChainConstant.CHAIN_TYPE_WEAK_NETWORK] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_WEAK_NETWORK) fwBuildMap[ChainConstant.CHAIN_TYPE_OCH] = @@ -98,8 +96,6 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { ChainLogParam(true, "红绿灯Union数据") traceInfoCache[ChainConstant.CHAIN_TYPE_ANR_LEAK] = ChainLogParam(true, "ANR Record") - traceInfoCache[ChainConstant.CHAIN_TYPE_V2X] = - ChainLogParam(true, "V2X(V2N/V2I)") traceInfoCache[ChainConstant.CHAIN_TYPE_WEAK_NETWORK] = ChainLogParam(true, "WeakNetWork Record") diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt index 712307239a..7b69cb6213 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt @@ -34,20 +34,20 @@ class IPCUpgradeNetWorkModel { fun upgradeConfirm(images: List,padSn: String,releaseId: String, onSuccess: ((String) -> Unit),onError: ((String) -> Unit)){ request> { - val requestJson = JSONObject() - val imagesJsonArray = JSONArray() - images.iterator().forEach { - imagesJsonArray.put(it) - } - requestJson.put("images",imagesJsonArray) - requestJson.put("padSn",padSn) - requestJson.put("releaseId",releaseId) - val requestBody:RequestBody= RequestBody.create( - MediaType.parse("application/json; charset=utf-8"), - requestJson.toString() - ) loader{ apiCall{ + val requestJson = JSONObject() + val imagesJsonArray = JSONArray() + images.iterator().forEach { + imagesJsonArray.put(it) + } + requestJson.put("images",imagesJsonArray) + requestJson.put("padSn",padSn) + requestJson.put("releaseId",releaseId) + val requestBody:RequestBody= RequestBody.create( + MediaType.parse("application/json; charset=utf-8"), + requestJson.toString() + ) getNetWorkApi(getBaseUrl()).upgradeConfirm(requestBody) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/WeakNetworkStrategy.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/WeakNetworkStrategy.kt index ce2597b208..1fe1cf76da 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/WeakNetworkStrategy.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/WeakNetworkStrategy.kt @@ -15,7 +15,7 @@ object WeakNetworkStrategy { private const val TAG = "WeakNetworkStrategy" // 记录到链路日志中的时间间隔 - private const val OUTPUT_TIME_INTERVAL = 15000 + private const val OUTPUT_TIME_INTERVAL = 2500 private const val WEAK_HTTP_RTT = 1300 @@ -23,6 +23,8 @@ object WeakNetworkStrategy { private var lastOutputTime = 0L + private var isDebug = false + private val lock by lazy { ReentrantReadWriteLock() } @@ -53,6 +55,10 @@ object WeakNetworkStrategy { }) } + fun setDebug(isDebug: Boolean) { + this.isDebug = isDebug + } + fun stopListen() { setListener(null) } @@ -63,10 +69,13 @@ object WeakNetworkStrategy { try { val currentTime = System.currentTimeMillis() if (currentTime - lastOutputTime > OUTPUT_TIME_INTERVAL) { + if (isDebug) { + invokeWeakResult("url为:$url, 耗时为:$timeStamp${if (isFail) " 连接失败!" else ""}") + } if (timeStamp >= WEAK_HTTP_RTT) { ToastUtils.showShort("当前网络质量差!") } else if (timeStamp in 300 until WEAK_HTTP_RTT) { - invokeWeakResult("url为:$url, 耗时为:$timeStamp${if (isFail) " 连接失败!" else ""}") +// invokeWeakResult("url为:$url, 耗时为:$timeStamp${if (isFail) " 连接失败!" else ""}") SdtManager.startActiveCheck() } lastOutputTime = currentTime 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 index 2959045ff3..7a03289e1f 100644 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_audio.png 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_edit.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_edit.png new file mode 100644 index 0000000000..6ef85bbe15 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_edit.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_look_screen.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_look_screen.png new file mode 100644 index 0000000000..f6201cea81 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_look_screen.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_screen_close.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_screen_close.png new file mode 100644 index 0000000000..1899acac7e Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_screen_close.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_artificial_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_artificial_button_bg.xml new file mode 100644 index 0000000000..03f1407ad1 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_artificial_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_auto_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_auto_button_bg.xml new file mode 100644 index 0000000000..fdc5ea6d1e --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_auto_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 deleted file mode 100644 index 09ffe565d7..0000000000 Binary files a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_bag_edit.png and /dev/null differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_record_screen.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_record_screen.xml new file mode 100644 index 0000000000..b125bb4555 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_record_screen.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + \ 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 index 8cd8a75b48..60129b5acd 100644 --- 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 @@ -17,25 +17,56 @@ app:layout_constraintStart_toStartOf="parent" /> - + + + + + + + - + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml index 96a89f7004..3424a3f421 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml @@ -104,6 +104,23 @@ android:layout_marginBottom="@dimen/dp_40" /> + + - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml index 4178a3b155..72e93d6b9d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml @@ -104,6 +104,23 @@ android:layout_marginBottom="@dimen/dp_40" /> + + - - \ 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/lookaround/M1LookAroundView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt index c1bde36d11..b990722143 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt @@ -5,7 +5,6 @@ import android.graphics.* import android.graphics.Paint.Style.STROKE import android.os.Handler import android.os.HandlerThread -import android.os.SystemClock import android.util.* import android.view.SurfaceHolder import android.view.SurfaceView @@ -15,6 +14,8 @@ import com.mogo.eagle.core.function.api.lookaround.data.* import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.function.call.devatools.* import com.mogo.eagle.core.utilcode.kotlin.* +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.ThreadUtils import com.mogo.eagle.core.utilcode.util.Utils import kotlinx.coroutines.* @@ -279,12 +280,11 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas override fun onAttachedToWindow() { super.onAttachedToWindow() CallerChassisSteeringStateListenerManager.addListener(TAG, this) - Log.d(TAG, "--- 发起订阅 ---") CallerAutoPilotControlManager.setIsSubscribeM1StitchedVideo(true) scope.launch(ThreadUtils.getCpuPool().asCoroutineDispatcher()) { CallerDevaToolsManager.lookAroundProvider()?.flow()?.also { flow -> flow.onEach { - Log.d(TAG, "-- onEach ---:$it") + CallerLogger.d("$M_HMI$TAG", "-- onEach ---:$it") if (it.isValid()) { data = it handler.get()?.removeCallbacks(this@M1LookAroundView) @@ -307,7 +307,6 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas override fun onDetachedFromWindow() { super.onDetachedFromWindow() CallerChassisSteeringStateListenerManager.removeListener(TAG) - Log.d(TAG, "--- 取消订阅 ---") CallerAutoPilotControlManager.setIsSubscribeM1StitchedVideo(false) handler.get()?.looper?.quitSafely() } 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 1c4e6a7a75..905b83cff0 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 @@ -19,8 +19,6 @@ 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.function.msgbox.MsgBoxConfig -import com.mogo.eagle.core.function.msgbox.MsgFmData 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 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 9abf8fd4d3..b35f490ca8 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 @@ -18,7 +18,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.function.msgbox.MsgFmData 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.ResourceUtils.getDrawable 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 b5758c6c39..8e05d9b313 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 @@ -11,6 +11,7 @@ import android.os.Build import android.os.Process import android.text.Html import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.view.View import androidx.annotation.RequiresApi @@ -21,6 +22,7 @@ import androidx.core.view.MenuCompat import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope import chassis.Chassis +import com.mogo.cloud.network.cronet.NetworkQualityListener import com.mogo.cloud.network.cronet.QuicConfig import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig @@ -86,6 +88,7 @@ import com.mogo.eagle.core.utilcode.util.* import com.mogo.map.MogoData.Companion.mogoMapData import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.map.uicontroller.VisualAngleMode.* +import com.zhjt.service.chain.ChainLog import kotlinx.android.synthetic.main.view_debug_setting.view.* import kotlinx.coroutines.* import mogo.telematics.pad.MessagePad @@ -773,7 +776,35 @@ internal class DebugSettingView @JvmOverloads constructor( FunctionBuildConfig.isObuWarningFusionUnion = isChecked } tbCronet.setOnCheckedChangeListener { _, isChecked -> + if (!isChecked) { + CallerDevaToolsManager.setNetworkMode(true) + } QuicConfig.setEnable(context, isChecked) + QuicConfig.setNetworkListener(object : NetworkQualityListener { + override fun onLatencyObservation(rttMs: Int, url: String?) { + invokeCronetResult("****** Cronet Request Completed, the latency is $rttMs ms;url is $url") + } + + override fun onFailed(error: String?, url: String?) { + invokeCronetResult("****** Cronet Request onFailed, error is $error;url is $url") + } + + override fun onCanceled(url: String?) { + invokeCronetResult("****** Cronet Request onFailed, url is: $url") + } + + override fun onRttObservation(rttMs: Int, whenMs: Long, source: Int) { + invokeCronetResult("rttMs is:$rttMs ms,source is:$source") + } + + override fun onThroughputObservation( + throughputKbps: Int, + whenMs: Long, + source: Int + ) { + invokeCronetResult("downstream throughput is:$throughputKbps,source is:$source") + } + }) } //重启工控机所有节点 @@ -2310,4 +2341,13 @@ internal class DebugSettingView @JvmOverloads constructor( } } + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_WEAK_NETWORK, + linkCode = ChainConstant.CHAIN_SOURCE_WEAK_NETWORK, + nodeAliasCode = ChainConstant.CHAIN_CODE_RECORD_WEAK_NETWORK, + paramIndexes = [0] + ) + private fun invokeCronetResult(json: String) { + Log.d("CronetNetwork", json) + } } \ 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/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 b01319581d..2c888da2b4 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 @@ -2,7 +2,6 @@ package com.mogo.eagle.core.function.hmi.ui.setting import android.content.Context import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.Toast @@ -31,7 +30,6 @@ import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.call.vehicle.CallerSweeperModeListenerManager import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.function.hmi.ui.tools.DockerRebootDialog import com.mogo.eagle.core.function.hmi.ui.tools.SweeperModeChangedConfirmDialog import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction @@ -84,6 +82,7 @@ import kotlinx.android.synthetic.main.view_sop_setting.view.scV2nPnc import kotlinx.android.synthetic.main.view_sop_setting.view.scWeakNetSlowDown import kotlinx.android.synthetic.main.view_sop_setting.view.sopLayout import kotlinx.android.synthetic.main.view_sop_setting.view.tvOverTakeLimit +import kotlinx.android.synthetic.main.view_sop_setting.view.tvPullTimeTitle import kotlinx.android.synthetic.main.view_sop_setting.view.tvSpeed import kotlinx.android.synthetic.main.view_sop_setting.view.tvSpeedOverTakeLimit import kotlinx.android.synthetic.main.view_sop_setting.view.tvSpeedThresholdTitle @@ -789,6 +788,11 @@ internal class SOPSettingView @JvmOverloads constructor( View.VISIBLE else View.GONE + tvPullTimeTitle.visibility = + if(AppIdentityModeUtils.isTaxiDriver(FunctionBuildConfig.appIdentityMode)) + View.VISIBLE + else + View.GONE /** * 魔方sop运营相关配置 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt index 6e0d8be103..de47dd80e6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/utils/HmiActionLog.kt @@ -1,6 +1,9 @@ package com.mogo.eagle.core.function.hmi.ui.utils +import com.mogo.eagle.core.data.deva.chain.ChainCommon import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.zhjt.service.chain.ChainLog @@ -9,14 +12,34 @@ class HmiActionLog { companion object { + fun hmiAction(data: Any, data1: Any, param: Boolean = false) { + CallerLogger.d(M_HMI + data.toString(), data1) + if (param) { + val cal = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val lineId = CallerAutoPilotStatusListenerManager.getLineId() + realParamAction(data, data1, ChainCommon(cal.latitude, cal.longitude, lineId)) + } else { + realAction(data, data1) + } + } + @ChainLog( linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, linkCode = ChainConstant.CHAIN_SOURCE_HMI, nodeAliasCode = ChainConstant.CHAIN_CODE_HMI_ACTIONS, paramIndexes = [0, 1] ) - fun hmiAction(data: Any, data1: Any) { - CallerLogger.d(M_HMI + data.toString(), data1) + private fun realAction(data: Any, data1: Any) { + + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_HMI, + nodeAliasCode = ChainConstant.CHAIN_CODE_HMI_ACTIONS, + paramIndexes = [0, 1, 2] + ) + private fun realParamAction(data: Any, data1: Any, chainCommon: ChainCommon) { } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt index 5b8d49477c..f835356bef 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/ParallelDriveView.kt @@ -6,7 +6,6 @@ import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.util.AttributeSet -import android.util.Log import android.view.LayoutInflater import android.view.animation.LinearInterpolator import android.widget.ImageView @@ -22,6 +21,9 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerParallelDrivingActionsListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerParallelDrivingListenerManager import com.mogo.eagle.core.function.hmi.R +import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog +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.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhjt.mogo.adas.data.bean.UnableLaunchReason @@ -74,9 +76,9 @@ class ParallelDriveView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() initView() - CallerAutoPilotStatusListenerManager.addListener(TAG, this) - CallerParallelDrivingListenerManager.addListener(TAG, this) - CallerParallelDrivingActionsListenerManager.addListener(TAG, this) + CallerAutoPilotStatusListenerManager.addListener("$M_HMI$TAG", this) + CallerParallelDrivingListenerManager.addListener("$M_HMI$TAG", this) + CallerParallelDrivingActionsListenerManager.addListener("$M_HMI$TAG", this) } private fun initView() { @@ -88,7 +90,7 @@ class ParallelDriveView @JvmOverloads constructor( when (state) { 0 -> { state = APP_REQUESTING - Log.d(TAG, "Click-开始请求平行驾驶") + HmiActionLog.hmiAction(TAG,"Click-开始请求平行驾驶") updateUI(APP_REQUESTING) reqParaDrive() listener?.onReqClick() @@ -96,18 +98,18 @@ class ParallelDriveView @JvmOverloads constructor( APP_REQUESTING -> { cancelParaDrive() - Log.d(TAG, "Click-请求已取消") + HmiActionLog.hmiAction(TAG,"Click-请求已取消") ToastUtils.showShort("请求已取消!") checkAvailableAndUpdateUI() } AD_REQUESTING -> { - Log.d(TAG, "Click-自动驾驶正在请求平行驾驶") + HmiActionLog.hmiAction(TAG,"Click-自动驾驶正在请求平行驾驶") ToastUtils.showShort("自动驾驶正在请求平行驾驶") } UNAVAILABLE -> { - Log.d(TAG, "Click-请P档驻车并松开油门刹车后请求") + HmiActionLog.hmiAction(TAG,"Click-请P档驻车并松开油门刹车后请求") ToastUtils.showShort("请P档驻车并松开油门刹车后请求") } } @@ -124,7 +126,6 @@ class ParallelDriveView @JvmOverloads constructor( when (state) { 7 -> { isAutoDriving = false - Log.d(TAG, "onAutopilotStatusResponse-7") ThreadUtils.runOnUiThread({ this.state = PARALLEL_DRIVING updateUI(PARALLEL_DRIVING) @@ -133,7 +134,6 @@ class ParallelDriveView @JvmOverloads constructor( 2 -> { isAutoDriving = true - Log.d(TAG, "onAutopilotStatusResponse-2") if (this.autopilotState == 7) { ThreadUtils.runOnUiThread({ checkAvailableAndUpdateUI() @@ -143,7 +143,6 @@ class ParallelDriveView @JvmOverloads constructor( else -> { isAutoDriving = false - Log.d(TAG, "onAutopilotStatusResponse-else") if (this.autopilotState == 7) { ThreadUtils.runOnUiThread({ checkAvailableAndUpdateUI() @@ -158,14 +157,14 @@ class ParallelDriveView @JvmOverloads constructor( isParallelDrivingAbility: Boolean ) { if (!isParallelDrivingAbility) { - Log.d(TAG, "onParallelDrivingAbility-UNAVAILABLE") + CallerLogger.d("$M_HMI$TAG", "onParallelDrivingAbility-UNAVAILABLE") ThreadUtils.runOnUiThread({ if (state == PARALLEL_DRIVING) return@runOnUiThread state = UNAVAILABLE updateUI(UNAVAILABLE) }, ThreadUtils.MODE.QUEUE) } else { - Log.d(TAG, "onParallelDrivingAbility-AVAILABLE") + CallerLogger.d("$M_HMI$TAG", "onParallelDrivingAbility-AVAILABLE") ThreadUtils.runOnUiThread({ if (state == PARALLEL_DRIVING) return@runOnUiThread state = 0 @@ -176,8 +175,8 @@ class ParallelDriveView @JvmOverloads constructor( override fun onParallelDrivingResp(parallelTaskProcessNotice: ParallelTaskProcessNoticeOuterClass.ParallelTaskProcessNotice?) { parallelTaskProcessNotice?.let { + CallerLogger.d("$M_HMI$TAG", "onParallelDrivingResp-code:${it.code}") ThreadUtils.runOnUiThread({ - Log.d(TAG, "onParallelDrivingResp-code:${it.code}") when (it.code) { "START_SYNC" -> {// 同步中 state = SYNCHRONIZING @@ -452,9 +451,9 @@ class ParallelDriveView @JvmOverloads constructor( override fun onDetachedFromWindow() { super.onDetachedFromWindow() - CallerAutoPilotStatusListenerManager.removeListener(TAG) - CallerParallelDrivingListenerManager.removeListener(TAG) - CallerParallelDrivingActionsListenerManager.removeListener(TAG) + CallerAutoPilotStatusListenerManager.removeListener("$M_HMI$TAG") + CallerParallelDrivingListenerManager.removeListener("$M_HMI$TAG") + CallerParallelDrivingActionsListenerManager.removeListener("$M_HMI$TAG") } interface ClickEventListener { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.kt index f8f11438f0..1d48809d87 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/SteeringWheelView.kt @@ -96,7 +96,6 @@ class SteeringWheelView : ConstraintLayout, IMoGoChassisSteeringStateListener, object : IMoGoAutopilotStatusListener { override fun onAutopilotStatusResponse(state: Int) { ThreadUtils.runOnUiThread { - d("$M_BUS_P$TAG", "state = %s", state) if (autopilotIV != null) { if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { if (!isBus(FunctionBuildConfig.appIdentityMode)) { 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 c74b35b6a2..3372261d27 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 @@ -136,10 +136,7 @@ class SystemVersionView @JvmOverloads constructor( } ivHDCache.setOnClickListener { - hmiAction( - "$M_HMI$TAG", - "HD map view click , isHDCached:$isHDCached , lon:${getChassisLocationWGS84().longitude} , lat:${getChassisLocationWGS84().latitude}" - ) + hmiAction("$M_HMI$TAG", mapOf("isHDCached" to isHDCached)) if (isHDCached) {// 已缓存 ToastUtils.showShort(resources.getString(R.string.offline_had_downloaded)) } else {// 未缓存 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java index 5245de3bd6..16d9dd686b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java @@ -18,13 +18,11 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisBrakeStateListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisGearStateListener; -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisSteeringStateListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisThrottleStateListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisBrakeStateListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisGearStateListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerChassisSteeringStateListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisThrottleStateListenerManager; import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.utilcode.util.ThreadUtils; @@ -33,8 +31,6 @@ import org.jetbrains.annotations.NotNull; import chassis.Chassis; import mogo.telematics.pad.MessagePad; -import chassis.ChassisStatesOuterClass; -import planning.RoboSweeperTaskIndexOuterClass; /** * @author Jing @@ -42,7 +38,6 @@ import planning.RoboSweeperTaskIndexOuterClass; * @since: 6/24/22 */ public class TrafficDataView extends ConstraintLayout implements - IMoGoChassisSteeringStateListener, IMoGoChassisGearStateListener , IMoGoChassisBrakeStateListener, IMoGoChassisThrottleStateListener, @@ -54,9 +49,6 @@ public class TrafficDataView extends ConstraintLayout implements private ImageView speedImage; private ImageView brakeStatus; - //圆弧颜色 - private int mArcColor; - private static final int MSG_SEND_UPDATE = 1; private volatile double acceleration; private volatile float mBrake; @@ -114,7 +106,6 @@ public class TrafficDataView extends ConstraintLayout implements protected void onAttachedToWindow() { super.onAttachedToWindow(); handler.sendEmptyMessageDelayed(MSG_SEND_UPDATE, 1000L); - CallerChassisSteeringStateListenerManager.INSTANCE.addListener(TAG, this); CallerChassisGearStateListenerManager.INSTANCE.addListener(TAG, this); CallerChassisBrakeStateListenerManager.INSTANCE.addListener(TAG, this); CallerChassisThrottleStateListenerManager.INSTANCE.addListener(TAG, this); @@ -133,7 +124,6 @@ public class TrafficDataView extends ConstraintLayout implements @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - CallerChassisSteeringStateListenerManager.INSTANCE.removeListener(TAG); CallerChassisGearStateListenerManager.INSTANCE.removeListener(TAG); CallerChassisBrakeStateListenerManager.INSTANCE.removeListener(TAG); CallerChassisThrottleStateListenerManager.INSTANCE.removeListener(TAG); @@ -145,20 +135,8 @@ public class TrafficDataView extends ConstraintLayout implements acceleration = planningActionMsg.getDestinationAcc(); } - /** - * 方向盘转向角 左+右- - * @param steering - */ - @Override - public void onAutopilotSteeringData(float steering) { - if (Math.abs(steering) < 1) { - steering = 0; - } - } - /** * 档位 - * @param gear */ @Override public void onAutopilotGearData(@NotNull Chassis.GearPosition gear) { @@ -178,23 +156,6 @@ public class TrafficDataView extends ConstraintLayout implements public void onAutopilotThrottle(float throttle) { mThrottle = throttle; } - /** - * 设置弧形颜色 - * - * @param value 颜色值 - */ - public void setArcColor(int value) { - mArcColor = value; - } - - /** - * 设置数据 - * - * @param value 当前绘制的值 - */ - public void setValues(int value) { - - } /** * value呈现 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt index f5ca6be125..69a48cf285 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.kt @@ -41,7 +41,6 @@ import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView import com.mogo.eagle.core.function.main.modules.MogoModulesManager import com.mogo.eagle.core.function.main.windowview.FloatingViewHandler import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant @@ -59,10 +58,6 @@ import java.io.File /** - * @author congtaowang - * @since 2019-12-23 - * - * * 描述:加载各个模块 */ open class MainActivity : MvpActivity(), MainView, @@ -76,7 +71,8 @@ open class MainActivity : MvpActivity(), MainView, private var isFirst = false private var mConnAdapter: ConnInfoAdapter? = null private val dataList: List = ArrayList() - private var mLastStatus = 0x00 +// private var mLastStatus = 0x00 + private var mLastStatus = 0x01 private var isFloatingLayerHidden = false override fun getLayoutId(): Int { @@ -327,11 +323,11 @@ open class MainActivity : MvpActivity(), MainView, MogoStatusManager.getInstance().setMainPageIsBackgroundStatus(TAG, true) } - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { + override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { + super.onAutopilotIpcConnectStatusChanged(status, reason) UiThreadHandler.post { - val status = autoPilotStatusInfo.ipcConnStatus - if (mLastStatus != status) { - val statusInfo = autoPilotStatusInfo.clone() + if(mLastStatus != status){ + val statusInfo = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().clone() rvConnectInfo.post { updateConnectInfoView(statusInfo) } mLastStatus = status } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml index a306e10e77..5c813a0e19 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_debug_setting.xml @@ -2372,7 +2372,7 @@ android:padding="@dimen/dp_20" android:background="@drawable/radio_button_normal_background_right" android:textColor="#000" - android:textOff="开启QUIC协议(服务器暂不支持)" + android:textOff="开启QUIC协议(目前QA环境可用)" android:textOn="关闭QUIC协议" android:textSize="@dimen/dp_24" /> 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 cad768784f..92488dd246 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 @@ -586,7 +586,7 @@ android:textColor="@color/black" android:textSize="32dp" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/scLineRoutingVerify" /> + app:layout_constraintTop_toBottomOf="@id/scShowBagRecordWindow" /> Unit) ) { request> { - val map = mutableMapOf() - start { - map["sn"] = MoGoAiCloudClientConfig.getInstance().sn - map["status"] = dataReceive - map["startMetre"] = START_METRE - map["endMetre"] = END_METRE - map["type"] = 1 - if (lon != 0.0) { - map["lon"] = lon - } - if (lat != 0.0) { - map["lat"] = lat - } - } loader { apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["status"] = dataReceive + map["startMetre"] = START_METRE + map["endMetre"] = END_METRE + map["type"] = 1 + if (lon != 0.0) { + map["lon"] = lon + } + if (lat != 0.0) { + map["lat"] = lat + } getNetWorkApi().identifyRange(map) } } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/CarOverlay.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/CarOverlay.java deleted file mode 100644 index 277d473123..0000000000 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/CarOverlay.java +++ /dev/null @@ -1,284 +0,0 @@ -package com.mogo.eagle.core.function.smp; - -import android.content.Context; -import android.graphics.BitmapFactory; - -import com.amap.api.maps.AMap; -import com.amap.api.maps.CameraUpdateFactory; -import com.amap.api.maps.TextureMapView; -import com.amap.api.maps.model.BitmapDescriptor; -import com.amap.api.maps.model.BitmapDescriptorFactory; -import com.amap.api.maps.model.CameraPosition; -import com.amap.api.maps.model.LatLng; -import com.amap.api.maps.model.Marker; -import com.amap.api.maps.model.MarkerOptions; -import com.amap.api.maps.model.Polyline; -import com.autonavi.amap.mapcore.IPoint; -import com.mogo.eagle.core.function.map.R; - -import java.util.concurrent.ScheduledExecutorService; - -/** - * 包名: com.amap.api.navi.core - *

- * 创建时间:2018/3/1 - * 项目名称:AndroidNavigationSDK - * - * @author guibao.ggb - * @email guibao.ggb@alibaba-inc.com - *

- * 类说明:自车位置管理Overlay类 - */ -public class CarOverlay { - - protected static final int CAR_MOVE_ANIMATION_PERIOD = 50; - protected int carMoveAnimationFrameNum = 2; - protected boolean mIsLock = true; - protected IPoint mapAnchorBackup = null; - protected double dXOffStep; - protected double dYOffStep; - protected float dAngleOffStep; - protected int currentFrameIndex; - protected float angleStart = 0; - protected boolean isMoveStarted = false; - protected float newAngle = 0; - protected BitmapDescriptor carDescriptor = null; - protected BitmapDescriptor fourCornersDescriptor = null; - protected Marker carMarker; - protected Marker directionMarker; - protected AMap mAmap = null; - protected TextureMapView mapView; - protected boolean isDirectionVisible = true; - protected LatLng endLatLng = null; - protected Polyline leaderLine = null; - protected final int DISTANCE_OFFSET = 150;// 默认 500 偏差 - - // API 默认 1800 UI 默认 360 - protected int angleModValue = 1800; - - - private ScheduledExecutorService executorService; - - public CarOverlay(Context context, TextureMapView mapView) { - this.mapView = mapView; - -// fourCornersDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory -// .decodeResource(context.getResources(), -// R.drawable.module_small_map_navi_direction)); - - carDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory - .decodeResource(context.getResources(), - R.drawable.module_small_map_view_my_location_logo)); - angleModValue = 1800; - - } - - /** - * 设置自车状态 - * - * @param lock true 锁车 false 非锁车 - */ - public void setLock(boolean lock) { - mIsLock = lock; - if (carMarker == null) { - return; - } - if (mAmap == null) { - return; - } - if (directionMarker == null) { - return; - } - carMarker.setFlat(true); - directionMarker.setGeoPoint(carMarker.getGeoPoint()); - carMarker.setGeoPoint(carMarker.getGeoPoint()); - carMarker.setRotateAngle(carMarker.getRotateAngle()); - if (mIsLock) { - CameraPosition cameraPosition = new CameraPosition.Builder().target(carMarker.getPosition()).bearing(newAngle).tilt(0).zoom(16).build(); - mAmap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); - } - } - - public void reset() { - if (carMarker != null) { - carMarker.remove(); - } - if (directionMarker != null) { - directionMarker.remove(); - } - if (leaderLine != null) { - leaderLine.remove(); - } - leaderLine = null; - carMarker = null; - directionMarker = null; - - if (executorService != null) { - if (!executorService.isShutdown()) { - executorService.shutdown(); - } - isMoveStarted = false; - - executorService = null; - } - } - - /** - * 绘制自车 - * - * @param aMap - * @param mLatLng - * @param bearing - */ - public void draw(AMap aMap, LatLng mLatLng, float bearing) { - if (aMap == null || mLatLng == null || carDescriptor == null) { - return; - } - mAmap = aMap; - try { - if (carMarker == null) { - carMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).setFlat(true).icon(carDescriptor).position(mLatLng)); - } - - if (directionMarker == null) { - directionMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).setFlat(true).icon(fourCornersDescriptor).position(mLatLng)); - directionMarker.setVisible(isDirectionVisible); - } - carMarker.setVisible(true); - newAngle = bearing; - IPoint resultGeoPnt = IPoint.obtain(); -// resultGeoPnt = NaviUtil.lonlat2Geo(mLatLng.latitude, mLatLng.longitude, 20); - updateCarPosition(resultGeoPnt); - resultGeoPnt.recycle(); - - } catch (Throwable e) { - e.printStackTrace(); - } - } - - - private void updateCarPosition(IPoint p) { - carMarker.setGeoPoint(p); - carMarker.setFlat(true); - carMarker.setRotateAngle(360 - newAngle); - if (directionMarker != null) { - directionMarker.setGeoPoint(p); - } - - if (mIsLock) { - CameraPosition cameraPosition = new CameraPosition.Builder().target(carMarker.getPosition()).bearing(newAngle).tilt(0).zoom(16).build(); - mAmap.moveCamera(CameraUpdateFactory.changeBearingGeoCenter(newAngle, p)); - } - } - - - public void setEndPoi(LatLng latlng) { - endLatLng = latlng; - } - - /** - * 释放自车资源 - */ - public void destroy() { - if (carMarker != null) { - carMarker.remove(); - carMarker = null; - } - if (directionMarker != null) { - directionMarker.remove(); - directionMarker = null; - } - carDescriptor = null; - - if (executorService != null && !executorService.isShutdown()) { - executorService.shutdown(); - isMoveStarted = false; - - executorService = null; - } - } - - private void calculateCarSmoothMoveOffset(IPoint newCenter, float newAngle) { - if (carMarker == null) { - return; - } - IPoint currentAnchorGeoPoint = carMarker.getGeoPoint(); - if (currentAnchorGeoPoint == null || currentAnchorGeoPoint.x == 0 || currentAnchorGeoPoint.y == 0) { - currentAnchorGeoPoint = newCenter; - } - currentFrameIndex = 0; - mapAnchorBackup = currentAnchorGeoPoint; - dXOffStep = (newCenter.x - currentAnchorGeoPoint.x) / carMoveAnimationFrameNum; - dYOffStep = (newCenter.y - currentAnchorGeoPoint.y) / carMoveAnimationFrameNum; - // 获取当前的旋转角度 - angleStart = carMarker.getRotateAngle(); - boolean isFirst = false; - - if (Float.compare(angleStart, newAngle) == 0) { - isFirst = true; - } else { - angleStart = 360 - angleStart; - } - // 校正旋转角度问题 - float dAngleDelta = newAngle - angleStart; - if (isFirst) { - dAngleDelta = 0; - } - if (dAngleDelta > 180) { - dAngleDelta = dAngleDelta - 360; - } - else if (dAngleDelta < -180) { - dAngleDelta = dAngleDelta + 360; - } - dAngleOffStep = dAngleDelta / carMoveAnimationFrameNum; - isMoveStarted = true; - } - -// protected void startSmoothMoveTimer() { -// if (executorService == null) { -// executorService = new ScheduledThreadPoolExecutor(1, new BasicThreadFactory.Builder().namingPattern("caroverlay-schedule-pool-%d").daemon(true).build()); -// -// executorService.scheduleAtFixedRate(new Runnable() { -// long currentSeconds; -// @Override -// public void run() { -// try{ -// currentSeconds = System.currentTimeMillis(); -// mapSmoothMoveTimerTick(); -// } catch(Throwable e){ -// e.printStackTrace(); -// } -// } -// }, 0, CAR_MOVE_ANIMATION_PERIOD, TimeUnit.MILLISECONDS); -// } -// } - - private void mapSmoothMoveTimerTick() { - if (!isMoveStarted) { - return; - } - if (carMarker == null) { - return; - } - if (mAmap == null) { - return; - } - try { - IPoint p = carMarker.getGeoPoint(); - double newX, newY; - if (currentFrameIndex++ < carMoveAnimationFrameNum) { - newX = mapAnchorBackup.x + dXOffStep * currentFrameIndex; - newY = mapAnchorBackup.y + dYOffStep * currentFrameIndex; - newAngle = angleStart + dAngleOffStep * currentFrameIndex; - newAngle %= angleModValue; - if (newX != 0 || newY != 0) { - p = new IPoint((int)newX, (int)newY); - } - updateCarPosition(p); - } - } catch (Throwable e) { - e.printStackTrace(); - } - } - -} diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/BagInfoEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/BagInfoEntity.kt index 143aec776a..d1123ae7dc 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/BagInfoEntity.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/BagInfoEntity.kt @@ -9,7 +9,7 @@ class BagInfoEntity(){ var key: Long = 0// bag key值 var totalSize: Long = 0// 所有子包或合并后的包的总大小 var timestamp: String = ""// 时间戳 - var bagPath: String ?= null// bag所在路径 + var bagPath: String = ""// bag所在路径 var mergeStat: Boolean = false// 合并状态 var uploadStat: Boolean = false// 上传cos桶状态 var description: BagDescriptionEntity?= null// 包描述信息 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt index dc4146fbbc..3fabcc1373 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt @@ -1,3 +1,9 @@ package com.mogo.eagle.core.data.deva.badcase -data class RecordCaseEntity(var caseId: Int,var caseName: String,var topicList: ArrayList) \ No newline at end of file +import com.google.protobuf.ProtocolStringList + +data class RecordCaseEntity( + var caseId: Int, + var caseName: String, + var topicList: ProtocolStringList +) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainCommon.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainCommon.kt new file mode 100644 index 0000000000..18d7a3d8d0 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainCommon.kt @@ -0,0 +1,6 @@ +package com.mogo.eagle.core.data.deva.chain + +import com.mogo.eagle.core.data.app.AppConfigInfo + +data class ChainCommon(val lat:Double, val lon:Double, val lineId:Long, val eagleVersionCode:Int = AppConfigInfo.appVersionCode) { +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index 56555c05f0..d227008626 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -22,14 +22,13 @@ class ChainConstant { const val CHAIN_SOURCE_OCH = 13 //业务类型与下方文件名一一对应 - const val CHAIN_TYPE_STATUS = 0 // 各个业务初始化信息,配置信息.链接状态,点击信息 + const val CHAIN_TYPE_STATUS = 0 // 记录所有业务信息(正常调用,异常数据) const val CHAIN_TYPE_GNSS = 1 // 工控定位数据 const val CHAIN_TYPE_SOCKET_AUTOPILOT = 2 // 包括自动驾驶状态,reportMsg,planning数据,全局路径数据,FM const val CHAIN_TYPE_SOCKET_DATA_TRACKED = 3 // 感知数据,现阶段记录云端漫游 const val CHAIN_TYPE_SOCKET_TRAJECTORY = 4 // 前车引导线,用于调试 const val CHAIN_TYPE_SOCKET_VEHICLE = 5 // 底盘数据 const val CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT = 6 // 多元红绿灯聚合数据 - const val CHAIN_TYPE_V2X = 100 // V2X(V2I、V2N) const val CHAIN_TYPE_ANR_LEAK = 300 const val CHAIN_TYPE_WEAK_NETWORK = 400 const val CHAIN_TYPE_OCH = 500 @@ -42,7 +41,6 @@ class ChainConstant { const val CHAIN_LINK_LOG_ADAS_TRAJECTORY = "-adasTrajectory" const val CHAIN_LINK_LOG_ADAS_VEHICLE = "-adasVehicle" const val CHAIN_LINK_LOG_ADAS_TRAFFIC_LIGHT = "-UnionTrafficLight" - const val CHAIN_LINK_LOG_V2X = "-eagleCloudWSV2X" const val CHAIN_LINK_LOG_RECORD_ANR = "-eagleRecordANR" const val CHAIN_LINK_LOG_RECORD_WEAK_NETWORK = "-eagleRecordWeakNetwork" const val CHAIN_LINK_LOG_OCH = "-eagleOch" @@ -102,8 +100,8 @@ class ChainConstant { const val CHAIN_CODE_HTTP_DNS_CITY_CODE = "CHAIN_CODE_HTTP_DNS_CITY_CODE" const val CHAIN_CODE_HTTP_DNS_ERROR_REASON = "CHAIN_CODE_HTTP_DNS_ERROR_REASON" + const val CHAIN_CODE_DATA_CENTER = "CHAIN_CODE_DATA_CENTER" const val CHAIN_CODE_V2X_MSG = "CHAIN_CODE_V2X_MSG" - const val CHAIN_CODE_MSG_BOX = "CHAIN_CODE_MSG_BOX" const val CHAIN_CODE_HD_MAP_CALL = "CHAIN_CODE_HD_MAP_CALL" const val CHAIN_CODE_HD_MAP_ROAD_CROSS = "CHAIN_CODE_HD_MAP_ROAD_CROSS" const val CHAIN_CODE_HD_MAP_ICON_SET = "CHAIN_CODE_HD_MAP_ICON_SET" diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerUserInfo.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerUserInfo.java index d38a08955b..ae3377d20c 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerUserInfo.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/entity/MarkerUserInfo.java @@ -40,7 +40,7 @@ public class MarkerUserInfo implements Serializable { int year = cal.get(Calendar.YEAR); //2020-30=1990 - double ageDiffer = year - getAgeNumber(); + double ageDiffer = (double) (year - getAgeNumber()); String ageStr = "" + ageDiffer; char[] ageChars = ageStr.toCharArray(); diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt similarity index 99% rename from core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt rename to core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt index 064484cc27..32297c55cc 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt @@ -1,6 +1,4 @@ -package com.mogo.eagle.core.function.msgbox - -import com.zhjt.mogo.adas.data.bean.MogoReport +package com.mogo.eagle.core.data.msgbox /** * FM信息对照表 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 d70810e024..b022e6a006 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 @@ -1,6 +1,5 @@ package com.mogo.eagle.core.function.api.autopilot -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg import system_master.* @@ -12,14 +11,6 @@ import system_master.* */ interface IMoGoAutopilotStatusListener { - /** - * 自动驾驶状态信息 - * - * @param autoPilotStatusInfo 状态信息 - */ - @Deprecated("3.3.0之后不建议使用此种回调方式,按需回调,主界面暂时使用用于check检查信息透出") - fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {} - /** * 自动驾驶状态信息 * 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 750ae690c2..16f2b6358d 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 @@ -113,6 +113,11 @@ interface IDevaToolsProvider : IProvider { */ fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) + /** + * 魔方开启主动录包 + */ + fun startRecordByMoFang() + /** * 展示录包配置 */ @@ -244,4 +249,6 @@ interface IDevaToolsProvider : IProvider { * 各线程CPU使用率 */ fun usage(): IMoGoCpuUsageProvider? + + fun setNetworkMode(isDebug: Boolean) } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/deva/IMoGoMapScreenListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/deva/IMoGoMapScreenListener.kt new file mode 100644 index 0000000000..8c4d1a83b8 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/deva/IMoGoMapScreenListener.kt @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.api.map.deva + +import android.graphics.Bitmap + +interface IMoGoMapScreenListener { + /** + * 高精地图监听回调 + */ + fun onMapScreen(bitmap: Bitmap){} +} \ No newline at end of file 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 9f614cc914..ecd573a124 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 @@ -4,6 +4,7 @@ import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.function.call.trace.CallerTrace import com.mogo.eagle.core.utilcode.util.GsonUtils import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg @@ -26,6 +27,9 @@ object CallerAutoPilotStatusListenerManager : CallerBase if (oldValue != newValue) { - fixAtStationState(newValue) + CallerTrace.write("AutoPilotStatus", mapOf("AutoPilotStatus" to newValue)) M_LISTENERS.forEach { val listener = it.value listener.onAutopilotStatusResponse(newValue) @@ -42,19 +46,6 @@ object CallerAutoPilotStatusListenerManager : CallerBase if (!oldValue.contentEquals(newValue)) { M_LISTENERS.forEach { @@ -71,7 +62,6 @@ object CallerAutoPilotStatusListenerManager : CallerBase? ) { if (isConnected) { - var isEquals: Boolean = true + var isEquals = true if (unableAutopilotReasons != null && this.unableAutopilotReasons != null) { unableAutopilotReasons.let { onw -> onw.sortWith(compareBy(UnableLaunchReason::hashCode)); 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 f0b8cae7f0..99a624bac0 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 @@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.call.autopilot import bag_manager.BagManagerOuterClass import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.function.call.trace.CallerTrace import mogo.telematics.pad.MessagePad import record_cache.RecordPanelOuterClass @@ -17,6 +18,20 @@ object CallerAutopilotRecordListenerManager : CallerBase() { - /** * 车辆加速度 * acc 加速度 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisBrakeStateListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisBrakeStateListenerManager.kt index 1f5797029f..a197d8dad7 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisBrakeStateListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerChassisBrakeStateListenerManager.kt @@ -8,7 +8,6 @@ import com.mogo.eagle.core.function.call.base.CallerBase */ object CallerChassisBrakeStateListenerManager : CallerBase() { - /** * brake 刹车 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingActionsListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingActionsListenerManager.kt index e81e2d16a3..53881e328a 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingActionsListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingActionsListenerManager.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.call.autopilot import com.mogo.eagle.core.function.api.autopilot.IMoGoParallelDrivingActionsListener import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.function.call.trace.CallerTrace /** @@ -43,6 +44,7 @@ object CallerParallelDrivingActionsListenerManager : } private fun notification() { + CallerTrace.write("ParallelDriving", mapOf("ParallelState" to isParallelDrivingAbility)) M_LISTENERS.forEach { val listener = it.value listener.onParallelDrivingAbility( diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingListenerManager.kt index c7ccd21d99..a83c5db191 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerParallelDrivingListenerManager.kt @@ -2,7 +2,7 @@ package com.mogo.eagle.core.function.call.autopilot import com.mogo.eagle.core.function.api.autopilot.IMoGoParallelDrivingStatusListener import com.mogo.eagle.core.function.call.base.CallerBase -import mogo.telematics.pad.MessagePad +import com.mogo.eagle.core.function.call.trace.CallerTrace import mogo.yycp.paralleldriving.protocol.ParallelTaskProcessNoticeOuterClass /** @@ -12,6 +12,7 @@ object CallerParallelDrivingListenerManager : CallerBase() { + + /** + * 高精地图屏幕截图回调 + */ + fun invokeMapScreen(bitmap: Bitmap){ + M_LISTENERS.forEach{ + val listener = it.value + listener.onMapScreen(bitmap) + } + } + +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt index ab3cbd16cb..1701c70b95 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/msgbox/CallerMsgBoxManager.kt @@ -2,11 +2,10 @@ package com.mogo.eagle.core.function.call.msgbox import android.content.Context import com.mogo.eagle.core.data.constants.MogoServicePaths -import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxProvider import com.mogo.eagle.core.function.call.base.CallerBase -import com.zhjt.service.chain.ChainLog +import com.mogo.eagle.core.function.call.trace.CallerTrace object CallerMsgBoxManager { @@ -25,13 +24,8 @@ object CallerMsgBoxManager { /** * 存储数据到消息盒子 */ - @ChainLog( - linkChainLog = ChainConstant.CHAIN_TYPE_V2X, - linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, - nodeAliasCode = ChainConstant.CHAIN_CODE_MSG_BOX, - paramIndexes = [0] - ) fun saveMsgBox(bean: MsgBoxBean) { + CallerTrace.write(TAG,bean) providerApi?.saveMsg(bean) } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/trace/CallerTrace.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/trace/CallerTrace.kt new file mode 100644 index 0000000000..fe59374ea5 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/trace/CallerTrace.kt @@ -0,0 +1,46 @@ +package com.mogo.eagle.core.function.call.trace + +import com.mogo.eagle.core.data.deva.chain.ChainCommon +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.zhjt.service.chain.ChainLog + +class CallerTrace { + + companion object { + + fun write(data: Any, data1: Any, param: Boolean = true) { + CallerLogger.d(SceneConstant.M_D_C + data.toString(), data1) + if (param) { + val cal = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02() + val lineId = CallerAutoPilotStatusListenerManager.getLineId() + realParamAction(data, data1, ChainCommon(cal.latitude, cal.longitude, lineId)) + } else { + realAction(data, data1) + } + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_INIT, + nodeAliasCode = ChainConstant.CHAIN_CODE_DATA_CENTER, + paramIndexes = [0, 1] + ) + private fun realAction(data: Any, data1: Any) { + + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_INIT, + nodeAliasCode = ChainConstant.CHAIN_CODE_DATA_CENTER, + paramIndexes = [0, 1, 2] + ) + private fun realParamAction(data: Any, data1: Any, chainCommon: ChainCommon) { + + } + } +} \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/values/ids.xml b/core/mogo-core-res/src/main/res/values/ids.xml new file mode 100644 index 0000000000..fc995c989e --- /dev/null +++ b/core/mogo-core-res/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/core/mogo-core-res/src/main/res/values/styles.xml b/core/mogo-core-res/src/main/res/values/styles.xml index d983a865a0..e6496d2029 100644 --- a/core/mogo-core-res/src/main/res/values/styles.xml +++ b/core/mogo-core-res/src/main/res/values/styles.xml @@ -13,4 +13,8 @@ + + + + \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/geometry/Real.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/geometry/Real.java index db5e9ebc77..e20bdf8e9b 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/geometry/Real.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/geometry/Real.java @@ -63,7 +63,7 @@ strictfp class Real extends Number { epsilon *= 0.5; } while (1.0 + epsilon != 1.0); int mantissaBits = (int) Math.round(-Math.log(epsilon) / Math.log(2)); - SPLITTER = (1 << ((mantissaBits + 1) / 2)) + 1; + SPLITTER = (double) (1 << ((mantissaBits + 1) / 2)) + 1; } /** Returns the result of a + b, without loss of precision. */ diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java index 42b6cfaa21..fa51210023 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/mogo/storage/lrucache/DiskCacheManager.java @@ -24,7 +24,7 @@ public class DiskCacheManager { private static DiskLruCache mDiskLruCache = null; private DiskLruCache.Editor mEditor = null; private DiskLruCache.Snapshot mSnapshot = null; - public static final long CACHE_MAXSIZE = 10 * 1024 * 1024; + public static final long CACHE_MAXSIZE = 10L * 1024 * 1024; public DiskCacheManager( Context context, String uniqueName) { try { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/CommonUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/CommonUtils.java index b08328aa46..a95d476c64 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/CommonUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/CommonUtils.java @@ -540,8 +540,12 @@ public class CommonUtils { try { packageName = TextUtils.isEmpty(packageName) ? context.getPackageName() : packageName; PackageManager packageManager = context.getPackageManager(); - PackageInfo packInfo = packageManager.getPackageInfo(packageName, 0); - return packInfo.versionName; + if(packageManager != null){ + PackageInfo packInfo = packageManager.getPackageInfo(packageName, 0); + return packInfo.versionName; + }else { + return ""; + } } catch (Exception e) { return ""; } @@ -558,6 +562,9 @@ public class CommonUtils { try { packageName = TextUtils.isEmpty(packageName) ? context.getPackageName() : packageName; PackageManager packageManager = context.getPackageManager(); + if(packageManager == null){ + return 0; + } PackageInfo packInfo = packageManager.getPackageInfo(packageName, 0); return packInfo.versionCode; } catch (Exception e) { @@ -580,7 +587,7 @@ public class CommonUtils { } BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream())); StringBuffer stringBuffer = new StringBuffer(); - String line = null; + String line; while ((line = in.readLine()) != null) { stringBuffer.append(line + " "); diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/FileUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/FileUtils.java index 3016a6c36a..0f5e4eb7d1 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/FileUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/FileUtils.java @@ -114,7 +114,6 @@ public final class FileUtils { Uri uri = Uri.parse(filePath); ContentResolver cr = Utils.getApp().getContentResolver(); AssetFileDescriptor afd = cr.openAssetFileDescriptor(uri, "r"); - if (afd == null) return false; try { afd.close(); } catch (IOException ignore) { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ImageUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ImageUtils.java index 13a2bcdf12..4690e0442b 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ImageUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ImageUtils.java @@ -1072,17 +1072,17 @@ public final class ImageUtils { Bitmap ret = Bitmap.createBitmap(srcWidth, srcHeight + reflectionHeight, src.getConfig()); Canvas canvas = new Canvas(ret); canvas.drawBitmap(src, 0, 0, null); - canvas.drawBitmap(reflectionBitmap, 0, srcHeight + REFLECTION_GAP, null); + canvas.drawBitmap(reflectionBitmap, 0, (float) (srcHeight + REFLECTION_GAP), null); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); LinearGradient shader = new LinearGradient( 0, srcHeight, - 0, ret.getHeight() + REFLECTION_GAP, + 0, (float) (ret.getHeight() + REFLECTION_GAP), 0x70FFFFFF, 0x00FFFFFF, Shader.TileMode.MIRROR); paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); - canvas.drawRect(0, srcHeight + REFLECTION_GAP, srcWidth, ret.getHeight(), paint); + canvas.drawRect(0, (float) (srcHeight + REFLECTION_GAP), srcWidth, ret.getHeight(), paint); if (!reflectionBitmap.isRecycled()) reflectionBitmap.recycle(); if (recycle && !src.isRecycled() && ret != src) src.recycle(); return ret; diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/SpanUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/SpanUtils.java index 35ba5f0437..98d53eb5cc 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/SpanUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/SpanUtils.java @@ -1158,7 +1158,7 @@ public final class SpanUtils { p.setStyle(Paint.Style.FILL); p.setColor(this.color); - c.drawRect(x, top, x + dir * stripeWidth, bottom, p); + c.drawRect(x, top, (float) (x + dir * stripeWidth), bottom, p); p.setStyle(style); p.setColor(color); @@ -1388,9 +1388,9 @@ public final class SpanUtils { } else if (mVerticalAlignment == ALIGN_CENTER) { transY = (bottom + top - rect.height()) / 2.0f; } else if (mVerticalAlignment == ALIGN_BASELINE) { - transY = y - rect.height(); + transY = (float) (y - rect.height()); } else { - transY = bottom - rect.height(); + transY = (float) (bottom - rect.height()); } canvas.translate(x, transY); } else { diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java index 2ad587de61..3edf2d84c8 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java @@ -47,6 +47,14 @@ public final class TimeUtils { return getSafeDateFormat("yyyy-MM-dd HH:mm:ss"); } + public static SimpleDateFormat getMdFormat(){ + return getSafeDateFormat("yyyy-MM-dd"); + } + + public static SimpleDateFormat getMdFormatTwo(){ + return getSafeDateFormat("yyyyMMdd"); + } + public static SimpleDateFormat getHourMinSecondFormat(){ return getSafeDateFormat("HH:mm:ss"); } diff --git a/foudations/mogo-commons/build.gradle b/foudations/mogo-commons/build.gradle index f39dbedbe7..f182270d1b 100644 --- a/foudations/mogo-commons/build.gradle +++ b/foudations/mogo-commons/build.gradle @@ -51,8 +51,6 @@ dependencies { implementation rootProject.ext.dependencies.arouter annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.rxjava - - implementation rootProject.ext.dependencies.amapnavi3dmap implementation rootProject.ext.dependencies.analytics api 'org.greenrobot:eventbus:3.1.1' 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 6ec57ac8d5..8e8b994df7 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 @@ -4,10 +4,10 @@ import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.config.FunctionBuildConfig; public class HostConst { - public static final String HOST_DEV = "http://eagle-qa.zhidaozhixing.com"; + public static final String HOST_DEV = "https://eagle-qa.zhidaozhixing.com"; public static final String HOST_RELEASE = "http://eagle-mis.zhidaozhixing.com"; - public static final String HOST_EAGLE_QA = "http://eagle-dns-qa.zhidaozhixing.com/"; + public static final String HOST_EAGLE_QA = "https://eagle-dns-qa.zhidaozhixing.com/"; public static final String HOST_EAGLE_RELEASE = "http://eagle-dns.zhidaozhixing.com/"; public static String getHost() { diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/module/ServiceConst.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/module/ServiceConst.java deleted file mode 100644 index 9a3ce9b413..0000000000 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/module/ServiceConst.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.mogo.commons.module; - -/** - * @author congtaowang - * @since 2020-01-03 - *

- * 描述 - */ -public class ServiceConst { - - /** - * 类型 - */ - public static final String TYPE = "STRATEGY_REFRESH"; - - - /** - * 卡片 用户数据 - */ - public static final String CARD_TYPE_USER_DATA = "CARD_TYPE_USER_DATA"; - - /** - * 卡片 探路数据 - */ - public static final String CARD_TYPE_ROAD_CONDITION = "CARD_TYPE_ROAD_CONDITION"; - - /** - * 卡片 新鲜事 - */ - public static final String CARD_TYPE_NOVELTY = "CARD_TYPE_NOVELTY"; - -} diff --git a/gradle.properties b/gradle.properties index fa2ca24e8e..a996b0b75f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -61,27 +61,27 @@ bytex.ASM_API=ASM7 ################ 外部依赖引用 ################ # loglib -LOGLIB_VERSION=1.10.6 +LOGLIB_VERSION=1.10.7 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION -MOGO_NETWORK_VERSION=1.4.7.19 +MOGO_NETWORK_VERSION=1.4.7.20 # 鉴权 -MOGO_PASSPORT_VERSION=1.4.7.19 +MOGO_PASSPORT_VERSION=1.4.7.20 # 长链接 -MOGO_SOCKET_VERSION=1.4.7.19 +MOGO_SOCKET_VERSION=1.4.7.20 # 数据采集 -MOGO_REALTIME_VERSION=1.4.7.19 +MOGO_REALTIME_VERSION=1.4.7.20 # 直播推流 -MOGO_LIVE_VERSION=1.4.7.19 +MOGO_LIVE_VERSION=1.4.7.20 # 直播拉流 -MOGO_TRAFFICLIVE_VERSION=1.4.7.19 +MOGO_TRAFFICLIVE_VERSION=1.4.7.20 # 定位服务 -MOGO_LOCATION_VERSION=1.4.7.19 +MOGO_LOCATION_VERSION=1.4.7.20 # 远程通讯模块 -MOGO_TELEMATIC_VERSION=1.4.7.19 +MOGO_TELEMATIC_VERSION=1.4.7.20 ######## MogoAiCloudSDK Version ######## # 自研地图 -MAP_SDK_VERSION=3.3.0.10 +MAP_SDK_VERSION=3.3.2.2 MAP_SDK_DATA_VERSION=1.0.0.7 MAP_SDK_OPERATION_VERSION=1.1.4.1 # websocket @@ -90,8 +90,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=6002002 -versionName=6.2.2 +versionCode=6002004 +versionName=6.2.4 ################# 新架构模块Maven版本管理 ################# MOGO_CORE_FUNCTION_HMI_VERSION=0.0.58.10 @@ -150,28 +150,28 @@ MATRIX_VERSION=2.0.8 # 测试模式司机端版本号 NOOP_DRIVER_VERSION=3.2.0 # 公交模式司机端版本号 -BUS_DRIVER_VERSION=6.2.0 +BUS_DRIVER_VERSION=6.2.4 # 公交模式乘客端端版本号 -BUS_PASSENGER_VERSION=5.2.0 +BUS_PASSENGER_VERSION=5.2.4 # 接驳模式司机端版本号 -SHUTTLE_DRIVER_VERSION=6.2.0 +SHUTTLE_DRIVER_VERSION=6.2.4 # 接驳模式乘客端端版本号 -SHUTTLE_PASSENGER_VERSION=5.2.0 +SHUTTLE_PASSENGER_VERSION=5.2.4 # 出租车模式司机端版本号 -TAXI_DRIVER_VERSION=6.2.0 +TAXI_DRIVER_VERSION=6.2.4 # 出租车模式乘客端端版本号 -TAXI_PASSENGER_VERSION=5.2.0 +TAXI_PASSENGER_VERSION=5.2.4 # 出租车模式司机端版本号 -TAXIUNMANNED_DRIVER_VERSION=6.2.2 +TAXIUNMANNED_DRIVER_VERSION=6.2.4 # 出租车模式乘客端端版本号 -TAXIUNMANNED_PASSENGER_VERSION=5.2.0 +TAXIUNMANNED_PASSENGER_VERSION=5.2.4 # 包车模式司机端版本号 -CHARTER_DRIVER_VERSION=6.2.0 +CHARTER_DRIVER_VERSION=6.2.4 # 包车模式乘客端端版本号 -CHARTER_PASSENGER_VERSION=5.2.0 +CHARTER_PASSENGER_VERSION=5.2.4 # 支持云控清扫车模式司机端版本号 -SWEEPERCLOUD_DRIVER_VERSION=6.2.0 +SWEEPERCLOUD_DRIVER_VERSION=6.2.4 # 清扫车模式司机端版本号 -SWEEPEROPERATE_DRIVER_VERSION=6.2.0 +SWEEPEROPERATE_DRIVER_VERSION=6.2.4 diff --git a/gradle/bytex/bytex_lancetx.gradle b/gradle/bytex/bytex_lancetx.gradle index d4cbbd960e..6120e724c7 100644 --- a/gradle/bytex/bytex_lancetx.gradle +++ b/gradle/bytex/bytex_lancetx.gradle @@ -30,6 +30,9 @@ LancetX { main_block_check { enable rootProject.isJunkDetectEnable() } + view_pressed_state { + enable false + } } } diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/byteh/PayloadEncoder.java b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/byteh/PayloadEncoder.java index 6f3f27d43e..dcb5928cc9 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/byteh/PayloadEncoder.java +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/byteh/PayloadEncoder.java @@ -39,8 +39,10 @@ public class PayloadEncoder { switch (typeName) { case "com.autonavi.nge.map.LonLat": LonLat lonLat = (LonLat) value; - buffer.writeDouble(lonLat.getLon()); - buffer.writeDouble(lonLat.getLat()); + if(lonLat != null){ + buffer.writeDouble(lonLat.getLon()); + buffer.writeDouble(lonLat.getLat()); + } break; case "java.lang.Boolean": case "kotlin.Boolean": diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt index bf85e7c9dc..1e828eadd5 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/map/MapController.kt @@ -709,7 +709,7 @@ class MapController(private var context: Context?, private val mMapView: IMapVie if(!isSurfaceCreated()) { return } - setMarkerScale() +// setMarkerScale() val currentZoom = zoomIndex if (DEBUG) { Log.d(TAG, "styleop--dispatchZoomChanged: currentZoom:${currentZoom},lastZoom:${lastZoom} ${mMapView.isTouching()}") diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/utils/MainInfo.java b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/utils/MainInfo.java index c3817df850..11c6df6f8d 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/utils/MainInfo.java +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/inner/utils/MainInfo.java @@ -2,6 +2,7 @@ package com.zhidaoauto.map.sdk.inner.utils; import java.io.File; import java.io.FileWriter; +import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; @@ -33,12 +34,11 @@ public class MainInfo { if (null == dir) { return; } - try { - FileWriter fw = new FileWriter((dir + "log.txt"), true); + try(FileWriter fw = new FileWriter((dir + "log.txt"), true)){ String date = dateFormat.format(new Date()); fw.write(date + " " + log + "\r\n"); - fw.close(); - } catch (Exception ex) { + } catch (IOException e) { + e.printStackTrace(); } } @@ -50,11 +50,11 @@ public class MainInfo { if (null == dir) { return; } - try { - FileWriter fw = new FileWriter((dir + "log.txt"), true); + + try(FileWriter fw = new FileWriter((dir + "log.txt"), true)){ e.printStackTrace(new PrintWriter(fw)); - fw.close(); - } catch (Exception ex) { + } catch (IOException ex) { + ex.printStackTrace(); } } diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/location/MyLocationStyle.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/location/MyLocationStyle.kt index c0acb1a24b..368431d0a2 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/location/MyLocationStyle.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/location/MyLocationStyle.kt @@ -220,6 +220,7 @@ class MyLocationStyle( .setGps(true) .position(LonLatPoint(lon, lat)) .marker3DIcon(resId, mMapController) + .scale(0.9f) .displayAnimEnable(isDisplayAnim) .zIndex(zIndex) .title("self") diff --git a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/marker/MarkerOptions.kt b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/marker/MarkerOptions.kt index 61cba0d860..dd4fa0fc03 100644 --- a/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/marker/MarkerOptions.kt +++ b/libraries/mapmodule/src/main/java/com/zhidaoauto/map/sdk/open/marker/MarkerOptions.kt @@ -63,7 +63,7 @@ class MarkerOptions { @JSONField(name = "alpha") private var alpha: Float = 1.0F - var scale: Float = 0.7F + var scale: Float = 1F private var offsetX: Int = 0 private var offsetY: Int = 0 var period: Int = 0 @@ -138,7 +138,7 @@ class MarkerOptions { id="" offsetX = 0 offsetY = 0 - scale = 0.7f + scale = 1f anchorColor = "" rotateAngle = 0f visible = true @@ -584,7 +584,7 @@ class MarkerOptions { } fun scale(scale: Float): MarkerOptions { - this.scale = 0.7f*scale + this.scale = scale return this } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt index f924bf6193..2e08c74471 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt @@ -330,4 +330,9 @@ interface IMogoMapUIController { * 设置地图默认视角 */ fun setVrAngleDefaultMode(mode: VisualAngleMode) + + /** + * 获取高精地图截图 + */ + fun getMapScreenShot() } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt index 16342b6969..b44e5bd196 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt @@ -1,5 +1,6 @@ package com.mogo.map +import android.graphics.Bitmap import android.graphics.Point import android.graphics.Rect import android.os.Bundle @@ -8,6 +9,7 @@ import android.os.HandlerThread import android.text.TextUtils import android.view.MotionEvent import android.view.View +import com.autonavi.nge.map.OnMapScreenShotListener import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.enums.TrafficTypeEnum import com.mogo.eagle.core.data.map.MogoLatLng @@ -19,6 +21,7 @@ import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.invoke import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.invokeRoadChange import com.mogo.eagle.core.function.call.map.CallerMapRomaListener.invokeMapRomaRange import com.mogo.eagle.core.function.call.map.CallerMapRomaListener.invokeMapRomaStatus +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i @@ -61,7 +64,7 @@ import kotlin.properties.Delegates class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIController, OnMapLoadedListener, OnMapClickListener, OnMapTouchListener, OnMarkClickListener, OnMapStyleListener, OnMapViewVisualAngleChangeListener, OnRoadInfoListener, - ILog, OnRoamStatusListener, OnRoadSideFenceRegionListener { + ILog, OnRoamStatusListener, OnRoadSideFenceRegionListener,OnMapScreenShotListener { companion object { private const val TAG = "AMapViewWrapper" @@ -124,6 +127,7 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle mMapView.setOnMapViewVisualAngleChangeListener(this) mMapView.setOnRoadInfoListener(this, 1) mMapView.setOnRoadSideFenceRegionListener(this,5000) + mMapView.registerScreenListener(this) registerLogListener(this, mMapView.getEventController()) d(M_MAP + TAG, "initListeners - setOnMapStyleListener - view $mMapView") } @@ -888,6 +892,12 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle } } + override fun getMapScreenShot() { + if(checkAMapView()){ + mMapView.getMapAutoViewHelper()?.toScreen() + } + } + override fun getVrAngleDefaultMode(): VisualAngleMode { if (checkAMapView()) { val code = mMapView.getMapStyleParams()?.getVrAngleDefaultMode() @@ -895,4 +905,12 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle } return MODE_MEDIUM_SIGHT } + /** + * 高精地图屏幕截图 + */ + override fun onMapScreenShot(bitmap: Bitmap?) { + bitmap?.let { + CallerMapScreenListenerManager.invokeMapScreen(it) + } + } } \ No newline at end of file