diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java index 0969ca9ad4..3690ed62c9 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/MogoOCHBusPassenger.java @@ -46,6 +46,11 @@ public class MogoOCHBusPassenger implements IMogoOCH { this.mActivity = activity; this.mContainerId = containerId; showFragment(); + + if (AppIdentityModeUtils.isJL(FunctionBuildConfig.appIdentityMode)) { + MultiDisplayUtils.INSTANCE.startActWithSecond(activity, VideoPlayerActivity.class); + } + return null; } diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java index 28e451dced..7f07057f98 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerAutopilotPlanningCallback.java @@ -1,6 +1,7 @@ package com.mogo.och.bus.passenger.callback; import com.amap.api.maps.model.LatLng; +import com.mogo.eagle.core.data.map.MogoLocation; import java.util.List; @@ -8,7 +9,7 @@ import java.util.List; * Created on 2022/3/31 */ public interface IBusPassengerAutopilotPlanningCallback { - void routeResult(List models,int haveArrivedIndex); + void routeResult(List routeArrivied, List routeArriving, MogoLocation location); void routePlanningToNextStationChanged(long meters, long timeInSecond); void updateTotalDistance(); } diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java deleted file mode 100644 index 3967989855..0000000000 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ /dev/null @@ -1,685 +0,0 @@ -package com.mogo.och.bus.passenger.model; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; -import static com.mogo.och.bus.passenger.constant.BusPassengerConst.QUERY_BUS_P_STATION_DELAY; -import static com.mogo.och.bus.passenger.constant.BusPassengerConst.STATION_STATUS_STOPPED; - -import android.content.Context; -import android.content.Intent; -import android.net.ConnectivityManager; -import android.os.Handler; -import android.os.Message; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.amap.api.maps.model.LatLng; -import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.commons.module.intent.IMogoIntentListener; -import com.mogo.commons.module.intent.IntentManager; -import com.mogo.commons.module.status.IMogoStatusChangedListener; -import com.mogo.commons.module.status.MogoStatusManager; -import com.mogo.commons.module.status.StatusDescriptor; -import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; -import com.mogo.eagle.core.data.autopilot.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; -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; -import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener; -import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener; -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.CallerChassisLocationGCJ02ListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager; -import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager; -import com.mogo.eagle.core.network.utils.GsonUtil; -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.Logger; -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant; -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.util.CoordinateUtils; -import com.mogo.eagle.core.utilcode.util.GsonUtils; -import com.mogo.eagle.core.utilcode.util.NetworkUtils; -import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.och.bus.passenger.R; -import com.mogo.och.bus.passenger.bean.BusPassengerOperationStatusResponse; -import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResponse; -import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResult; -import com.mogo.och.bus.passenger.bean.BusPassengerStation; -import com.mogo.och.bus.passenger.callback.IBusPassegerDriverStatusCallback; -import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback; -import com.mogo.och.bus.passenger.callback.IBusPassengerAutopilotPlanningCallback; -import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback; -import com.mogo.och.bus.passenger.callback.IBusPassengerRouteLineInfoCallback; -import com.mogo.och.bus.passenger.constant.BusPassengerConst; -import com.mogo.och.bus.passenger.network.BusPassengerModelLoopManager; -import com.mogo.och.bus.passenger.network.BusPassengerServiceManager; -import com.mogo.och.common.module.bean.dpmsg.AppConnectMsg; -import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg; -import com.mogo.och.common.module.bean.dpmsg.DPMsgType; -import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager; -import com.mogo.och.common.module.biz.constant.OchCommonConst; -import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; -import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager; -import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; -import com.mogo.och.common.module.utils.PinYinUtil; -import com.mogo.och.common.module.utils.DateTimeUtil; - -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import mogo.telematics.pad.MessagePad; -import mogo_msg.MogoReportMsg; -import system_master.SystemStatusInfo; - -/** - * Created on 2022/3/31 - */ -public class BusPassengerModel { - private static final String TAG = BusPassengerModel.class.getSimpleName(); - - private List mRoutePoints = new ArrayList<>(); - - private static final class SingletonHolder { - private static final BusPassengerModel INSTANCE = new BusPassengerModel(); - } - - public static BusPassengerModel getInstance() { - return SingletonHolder.INSTANCE; - } - - private Context mContext; - private IBusPassengerADASStatusCallback mADASStatusCallback; //Model->Presenter:自动驾驶状态相关 - private IBusPassengerAutopilotPlanningCallback mAutopilotPlanningCallback; //Model->Presenter:自动驾驶线路规划 - private Map mControllerStatusCallbackMap = new ConcurrentHashMap<>(); - - private IBusPassegerDriverStatusCallback mDriverStatusCallback; //出车收车状态 - private IBusPassengerRouteLineInfoCallback mRouteLineInfoCallback; // bus路线信息更新 - - private MogoLocation mLocation = null; - - private BusPassengerRoutesResult routesResult = null; - - List mStations = new ArrayList<>(); - private int mNextStationIndex = 0;// 要到达站的index - private final List mTwoStationsRouts = new ArrayList<>(); - private int mPreRouteIndex = 0; - private int mWipePreIndex = 0; - - private static final int MSG_QUERY_BUS_P_STATION = 1001; - private final Handler handler = new Handler(new Handler.Callback() { - @Override - public boolean handleMessage(Message msg) { - if ( msg.what == MSG_QUERY_BUS_P_STATION ) { - queryDriverOperationStatus(); - return true; - } - return false; - } - }); - - private BusPassengerModel() { - } - - public void init( Context context ) { - mContext = context.getApplicationContext(); - initListeners(); - // TODO: 2022/3/31 - queryDriverOperationStatus(); - startOrStopOrderLoop(true); - } - - public void setDriverStatusCallback(IBusPassegerDriverStatusCallback callback){ - this.mDriverStatusCallback = callback; - } - - public void setRouteLineInfoCallback(IBusPassengerRouteLineInfoCallback callback){ - this.mRouteLineInfoCallback = callback; - } - - private void queryDriverOperationDelay() { - handler.sendEmptyMessageDelayed( MSG_QUERY_BUS_P_STATION, QUERY_BUS_P_STATION_DELAY ); - } - - private void queryDriverOperationStatus() { - BusPassengerServiceManager.queryDriverOperationStatus(mContext - , new OchCommonServiceCallback() { - @Override - public void onSuccess(BusPassengerOperationStatusResponse data) { - if (data == null || data.data == null) return; - if (mDriverStatusCallback != null) { - CallerLogger.INSTANCE.d( M_BUS_P + TAG, "queryDriverOperationStatus = %s", data.data.plateNumber ); - mDriverStatusCallback.changeOperationStatus(data.data.driverStatus == 1); - mDriverStatusCallback.updatePlateNumber(data.data.plateNumber); - } - } - - @Override - public void onError() { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(mContext.getString(R.string.network_error_tip)); - } else { - ToastUtils.showShort(mContext.getString(R.string.request_error_tip)); - } - queryDriverOperationDelay(); - } - - @Override - public void onFail(int code, String msg) { - //延迟3s再次查询 - queryDriverOperationDelay(); - } - }); - } - - public void queryDriverSiteByCoordinate(){ - BusPassengerServiceManager.queryDriverSiteByCoordinate(mContext - , new OchCommonServiceCallback() { - @Override - public void onSuccess(BusPassengerRoutesResponse data) { - if ( data == null || data.getResult() == null) { - CallerLogger.INSTANCE.d( M_BUS_P + TAG, "queryDriverSiteByCoordinate = null"); - if (routesResult != null) { - routesResult = null; - mNextStationIndex = 0; - } - - startOrStopCalculateRouteInfo(false); - - if (mRouteLineInfoCallback != null){ - mRouteLineInfoCallback.showNoTaskView(); - } - - mRoutePoints.clear(); - - return; - } - if (routesResult != null && data.getResult().equals(routesResult)){ - CallerLogger.INSTANCE.d( M_BUS_P + TAG, "queryDriverSiteByCoordinate = not update"); - return; - } - routesResult = data.getResult(); - updatePassengerRouteInfo(data.getResult()); - } - - @Override - public void onFail(int code, String msg) { - CallerLogger.INSTANCE.d( M_BUS_P + TAG, "queryDriverSiteByCoordinate = %s", msg - + ", sn = " +BusPassengerServiceManager.INSTANCE.getDriverAppSn()); - if (code == 1003){ - queryDriverOperationDelay(); - } - if (BusPassengerServiceManager.INSTANCE.getDriverAppSn().isEmpty()){ - //此处拦截是为了防止过程中乘客屏和司机端断连,拿不到司机端sn, 造成请求失败去刷新了界面 - return; - } - if (code == 1003){ - routesResult = null; - startOrStopCalculateRouteInfo(false); - return; - } - } - }); - } - - private void updatePassengerRouteInfo(BusPassengerRoutesResult result) { - if (mRouteLineInfoCallback != null){ - mRouteLineInfoCallback.updateLineInfo(result.getName(),result.getRunningDur()); - mRouteLineInfoCallback.hideNoTaskView(); - if (result.getSites() != null){ - List stations = result.getSites(); - mStations.clear(); - mStations.addAll(stations); - for (int i = 0; i< stations.size(); i++){ - BusPassengerStation station = stations.get(i); - if (station.getDrivingStatus() == STATION_STATUS_STOPPED && station.isLeaving() && i+1 < stations.size()){ //离站 - mRouteLineInfoCallback.updateStationsInfo(stations,i+1,false); - if(mNextStationIndex != i+1){ - mTwoStationsRouts.clear(); - startRemainRouteInfo(); - } - mNextStationIndex = i+1; - - updateAutopilotControlParameters(result,i); - return; - }else if (station.getDrivingStatus() == STATION_STATUS_STOPPED && !station.isLeaving()){ //到站 - if (i == 0){ - startOrStopRouteAndWipe(false); - } - mPreRouteIndex = 0; - startOrStopCalculateRouteInfo(false); - mRouteLineInfoCallback.updateStationsInfo(stations,i,true); - clearAutopilotControlParameters(); - return; - } - } - } - } - - } - - private void updateAutopilotControlParameters(BusPassengerRoutesResult busRoutesResult, - int leaveIndex) { - - AutopilotControlParameters parameters = initAutopilotControlParameters(busRoutesResult,leaveIndex); - if (null == parameters) { - CallerLogger.INSTANCE.e(M_BUS_P + TAG, "AutopilotControlParameters is empty."); - return; - } - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "AutopilotControlParameters is update."); - CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters); - } - - private void clearAutopilotControlParameters() { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "AutopilotControlParameters is clear."); - CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null); - } - - private AutopilotControlParameters initAutopilotControlParameters(BusPassengerRoutesResult busRoutesResult, - int leaveIndex) { - if (busRoutesResult.getSites() == null){ return null ;} - List stations = busRoutesResult.getSites(); - if (leaveIndex + 1 > stations.size() - 1) { - CallerLogger.INSTANCE.e(M_BUS_P + TAG, "行程日志-mismatch condition1."); - return null; - } - BusPassengerStation currentStation = stations.get(leaveIndex); - BusPassengerStation nextStation = stations.get(leaveIndex + 1); - - AutopilotControlParameters parameters = new AutopilotControlParameters(); - parameters.routeID = busRoutesResult.getLineId(); - parameters.routeName = busRoutesResult.getName(); - parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.getName()); - parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.getName()); - parameters.startLatLon = new AutopilotControlParameters - .AutoPilotLonLat(currentStation.getLat(), currentStation.getLon()); - parameters.endLatLon = new AutopilotControlParameters - .AutoPilotLonLat(nextStation.getLat(), nextStation.getLon()); - parameters.vehicleType = 10; - if (parameters.autoPilotLine == null) { - parameters.autoPilotLine = new AutopilotControlParameters.AutoPilotLine( - busRoutesResult.getLineId(), - busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, - busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, - busRoutesResult.contrailSaveTime, busRoutesResult.carModel, - busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, - busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, - busRoutesResult.contrailSaveTimeDPQP); - } - - return parameters; - } - - public void release() { - releaseListeners(); - startOrStopCalculateRouteInfo(false); - startOrStopOrderLoop(false); - } - - public void setMoGoAutopilotPlanningListener(IBusPassengerAutopilotPlanningCallback - moGoAutopilotPlanningCallback) { - this.mAutopilotPlanningCallback = moGoAutopilotPlanningCallback; - } - - public void setADASStatusCallback(IBusPassengerADASStatusCallback callback) { - this.mADASStatusCallback = callback; - } - - public void setControllerStatusCallback(String tag, IBusPassengerControllerStatusCallback callback) { - if (tag == null || "".equals(tag)) return; - - if (callback == null) { - mControllerStatusCallbackMap.remove(tag); - return; - } - - mControllerStatusCallbackMap.put(tag,callback); - - } - - private void initListeners() { - - // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 - CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); - IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); - MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener ); - // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, mMapLocationListener); - - //2021.11.1 自动驾驶路线规划接口 - CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); - - //监听司机端消息 - CallerTelematicListenerManager.INSTANCE.addListener(TAG,mReceivedMsgListener); - - AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); - } - - private void releaseListeners() { - MogoStatusManager.getInstance().unregisterStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); - - // 注销定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); - - MogoAiCloudSocketManager.getInstance(mContext) - .unregisterLifecycleListener(10010); - - CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(mGoAutopilotStatusListener); - CallerPlanningRottingListenerManager.INSTANCE.removeListener(moGoAutopilotPlanningListener); - CallerTelematicListenerManager.INSTANCE.removeListener(TAG); - - AbnormalFactorsLoopManager.INSTANCE.stopLoopAbnormalFactors(); - } - - private final IReceivedMsgListener mReceivedMsgListener = new IReceivedMsgListener() { - @Override - public void onReceivedServerSn(@Nullable String sn) { - Logger.d(SceneConstant.M_BUS_P+TAG,"onReceivedServerSn = "+sn); - if (mDriverStatusCallback != null) { - mDriverStatusCallback.updateDriverSn(sn); - } - } - - @Override - public void onReceivedMsg(int type, @NonNull byte[] byteArray) { - if (OchCommonConst.BUSINESS_STRING == type){ - - BaseDPMsg baseMsg = GsonUtils.fromJson(new String(byteArray), BaseDPMsg.class); - Logger.d(SceneConstant.M_BUS_P+TAG,"onReceivedMsg = "+GsonUtils.toJson(baseMsg)); - - if (baseMsg != null && baseMsg.getType() == DPMsgType.TYPE_COMMON.getType()){ - AppConnectMsg msg = GsonUtils.fromJson(new String(byteArray), AppConnectMsg.class); - if (msg.isViewShow()){ //消息盒子显示内容 - OCHSocketMessageManager.INSTANCE.pushAppOperationalMsgBox( - DateTimeUtil.getCurrentTimeStamp(),msg.getMsg(), - OCHSocketMessageManager.OPERATION_SYSTEM); - } - } - } - } - }; - - //监听网络变化,避免启动机器时无网导致无法更新订单信息 - private final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { - @Override - public void onIntentReceived( String intentStr, Intent intent ) { - CallerLogger.INSTANCE.d( M_BUS_P + TAG, "onIntentReceived = %s", intentStr ); - if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) { - if ( NetworkUtils.isConnected( mContext ) ) { - queryDriverOperationStatus(); - } - } - } - }; - - // VR mode变更回调 - private final IMogoStatusChangedListener mMogoStatusChangedListener = (descriptor, isTrue) -> { - if (StatusDescriptor.VR_MODE == descriptor) { - if (mControllerStatusCallbackMap.size() > 0) { - for (IBusPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ - callback.onVRModeChanged(isTrue); - } - } - } - }; - - private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() { - @Override - public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { - if (null == gnssInfo) return; - mLocation = gnssInfo; - for (IBusPassengerControllerStatusCallback callback :mControllerStatusCallbackMap.values()){ - callback.onCarLocationChanged(gnssInfo); - } - } - }; - - private volatile int mPreAutoStatus = -1; - - private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ - - @Override - public void onAutopilotRouteLineId(long lineId) { - - } - - @Override - public void onAutopilotIpcConnectStatusChanged(int status, @Nullable String reason) { - } - - @Override - public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { - - } - - private boolean arriveAtEnd = false; //乘客app专用字段 - - @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - if (autopilotStatusInfo == null) return; - int state = autopilotStatusInfo.getState(); - if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - if(state != mPreAutoStatus){ - mTwoStationsRouts.clear(); - } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable(); - } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - if(state != mPreAutoStatus){ - mTwoStationsRouts.clear(); - } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable(); - }else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING){ - if(state != mPreAutoStatus){ - mTwoStationsRouts.clear(); - } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); - } - mPreAutoStatus = state; - } - - @Override - public void onAutopilotSNRequest() { - - } - - @Override - public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) { - if (FunctionBuildConfig.isDemoMode - && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { - arriveAtEnd = true; - } - - // TODO: 2022/3/31 - if (DebugConfig.isDebug()) { - // ToastUtils.showShort("到达目的地"); - } - if (mADASStatusCallback != null){ - mADASStatusCallback.onAutopilotArriveEnd(); - } - } - - @Override - public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { - - } - }; - - private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener(){ - - @Override - public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "onAutopilotRotting = " - + GsonUtil.jsonFromObject(routeList)); - List routePoints = routeList.getWayPointsList(); - if (null != routePoints && routePoints.size() > 0){ - updateRoutePoints(routePoints); - startToRouteAndWipe(); - } - } - }; - - public void updateRoutePoints(List routePoints){ - mRoutePoints.clear(); - List latLngModels = CoordinateCalculateRouteUtil - .coordinateConverterWgsToGcjLocations(mContext,routePoints); - mRoutePoints.addAll(latLngModels); - calculateTwoStationsRoute(); - } - - private void calculateTwoStationsRoute(){ - //找出前往站对应的轨迹点,拿出两站点的集合 - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "mRoutePoints.size() = " + mRoutePoints.size()); - if (mRoutePoints.size() > 0) { - if (mStations.size() > 1){ //两个站点及以上要计算两个站点间的轨迹路线 - if (mNextStationIndex <= mStations.size()-1 && mNextStationIndex - 1 >=0){ - mTwoStationsRouts.clear(); - BusPassengerStation stationNext = mStations.get(mNextStationIndex); - BusPassengerStation stationCur = mStations.get(mNextStationIndex - 1); - //当前站在轨迹中对应的点 - int currentRouteIndex = CoordinateCalculateRouteUtil.getArrivedPointIndexNew(0 - ,mRoutePoints - ,stationCur.getGcjLon(),stationCur.getGcjLat()); - //要前往的站在轨迹中对应的点 - int nextRouteIndex = CoordinateCalculateRouteUtil.getArrivedPointIndexNew(currentRouteIndex - ,mRoutePoints - ,stationNext.getGcjLon(),stationNext.getGcjLat()); - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "轨迹排查==currentRouteIndex = " + currentRouteIndex - + ", nextRouteIndex = " + nextRouteIndex); - if (currentRouteIndex < nextRouteIndex){ //如果找到的next在起点的轨迹前面,直接舍弃这个轨迹,不显示 - mTwoStationsRouts.addAll(mRoutePoints.subList(currentRouteIndex,nextRouteIndex + 1)); - } - } - } -// else { //只有两个站点的时候整个路线就是两个站点之间的轨迹 -// mTwoStationsRouts.clear(); -// mTwoStationsRouts.addAll(mRoutePoints); -// } - if (mTwoStationsRouts.size() > 0){ - float sumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(mTwoStationsRouts); - SharedPrefsMgr.getInstance(mContext).putInt(BusPassengerConst.BUS_SP_KEY_ORDER_SUM_DIS,(int) sumLength); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.updateTotalDistance(); - } - } - } - } - - public void dynamicCalculateRouteInfo() { - //计算当前位置和下一站的剩余点集合 - //计算剩余点总里程和时间 - if (mTwoStationsRouts.size() == 0){ - calculateTwoStationsRoute(); - } - if (mTwoStationsRouts.size() > 0 && mLocation != null){ - Map> lastPointsMap = CoordinateCalculateRouteUtil - .getRemainPointListByCompareNew(mPreRouteIndex,mTwoStationsRouts,mLocation); - for (int index: lastPointsMap.keySet()) { - mPreRouteIndex = index; - break; - } - - for (List lastPoints: lastPointsMap.values()){ - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "轨迹排查==lastPoints.size() = " + lastPoints.size()); - float lastSumLength = 0; - if (lastPoints.size() == 1){ //只是最后一个点,计算当前位置和最后一个点的距离 - if (mNextStationIndex <= mStations.size()-1 && mNextStationIndex >= 0){ - BusPassengerStation stationNext = mStations.get(mNextStationIndex); - lastSumLength = CoordinateUtils.calculateLineDistance( - stationNext.getGcjLon(), stationNext.getGcjLat(), - mLocation.getLongitude(), mLocation.getLatitude()); - }else { - lastSumLength = CoordinateUtils.calculateLineDistance( - lastPoints.get(0).getLongitude(), lastPoints.get(0).getLatitude(), - mLocation.getLongitude(), mLocation.getLatitude()); - } - - }else { - lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints); - } - - double lastTime = lastSumLength / getAverageSpeed() * 3.6 ; //秒 - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "轨迹排查==lastSumLength = " + lastSumLength); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.routePlanningToNextStationChanged((long)lastSumLength,(long) lastTime); - } - } - } - } - - public int getAverageSpeed(){ - return BusPassengerConst.BUS_AVERAGE_SPEED; - } - - public void startRemainRouteInfo() { - //开启实时计算剩余距离,剩余时间,预计时间 - startOrStopCalculateRouteInfo(true); - } - - public void startToRouteAndWipe() { - startOrStopRouteAndWipe(true); - } - - /** - * 实时轨迹擦除 - * @param isStart - */ - public void startOrStopRouteAndWipe(boolean isStart){ - if (isStart){ - BusPassengerModelLoopManager.getInstance().startOrStopRouteAndWipe(); - }else { - mWipePreIndex = 0; - BusPassengerModelLoopManager.getInstance().stopOrStopRouteAndWipe(); - } - } - - public void loopRouteAndWipe() { - if (mRoutePoints != null && mRoutePoints.size() > 0 && mLocation != null){ - int haveArrivedIndex = CoordinateCalculateRouteUtil - .getArrivedPointIndexNew(mWipePreIndex, - mRoutePoints, - mLocation); - - mWipePreIndex = haveArrivedIndex; - - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "thread = "+ Thread.currentThread().getName()+" haveArrivedIndex== " + haveArrivedIndex); - if (mAutopilotPlanningCallback != null){ - List routePoints = CoordinateCalculateRouteUtil - .coordinateConverterLocationToLatLng(mContext,mRoutePoints); - mAutopilotPlanningCallback.routeResult(routePoints,haveArrivedIndex); - } - } - } - - /** - * 开始轮询计算剩余里程和时间 - * @param isStart - */ - public void startOrStopCalculateRouteInfo(boolean isStart) { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "startOrStopCalculateRouteInfo() " + isStart); - if (isStart) { - BusPassengerModelLoopManager.getInstance().startCalculateRouteInfoLoop(); - } else { - mTwoStationsRouts.clear(); - BusPassengerModelLoopManager.getInstance().stopCalculateRouteInfLoop(); - } - } - - private void startOrStopOrderLoop(boolean start) { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "startOrStopOrderLoop() " + start); - if (start) { - BusPassengerModelLoopManager.getInstance().startQueryDriverLineLoop(); - } else { - BusPassengerModelLoopManager.getInstance().stopQueryDriverLineLoop(); - } - } - -} diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt new file mode 100644 index 0000000000..f90176c027 --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt @@ -0,0 +1,608 @@ +package com.mogo.och.bus.passenger.model + +import android.annotation.SuppressLint +import android.content.Context +import android.net.ConnectivityManager +import android.os.Handler +import com.amap.api.maps.model.LatLng +import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager +import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.module.intent.IMogoIntentListener +import com.mogo.commons.module.intent.IntentManager +import com.mogo.commons.module.status.IMogoStatusChangedListener +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat +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 +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener +import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.addListener +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager +import com.mogo.eagle.core.network.utils.GsonUtil +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger +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.Logger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.bus.passenger.R +import com.mogo.och.bus.passenger.bean.BusPassengerOperationStatusResponse +import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResponse +import com.mogo.och.bus.passenger.bean.BusPassengerRoutesResult +import com.mogo.och.bus.passenger.bean.BusPassengerStation +import com.mogo.och.bus.passenger.callback.IBusPassegerDriverStatusCallback +import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback +import com.mogo.och.bus.passenger.callback.IBusPassengerAutopilotPlanningCallback +import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback +import com.mogo.och.bus.passenger.callback.IBusPassengerRouteLineInfoCallback +import com.mogo.och.bus.passenger.constant.BusPassengerConst +import com.mogo.och.bus.passenger.network.BusPassengerModelLoopManager +import com.mogo.och.bus.passenger.network.BusPassengerServiceManager +import com.mogo.och.bus.passenger.network.BusPassengerServiceManager.driverAppSn +import com.mogo.och.common.module.bean.dpmsg.AppConnectMsg +import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg +import com.mogo.och.common.module.bean.dpmsg.DPMsgType +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager +import com.mogo.och.common.module.biz.common.socketmessage.OCHSocketMessageManager.pushAppOperationalMsgBox +import com.mogo.och.common.module.biz.constant.OchCommonConst +import com.mogo.och.common.module.biz.network.OchCommonServiceCallback +import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.startLoopAbnormalFactors +import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager.stopLoopAbnormalFactors +import com.mogo.och.common.module.manager.distancemamager.IDistanceListener +import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addDistanceListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.addTrajectoryListener +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.setStationPoint +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager.suspendCalculate +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.calculateRouteSumLength +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjLocations +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil.getArrivedPointIndexNew +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.PinYinUtil +import mogo.telematics.pad.MessagePad +import mogo.telematics.pad.MessagePad.ArrivalNotification +import mogo.telematics.pad.MessagePad.GlobalPathResp +import system_master.SystemStatusInfo +import java.util.concurrent.ConcurrentHashMap + +/** + * Created on 2022/3/31 + */ +@SuppressLint("StaticFieldLeak") +object BusPassengerModel{ + + private val TAG = BusPassengerModel::class.java.simpleName + private const val MSG_QUERY_BUS_P_STATION = 1001 + + private val mRoutePoints: MutableList = ArrayList() + + private var mContext: Context? = null + private var mADASStatusCallback //Model->Presenter:自动驾驶状态相关 + : IBusPassengerADASStatusCallback? = null + private var mAutopilotPlanningCallback //Model->Presenter:自动驾驶线路规划 + : IBusPassengerAutopilotPlanningCallback? = null + private val mControllerStatusCallbackMap: MutableMap = + ConcurrentHashMap() + private var mDriverStatusCallback //出车收车状态 + : IBusPassegerDriverStatusCallback? = null + private var mRouteLineInfoCallback // bus路线信息更新 + : IBusPassengerRouteLineInfoCallback? = null + private var mLocation: MogoLocation? = null + private var routesResult: BusPassengerRoutesResult? = null + var mStations: MutableList = ArrayList() + private var mNextStationIndex = 0 // 要到达站的index + private val mTwoStationsRouts: MutableList = ArrayList() + private val handler = Handler(Handler.Callback { msg -> + if (msg.what == MSG_QUERY_BUS_P_STATION) { + queryDriverOperationStatus() + return@Callback true + } + false + }) + + fun init(context: Context) { + mContext = context.applicationContext + initListeners() + // TODO: 2022/3/31 + queryDriverOperationStatus() + startOrStopOrderLoop(true) + } + + fun setDriverStatusCallback(callback: IBusPassegerDriverStatusCallback?) { + mDriverStatusCallback = callback + } + + fun setRouteLineInfoCallback(callback: IBusPassengerRouteLineInfoCallback?) { + mRouteLineInfoCallback = callback + } + + private fun queryDriverOperationDelay() { + handler.sendEmptyMessageDelayed( + MSG_QUERY_BUS_P_STATION, + BusPassengerConst.QUERY_BUS_P_STATION_DELAY + ) + } + + private fun queryDriverOperationStatus() { + BusPassengerServiceManager.queryDriverOperationStatus( + mContext!!, object : OchCommonServiceCallback { + override fun onSuccess(data: BusPassengerOperationStatusResponse?) { + if (data?.data == null) return + if (mDriverStatusCallback != null) { + d( + M_BUS_P + TAG, + "queryDriverOperationStatus = %s", + data.data.plateNumber + ) + mDriverStatusCallback!!.changeOperationStatus(data.data.driverStatus == 1) + mDriverStatusCallback!!.updatePlateNumber(data.data.plateNumber) + } + } + + override fun onError() { + if (!NetworkUtils.isConnected(mContext)) { + ToastUtils.showShort(mContext!!.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(mContext!!.getString(R.string.request_error_tip)) + } + queryDriverOperationDelay() + } + + override fun onFail(code: Int, msg: String) { + //延迟3s再次查询 + queryDriverOperationDelay() + } + }) + } + + fun queryDriverSiteByCoordinate() { + BusPassengerServiceManager.queryDriverSiteByCoordinate( + mContext!!, object : OchCommonServiceCallback { + override fun onSuccess(data: BusPassengerRoutesResponse) { + if (data.result == null) { + d(M_BUS_P + TAG, "order = queryDriverSiteByCoordinate = null") + if (routesResult != null) { + routesResult = null + mNextStationIndex = 0 + } + cleanStation("queryDriverSiteByCoordinate") + if (mRouteLineInfoCallback != null) { + mRouteLineInfoCallback!!.showNoTaskView() + } + mRoutePoints.clear() + return + } + if (routesResult != null && data.result.equals(routesResult)) { + d(M_BUS_P + TAG, "order = queryDriverSiteByCoordinate = not update") + return + } + routesResult = data.result + updatePassengerRouteInfo(data.result) + } + + override fun onFail(code: Int, msg: String) { + d( + M_BUS_P + TAG, "queryDriverSiteByCoordinate = %s", msg + + ", sn = " + driverAppSn + ) + if (code == 1003) { + queryDriverOperationDelay() + } + if (driverAppSn.isEmpty()) { + //此处拦截是为了防止过程中乘客屏和司机端断连,拿不到司机端sn, 造成请求失败去刷新了界面 + return + } + if (code == 1003) { + routesResult = null + cleanStation("queryDriverSiteByCoordinate 1003") + return + } + } + }) + } + + private fun updatePassengerRouteInfo(result: BusPassengerRoutesResult) { + if (mRouteLineInfoCallback != null) { + Logger.d(M_BUS_P + TAG, "order = BusPassengerRoutesResult= " +GsonUtil.jsonFromObject(result)) + mRouteLineInfoCallback!!.updateLineInfo(result.name, result.runningDur) + mRouteLineInfoCallback!!.hideNoTaskView() + if (result.sites != null) { + val stations = result.sites + mStations.clear() + mStations.addAll(stations) + for (i in stations.indices) { + val station = stations[i] + if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && station.isLeaving && i + 1 < stations.size) { //离站 + Logger.d(M_BUS_P + TAG, "order = station= leave") + mRouteLineInfoCallback!!.updateStationsInfo(stations, i + 1, false) + if (mNextStationIndex != i + 1) { + mTwoStationsRouts.clear() + } + mNextStationIndex = i + 1 + val startStation = mStations[i] + val endStation = mStations[i + 1] + setTrajectoryStation(startStation, endStation, result.lineId) + updateAutopilotControlParameters(result, i) + return + } else if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !station.isLeaving) { //到站 + if (i == stations.size - 1) { + cleanStation("updatePassengerRouteInfo最后一个站点") + } + suspendCalculate() + + Logger.d(M_BUS_P + TAG, "order = station= arrive") + + mRouteLineInfoCallback!!.updateStationsInfo(stations, i, true) + clearAutopilotControlParameters() + return + } + } + } + } + } + + private fun updateAutopilotControlParameters( + busRoutesResult: BusPassengerRoutesResult, + leaveIndex: Int + ) { + val parameters = initAutopilotControlParameters(busRoutesResult, leaveIndex) + if (null == parameters) { + e(M_BUS_P + TAG, "AutopilotControlParameters is empty.") + return + } + d(M_BUS_P + TAG, "AutopilotControlParameters is update.") + updateAutopilotControlParameters(parameters) + } + + private fun clearAutopilotControlParameters() { + d(M_BUS_P + TAG, "AutopilotControlParameters is clear.") + updateAutopilotControlParameters(null) + } + + private fun initAutopilotControlParameters( + busRoutesResult: BusPassengerRoutesResult, + leaveIndex: Int + ): AutopilotControlParameters? { + if (busRoutesResult.sites == null) { + return null + } + val stations = busRoutesResult.sites + if (leaveIndex + 1 > stations.size - 1) { + e(M_BUS_P + TAG, "行程日志-mismatch condition1.") + return null + } + val currentStation = stations[leaveIndex] + val nextStation = stations[leaveIndex + 1] + val parameters = AutopilotControlParameters() + parameters.routeID = busRoutesResult.lineId + parameters.routeName = busRoutesResult.name + parameters.startName = PinYinUtil.getPinYinHeadChar(currentStation.name) + parameters.endName = PinYinUtil.getPinYinHeadChar(nextStation.name) + parameters.startLatLon = AutoPilotLonLat(currentStation.lat, currentStation.lon) + parameters.endLatLon = AutoPilotLonLat(nextStation.lat, nextStation.lon) + parameters.vehicleType = 10 + if (parameters.autoPilotLine == null) { + parameters.autoPilotLine = AutoPilotLine( + busRoutesResult.lineId.toLong(), + busRoutesResult.csvFileUrl, busRoutesResult.csvFileMd5, + busRoutesResult.txtFileUrl, busRoutesResult.txtFileMd5, + busRoutesResult.contrailSaveTime, busRoutesResult.carModel, + busRoutesResult.csvFileUrlDPQP, busRoutesResult.csvFileMd5DPQP, + busRoutesResult.txtFileUrlDPQP, busRoutesResult.txtFileMd5DPQP, + busRoutesResult.contrailSaveTimeDPQP + ) + } + return parameters + } + + fun release() { + releaseListeners() + cleanStation("release") + startOrStopOrderLoop(false) + } + + fun setMoGoAutopilotPlanningListener(moGoAutopilotPlanningCallback: IBusPassengerAutopilotPlanningCallback?) { + mAutopilotPlanningCallback = moGoAutopilotPlanningCallback + } + + fun setADASStatusCallback(callback: IBusPassengerADASStatusCallback?) { + mADASStatusCallback = callback + } + + fun setControllerStatusCallback( + tag: String?, + callback: IBusPassengerControllerStatusCallback? + ) { + if (tag == null || "" == tag) return + if (callback == null) { + mControllerStatusCallbackMap.remove(tag) + return + } + mControllerStatusCallbackMap[tag] = callback + } + + private fun initListeners() { + + // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 + CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) + IntentManager.getInstance() + .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener) + MogoStatusManager.getInstance().registerStatusChangedListener( + TAG, + StatusDescriptor.VR_MODE, + mMogoStatusChangedListener + ) + // 定位监听 + addListener(TAG, 10, mMapLocationListener) + + //2021.11.1 自动驾驶路线规划接口 + CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) + + //监听司机端消息 + CallerTelematicListenerManager.addListener(TAG, mReceivedMsgListener) + startLoopAbnormalFactors(mContext!!) + addDistanceListener(TAG, distanceListener) + addTrajectoryListener(TAG, trajectoryListener) + } + + private fun releaseListeners() { + MogoStatusManager.getInstance().unregisterStatusChangedListener( + TAG, + StatusDescriptor.VR_MODE, + mMogoStatusChangedListener + ) + + // 注销定位监听 + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + MogoAiCloudSocketManager.getInstance(mContext) + .unregisterLifecycleListener(10010) + CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener) + CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener) + CallerTelematicListenerManager.removeListener(TAG) + stopLoopAbnormalFactors() + } + + private val distanceListener: IDistanceListener = object : IDistanceListener { + override fun distanceCallback(distance: Float) { + val lastTime: Double = distance / BusPassengerConst.BUS_AVERAGE_SPEED * 3.6 //秒 + d(M_BUS_P + TAG, "轨迹排查==lastSumLength = $distance") + for (site in routesResult!!.sites) { + if (site.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !site.isLeaving) { + return + } + } + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback!!.routePlanningToNextStationChanged( + distance.toLong(), + lastTime.toLong() + ) + } + } + } + private val trajectoryListener: ITrajectoryListener = + object : ITrajectoryListener { + override fun trajectoryCallback( + routeArrivied: MutableList, + routeArriving: MutableList, + location: MogoLocation + ) { + if (mAutopilotPlanningCallback != null) { + val routeArriviedTemp: MutableList = ArrayList() + val routeArrivingTemp: MutableList = ArrayList() + var temp: LatLng + for (mogoLocation in routeArrivied) { + temp = LatLng(mogoLocation.latitude, mogoLocation.longitude) + routeArriviedTemp.add(temp) + } + for (mogoLocation in routeArriving) { + temp = LatLng(mogoLocation.latitude, mogoLocation.longitude) + routeArrivingTemp.add(temp) + } + mAutopilotPlanningCallback!!.routeResult( + routeArriviedTemp, + routeArrivingTemp, + location + ) + } + } + } + private val mReceivedMsgListener: IReceivedMsgListener = object : IReceivedMsgListener { + override fun onReceivedServerSn(sn: String?) { + Logger.d(M_BUS_P + TAG, "onReceivedServerSn = $sn") + if (mDriverStatusCallback != null) { + mDriverStatusCallback!!.updateDriverSn(sn) + } + } + + override fun onReceivedMsg(type: Int, byteArray: ByteArray) { + if (OchCommonConst.BUSINESS_STRING == type) { + val baseMsg = GsonUtils.fromJson(String(byteArray), BaseDPMsg::class.java) + Logger.d( + M_BUS_P + TAG, + "onReceivedMsg = " + GsonUtils.toJson(baseMsg) + ) + if (baseMsg != null && baseMsg.type == DPMsgType.TYPE_COMMON.type) { + val (isViewShow, _, msg1) = GsonUtils.fromJson( + String(byteArray), + AppConnectMsg::class.java + ) + if (isViewShow) { //消息盒子显示内容 + pushAppOperationalMsgBox( + DateTimeUtil.getCurrentTimeStamp(), msg1, + OCHSocketMessageManager.OPERATION_SYSTEM + ) + } + } + } + } + } + + //监听网络变化,避免启动机器时无网导致无法更新订单信息 + private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent -> + d(M_BUS_P + TAG, "onIntentReceived = %s", intentStr) + if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) { + if (NetworkUtils.isConnected(mContext)) { + queryDriverOperationStatus() + } + } + } + + // VR mode变更回调 + private val mMogoStatusChangedListener = + IMogoStatusChangedListener { descriptor: StatusDescriptor, isTrue: Boolean -> + if (StatusDescriptor.VR_MODE == descriptor) { + if (mControllerStatusCallbackMap.isNotEmpty()) { + for (callback in mControllerStatusCallbackMap.values) { + callback.onVRModeChanged(isTrue) + } + } + } + } + private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener = + object : IMoGoChassisLocationGCJ02Listener { + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (null == mogoLocation) return + mLocation = mogoLocation + for (callback in mControllerStatusCallbackMap.values) { + callback.onCarLocationChanged(mogoLocation) + } + } + } + private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener = + object : IMoGoAutopilotStatusListener { + private var arriveAtEnd = false //乘客app专用字段 + override fun onAutopilotStatusResponse(state: Int) { + if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { + if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotRunning() + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + mTwoStationsRouts.clear() + if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotEnable() + } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + mTwoStationsRouts.clear() + if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotDisable() + } else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) { + mTwoStationsRouts.clear() + if (mADASStatusCallback != null) mADASStatusCallback!!.onAutopilotRunning() + } + } + override fun onAutopilotArriveAtStation(arrivalNotification: ArrivalNotification?) { + if (FunctionBuildConfig.isDemoMode + && isPassenger(FunctionBuildConfig.appIdentityMode) + ) { + arriveAtEnd = true + } + + // TODO: 2022/3/31 + if (DebugConfig.isDebug()) { + // ToastUtils.showShort("到达目的地"); + } + if (mADASStatusCallback != null) { + mADASStatusCallback!!.onAutopilotArriveEnd() + } + } + + override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {} + } + private val moGoAutopilotPlanningListener: IMoGoPlanningRottingListener = + object : IMoGoPlanningRottingListener { + override fun onAutopilotRotting(globalPathResp: GlobalPathResp?) { + globalPathResp?.wayPointsList?.let { + if (it.size > 0) { + d(M_BUS_P + TAG, "收到轨迹:${it.size}--第一个点${it[0]}--最后一个点:${it.last()}") + updateRoutePoints(it) + } + } + } + } + + fun updateRoutePoints(routePoints: List) { + mRoutePoints.clear() + val latLngModels: List = coordinateConverterWgsToGcjLocations(mContext, routePoints) + mRoutePoints.addAll(latLngModels) + calculateTwoStationsRoute() + } + + private fun calculateTwoStationsRoute() { + //找出前往站对应的轨迹点,拿出两站点的集合 + d(M_BUS_P + TAG, "mRoutePoints.size() = " + mRoutePoints.size) + if (mRoutePoints.size > 0) { + if (mStations.size > 1) { //两个站点及以上要计算两个站点间的轨迹路线 + if (mNextStationIndex <= mStations.size - 1 && mNextStationIndex - 1 >= 0) { + mTwoStationsRouts.clear() + val stationNext = mStations[mNextStationIndex] + val stationCur = mStations[mNextStationIndex - 1] + //当前站在轨迹中对应的点 + val currentRouteIndex = getArrivedPointIndexNew( + 0, mRoutePoints, stationCur.gcjLon, stationCur.gcjLat + ) + //要前往的站在轨迹中对应的点 + val nextRouteIndex = getArrivedPointIndexNew( + currentRouteIndex, mRoutePoints, stationNext.gcjLon, stationNext.gcjLat + ) + d( + M_BUS_P + TAG, + "轨迹排查==currentRouteIndex = " + currentRouteIndex + + ", nextRouteIndex = " + nextRouteIndex + ) + if (currentRouteIndex < nextRouteIndex) { //如果找到的next在起点的轨迹前面,直接舍弃这个轨迹,不显示 + mTwoStationsRouts.addAll( + mRoutePoints.subList( + currentRouteIndex, + nextRouteIndex + 1 + ) + ) + } + } + } + if (mTwoStationsRouts.size > 0) { + val sumLength = calculateRouteSumLength(mTwoStationsRouts) + SharedPrefsMgr.getInstance(mContext!!) + .putInt(BusPassengerConst.BUS_SP_KEY_ORDER_SUM_DIS, sumLength.toInt()) + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback!!.updateTotalDistance() + } + } + } + } + + private fun startOrStopOrderLoop(start: Boolean) { + d(M_BUS_P + TAG, "startOrStopOrderLoop() $start") + if (start) { + BusPassengerModelLoopManager.getInstance().startQueryDriverLineLoop() + } else { + BusPassengerModelLoopManager.getInstance().stopQueryDriverLineLoop() + } + } + + private fun setTrajectoryStation( + startStationInfo: BusPassengerStation, + endStationInfo: BusPassengerStation, + lineId: Int + ) { + val startStation = MogoLocation() + startStation.longitude = startStationInfo.gcjLon + startStation.latitude = startStationInfo.gcjLat + val endStation = MogoLocation() + endStation.longitude = endStationInfo.gcjLon + endStation.latitude = endStationInfo.gcjLat + setStationPoint(startStation, endStation, lineId.toLong()) + } + + fun cleanStation(type:String) { + d(M_BUS_P + TAG, "清理站点 $type") + setStationPoint(null, null, -1L) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java index c0d1db411d..2c7963cf07 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/network/BusPassengerModelLoopManager.java @@ -37,45 +37,6 @@ public class BusPassengerModelLoopManager { } private Disposable mQueryLineDisposable; //心跳轮询 - private CompositeDisposable mRouteWipeDisposable; - private CompositeDisposable mCalculateRouteDisposable; //每隔2s计算一次剩余里程和时间 - - public void startOrStopRouteAndWipe() { - CallerLogger.INSTANCE.i(M_BUS_P + TAG, "startOrStopRouteWipe()"); - if (mRouteWipeDisposable != null) return; - if (mRouteWipeDisposable == null){ - mRouteWipeDisposable = new CompositeDisposable(); - } - Disposable disposable = startLoopRouteAndWipe() - .doOnSubscribe(new Consumer() { - @Override - public void accept(Disposable disposable) throws Exception { - } - }) - .doOnError(new Consumer() { - @Override - public void accept(Throwable throwable) throws Exception { - } - }) - .delay(LOOP_LINE_1S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 - .subscribeOn(Schedulers.io()) - .repeat() // repeat保证请求成功后能够重新订阅。 - .retry() // retry保证请求失败后能重新订阅 - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(Integer integer) throws Exception { - } - }); - mRouteWipeDisposable.add(disposable); - } - - public void stopOrStopRouteAndWipe() { - if (mRouteWipeDisposable != null) { - mRouteWipeDisposable.dispose(); - mRouteWipeDisposable = null; - } - } public void startQueryDriverLineLoop() { if (mQueryLineDisposable != null && !mQueryLineDisposable.isDisposed()) { @@ -87,7 +48,7 @@ public class BusPassengerModelLoopManager { .map((aLong -> aLong + 1)) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(aLong -> BusPassengerModel.getInstance().queryDriverSiteByCoordinate()); + .subscribe(aLong -> BusPassengerModel.INSTANCE.queryDriverSiteByCoordinate()); } public void stopQueryDriverLineLoop() { @@ -98,63 +59,4 @@ public class BusPassengerModelLoopManager { } } - public void startCalculateRouteInfoLoop() { - CallerLogger.INSTANCE.i(M_BUS_P + TAG, "startCalculateRouteInfoLoop()"); - if (mCalculateRouteDisposable != null) return; - if (mCalculateRouteDisposable == null){ - mCalculateRouteDisposable = new CompositeDisposable(); - } - Disposable disposable = startLoopCalculateRouteInfo() - .doOnSubscribe(new Consumer() { - @Override - public void accept(Disposable disposable) throws Exception { - } - }) - .doOnError(new Consumer() { - @Override - public void accept(Throwable throwable) throws Exception { - } - }) - .delay(LOOP_LINE_2S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 - .subscribeOn(Schedulers.io()) - .repeat() // repeat保证请求成功后能够重新订阅。 - .retry() // retry保证请求失败后能重新订阅 - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(Integer integer) throws Exception { - } - }); - mCalculateRouteDisposable.add(disposable); - } - - public void stopCalculateRouteInfLoop() { - if (mCalculateRouteDisposable != null) { - CallerLogger.INSTANCE.i(M_BUS_P + TAG, "stopCalculateRouteInfLoop()"); - mCalculateRouteDisposable.dispose(); - mCalculateRouteDisposable = null; - } - } - - private Observable startLoopRouteAndWipe(){ - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter emitter) throws Exception { - if (emitter.isDisposed()) return; - BusPassengerModel.getInstance().loopRouteAndWipe(); - emitter.onComplete(); - } - }); - } - - private Observable startLoopCalculateRouteInfo(){ - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter emitter) throws Exception { - if (emitter.isDisposed()) return; - BusPassengerModel.getInstance().dynamicCalculateRouteInfo(); - emitter.onComplete(); - } - }); - } } diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java index 20bfc21db5..a448c2cd36 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java @@ -35,7 +35,7 @@ public class BaseBusPassengerPresenter extends Presenter models, int haveArrivedIndex) { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "routeResult:" + models.size() - + " haveArrivedIndex = "+haveArrivedIndex); - runOnUIThread(() ->mView.routeResult(models,haveArrivedIndex)); + public void routeResult(List routeArrivied,List routeArriving,MogoLocation location) { + runOnUIThread(() ->mView.routeResult(routeArrivied,routeArriving,location)); } @Override diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java index 4eafc8271c..c3a0911815 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java @@ -15,7 +15,9 @@ import com.mogo.commons.mvp.Presenter; import com.mogo.eagle.core.data.multidisplay.TelematicConstant; import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener; import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager; +import com.mogo.eagle.core.function.hmi.ui.widget.RomaPassengerView; import com.mogo.eagle.core.function.view.MapBizView; +import com.mogo.eagle.core.utilcode.util.DeviceUtils; import com.mogo.och.bus.passenger.R; /** @@ -28,6 +30,7 @@ public abstract class BusPassengerBaseFragment openOrCloseLiveVideo()); CallerTelematicListenerManager.INSTANCE.addListener(TAG, new IReceivedMsgListener() { @Override diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.java deleted file mode 100644 index 6f8411205b..0000000000 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.java +++ /dev/null @@ -1,352 +0,0 @@ -package com.mogo.och.bus.passenger.ui; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; - -import android.content.Context; -import android.os.Bundle; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.RelativeLayout; - -import androidx.annotation.Nullable; - -import com.amap.api.maps.AMap; -import com.amap.api.maps.CameraUpdate; -import com.amap.api.maps.CameraUpdateFactory; -import com.amap.api.maps.TextureMapView; -import com.amap.api.maps.UiSettings; -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.CustomMapStyleOptions; -import com.amap.api.maps.model.LatLng; -import com.amap.api.maps.model.LatLngBounds; -import com.amap.api.maps.model.Marker; -import com.amap.api.maps.model.MarkerOptions; -import com.amap.api.maps.model.Polyline; -import com.amap.api.maps.model.PolylineOptions; -import com.mogo.eagle.core.data.map.MogoLocation; -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.och.bus.passenger.R; -import com.mogo.och.bus.passenger.callback.IBusPassengerMapViewCallback; -import com.mogo.och.bus.passenger.utils.BusPassengerMapAssetStyleUtil; - -import java.util.ArrayList; -import java.util.List; - -/** - * 乘客屏小地图 - */ -public class BusPassengerMapDirectionView - extends RelativeLayout - implements IMoGoChassisLocationGCJ02Listener, - IBusPassengerMapDirectionView, - AMap.OnCameraChangeListener { - - //小地图名称 - public static final String TAG = "TPMapDirectionView"; - - private TextureMapView mAMapNaviView; - private AMap mAMap; - private Marker mCarMarker; - - private List mCoordinatesLatLng = new ArrayList<>(); //轨迹坐标数据 - private List mLineStationLatLng = new ArrayList<>();//站点坐标数据 - private Polyline mPolyline; - private CameraUpdate mCameraUpdate; - private Context mContext; - - List textureList = new ArrayList<>(); - List texIndexList = new ArrayList<>(); - private int mHaveArrivedIndex = 0; - - private List mLineMarkers = new ArrayList<>(); - -// private IBusPassengerMapViewCallback mIBusPassengerMapViewCallback; - private BitmapDescriptor mArrivedRes; - private BitmapDescriptor mUnArrivedRes; - - public BusPassengerMapDirectionView(Context context) { - this(context, null); - } - - public BusPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs) { - this(context, attrs, 0); - } - - public BusPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - try { - initView(context); - } catch (Exception e) { - e.printStackTrace(); - } - } - -// public void setTaxiPassengerMapViewCallback(IBusPassengerMapViewCallback iBusPassengerMapViewCallback) { -// this.mIBusPassengerMapViewCallback = iBusPassengerMapViewCallback; -// } - - private void initView(Context context) { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "initView"); - - mContext = context; - - View smpView = LayoutInflater.from(context).inflate(R.layout.bus_p_map_view, this); - - mAMapNaviView = (TextureMapView) smpView.findViewById(R.id.bus_p_line_amap_view); - - initAMapView(); - - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); - } - - private void initAMapView() { -// mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); - mAMap = mAMapNaviView.getMap(); - // 设置导航地图模式,aMap是地图控制器对象。 - mAMap.setMapType(AMap.MAP_TYPE_NIGHT); - - // 关闭显示实时路况图层,aMap是地图控制器对象。 - mAMap.setTrafficEnabled(false); - - // 设置 锚点 图标 - mCarMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_car)) - .anchor(0.5f, 0.5f)); - - mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_arrived); - mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_un_arrive); - - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(BusPassengerMapAssetStyleUtil.getAssetsStyle(getContext(), "map_style.data")) - .setStyleExtraData(BusPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(), "map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - - //设置希望展示的地图缩放级别 -// mAMap.moveCamera(mCameraUpdate); - - // 设置地图的样式 - UiSettings uiSettings = mAMap.getUiSettings(); - uiSettings.setZoomControlsEnabled(false);// 地图缩放级别的交换按钮 - uiSettings.setAllGesturesEnabled(false);// 所有手势 - uiSettings.setMyLocationButtonEnabled(false); // 显示默认的定位按钮 - uiSettings.setLogoBottomMargin(-150); //设置Logo下边界距离屏幕底部的边距,设置为负值即可 - - mAMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() { - @Override - public void onMapLoaded() { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "smp---onMapLoaded"); - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(BusPassengerMapAssetStyleUtil.getAssetsStyle(getContext(), "map_style.data")) - .setStyleExtraData(BusPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(), "map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - mAMapNaviView.getMap().setPointToCenter(mAMapNaviView.getWidth() / 2, mAMapNaviView.getHeight() / 2); - } - }); - - //设置地图状态的监听接口 - mAMap.setOnCameraChangeListener(this); - } - - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return true; - } - - @Override - public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { - if (gnssInfo == null) { - return; - } -// CallerLogger.INSTANCE.d(M_BUS_P + TAG, "onCarLocationChanged2 :" + location.getLatitude() + ":" + location.getLongitude()); - LatLng currentLatLng = new LatLng(gnssInfo.getLatitude(), gnssInfo.getLongitude()); - - //更新车辆位置 - if (mCarMarker != null) { -// CallerLogger.INSTANCE.d(M_BUS_P + TAG, "location.getBearing() = " + location.getBearing()); - mCarMarker.setRotateAngle((float) (360 - gnssInfo.getHeading())); - mCarMarker.setPosition(currentLatLng); - mCarMarker.setToTop(); - } - - try { - - //圈定地图显示范围 - LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); - - if (mCoordinatesLatLng.size() > 0){ - //存放经纬度 - for (int i = 0; i < mCoordinatesLatLng.size(); i++) { - boundsBuilder.include(mCoordinatesLatLng.get(i)); - } - //第二个参数为四周留空宽度 - }else if (mLineStationLatLng.size() > 0){ - for (int i = 0; i< mLineStationLatLng.size();i++){ - boundsBuilder.include(mLineStationLatLng.get(i)); - } - } - - boundsBuilder.include(currentLatLng); - mAMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(),100,100,100,100)); - - }catch (Exception e){ - - } - } - - - @Override - public void drawablePolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - if (mAMap != null) { - - addRouteColorList(); - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "mLinePointsLatLng.size() = " +mLineStationLatLng.size() - +" mCoordinatesLatLng.size()= " + mCoordinatesLatLng.size()); - if (mLineStationLatLng.size() >= 2 && mCoordinatesLatLng.size() > 2) { - //设置线段纹理 - PolylineOptions polylineOptions = new PolylineOptions(); - polylineOptions.addAll(mCoordinatesLatLng); - polylineOptions.width(14); //线段宽度 - polylineOptions.setUseTexture(true); - polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound); - polylineOptions.setCustomTextureList(textureList); - polylineOptions.setCustomTextureIndex(texIndexList); -// polylineOptions.colorValues(colorList); -// polylineOptions.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow)); - - // 绘制线 - mPolyline = mAMap.addPolyline(polylineOptions); - - } - } - } - - /** - * 添加画线颜色值 - */ - private void addRouteColorList() { - textureList.clear(); - texIndexList.clear(); - for (int i = 0; i < mCoordinatesLatLng.size(); i++){ - if (i <= mHaveArrivedIndex){ - textureList.add(mArrivedRes); - }else { - textureList.add(mUnArrivedRes); - } - texIndexList.add(i); - } - } - - @Override - public void clearPolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - } - - @Override - public void setLineMarker() { - - } - - public void clearCoordinatesLatLng(){ - textureList.clear(); - texIndexList.clear(); - mCoordinatesLatLng.clear(); - mLineStationLatLng.clear(); - CallerLogger.INSTANCE.d(M_BUS_P + TAG, " mCoordinatesLatLng.clear " ); - } - - public void onCreateView(Bundle savedInstanceState) { - if (mAMapNaviView != null) { - mAMapNaviView.onCreate(savedInstanceState); - } - } - - public void onResume() { - if (mAMapNaviView != null) { - mAMapNaviView.onResume(); - } - } - - public void onPause() { - if (mAMapNaviView != null) { - mAMapNaviView.onPause(); - } - } - - public void onDestroy() { - if (mAMapNaviView != null) { - mAMapNaviView.onDestroy(); - } - } - - public void setCoordinatesLatLng(List latLngs,int haveArrivedIndex) { - mCoordinatesLatLng.clear(); - mCoordinatesLatLng.addAll(latLngs); - mHaveArrivedIndex = haveArrivedIndex; - } - - public void clearLineMarkers(){ - for (int i =0; i< mLineMarkers.size();i++){ - mLineMarkers.get(i).setVisible(false); - mLineMarkers.get(i).remove(); - } - mLineMarkers.clear(); - } - - public void setLinePointMarkerAndDraw(List mLineStationsList, int currentIndex) { - clearLineMarkers(); - mLineStationLatLng.clear(); - mLineStationLatLng.addAll(mLineStationsList); - - if (mLineStationsList.size() > 0){ - for (int i = 0; i < mLineStationsList.size(); i++) { - if (currentIndex == i){ - Marker mEndMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_view_dir_end_point))); - mEndMarker.setPosition(mLineStationsList.get(i)); - mLineMarkers.add(i,mEndMarker); - }else { - Marker mStartMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_view_dir_way_point))); - mStartMarker.setPosition(mLineStationsList.get(i)); - mLineMarkers.add(i,mStartMarker); - } - } - } - } - - @Override - public void onCameraChange(CameraPosition cameraPosition) { -// mIBusPassengerMapViewCallback.onCameraChange(cameraPosition.bearing); - } - - @Override - public void onCameraChangeFinish(CameraPosition cameraPosition) { - - } -} diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.kt b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.kt new file mode 100644 index 0000000000..df13122d1e --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerMapDirectionView.kt @@ -0,0 +1,331 @@ +package com.mogo.och.bus.passenger.ui + +import android.content.Context +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.view.View +import android.widget.RelativeLayout +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.CustomMapStyleOptions +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.Polyline +import com.amap.api.maps.model.PolylineOptions +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P +import com.mogo.och.bus.passenger.R +import com.mogo.och.bus.passenger.utils.BusPassengerMapAssetStyleUtil + +/** + * 乘客屏小地图 + */ +class BusPassengerMapDirectionView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener, + IBusPassengerMapDirectionView, AMap.OnCameraChangeListener { + + companion object { + //小地图名称 + const val TAG = "BusPassengerMapDirectionView" + } + + private lateinit var mAMapNaviView: TextureMapView + private lateinit var mAMap: AMap + private var mPolyline: Polyline? = null + private val mLineMarkers: MutableList = ArrayList() + private lateinit var mCarMarker: Marker + + private val mLineStationLatLng: MutableList = ArrayList() //站点坐标数据 + var textureList: MutableList = ArrayList() + var texIndexList: MutableList = ArrayList() + private var mArrivedRes: BitmapDescriptor? = null + private var mUnArrivedRes: BitmapDescriptor? = null + + private val routeArrivied: MutableList = ArrayList() + private val routeArriving: MutableList = ArrayList() + private var location: MogoLocation? = null + + init { + try { + initView(context) + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun initView(context: Context) { + d(M_BUS_P + TAG, "initView") + val smpView = LayoutInflater.from(context).inflate(R.layout.bus_p_map_view, this) + mAMapNaviView = smpView.findViewById(R.id.bus_p_line_amap_view) as TextureMapView + initAMapView() + + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + } + + private fun initAMapView() { + mAMap = mAMapNaviView.map + // 设置导航地图模式,aMap是地图控制器对象。 + mAMap.mapType = AMap.MAP_TYPE_NIGHT + + // 关闭显示实时路况图层,aMap是地图控制器对象。 + mAMap.isTrafficEnabled = false + + // 设置 锚点 图标 + mCarMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_car)).anchor(0.5f, 0.5f)) + mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_arrived) + mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrow_un_arrive) + + // 加载自定义样式 + val customMapStyleOptions = CustomMapStyleOptions() + .setEnable(true) + .setStyleData( + BusPassengerMapAssetStyleUtil.getAssetsStyle( + context, "map_style.data" + ) + ) + .setStyleExtraData( + BusPassengerMapAssetStyleUtil.getAssetsExtraStyle( + context, "map_style_extra.data" + ) + ) + // 设置自定义样式 + mAMap.setCustomMapStyle(customMapStyleOptions) + + // 设置地图的样式 + mAMap.uiSettings.apply { + isZoomControlsEnabled = false // 地图缩放级别的交换按钮 + setAllGesturesEnabled(true) // 所有手势 + isMyLocationButtonEnabled = false // 显示默认的定位按钮 + setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可 + } + + mAMap.setOnMapLoadedListener { + d(M_BUS_P + TAG, "smp---onMapLoaded") + // 加载自定义样式 + val options = CustomMapStyleOptions() + .setEnable(true) + .setStyleData( + BusPassengerMapAssetStyleUtil.getAssetsStyle( + context, "map_style.data" + ) + ) + .setStyleExtraData( + BusPassengerMapAssetStyleUtil.getAssetsExtraStyle( + context, "map_style_extra.data" + ) + ) + // 设置自定义样式 + mAMap.setCustomMapStyle(options) + mAMapNaviView.map.setPointToCenter( + mAMapNaviView.width / 2, + mAMapNaviView.height / 2 + ) + } + + //设置地图状态的监听接口 + mAMap.setOnCameraChangeListener(this) + } + +// override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { +// return true +// } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (mogoLocation == null) { + return + } + val currentLatLng = LatLng(mogoLocation.latitude, mogoLocation.longitude) + + //更新车辆位置 + mCarMarker.rotateAngle = (360 - mogoLocation.heading).toFloat() + mCarMarker.position = currentLatLng + mCarMarker.setToTop() + try { + //圈定地图显示范围 + val boundsBuilder = LatLngBounds.Builder() + routeArrivied.forEach { + boundsBuilder.include(it) + } + routeArriving.forEach { + boundsBuilder.include(it) + } + mLineStationLatLng.forEach { + boundsBuilder.include(it) + } + boundsBuilder.include(currentLatLng) + mAMap.moveCamera( + CameraUpdateFactory.newLatLngBoundsRect( + boundsBuilder.build(), + 100, + 100, + 100, + 100 + ) + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun drawablePolyline() { + if (routeArrivied.isEmpty() && routeArriving.isEmpty()) { + d(SceneConstant.M_TAXI + TAG, "没有点") + return + } + texIndexList.clear() + val allPoints = ArrayList(routeArrivied) + for (i in routeArrivied.indices) { + if (routeArrivied.size > 1 && i < routeArrivied.size - 1) { + texIndexList.add(0) + } + } + texIndexList.add(0) + allPoints.add(LatLng(location!!.latitude, location!!.longitude)) + allPoints.addAll(routeArriving) + for (ignored in routeArrivied) { + texIndexList.add(1) + } + if (mPolyline != null) { + mPolyline!!.points = allPoints + mPolyline!!.options.customTextureIndex = texIndexList + return + } + if(textureList.isEmpty()) { + textureList.add(mArrivedRes) + textureList.add(mUnArrivedRes) + } + //设置线段纹理 + val polylineOptions = PolylineOptions().apply { + addAll(allPoints) + isUseTexture = true + width(15f) + lineCapType(PolylineOptions.LineCapType.LineCapRound) + customTextureList = textureList + customTextureIndex = texIndexList + } + + // 绘制线 + mPolyline = mAMap.addPolyline(polylineOptions) + } + + override fun clearPolyline() { + if (mPolyline != null) { + mPolyline!!.remove() + mPolyline = null + } + } + + override fun setLineMarker() {} + + fun clearCoordinatesLatLng() { + textureList.clear() + texIndexList.clear() + routeArrivied.clear() + routeArriving.clear() + mLineStationLatLng.clear() + d(M_BUS_P + TAG, " mCoordinatesLatLng.clear ") + } + + fun onCreateView(savedInstanceState: Bundle?) { + mAMapNaviView.onCreate(savedInstanceState) + } + + fun onResume() { + mAMapNaviView.onResume() + } + + fun onPause() { + mAMapNaviView.onPause() + } + + fun onDestroy() { + mAMapNaviView.onDestroy() + } + + fun setCoordinatesLatLng( + routeArrivied: List?, + routeArriving: List?, + location: MogoLocation? + ) { + this.routeArrivied.clear() + this.routeArrivied.addAll(routeArrivied!!) + this.routeArriving.clear() + this.routeArriving.addAll(routeArriving!!) + this.location = location + } + + fun clearLineMarkers() { + for (i in mLineMarkers.indices) { + mLineMarkers[i].isVisible = false + mLineMarkers[i].remove() + } + mLineMarkers.clear() + } + + fun setLinePointMarkerAndDraw(mLineStationsList: List, currentIndex: Int) { + clearLineMarkers() + mLineStationLatLng.clear() + mLineStationLatLng.addAll(mLineStationsList) + if (mLineStationsList.isNotEmpty()) { + // 起点marker, 终点marker, 过站marker, 未过站marker + val size = mLineStationsList.size + val mStartMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_start_point)) + ) + val mEndMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_end_point)) + ) + mStartMarker.position = mLineStationsList[0] + mLineMarkers.add(0, mStartMarker) + for (i in mLineStationsList.indices) { + if (currentIndex <= i && i < size - 1 && i > 0) { //未到达 + val unArrivedMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_unarrived_point)) + ) + unArrivedMarker.position = mLineStationsList[i] + mLineMarkers.add(i, unArrivedMarker) + } else if (i in 1 until currentIndex) { + val arrivedMarker = mAMap.addMarker( + MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrived_point)) + ) + arrivedMarker.position = mLineStationsList[i] + mLineMarkers.add(i, arrivedMarker) + } + } + mEndMarker.position = mLineStationsList[size - 1] + mLineMarkers.add(size - 1, mEndMarker) + } + } + + override fun onCameraChange(cameraPosition: CameraPosition) { + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition) {} + +} \ No newline at end of file diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java index 5041b7e52f..33d497dbf3 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java @@ -240,9 +240,9 @@ public class BusPassengerRouteFragment extends } } - public void routeResult(List latLngList,int haveArrivedIndex) { - if (latLngList.size() > 0) { - drawablePolyline(latLngList,haveArrivedIndex); + public void routeResult(List routeArrivied,List routeArriving,MogoLocation location) { + if (routeArrivied.size() > 0||routeArriving.size()>0) { + drawablePolyline(routeArrivied,routeArriving,location); } else { clearMapView(); } @@ -253,15 +253,10 @@ public class BusPassengerRouteFragment extends * * @param coordinates */ - private void drawablePolyline(List coordinates,int haveArrivedIndex) { + private void drawablePolyline(List routeArrivied,List routeArriving,MogoLocation location) { if (mMapDirectionView != null) { - mMapDirectionView.setCoordinatesLatLng(coordinates,haveArrivedIndex); - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapDirectionView.drawablePolyline(); - } - }); + mMapDirectionView.setCoordinatesLatLng(routeArrivied,routeArriving,location); + UiThreadHandler.post(() -> mMapDirectionView.drawablePolyline()); } } @@ -290,10 +285,7 @@ public class BusPassengerRouteFragment extends } public void changeOperationStatus(boolean status) { - if (status) { - mNoLineInfoView.setVisibility(View.GONE); - mRouteInfoView.setVisibility(View.VISIBLE); - } else { + if (!status) { emptyTv.setText(getString(R.string.bus_p_no_out)); mNoLineInfoView.setVisibility(View.VISIBLE); mRouteInfoView.setVisibility(View.GONE); diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java index ac7db3446d..7346b58bbf 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/utils/BPRouteDataTestUtils.java @@ -48,9 +48,7 @@ public class BPRouteDataTestUtils { builder.setLongitude(s.getDouble("longitude_")); list.add(builder.build()); } - BusPassengerModel.getInstance().updateRoutePoints(list); - BusPassengerModel.getInstance().startRemainRouteInfo(); - BusPassengerModel.getInstance().startToRouteAndWipe(); + BusPassengerModel.INSTANCE.updateRoutePoints(list); } catch (JSONException e) { e.printStackTrace(); } diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_arrived_point.png b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_arrived_point.png new file mode 100644 index 0000000000..ac317649b4 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_arrived_point.png differ diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png index 17beb894a6..702f10f265 100644 Binary files a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png and b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png differ diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_end_point.png b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_end_point.png new file mode 100644 index 0000000000..39262e5ecb Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_end_point.png differ diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_start_point.png b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_start_point.png new file mode 100644 index 0000000000..b2e4c69ada Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_start_point.png differ diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_unarrived_point.png b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_unarrived_point.png new file mode 100644 index 0000000000..ec6081f5a3 Binary files /dev/null and b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_unarrived_point.png differ diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_end_point.png b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_end_point.png deleted file mode 100644 index 1e64713481..0000000000 Binary files a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_end_point.png and /dev/null differ diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_way_point.png b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_way_point.png deleted file mode 100644 index ff04c01f13..0000000000 Binary files a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_way_point.png and /dev/null differ diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml index 46bf3aefed..13974b5df3 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml @@ -27,7 +27,7 @@ app:layout_constraintStart_toStartOf="parent" /> diff --git a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml index a99b9ec46e..a92d7350f4 100644 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/res/layout/bus_p_route_fragment.xml @@ -41,7 +41,8 @@ android:id="@+id/driver_info_bg" android:layout_width="@dimen/bus_p_route_info_panel_width" android:layout_height="0dp" - app:layout_constraintBottom_toTopOf="@+id/busPLineMapView" + android:layout_marginBottom="@dimen/bus_p_route_line_map_view_height" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"> diff --git a/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data b/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data index efcf9bf6c4..d4d4bc8214 100644 Binary files a/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data and b/OCH/mogo-och-bus-passenger/src/main/assets/map_style.data differ diff --git a/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data b/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data index ff5d9fb51b..88c4e33256 100644 Binary files a/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data and b/OCH/mogo-och-bus-passenger/src/main/assets/map_style_extra.data differ diff --git a/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java b/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java index aa43036428..5153efce75 100644 --- a/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/mogo-och-bus/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java @@ -34,6 +34,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02Lis import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.CoordinateUtils; +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -62,6 +63,8 @@ import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.callback.OchAdasStartFailureCallback; import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager; import com.mogo.och.common.module.manager.OCHAdasAbilityManager; +import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener; +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.DateTimeUtil; import com.mogo.och.common.module.utils.NumberFormatUtil; @@ -94,8 +97,6 @@ public class OrderModel { private int backgroundCurrentStationIndex = 0;//A->B 此处值是A站点索引 private static volatile OrderModel sInstance; - public double mLongitude = 0; - public double mLatitude = 0; private Context mContext; private final List stationList = new ArrayList<>(); private BusRoutesResult busRoutesResult = null; @@ -153,7 +154,7 @@ public class OrderModel { mContext = AbsMogoApplication.getApp(); loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, mMapLocationListener); + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,10, mMapLocationListener); MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); @@ -173,6 +174,8 @@ public class OrderModel { AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); + TrajectoryAndDistanceManager.INSTANCE.addTrajectoryListener(TAG,trajectoryListener); + //2022.1.28 // 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃 // The exception could not be delivered to the consumer because it has already canceled/disposed @@ -268,6 +271,12 @@ public class OrderModel { this.mControllerStatusCallback = callback; } + private final ITrajectoryListener trajectoryListener = new ITrajectoryListener() { + @Override + public void trajectoryCallback(@NonNull List routeArrivied, @NonNull List routeArriving, @NonNull MogoLocation location) { + + } + }; private final IMoGoPlanningRottingListener moGoAutopilotPlanningListener = new IMoGoPlanningRottingListener() { @Override @@ -347,6 +356,8 @@ public class OrderModel { OCHSocketMessageManager.msgWriteOffPassengerType); AbnormalFactorsLoopManager.INSTANCE.stopLoopAbnormalFactors(); + + TrajectoryAndDistanceManager.INSTANCE.removeListener(TAG); } private Object readResolve() { @@ -382,8 +393,6 @@ public class OrderModel { @Override public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { if (null == gnssInfo) return; - mLongitude = gnssInfo.getLongitude(); - mLatitude = gnssInfo.getLatitude(); if (mControllerStatusCallback != null) { mControllerStatusCallback.onCarLocationChanged(gnssInfo); } @@ -410,10 +419,26 @@ public class OrderModel { startLon, startLat, location.getLongitude(), location.getLatitude()); - if (distance <= BusConst.ARRIVE_AT_END_STATION_DISTANCE) { + if (distance <= BusConst.ARRIVE_AT_END_STATION_DISTANCE) {//1、当前位置和站点围栏15m内 CallerLogger.INSTANCE.d(M_BUS + TAG, "行程日志-judgeArrivedStation() distance = " + distance + " to " + upcomingStation.getName()); - onArriveAt(null); //无自动驾驶到站信息传null + + //2、开始计算当前位置和站点的向量角度 < 90度 未经过 >90度 经过 + double stationAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( + location.getLongitude(), + location.getLatitude(), + startLon, + startLat, + (int) location.getHeading()); + + CallerLogger.INSTANCE.d(M_BUS + TAG, "judgeArrivedStation() stationAngle = " + stationAngle); + + //3、刚过站且过站距离在15m内, 提交到站 + if (stationAngle > 90 && distance <= BusConst.ARRIVE_AT_END_STATION_DISTANCE){ + CallerLogger.INSTANCE.d(M_BUS + TAG, "judgeArrivedStation() = 刚过站且在15m内"); + onArriveAt(null); //无自动驾驶到站信息传null + } + return; } } @@ -601,12 +626,13 @@ public class OrderModel { , nextStation , isLastStop); } + } private void onStartAutopilot(int leaveIndex) { //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 isGoingToNextStation = true; - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { startAutopilot(false, leaveIndex); } else { @@ -743,16 +769,24 @@ public class OrderModel { CallerLogger.INSTANCE.d(M_BUS + TAG, "leaveStation-backgroundCurrentStationIndex = " + backgroundCurrentStationIndex); String nextStationName = ""; String nextStationNameKr = ""; + MogoLocation nextStationPoint = new MogoLocation(); if (backgroundCurrentStationIndex < stationList.size() - 1) { - nextStationName = stationList.get(backgroundCurrentStationIndex + 1).getName(); - nextStationNameKr = stationList.get(backgroundCurrentStationIndex + 1).getNameKr(); + BusStationBean nextStation = stationList.get(backgroundCurrentStationIndex + 1); + nextStationName = nextStation.getName(); + nextStationNameKr = nextStation.getNameKr(); + nextStationPoint.setLongitude(nextStation.getGcjLon()); + nextStationPoint.setLatitude(nextStation.getGcjLat()); } - final String currentStationName = stationList.get(backgroundCurrentStationIndex).getName(); + BusStationBean busStationBean = stationList.get(backgroundCurrentStationIndex); + final String currentStationName = busStationBean.getName(); String finalNextStationName = nextStationName; String finalNextStationNameKr = nextStationNameKr; + MogoLocation currentStationPoint = new MogoLocation(); + currentStationPoint.setLongitude(busStationBean.getGcjLon()); + currentStationPoint.setLatitude(busStationBean.getGcjLat()); OrderServiceManager.leaveStation(mContext, - stationList.get(backgroundCurrentStationIndex).getSeq(), - stationList.get(backgroundCurrentStationIndex).getSiteId(), + busStationBean.getSeq(), + busStationBean.getSiteId(), currentTaskId, new OchCommonServiceCallback() { @Override @@ -764,6 +798,7 @@ public class OrderModel { queryBusRoutes(); leaveStationSuccess(backgroundCurrentStationIndex, currentStationName, finalNextStationName,finalNextStationNameKr); + setTrajectoryStation(currentStationPoint,nextStationPoint, (long) currentLineId); } @@ -1019,7 +1054,7 @@ public class OrderModel { } CallerLogger.INSTANCE.d(M_BUS + TAG, "单程结束===="); CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot(); - + setTrajectoryStation(null,null,-1L); endTask(); } @@ -1090,6 +1125,10 @@ public class OrderModel { String arriveLat = NumberFormatUtil.cutOutNumber(arriveStation.getLat(), 5); String arriveLon = NumberFormatUtil.cutOutNumber(arriveStation.getLon(), 5); + CallerLogger.INSTANCE.d(M_BUS + TAG, "行程日志-dataLatitude = "+ latitude+ + ", dataLongitude = " + longitude + "; arriveLat = " + arriveLat + + ", arriveLon = " +arriveLon); + if (!latitude.equals(arriveLat) || !longitude.equals(arriveLon)) { CallerLogger.INSTANCE.e(M_BUS + TAG, "行程日志-到站拦截,到站坐标不一致"); return; @@ -1113,6 +1152,8 @@ public class OrderModel { // 车机端上传心跳数据(只在出车状态时上传) public void runCarHeartbeat() { + double mLatitude = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLatitude(); + double mLongitude =CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLongitude(); OrderServiceManager.runCarHeartbeat(mContext, mLongitude, mLatitude, new OchCommonServiceCallback() { @Override @@ -1138,6 +1179,8 @@ public class OrderModel { // 登出 public void logout() { + double mLatitude = CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLatitude(); + double mLongitude =CallerChassisLocationGCJ02ListenerManager.INSTANCE.getChassisLocationGCJ02().getLongitude(); loginService.loginOut(mLatitude, mLongitude); } @@ -1232,4 +1275,8 @@ public class OrderModel { return parameters; } + + public void setTrajectoryStation(MogoLocation startStation,MogoLocation endStation,Long lineId){ + TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation,endStation,lineId); + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt index 7eadb3d41f..711fe90a39 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/constant/BusConst.kt @@ -64,7 +64,7 @@ class BusConst { const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L //围栏到站 暂定10米 - const val ARRIVE_AT_END_STATION_DISTANCE = 10 + const val ARRIVE_AT_END_STATION_DISTANCE = 15 // 轮询 const val LOOP_PASSENGER_5S = 5 * 1000L diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index 7b70977f1b..e0775f569f 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -158,7 +158,7 @@ public abstract class BaseBusTabFragment }); initListener(); - setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState()); ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() { @Override @@ -301,9 +301,6 @@ public abstract class BaseBusTabFragment @Override public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) { -// if (!HmiBuildConfig.isShowBadCaseView && recordPanel != null && recordPanel.getType() == 1 && recordPanel.getStat() == 100) { -// CallerDevaToolsManager.INSTANCE.onReceiveBadCaseRecord(recordPanel); -// } } @Override @@ -448,7 +445,7 @@ public abstract class BaseBusTabFragment public void stopAnimAndUpdateBtnStatus() { stopAutopilotAnimation(); - updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState()); } /** @@ -465,9 +462,9 @@ public abstract class BaseBusTabFragment * 展示【自动驾驶】按钮 */ public void showAutopilotBiz() { - getActivity().runOnUiThread(() -> { - ctvAutopilotStatus.setVisibility(View.VISIBLE); - }); +// getActivity().runOnUiThread(() -> { +// ctvAutopilotStatus.setVisibility(View.VISIBLE); +// }); } public SlidePanelView.OnSlidePanelMoveToEndListener getSlidePanelOnEndListener() { @@ -522,7 +519,7 @@ public abstract class BaseBusTabFragment public void run() { //未启动成功做处理 if (isAnimateRunning) {// 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态 stopAutopilotAnimation(); - updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState()); } } }, TIMER_START_AUTOPILOT_INTERVAL); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index bcb1422d46..cd80f7b6e0 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -13,7 +13,6 @@ import androidx.constraintlayout.widget.Group; import androidx.annotation.Nullable; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; -import com.mogo.commons.AbsMogoApplication; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.map.CenterLine; import com.mogo.eagle.core.data.temp.EventLogout; @@ -108,7 +107,7 @@ public class BusFragment extends BaseBusTabFragment groupStationsPanel = findViewById(R.id.group_stations_panel); noDataView = findViewById(R.id.no_line_data_view); - CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getState()); // 初始化的时候设置 UI 按钮状态 showAutopilotBiz(); @@ -455,7 +454,7 @@ public class BusFragment extends BaseBusTabFragment } //清除鹰眼右下角小地图轨迹 - CallerLogger.INSTANCE.d(SceneConstant.M_MAP, "clearBusStationsMarkers --------->"); + CallerLogger.INSTANCE.d(SceneConstant.M_BUS, "clearBusStationsMarkers --------->"); smallMapView.clearPolyline(); } @@ -532,7 +531,7 @@ public class BusFragment extends BaseBusTabFragment public void onClick(View v) { if (v.getId() == R.id.switch_line_btn) {//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线 //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线 - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { ToastUtils.showLong(getResources().getString(R.string.bus_switch_line_btn_warning1)); return; diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index a2d0ae8d4a..5198e4dbca 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -34,8 +34,6 @@ import com.mogo.och.common.module.biz.constant.LoginStatusManager; import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.common.module.voice.VoiceNotice; -import org.jetbrains.annotations.NotNull; - import java.util.ArrayList; import java.util.List; @@ -45,8 +43,6 @@ import system_master.SystemStatusInfo; /** * 网约车小巴 - * - * @author tongchenfei */ public class BusPresenter extends Presenter implements IRefreshBusStationsCallback, ISlidePannelHideCallback @@ -54,8 +50,7 @@ public class BusPresenter extends Presenter private static final String TAG = "BusPresenter"; - private int currentAutopilotStatus = -1; - private List mStationList = new ArrayList<>(); + private final List mStationList = new ArrayList<>(); private int mCurrentStation = 0; public BusPresenter(BusFragment view) { @@ -101,16 +96,12 @@ public class BusPresenter extends Presenter } public void autoDriveToNextStation() { - currentAutopilotStatus = -1; OrderModel.getInstance().autoDriveToNextStation(); -// isRestartAutopilot = false; } public void restartAutopilot() { if (OrderModel.getInstance().isGoingToNextStation()){ - currentAutopilotStatus = -1; OrderModel.getInstance().restartAutopilot(); -// isRestartAutopilot = true; } } @@ -168,75 +159,28 @@ public class BusPresenter extends Presenter } @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - int state = autopilotStatusInfo.getState(); -// CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChange: " + state + "currentAutopilotStatus = " + currentAutopilotStatus); + public void onAutopilotStatusResponse(int state) { switch (state) { case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE: - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - // 设置UI【自动驾驶】按钮是否展示 - runOnUIThread(() -> mView.onAutopilotEnableChange(true)); - } - if (FunctionBuildConfig.isDemoMode - && ( - (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1) - && OrderModel.getInstance().isGoingToNextStation() - ) - ) { - CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); - return; - } - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE; - } - // 改变UI自动驾驶状态 - runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); - break; - case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING: - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING; - OrderModel.getInstance().triggerStartServiceEvent( - OrderModel.getInstance().isRestartAutopilot(), true); - } - // 改变UI自动驾驶状态 - runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); - break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE: - if (FunctionBuildConfig.isDemoMode - && ( - (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1) - && OrderModel.getInstance().isGoingToNextStation() - - ) - ) { - CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); - return; - } - - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE; - } - runOnUIThread(() -> { - mView.onAutopilotStatusChanged(currentAutopilotStatus); - }); - break; case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING: if (FunctionBuildConfig.isDemoMode && ( (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1) && OrderModel.getInstance().isGoingToNextStation() - ) ) { CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); return; } - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) { - currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING; - } - runOnUIThread(() -> { - mView.onAutopilotStatusChanged(currentAutopilotStatus); - }); + // 改变UI自动驾驶状态 + runOnUIThread(() -> mView.onAutopilotStatusChanged(state)); + break; + case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING: + OrderModel.getInstance().triggerStartServiceEvent( + OrderModel.getInstance().isRestartAutopilot(), true); + // 改变UI自动驾驶状态 + runOnUIThread(() -> mView.onAutopilotStatusChanged(state)); break; default: runOnUIThread(() -> mView.onAutopilotEnableChange(false)); @@ -275,13 +219,9 @@ public class BusPresenter extends Presenter /** * 测试使用 - * - * @param status */ public void debugAutoPilotStatus(int status) { - AutopilotStatusInfo info = new AutopilotStatusInfo(); - info.setState(status); - onAutopilotStatusResponse(info); + onAutopilotStatusResponse(status); } @Override @@ -340,4 +280,13 @@ public class BusPresenter extends Presenter public void onStartAdasFailure() { runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus()); } + + @Override + public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { + } + + @Override + public void onAutopilotDockerInfo(@NonNull String dockerVersion) { + } + } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java index b37e399e18..947adbfc0c 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java @@ -50,13 +50,13 @@ public class BusAnalyticsManager { CallerLogger.INSTANCE.e( M_BUS + "triggerStartAutopilotFailureEvent", failMsg ); - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_CODE, failCode); mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_MSG, failMsg); } mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_RESULT - , CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == + , CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/SlidePanelView.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/SlidePanelView.java index f04edddbdb..e010f37a76 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/SlidePanelView.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/view/SlidePanelView.java @@ -54,6 +54,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(); } @@ -129,7 +130,7 @@ public class SlidePanelView extends View { textPaint.setShader(textGradient); textPaint.getFontMetrics(blockTextMetrics); int size = AutoSizeUtils.dp2px(getContext(), 120); - BitmapFactory.Options opts = new BitmapFactory.Options(); + BitmapFactory.Options opts = new BitmapFactory.Options(); //todo yakun 优化 opts.inDensity = (int) AutoSizeConfig.getInstance().getInitDensity(); bmBlock = BitmapFactory.decodeResource(getResources(), R.drawable.bus_base_slide_block,opts); bmBlock = Bitmap.createScaledBitmap(bmBlock, size, size, true); diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt index ce826a078e..dd5ffce344 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/model/CharterPassengerModel.kt @@ -10,11 +10,9 @@ import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLine import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat -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 -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilot @@ -28,11 +26,11 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P import com.mogo.eagle.core.utilcode.util.* import com.mogo.och.bus.passenger.R -import com.mogo.och.bus.passenger.bean.LoopInfo +import com.mogo.och.common.module.manager.loopmanager.LoopInfo import com.mogo.och.bus.passenger.bean.response.* import com.mogo.och.bus.passenger.callback.* import com.mogo.och.bus.passenger.constant.CharterPassengerConst -import com.mogo.och.bus.passenger.net.BusPassengerModelLoopManager +import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager import com.mogo.och.bus.passenger.net.BusPassengerServiceManager import com.mogo.och.bus.passenger.utils.ToastCharterUtils import com.mogo.och.bus.passenger.utils.VoiceFocusManager @@ -78,7 +76,8 @@ object CharterPassengerModel { private var mContext: Context = AbsMogoApplication.getApp() //Model->Presenter:自动驾驶状态相关 - var mAutoStatusChnageListener = ConcurrentHashMap() + var mAutoStatusChnageListener = + ConcurrentHashMap() // 定位监听 private val mControllerStatusCallbackMap = @@ -111,17 +110,18 @@ object CharterPassengerModel { * 到站是否播报 key 线路id+业务 value 是否播报 * */ - private var broadcastList : MutableMap = HashMap() + private var broadcastList: MutableMap = HashMap() + // 到站仅一次 private val endKey = "arrivedLine" private val endKeyRequestIng = "arrivedLineRequestIng" private val ending100Key = "arrivingLine" private val min5Speak = "min5Speak" - private var carTypeChageListener: IOrderChangeCallback?=null + private var carTypeChageListener: IOrderChangeCallback? = null - private var subscribeCountDown: Disposable?=null - var switchLine5minWait: Disposable?=null + private var subscribeCountDown: Disposable? = null + var switchLine5minWait: Disposable? = null @Volatile var newCheckedSite: SiteInfoResponse.SiteInfo? = null @@ -148,7 +148,7 @@ object CharterPassengerModel { // 自动驾驶状态变化监听 CallerAutoPilotStatusListenerManager.addListener(TAG, mGoAutopilotStatusListener) // 定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 4 ,mMapLocationListener) + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 4, mMapLocationListener) // 自动驾驶路线规划接口 返回自动驾驶轨迹 CallerPlanningRottingListenerManager.addListener(TAG, moGoAutopilotPlanningListener) // 登录状态监听 @@ -164,6 +164,7 @@ object CharterPassengerModel { } mControllerStatusCallbackMap[tag] = callback } + fun setAutoStatusCallback(tag: String, callback: ICharterPassengerAutoStatusChangeCallback?) { if (tag.isBlank()) return if (callback == null) { @@ -214,24 +215,17 @@ object CharterPassengerModel { } } - // 前一个自动驾驶状体 - @Volatile - private var mPreAutoStatus = -1 - // 自动驾驶状态监听 private val mGoAutopilotStatusListener: IMoGoAutopilotStatusListener = object : IMoGoAutopilotStatusListener { - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - val state = autoPilotStatusInfo.state - if(mPreAutoStatus!=state){ - mPreAutoStatus = state - mAutoStatusChnageListener.forEach { - it.value.onAutoStatusChange(state) - } + override fun onAutopilotStatusResponse(state: Int) { + mAutoStatusChnageListener.forEach { + it.value.onAutoStatusChange(state) } } + override fun onAutopilotArriveAtStation(arrivalNotification: MessagePad.ArrivalNotification?) { - CallerLogger.d(M_BUS_P + TAG,"底盘给到站信息") + CallerLogger.d(M_BUS_P + TAG, "底盘给到站信息") arriveDest() } } @@ -255,17 +249,21 @@ object CharterPassengerModel { } } - fun updateRoutePoints(routePoints: List?) { + fun updateRoutePoints(routePoints: List) { mRoutePoints = null val latLngModels = CoordinateCalculateRouteUtil .coordinateConverterWgsToGcjLocations(mContext, routePoints) mRoutePoints = latLngModels } - fun cleanRoutePoints(){ + + fun cleanRoutePoints() { mRoutePoints = null } - fun setStatusChangeListener(tag:String,orderStatusChangeListener: IOrderStatusChangeListener?) { + fun setStatusChangeListener( + tag: String, + orderStatusChangeListener: IOrderStatusChangeListener? + ) { if (tag.isBlank()) return if (orderStatusChangeListener == null) { orderStatusChangeListeners.remove(tag) @@ -273,7 +271,8 @@ object CharterPassengerModel { } orderStatusChangeListeners[tag] = orderStatusChangeListener } - fun setStationDistanceListener(tag:String,orderStatusChangeListener: IDistanceCallback?) { + + fun setStationDistanceListener(tag: String, orderStatusChangeListener: IDistanceCallback?) { if (tag.isBlank()) return if (orderStatusChangeListener == null) { stationDistanceListener.remove(tag) @@ -281,7 +280,8 @@ object CharterPassengerModel { } stationDistanceListener[tag] = orderStatusChangeListener } - fun setOrderLeftTimeListeners(tag:String,orderStatusChangeListener: ITimeCallback?) { + + fun setOrderLeftTimeListeners(tag: String, orderStatusChangeListener: ITimeCallback?) { if (tag.isBlank()) return if (orderStatusChangeListener == null) { orderLeftTimeListeners.remove(tag) @@ -292,14 +292,15 @@ object CharterPassengerModel { orderStatusChangeListener.setOrderTimeCallBack(leftTime) } - fun setCarTypeChangeListener(carTypeChageListener: IOrderChangeCallback?){ + fun setCarTypeChangeListener(carTypeChageListener: IOrderChangeCallback?) { this.carTypeChageListener = carTypeChageListener } fun getCurrentOrderStatus(): OrderStatusEnum { return this.orderStatus } - fun getCurrentOrderInfo():OrderInfoResponse.OrderInfo?{ + + fun getCurrentOrderInfo(): OrderInfoResponse.OrderInfo? { return orderInfo } // endregion @@ -358,13 +359,13 @@ object CharterPassengerModel { BusPassengerServiceManager.queryOrderInfo( mContext, object : OchCommonServiceCallback { override fun onSuccess(data: OrderInfoResponse?) { - CallerLogger.d(M_BUS_P+TAG,"订单信息:$data") - if (data?.data == null){ - if(orderInfo!=null){ + CallerLogger.d(M_BUS_P + TAG, "订单信息:$data") + if (data?.data == null) { + if (orderInfo != null) { // 启动车辆服务状态 startCarStatusLoop() } - }else { + } else { // 判断是否有订单 ordrLagic(data.data) } @@ -383,21 +384,26 @@ object CharterPassengerModel { // 有订单有线路后结束轮训 orderData.let { order -> //设置车模 - if (this.orderInfo?.productType!=orderData.productType) { + if (this.orderInfo?.productType != orderData.productType) { this.carTypeChageListener?.setCarChangeListener(orderData.productType) - CallerLogger.d(M_BUS_P+TAG,"设置车模") + CallerLogger.d(M_BUS_P + TAG, "设置车模") } - if(this.orderInfo?.siteId!=orderData.siteId){ + if (this.orderInfo?.siteId != orderData.siteId) { val coordinateConverterWgsToGcj = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( mContext, order.wgs84Lon!!, order.wgs84Lat!! ) - this.carTypeChageListener?.setEndStationCallBack(order.siteId,order.siteName,coordinateConverterWgsToGcj.longitude,coordinateConverterWgsToGcj.latitude) + this.carTypeChageListener?.setEndStationCallBack( + order.siteId, + order.siteName, + coordinateConverterWgsToGcj.longitude, + coordinateConverterWgsToGcj.latitude + ) } this.orderInfo?.orderNo?.let { - if(it!=orderData.orderNo){ + if (it != orderData.orderNo) { // orderNo 变后清理 SharedPrefs.getInstance(mContext).remove("${it}$min5Speak") } @@ -414,7 +420,7 @@ object CharterPassengerModel { this.orderInfo = orderData setOrderStatus(OrderStatusEnum.OrdersWithLine) updateAutopilotControlParameters() - }else{ + } else { this.orderInfo = orderData } //计算终点距离 @@ -434,7 +440,7 @@ object CharterPassengerModel { ) // 小于15m到站 if (calculateLineDistance < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE && calculateLineDistance > 0) { - CallerLogger.d(M_BUS_P + TAG,"小于15米到站1") + CallerLogger.d(M_BUS_P + TAG, "小于15米到站1") arriveDest() } if (calculateLineDistance < CharterPassengerConst.ARRIVE_SOON_AT_START_STATION_DISTANCE && calculateLineDistance > 0) { @@ -451,7 +457,7 @@ object CharterPassengerModel { fun hasSetLineAndSite(): Pair? { orderInfo?.let { if (it.lineId != null && it.lineId > 0 && it.siteId != null && it.siteId!! > 0) { - if(it.arriveStatus==OrderInfoResponse.ARRIVED){ + if (it.arriveStatus == OrderInfoResponse.ARRIVED) { return null } val lineInfo = LineInfoResponse.LineInfo(it.lineName, it.lineId) @@ -472,7 +478,8 @@ object CharterPassengerModel { } return null } - fun hasOrder():Boolean{ + + fun hasOrder(): Boolean { return orderInfo != null } // endregion @@ -543,7 +550,7 @@ object CharterPassengerModel { private fun startCalibrationLoop() { BusPassengerModelLoopManager.setLoopFunction( TAGCALIBRATION, - LoopInfo(120, ::queryBusinessTime,immediately = true) + LoopInfo(120, ::queryBusinessTime, immediately = true) ) CallerLogger.d(M_BUS_P + TAG, "启动时间校准轮询") } @@ -573,42 +580,43 @@ object CharterPassengerModel { } val leadTime = endlast / 1000 subscribeCountDown = - Observable.intervalRange(0L, leadTime, 0, 5, TimeUnit.SECONDS) - .map { aLong -> leadTime - aLong } - .subscribeOn(Schedulers.io()) - .observeOn(Schedulers.io()) - .subscribe{millisUntilFinished-> - if (millisUntilFinished <= 300L) { - orderInfo?.let { - val isPlayed = SharedPrefs.getInstance(mContext) - .getBoolean("${it.orderNo}$min5Speak", false) - if (!isPlayed) { - //发送 通知 - OCHSocketMessageManager.pushAppOperationalMsgBox( - DateTimeUtil.getCurrentTimeStamp(), - AbsMogoApplication.getApp() - .getString(R.string.m1_end_order_5min), 2 - ) - VoiceManager.surplus5min(VoiceFocusManager.getVoiceCmdCallBack()) - CallerLogger.d(M_BUS_P+ TAG,"倒计时5分钟${it.orderNo}") - SharedPrefs.getInstance(mContext).putBoolean("${it.orderNo}$min5Speak",true) + Observable.intervalRange(0L, leadTime, 0, 5, TimeUnit.SECONDS) + .map { aLong -> leadTime - aLong } + .subscribeOn(Schedulers.io()) + .observeOn(Schedulers.io()) + .subscribe { millisUntilFinished -> + if (millisUntilFinished <= 300L) { + orderInfo?.let { + val isPlayed = SharedPrefs.getInstance(mContext) + .getBoolean("${it.orderNo}$min5Speak", false) + if (!isPlayed) { + //发送 通知 + OCHSocketMessageManager.pushAppOperationalMsgBox( + DateTimeUtil.getCurrentTimeStamp(), + AbsMogoApplication.getApp() + .getString(R.string.m1_end_order_5min), 2 + ) + VoiceManager.surplus5min(VoiceFocusManager.getVoiceCmdCallBack()) + CallerLogger.d(M_BUS_P + TAG, "倒计时5分钟${it.orderNo}") + SharedPrefs.getInstance(mContext) + .putBoolean("${it.orderNo}$min5Speak", true) + } } } - } - if(orderInfo==null){ - subscribeCountDown?.let { - if (!it.isDisposed) { - it.dispose() + if (orderInfo == null) { + subscribeCountDown?.let { + if (!it.isDisposed) { + it.dispose() + } } + invokeOrderLeftTimeListeners(-1) + invokeStationDistanceListener(-1, -1) + } else { + invokeOrderLeftTimeListeners(millisUntilFinished) } - invokeOrderLeftTimeListeners(-1) - invokeStationDistanceListener(-1,-1) - }else{ - invokeOrderLeftTimeListeners(millisUntilFinished) + CallerLogger.d(M_BUS_P + TAG, "订单倒计时${millisUntilFinished}") } - CallerLogger.d(M_BUS_P + TAG, "订单倒计时${millisUntilFinished}") - } } } @@ -628,9 +636,12 @@ object CharterPassengerModel { //设置全局轨迹信息 locusInfo = data.data - CallerLogger.d(M_BUS_P+TAG,"查询自动驾驶轨迹信息") - CallerLogger.d(M_BUS_P+TAG,GsonUtil.jsonFromObject( - locusInfo)) + CallerLogger.d(M_BUS_P + TAG, "查询自动驾驶轨迹信息") + CallerLogger.d( + M_BUS_P + TAG, GsonUtil.jsonFromObject( + locusInfo + ) + ) } override fun onFail(code: Int, msg: String) { @@ -668,15 +679,15 @@ object CharterPassengerModel { mLocationGCJ02?.let { orderInfo?.let { order -> CallerLogger.d(M_BUS_P + "calculateDistance", "订单信息:$order") - if(order.siteId==null||order.siteId==0L|| - order.wgs84Lat==null||order.wgs84Lat==0.0|| - order.wgs84Lon==null||order.wgs84Lon==0.0 - ){ + if (order.siteId == null || order.siteId == 0L || + order.wgs84Lat == null || order.wgs84Lat == 0.0 || + order.wgs84Lon == null || order.wgs84Lon == 0.0 + ) { CallerLogger.d(M_BUS_P + "calculateDistance", "站点信息未获得") return } newCheckedSite?.let { - if(it.siteId!=order.siteId){ + if (it.siteId != order.siteId) { CallerLogger.d(M_BUS_P + "calculateDistance", "站点和已选不吻合") return } @@ -700,46 +711,52 @@ object CharterPassengerModel { mogoLocation.latitude ) CallerLogger.d(M_BUS_P + "calculateDistance", "两点距离和站点的直线距离:${lastSumLength}") - if(lastSumLength>100) { - if (mRoutePoints==null||mRoutePoints?.size == 0){ + if (lastSumLength > 100) { + if (mRoutePoints == null || mRoutePoints?.size == 0) { //ToastCharterUtils.showLong("缺少轨迹数据暂停计算") - CallerLogger.d(M_BUS_P + "calculateDistance两点距离", + CallerLogger.d( + M_BUS_P + "calculateDistance两点距离", "缺少轨迹数据" ) return } // 计算距离 - val templastSumLength = + val templastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength( mRoutePoints, it, mogoLocation ) - CallerLogger.d(M_BUS_P + TAG, "使用轨迹轨迹:${mRoutePoints?.size}--第一个点${mRoutePoints!![0]}--最后一个点:${mRoutePoints!!.last()}") + CallerLogger.d( + M_BUS_P + TAG, + "使用轨迹轨迹:${mRoutePoints?.size}--第一个点${mRoutePoints!![0]}--最后一个点:${mRoutePoints!!.last()}" + ) CallerLogger.d(M_BUS_P + "calculateDistance", "轨迹计算的距离$templastSumLength") - if(templastSumLength>100){ + if (templastSumLength > 100) { lastSumLength = templastSumLength } } - val lastTime: Double = lastSumLength / CharterPassengerConst.Charter_AVERAGE_SPEED * 3.6 //秒 + val lastTime: Double = + lastSumLength / CharterPassengerConst.Charter_AVERAGE_SPEED * 3.6 //秒 - CallerLogger.d(M_BUS_P + "calculateDistance", + CallerLogger.d( + M_BUS_P + "calculateDistance", "最终信息:lastSumLength: ${lastSumLength}lastTime : $lastTime thread = ${Thread.currentThread().name}" ) - if (lastSumLength < CharterPassengerConst.ARRIVE_SOON_AT_START_STATION_DISTANCE&&lastSumLength>0) { - CallerLogger.d(M_BUS_P + TAG,"小于100米到站2") + if (lastSumLength < CharterPassengerConst.ARRIVE_SOON_AT_START_STATION_DISTANCE && lastSumLength > 0) { + CallerLogger.d(M_BUS_P + TAG, "小于100米到站2") arriveDestSoon() } - if (lastSumLength < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE&&lastSumLength>0) { - CallerLogger.d(M_BUS_P + TAG,"小于15米到站2") + if (lastSumLength < CharterPassengerConst.ARRIVE_AT_START_STATION_DISTANCE && lastSumLength > 0) { + CallerLogger.d(M_BUS_P + TAG, "小于15米到站2") arriveDest() return } - if(order.arriveStatus==OrderInfoResponse.ARRIVING) { + if (order.arriveStatus == OrderInfoResponse.ARRIVING) { invokeStationDistanceListener(lastSumLength.toLong(), lastTime.toLong()) - }else{ - invokeStationDistanceListener(-1,-1) + } else { + invokeStationDistanceListener(-1, -1) } } } @@ -749,7 +766,7 @@ object CharterPassengerModel { private fun setOrderStatus(orderStatus: OrderStatusEnum) { if (this.orderStatus != orderStatus) { - CallerLogger.d(M_BUS_P + TAG,"${this.orderInfo?.orderNo}新的状态:$orderStatus") + CallerLogger.d(M_BUS_P + TAG, "${this.orderInfo?.orderNo}新的状态:$orderStatus") this.orderStatus = orderStatus for (callback in orderStatusChangeListeners.values) { callback.onStatusChange(this.orderStatus) @@ -757,10 +774,10 @@ object CharterPassengerModel { } } - fun setEndOrderStatus(){ + fun setEndOrderStatus() { UiThreadHandler.postDelayed({ setOrderStatus(OrderStatusEnum.NoOrderUse) - },1000) + }, 1000) } /** @@ -787,16 +804,16 @@ object CharterPassengerModel { val calculateLineDistanceNext = CoordinateUtils.calculateLineDistance( currentInfo.longitude, currentInfo.latitude, - data[index+1].GcjLon!!, - data[index+1].GcjLat!! + data[index + 1].GcjLon!!, + data[index + 1].GcjLat!! ) - if(calculateLineDistanceNext= 2) { @@ -816,7 +833,7 @@ object CharterPassengerModel { middle = mutableEntry.value break } - if(middle==0){ + if (middle == 0) { return Pair(1, false) } mLocationGCJ02?.let { @@ -825,7 +842,7 @@ object CharterPassengerModel { // middle middle+1 // middle-1 middle-2 // middle+1 middle+2 - if(middle-1>=0) { + if (middle - 1 >= 0) { val degree = CoordinateCalculateRouteUtil.getDegree( it.longitude, it.latitude, data.get(middle).GcjLon!!, data.get(middle).GcjLat!!, @@ -835,17 +852,17 @@ object CharterPassengerModel { return Pair(middle, false) } } - if(middle+1 90) { - return Pair(middle+1, false) + return Pair(middle + 1, false) } } - if(middle-2>=0) { + if (middle - 2 >= 0) { val degree = CoordinateCalculateRouteUtil.getDegree( it.longitude, it.latitude, data.get(middle - 1).GcjLon!!, data.get(middle - 1).GcjLat!!, @@ -855,11 +872,11 @@ object CharterPassengerModel { return Pair(middle - 1, false) } } - if(middle+2 90) { return Pair(middle + 2, false) @@ -877,21 +894,29 @@ object CharterPassengerModel { BusPassengerServiceManager.endOrder(mContext, it, callback) } } - fun getLineTrajectory(lineId: Long,callback: OchCommonServiceCallback?) { + + fun getLineTrajectory(lineId: Long, callback: OchCommonServiceCallback?) { BusPassengerServiceManager.queryLineLocation(mContext, lineId = lineId.toString(), callback) } @Synchronized fun arriveDest() { val (order, lineId, siteId) = getOrderInfo() - if(order!=null&&lineId!=null&&siteId!=null){ + if (order != null && lineId != null && siteId != null) { val requestSuccessSign = "${siteId}$endKey" val requestIngSign = "${siteId}$endKeyRequestIng"//正在请求中 - CallerLogger.d(M_BUS_P + BaseDPMsg.TAG, - "requestSuccessSign${isSuccess(requestSuccessSign)}---requestIngSign${isSuccess(requestIngSign)}") + CallerLogger.d( + M_BUS_P + BaseDPMsg.TAG, + "requestSuccessSign${isSuccess(requestSuccessSign)}---requestIngSign${ + isSuccess( + requestIngSign + ) + }" + ) if (order.arriveStatus == OrderInfoResponse.ARRIVING) { - if (isSuccess(requestSuccessSign)&&//true 请求还没有成功 false 请求成功 - isSuccess(requestIngSign)) {// true 还没有正在请求 false 正在请求中 + if (isSuccess(requestSuccessSign) &&//true 请求还没有成功 false 请求成功 + isSuccess(requestIngSign) + ) {// true 还没有正在请求 false 正在请求中 val currentTimeStamp = DateTimeUtil.getCurrentTimeStamp() broadcastList[requestIngSign] = true //正在请求中 BusPassengerServiceManager.arriveDest( @@ -899,23 +924,23 @@ object CharterPassengerModel { lindId = lineId, writtenVersion = currentTimeStamp, object : OchCommonServiceCallback { - override fun onSuccess(data: BaseData?) { - if (null != data && 0 == data.code) { - arrivedDeskSuccess(currentTimeStamp,true) - broadcastList[requestIngSign] = false - } - } - - override fun onFail(code: Int, msg: String) { - ToastCharterUtils.showShort("$code:$msg") + override fun onSuccess(data: BaseData?) { + if (null != data && 0 == data.code) { + arrivedDeskSuccess(currentTimeStamp, true) broadcastList[requestIngSign] = false } + } - override fun onError() { - super.onError() - broadcastList[requestIngSign] = false - } - }) + override fun onFail(code: Int, msg: String) { + ToastCharterUtils.showShort("$code:$msg") + broadcastList[requestIngSign] = false + } + + override fun onError() { + super.onError() + broadcastList[requestIngSign] = false + } + }) } } } @@ -923,16 +948,16 @@ object CharterPassengerModel { fun arrivedDeskSuccess( currentTimeStamp: Long, - needSendDriver:Boolean + needSendDriver: Boolean ) { val (order, lineId, siteId) = getOrderInfo() val requestSuccessSign = "${siteId}$endKey" - if (!isSuccess(requestSuccessSign)){ + if (!isSuccess(requestSuccessSign)) { return } - if(order!=null&&lineId!=null&&siteId!=null){ + if (order != null && lineId != null && siteId != null) { VoiceManager.arrivedStation( order.siteName!!, order.siteNameKr ?: "", @@ -949,7 +974,7 @@ object CharterPassengerModel { order.startSiteId ?: 0, order.startSiteName ?: "", siteId.toInt(), - order.siteName?:"", + order.siteName ?: "", true, OrderInfoResponse.ARRIVED, currentTimeStamp @@ -973,15 +998,15 @@ object CharterPassengerModel { } } - private fun getOrderInfo():Triple{ - this.orderInfo?.let { order-> + private fun getOrderInfo(): Triple { + this.orderInfo?.let { order -> this.orderInfo?.lineId?.let { lineId -> this.orderInfo?.siteId?.let { siteId -> - return Triple(order,lineId,siteId) + return Triple(order, lineId, siteId) } } } - return Triple(null,null,null) + return Triple(null, null, null) } @Synchronized @@ -990,7 +1015,8 @@ object CharterPassengerModel { order.siteId?.let { siteId -> if (order.arriveStatus == OrderInfoResponse.ARRIVING) { if (isSuccess("${siteId}$ending100Key")) { - val string = mContext.getString(R.string.arrived_station_left_100,order.siteName) + val string = + mContext.getString(R.string.arrived_station_left_100, order.siteName) VoiceNotice.showNotice(string) broadcastList["${siteId}$ending100Key"] = true } @@ -1026,8 +1052,12 @@ object CharterPassengerModel { } fun leaveStation() { - orderInfo?.siteName?.let {cn-> - VoiceManager.leaveStation(cn,orderInfo?.siteNameKr?:"", VoiceFocusManager.getVoiceCmdCallBack()) + orderInfo?.siteName?.let { cn -> + VoiceManager.leaveStation( + cn, + orderInfo?.siteNameKr ?: "", + VoiceFocusManager.getVoiceCmdCallBack() + ) } } @@ -1051,14 +1081,17 @@ object CharterPassengerModel { return } orderInfo?.let { - if(it.arriveStatus==OrderInfoResponse.ARRIVED){ + if (it.arriveStatus == OrderInfoResponse.ARRIVED) { ToastCharterUtils.showLong("已到达目的地请重新选择线路") return } val parameters = initAutopilotControlParameters() if (null == parameters) { ToastCharterUtils.showShort("请选择站点") - CallerLogger.e(SceneConstant.M_BUS + TAG, "行程日志-AutopilotControlParameters is empty.") + CallerLogger.e( + SceneConstant.M_BUS + TAG, + "行程日志-AutopilotControlParameters is empty." + ) return } ToastCharterUtils.showShort("启动自动驾驶中") @@ -1119,12 +1152,14 @@ object CharterPassengerModel { fun sendTripInfo() { //发送前后屏出站消息 3:代表出站 orderInfo?.let { - CharterSendTripInfoManager.sendCharterTripInfo(LEAVE_STATION, - it.lineName!!,it.startSiteName!!,it.siteName!!,false) + CharterSendTripInfoManager.sendCharterTripInfo( + LEAVE_STATION, + it.lineName!!, it.startSiteName!!, it.siteName!!, false + ) } } - private fun invokeOrderLeftTimeListeners(timeInSecond: Long){ + private fun invokeOrderLeftTimeListeners(timeInSecond: Long) { leftTime = timeInSecond UiThreadHandler.post({ for (value in orderLeftTimeListeners.values) { @@ -1133,7 +1168,7 @@ object CharterPassengerModel { }, UiThreadHandler.MODE.QUEUE) } - private fun invokeStationDistanceListener(meters:Long , timeInSecond:Long){ + private fun invokeStationDistanceListener(meters: Long, timeInSecond: Long) { var tempMeters = meters var tempTimeInSecond = timeInSecond if (orderInfo?.arriveStatus == OrderInfoResponse.ARRIVED) { @@ -1142,7 +1177,7 @@ object CharterPassengerModel { } UiThreadHandler.post({ for (value in stationDistanceListener.values) { - value.setDistancecAndTime(tempMeters,tempTimeInSecond) + value.setDistancecAndTime(tempMeters, tempTimeInSecond) } }, UiThreadHandler.MODE.QUEUE) diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt index 89b6c2bcef..d7bd2cb1ac 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerFunctionOrderPresenter.kt @@ -9,11 +9,10 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02Lis import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.och.bus.passenger.utils.ToastCharterUtils -import com.mogo.och.bus.passenger.bean.LoopInfo +import com.mogo.och.common.module.manager.loopmanager.LoopInfo import com.mogo.och.bus.passenger.bean.event.EventLineSites import com.mogo.och.bus.passenger.bean.response.LineInfoListResponse import com.mogo.och.bus.passenger.bean.response.LineInfoResponse @@ -21,7 +20,7 @@ import com.mogo.och.bus.passenger.bean.response.SiteInfoResponse import com.mogo.och.bus.passenger.model.CharterPassengerModel import com.mogo.och.bus.passenger.model.IOrderStatusChangeListener import com.mogo.och.bus.passenger.model.OrderStatusEnum -import com.mogo.och.bus.passenger.net.BusPassengerModelLoopManager +import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager import com.mogo.och.bus.passenger.net.BusPassengerServiceManager import com.mogo.och.bus.passenger.ui.dialogfragment.fragment.M1OrderLineFragment import com.mogo.och.common.module.bean.dpmsg.BaseDPMsg @@ -185,7 +184,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : override fun onDestroy(owner: LifecycleOwner) { super.onDestroy(owner) - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "onDestroy") + CallerLogger.d(M_BUS_P + TAG, "onDestroy") RxUtils.disposeSubscribe(subscribeSelectLine) RxUtils.disposeSubscribe(subscribeSelectSite) BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) @@ -196,7 +195,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : /** * 接收司机屏反馈信息 */ - val msgReceived = object : IReceivedMsgListener { + private val msgReceived = object : IReceivedMsgListener { override fun onReceivedMsg(type: Int, byteArray: ByteArray) { UiThreadHandler.post { if (type == OchCommonConst.BUSINESS_STRING) { @@ -287,7 +286,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : ToastCharterUtils.showShort("断开和司机端连接、请联系安全员") BusPassengerModelLoopManager.removeLoopFunction(TAGLINELOOP) mView?.hideDataDriverRefuse() - CallerLogger.d(SceneConstant.M_BUS_P + TAG, "endAni666") + CallerLogger.d(M_BUS_P + TAG, "endAni666") } } @@ -316,7 +315,7 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : val gnssSpeed = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().gnssSpeed if (gnssSpeed < 0.5) { - when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) { + when (CallerAutoPilotStatusListenerManager.getState()) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 return true } @@ -325,13 +324,13 @@ class BusPassengerFunctionOrderPresenter(view: M1OrderLineFragment?) : } IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { // 自动驾驶中 - when (StopSideStatusManager.stopSiteStatus) { + return when (StopSideStatusManager.stopSiteStatus) { StopSideStatusManager.Status.EndingSuccess -> { - return true + true } else ->{ ToastCharterUtils.showShort("自动驾驶中无法切换线路") - return false + false } } } diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt index be25f6b913..a06052e277 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/presenter/BusPassengerPresenter.kt @@ -163,7 +163,7 @@ class BusPassengerPresenter(view: MainFragment?) : } OrderStatusEnum.OrdersWithLine -> {} OrderStatusEnum.NoOrderUse -> { - when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) { + when (CallerAutoPilotStatusListenerManager.getState()) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 ToastCharterUtils.showShort("设备未就绪请稍等,请安全员主动停止车辆") } diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt index 1409785af6..a3d1cde613 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/dialogfragment/M1ContainFragment.kt @@ -57,7 +57,7 @@ class M1ContainFragment : setStyle(STYLE_NO_TITLE, R.style.DialogFullScreen) //dialog全屏 } - private fun setCheckView() { + private fun setCheckView() { //todo yakun 优化 CallerLogger.d(M_BUS_P+ TAG, "setCheckView") when (tab) { VIDEOTAB -> { diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanage/CarouselLayoutManager.java b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanage/CarouselLayoutManager.java index c82d57dac4..334e0ede44 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanage/CarouselLayoutManager.java +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/layoutmanage/CarouselLayoutManager.java @@ -934,7 +934,7 @@ public class CarouselLayoutManager extends RecyclerView.LayoutManager implements } private CarouselSavedState(@NonNull final Parcel in) { - mSuperState = in.readParcelable(Parcelable.class.getClassLoader()); + mSuperState = in.readParcelable(RecyclerView.LayoutManager.class.getClassLoader()); mCenterItemPosition = in.readInt(); } diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/GoViewWithArrive.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/GoViewWithArrive.kt index a7ad0f56cd..bd02492dd7 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/GoViewWithArrive.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/GoViewWithArrive.kt @@ -82,7 +82,7 @@ class GoViewWithArrive @JvmOverloads constructor( ToastCharterUtils.showShort(string) return } - when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) { + when (CallerAutoPilotStatusListenerManager.getState()) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 ToastCharterUtils.showShort("设备未就绪请稍等") } @@ -122,7 +122,7 @@ class GoViewWithArrive @JvmOverloads constructor( }) RxUtils.disposeSubscribe(startAutoTimeOut) startAutoTimeOut = RxUtils.createSubscribe(20_000) { - if (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { + if (CallerAutoPilotStatusListenerManager.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { val string = AbsMogoApplication.getApp().getString(R.string.m1_start_auto_fail) ToastCharterUtils.showLong(string) } diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/StopSiteView.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/StopSiteView.kt index 444c35b3da..8266b48292 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/StopSiteView.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/ui/view/bottom/impl/StopSiteView.kt @@ -29,7 +29,7 @@ class StopSiteView @JvmOverloads constructor( } private fun stopSite(){ - when (CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state) { + when (CallerAutoPilotStatusListenerManager.getState()) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> {// 不可自动驾驶 ToastCharterUtils.showShort("设备未就绪请稍等,请稍后再试") } diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/view/statusbar/StatusBarView.kt b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/view/statusbar/StatusBarView.kt index df793fbdf9..0b82c76464 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/view/statusbar/StatusBarView.kt +++ b/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/view/statusbar/StatusBarView.kt @@ -9,7 +9,6 @@ import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import chassis.ChassisStatesOuterClass -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.autopilot.IMoGoBatteryManagementSystemListener @@ -25,7 +24,6 @@ import com.mogo.eagle.core.utilcode.util.ClickUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bus.passenger.R import com.mogo.och.bus.passenger.bean.event.DebugView -import com.mogo.och.bus.passenger.model.CharterPassengerModel import kotlinx.android.synthetic.main.m1_statusview_datetime.view.* import me.jessyan.autosize.utils.AutoSizeUtils import org.greenrobot.eventbus.EventBus @@ -47,8 +45,6 @@ class StatusBarView @JvmOverloads constructor( private var mHits = LongArray(COUNTS) - private var preStatus = -1 - private fun continuousClick(type:String) { //每次点击时,数组向前移动一位 System.arraycopy(mHits, 1, mHits, 0, mHits.size - 1) @@ -93,15 +89,11 @@ class StatusBarView @JvmOverloads constructor( progress.progress = 50 tv_power_cos.text = "50%" - val state = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state - setAutoPilotSatusInfo(state) + val state = CallerAutoPilotStatusListenerManager.getState() + setAutoPilotStatusInfo(state) } - private fun setAutoPilotSatusInfo(state: Int) { - if(preStatus==state){ - return - } - preStatus = state + private fun setAutoPilotStatusInfo(state: Int) { when (state) { IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE -> { actv_auto_status.text = "安全接管中" @@ -126,9 +118,9 @@ class StatusBarView @JvmOverloads constructor( } } - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { + override fun onAutopilotStatusResponse(state: Int) { UiThreadHandler.post { - setAutoPilotSatusInfo(autoPilotStatusInfo.state) + setAutoPilotStatusInfo(state) } } diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterAnalyticsManager.java b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterAnalyticsManager.java index 7418517a4d..0338c6f393 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterAnalyticsManager.java +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/manager/CharterAnalyticsManager.java @@ -49,13 +49,13 @@ public class CharterAnalyticsManager { CallerLogger.INSTANCE.e( M_BUS + "triggerStartAutopilotFailureEvent", failMsg ); - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ mStartAutopilotParams.put(CharterConst.EVENT_PARAM_START_FAILURE_CODE, failCode); mStartAutopilotParams.put(CharterConst.EVENT_PARAM_START_FAILURE_MSG, failMsg); } mStartAutopilotParams.put(CharterConst.EVENT_PARAM_START_RESULT - , CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == + , CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index 65ca0483fa..e77143325d 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -110,8 +110,7 @@ class DriverM1Model { fun init(context: Context) { mContext = context // 定位监听 - CallerChassisLocationGCJ02ListenerManager.addListener(TAG, mMapLocationListener) -// CallerChassisLocationGCJ02ListenerManager.setListenerHz(TAG,2) + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10,mMapLocationListener) //开启自驾后 异常信息返回 OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener) diff --git a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt index 2b13464cfd..085738af28 100644 --- a/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt +++ b/OCH/mogo-och-charter/src/driverm1/java/com/magic/mogo/och/charter/presenter/DriverM1Presenter.kt @@ -10,7 +10,6 @@ import com.magic.mogo.och.charter.fragment.DriverM1Fragment import com.magic.mogo.och.charter.manager.CharterTrajectoryManager import com.magic.mogo.och.charter.model.DriverM1Model import com.mogo.commons.mvp.Presenter -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.call.autopilot.CallerAutoPilotStatusListenerManager @@ -36,8 +35,9 @@ class DriverM1Presenter(view: DriverM1Fragment?) : IMoGoAutopilotStatusListener, StopSideStatusManager.OCHPlanningActionsCallback, IDriverM1ControllerStatusCallback { - private val TAG = DriverM1Presenter::class.java.name - private var mCurrentAutopilotStatus : Int = -1 + companion object{ + private const val TAG = "DriverM1Presenter" + } init { DriverM1Model.get().init(context) @@ -139,19 +139,14 @@ class DriverM1Presenter(view: DriverM1Fragment?) : DriverM1Model.get().onAutopilotArriveAtStation() } - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - val status = autoPilotStatusInfo.state - if (mCurrentAutopilotStatus == status) return - - mView?.onAutopilotStatusChanged(status) - mCurrentAutopilotStatus = status - when(status){ - + override fun onAutopilotStatusResponse(state: Int) { + mView?.onAutopilotStatusChanged(state) + when(state){ // IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE -> { // // // } IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ->{ - DriverM1Model.get().triggerStartServiceEvent(false,true) + DriverM1Model.get().triggerStartServiceEvent(isRestart = false, send = true) } // IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE ->{ // @@ -187,14 +182,12 @@ class DriverM1Presenter(view: DriverM1Fragment?) : } override fun startOpenAutopilot() { - mCurrentAutopilotStatus = -1 ThreadUtils.runOnUiThread { mView?.startAutopilotAnimation() } } override fun onStartAdasFailure() { - mCurrentAutopilotStatus = -1 ThreadUtils.runOnUiThread { mView?.stopAnimAndUpdateBtnStatus() } diff --git a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt index 0527ff1675..96bc9a4150 100644 --- a/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt +++ b/OCH/mogo-och-charter/src/main/java/com/magic/mogo/och/charter/base/CharterBaseFragment.kt @@ -17,7 +17,7 @@ import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.mvp.Presenter import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager.initAiCollect import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager.initBadCase @@ -126,7 +126,7 @@ abstract class CharterBaseFragment?>() : } }) initListener() - setAutopilotBtnStatus(getAutoPilotStatusInfo().state) + setAutopilotBtnStatus(getState()) ctvAutopilotStatus!!.setOnClickListener(object : OnPreventFastClickListener() { override fun onClickImpl(v: View) { restartAutopilot() @@ -394,7 +394,7 @@ abstract class CharterBaseFragment?>() : open fun stopAnimAndUpdateBtnStatus() { stopAutopilotAnimation() - updateAutopilotStatus(getAutoPilotStatusInfo().state) + updateAutopilotStatus(getState()) } @@ -453,7 +453,7 @@ abstract class CharterBaseFragment?>() : //未启动成功做处理 if (isAnimateRunning) { // 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态 stopAutopilotAnimation() - updateAutopilotStatus(getAutoPilotStatusInfo().state) + updateAutopilotStatus(getState()) } }, CharterConst.TIMER_START_AUTOPILOT_INTERVAL) } diff --git a/OCH/mogo-och-common-module/src/debug/AndroidManifest.xml b/OCH/mogo-och-common-module/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..7d64112bb0 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/AndroidManifest.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/BizBroadcastReceiver.kt b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/BizBroadcastReceiver.kt new file mode 100644 index 0000000000..b33df5e396 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/BizBroadcastReceiver.kt @@ -0,0 +1,38 @@ +package com.mogo.och.common.module.debug + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant + +class BizBroadcastReceiver: BroadcastReceiver() { + + private var mContext: Context? = null + + companion object { + private const val TAG = "BizBroadcastReceiver" + // 类型 + private const val type = "type" + // 数据源 + private const val sourceFile = "path" + // 数据频率 默认1s一次 -1 发送一次 + private const val frequencyKey = "fre" + } + + override fun onReceive(context: Context, intent: Intent) { + try { + mContext = context + val type = intent.getStringExtra(type) + val frequency = intent.getIntExtra(frequencyKey,1) + val sourceFilePath = intent.getStringExtra(sourceFile) + CallerLogger.d("${SceneConstant.M_OCHCOMMON}${TAG}", + "类型:${type} 频率:${frequency} 命令所在文件:${sourceFilePath}" + ) + DebugDataDispatch.disPathc(type,frequency,sourceFilePath) + } catch (e: Exception) { + e.printStackTrace() + } + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt new file mode 100644 index 0000000000..ed7619f7b4 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt @@ -0,0 +1,125 @@ +package com.mogo.och.common.module.debug + +import android.os.Environment +import com.amap.api.maps.model.LatLng +import com.google.gson.reflect.TypeToken +import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +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.GsonUtils +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.och.common.module.debug.location.MogoLocationExit +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil +import mogo.telematics.pad.MessagePad +import java.io.BufferedReader +import java.io.File +import java.io.FileInputStream +import java.io.IOException +import java.io.InputStreamReader + +object DebugDataDispatch { + + const val TAG = "DebugDataDispatch" + + const val globalPathMock = "globalPath" + const val locationMock = "location" + + val ROOT_PATH = + Environment.getExternalStorageDirectory().absolutePath + File.separator + "MLog" + File.separator + "APPLog" + File.separator //程序外部存储跟目录 + + + fun disPathc(type: String?, frequency: Int, sourceFilePath: String?) { + when (type) { + globalPathMock -> { + sourceFilePath?.let { + loadRawPoints(ROOT_PATH+it) + } + } + locationMock -> { + sourceFilePath?.let { + getLocaitonByLog(ROOT_PATH+it) + } + } + else -> {} + } + } + + fun getLocaitonByLog(path:String) { + ThreadUtils.getIoPool().execute { + val inputStream = FileInputStream(path) + val reader = BufferedReader(InputStreamReader(inputStream)) + var line: String? = "" + try { + while (reader.readLine().also { line = it } != null) { + val list = GsonUtils.fromJson( + line.toString(), + object : TypeToken() {}.type + ) + val mogoLocation = MogoLocation() + mogoLocation.latitude = list.msg.GnssInfo.latitude + mogoLocation.longitude = list.msg.GnssInfo.longitude + mogoLocation.heading = list.msg.GnssInfo.heading + mogoLocation.gnssSpeed = list.msg.GnssInfo.gnssSpeed.toFloat() + CallerChassisLocationGCJ02ListenerManager.invokeChassisLocationGCJ02( + mogoLocation, + DataSourceType.OBU + ) + Thread.sleep(100) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + + fun loadRawPoints(path:String) { + val inputStream = FileInputStream(path) + val reader = BufferedReader(InputStreamReader(inputStream)) + val jsonStr = StringBuilder() + var line: String? = "" + try { + while (reader.readLine().also { line = it } != null) { + jsonStr.append(line) + } + } catch (e: IOException) { + e.printStackTrace() + } + val list = GsonUtils.fromJson>( + jsonStr.toString(), + object : TypeToken?>() {}.type + ) + val newBuilder = MessagePad.GlobalPathResp.newBuilder() + + for (latLng in list) { + val locationBuilder = MessagePad.Location.newBuilder() + locationBuilder.latitude = latLng.latitude + locationBuilder.longitude = latLng.longitude + newBuilder.addWayPoints(locationBuilder) + } + + val mogoLocation = MogoLocation() + + mogoLocation.latitude = list[0].latitude + mogoLocation.longitude = list[0].longitude + + val mogoSecondLocation = MogoLocation() + mogoSecondLocation.latitude = list[1].latitude + mogoSecondLocation.longitude = list[1].longitude + val angle = CoordinateCalculateRouteUtil.getHeadingAngle( + mogoLocation, + mogoSecondLocation + ) + mogoLocation.heading = angle + + CallerChassisLocationGCJ02ListenerManager.invokeChassisLocationGCJ02( + mogoLocation, + DataSourceType.OBU + ) + CallerLogger.d(SceneConstant.M_OCHCOMMON + TAG,"轨迹点个数:${list.size}") + // 发送轨迹 + CallerPlanningRottingListenerManager.invokeAutopilotRotting(newBuilder.build()) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/location/MogoLocationExit.kt b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/location/MogoLocationExit.kt new file mode 100644 index 0000000000..838e172b40 --- /dev/null +++ b/OCH/mogo-och-common-module/src/debug/java/com/mogo/och/common/module/debug/location/MogoLocationExit.kt @@ -0,0 +1,30 @@ +package com.mogo.och.common.module.debug.location + +data class MogoLocationExit( + val localTime: Long, + val msg: Msg +) +data class Msg( + val GnssInfo: GnssInfo, + val Header: Header, + val stringDate0: String +) + +data class Header( + val msgID: Int, + val msgType: String, + val sourceTimestamp: Double, + val timestamp: Double +) + +data class GnssInfo( + val acceleration: Double, + val altitude: Double, + val gnssSpeed: Double, + val heading: Double, + val latitude: Double, + val longitude: Double, + val satelliteTime: Double, + val systemTime: Double, + val yawRate: Double +) \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/DistanceDegree.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/DistanceDegree.kt new file mode 100644 index 0000000000..205510c9da --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/DistanceDegree.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.manager.distancemamager + +data class DistanceDegree(var distance:Float,var degree:Double?,var isNext:Boolean?):Comparable{ + override fun compareTo(other: DistanceDegree): Int { + // 对比距离 + if(distance == other.distance){ + return 0; + } else if(distance < other.distance){ + return -1; + } + return 1; + } +} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/IDistanceListener.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/IDistanceListener.kt new file mode 100644 index 0000000000..d199f69d5b --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/IDistanceListener.kt @@ -0,0 +1,38 @@ +package com.mogo.och.common.module.manager.distancemamager + +import com.mogo.eagle.core.data.map.MogoLocation + +interface IDistanceListener { + /** + * @param distance 距离终点坐标的距离 + */ + fun distanceCallback(distance: Float) +} + +interface ITrajectoryListener{ + /** + * @param routeArrivied 已经走过的坐标 + * @param routeArriving 没有走过的坐标 + * @param location 车的坐标 + * @return + */ + fun trajectoryCallback( + routeArrivied: MutableList, + routeArriving: MutableList, + location: MogoLocation + ) +} + +interface ITrajectoryWithStationListener{ + /** + * @param routeArrivied 已经走过的坐标 第一个是站点坐标 + * @param routeArriving 没有走过的坐标 最后一个事站点坐标 + * @param location 车的坐标 + * @return + */ + fun trajectoryWithStationCallback( + routeArrivied: MutableList, + routeArriving: MutableList, + location: MogoLocation + ) +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/StationAndIndex.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/StationAndIndex.kt new file mode 100644 index 0000000000..9b76dcc949 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/StationAndIndex.kt @@ -0,0 +1,10 @@ +package com.mogo.och.common.module.manager.distancemamager + +import com.mogo.eagle.core.data.map.MogoLocation + +data class StationAndIndex( + var stationPoint: MogoLocation?,// 站点坐标 + var index: Int?,// 坐标对应轨迹中最近的点 + var distance: Float?,//轨迹中最近的点 + var isNext:Boolean?,// 最近的点在轨迹中是在站点的下一个还是上一个 +) diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt new file mode 100644 index 0000000000..72a72bd85e --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/distancemamager/TrajectoryAndDistanceManager.kt @@ -0,0 +1,469 @@ +package com.mogo.och.common.module.manager.distancemamager + +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.och.common.module.manager.loopmanager.BusPassengerModelLoopManager +import com.mogo.och.common.module.manager.loopmanager.LoopInfo +import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil +import com.zhjt.service.chain.ChainLog +import mogo.telematics.pad.MessagePad +import java.util.concurrent.ConcurrentHashMap + +object TrajectoryAndDistanceManager: IMoGoPlanningRottingListener{ + + private val distanceListeners: ConcurrentHashMap = ConcurrentHashMap() + private val trajectoryListeners: ConcurrentHashMap = ConcurrentHashMap() + private val trajectoryWithStationListeners: ConcurrentHashMap = ConcurrentHashMap() + + const val TAG = "DistanceManager" + const val TAGDISTANCE = "BusPassengerModelDistance" + + + fun addDistanceListener(tag: String, listener: IDistanceListener) { + if (distanceListeners.containsKey(tag)) { return } + distanceListeners[tag] = listener + } + fun addTrajectoryListener(tag: String, listener: ITrajectoryListener) { + if (trajectoryListeners.containsKey(tag)) { return } + trajectoryListeners[tag] = listener + } + fun addTrajectoryWithStationListener(tag: String, listener: ITrajectoryWithStationListener) { + if (trajectoryWithStationListeners.containsKey(tag)) { return } + trajectoryWithStationListeners[tag] = listener + } + + /** + * 删除监听 + * @param tag 标记,用来注销监听使用 + */ + fun removeListener(tag: String) { + distanceListeners.remove(tag) + trajectoryListeners.remove(tag) + trajectoryWithStationListeners.remove(tag) + } + + + + @Volatile + private var mRoutePoints: MutableList? = ArrayList() + private var mRoutePointsDistance: MutableList? = ArrayList() + private var maxDistanceAllPoint:Double = 0.0 + + @Volatile + private var lineId:Long? = null + + @Volatile + private var endStationInfo: StationAndIndex = StationAndIndex(null, null, null, null) + + @Volatile + private var startStationInfo: StationAndIndex = StationAndIndex(null, null, null, null) + + //上一次计算最近点的缓存 + private var preCarLocationIndexInTrajectory = 0 + + // TODO: 计算整个轨迹的长度 + // TODO: 计算轨迹点之间的长度、及轨迹点间最大长度 + + init { + CallerPlanningRottingListenerManager.addListener(TAG, this) + } + + override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) { + d(M_OCHCOMMON + TAG, "onAutopilotRotting: 收到轨迹") + globalPathResp?.wayPointsList?.let { + if (it.size > 0) { + d(M_OCHCOMMON + TAG, "收到轨迹:${it.size}第一个点${it[0]}最后一个点:${it.last()}") + if(globalPathResp.lineId!=null) { + if (globalPathResp.lineId == lineId && !mRoutePoints.isNullOrEmpty()) { + d(M_OCHCOMMON + TAG, "重复轨迹") + startCalculateDistanceLoop() + return + } + this.lineId = globalPathResp.lineId + } + endCalculateDistanceLoop() + updateRoutePoints(it) + preCarLocationIndexInTrajectory = 0 + startCalculateDistanceLoop() + } + } + } + + private fun updateRoutePoints(routePoints: List?) { + mRoutePoints = null + mRoutePointsDistance = null + val latLngModels = CoordinateCalculateRouteUtil + .coordinateConverterWgsToGcjLocations(AbsMogoApplication.getApp(), routePoints!!) + mRoutePoints = latLngModels + + mRoutePointsDistance = ArrayList() + maxDistanceAllPoint = 0.0 + mRoutePoints?.forEachIndexed { index, current -> + if (mRoutePoints!!.last()!=current) { + val next = mRoutePoints!![index + 1] + val distanceItem = CoordinateUtils.calculateLineDistance( + current.longitude, + current.latitude, + next.longitude, + next.latitude + ) + mRoutePointsDistance?.add(distanceItem) + maxDistanceAllPoint += distanceItem + } + } + } + + private fun removeTempData() { + resetStation() + preCarLocationIndexInTrajectory = 0 + lineId = null + } + private fun resetStation() { + this.endStationInfo.index = null + this.endStationInfo.distance = null + this.endStationInfo.isNext = null + this.startStationInfo.index = null + this.startStationInfo.distance = null + this.startStationInfo.isNext = null + } + + fun cleanRoutePoints() { + mRoutePoints = null + mRoutePointsDistance = null + } + + /** + * 设置或清理站点坐标 + */ + fun setStationPoint(startStationInfo: MogoLocation?,endStationInfo: MogoLocation?,lineId:Long?) { + d(M_OCHCOMMON+ TAG,"线路id:${lineId}设置站点:开始站点${startStationInfo}、结束站点:${endStationInfo}") + if (startStationInfo == null || endStationInfo == null || lineId == -1L) { + removeTempData() + endCalculateDistanceLoop() + cleanRoutePoints() + this.endStationInfo.stationPoint = null + this.startStationInfo.stationPoint = null + this.lineId = null + }else{ + if(isSameStation(this.startStationInfo.stationPoint,startStationInfo)&& + isSameStation(this.endStationInfo.stationPoint,endStationInfo)){ + if(this.lineId!=lineId){ + resetStation() + } + }else{ + resetStation() + } + this.endStationInfo.stationPoint = endStationInfo + this.startStationInfo.stationPoint = startStationInfo + this.lineId = lineId + startCalculateDistanceLoop() + } + } + + private fun isSameStation(stationOne: MogoLocation?,stationTwo: MogoLocation?):Boolean{ + if(stationOne==null||stationTwo==null){ + return false + } + if(stationOne.longitude==stationTwo.longitude&&stationOne.latitude==stationTwo.latitude){ + return true + } + return false + } + + /** + * 根据两点距离和轨迹距离来计算真实距离 + */ + private fun calculateDistance() { + //mLocation gcj坐标 + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { + if (mRoutePoints.isNullOrEmpty() || endStationInfo.stationPoint == null) { + d(M_OCHCOMMON + TAG, "没有轨迹或站点坐标停止计算") + //结束距离计算 + endCalculateDistanceLoop() + return + } + if(it.latitude==0.0&&it.longitude==0.0){ + return + } + calculateRouteSumLength(it) + } + } + + /** + * 暂停路距计算 + */ + fun suspendCalculate(){ + endCalculateDistanceLoop() + } + + fun reStartCalculate(){ + startCalculateDistanceLoop() + } + + /** + * 启动路距计算 + */ + private fun startCalculateDistanceLoop() { + BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance)) + d(SceneConstant.M_BUS_P + TAG, "开始路距计算") + } + + /** + * 结束启动路距计算 + */ + private fun endCalculateDistanceLoop() { + BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE) + d(SceneConstant.M_BUS_P + TAG, "结束路距计算") + } + + + @Synchronized + fun calculateRouteSumLength( + location: MogoLocation, + ) { + val autoPilotState = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state + val locationInfo = "自动驾驶状态:$autoPilotState line信息:${lineId}定位信息:${location.latitude},${location.longitude},${location.heading}" + if (mRoutePoints.isNullOrEmpty()) return + // 计算起始站点在轨迹中的信息 这个是一个常量 + if (startStationInfo.stationPoint != null + && startStationInfo.isNext == null + && startStationInfo.index == null + && startStationInfo.distance == null + ) { + //要前往的站在轨迹中对应的点的信息 + val startStationInfo = CoordinateCalculateRouteUtil.getNearestPointInfo( + preCarLocationIndexInTrajectory, mRoutePoints!!.size,mRoutePoints!!, startStationInfo.stationPoint!!,1 + ) + this.startStationInfo.isNext = startStationInfo.second + this.startStationInfo.index = startStationInfo.first + this.startStationInfo.distance = startStationInfo.third + preCarLocationIndexInTrajectory = startStationInfo.first + val calculateData = "距离起始站点最近的点:${startStationInfo.first} 点在站的后面:${startStationInfo.second} 距离点的距离:${startStationInfo.third}" + writeLog(calculateData,locationInfo) + } + + // 计算结束站点在轨迹中的信息 这个是一个常量可以缓存 + if (endStationInfo.stationPoint != null + && endStationInfo.isNext == null + && endStationInfo.index == null + && endStationInfo.distance == null + ) { + //要前往的站在轨迹中对应的点 + val endStationInfo = CoordinateCalculateRouteUtil.getNearestPointInfo( + preCarLocationIndexInTrajectory,mRoutePoints!!.size, mRoutePoints!!, endStationInfo.stationPoint!!,3 + ) + this.endStationInfo.isNext = endStationInfo.second + this.endStationInfo.index = endStationInfo.first + this.endStationInfo.distance = endStationInfo.third + val calculateData = "距离结束站点最近的点:${endStationInfo.first} 点在站的后面:${endStationInfo.second} 距离点的距离:${endStationInfo.third}" + writeLog(calculateData, locationInfo) + } + + val carLocationInfo:Triple + if(endStationInfo.isNext==true){ + // 计算车的位置在轨迹中的信息 这个是一个变量可以缓存 + carLocationInfo = CoordinateCalculateRouteUtil.getNearestPointInfo( + preCarLocationIndexInTrajectory,endStationInfo.index!!, mRoutePoints!!, location,2 + ) + }else{ + carLocationInfo = CoordinateCalculateRouteUtil.getNearestPointInfo( + preCarLocationIndexInTrajectory,endStationInfo.index!!+1, mRoutePoints!!, location,2 + ) + } + val calculateData = "距离结束站点最近的点:${carLocationInfo.first} 点在站的后面:${carLocationInfo.second} 距离点的距离:${carLocationInfo.third}" + writeLog(calculateData, locationInfo) + if(carLocationInfo.second==null||carLocationInfo.third>1_000){ + preCarLocationIndexInTrajectory = 0 + return + } + + var maxDisatance = 0.0f + if(carLocationInfo.second==true){ + if(carLocationInfo.first>0) { + maxDisatance = mRoutePointsDistance?.get(carLocationInfo.first - 1)?:0f + } + }else{ + maxDisatance = mRoutePointsDistance?.get(carLocationInfo.first)?:0f + } + if(carLocationInfo.third>maxDisatance){ + preCarLocationIndexInTrajectory = 0 + writeLog("到点的距离${carLocationInfo.third},最大距离${maxDisatance}",locationInfo) + return + } + + preCarLocationIndexInTrajectory = carLocationInfo.first + + // 距离回调 + try { + if(distanceListeners.size>0) { + invokeDistance(carLocationInfo, location,locationInfo) + } + }catch (e:Exception){ + e(M_OCHCOMMON+ TAG,"距离计算错误") + } + // 不带站点轨迹回调 + try { + if(trajectoryListeners.size>0) { + invokeTrajectory(carLocationInfo, location) + } + }catch (e:Exception){ + e(M_OCHCOMMON+ TAG,"轨迹线(轨迹两头)计算错误") + } + + // 只展示站点之间轨迹 + try { + if(trajectoryWithStationListeners.size>0) { + invokeTrajectoryWithStation(carLocationInfo, location) + } + }catch (e:Exception){ + e(M_OCHCOMMON+ TAG,"轨迹线(站点两头)计算错误") + } + + } + + + private fun invokeDistance( + carLocationInfo: Triple, + location: MogoLocation, + locationInfo: String + ){ + var lastSumLength = 0f + + val stationIndex = endStationInfo.index?:0 + if (carLocationInfo.first < stationIndex-1) { + // subList 是[) 需要的是[] + val subList = mRoutePoints!!.subList(carLocationInfo.first, stationIndex + 1) + // 轨迹点所有的距离 + lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(subList) + val stationDistance = endStationInfo.distance ?: 0f + if (endStationInfo.isNext == true) {// isNext = true + lastSumLength -= stationDistance + } else {// isNext = false + lastSumLength += stationDistance + } + if (carLocationInfo.second == true) {// 是否是下一个 true 下一个 + lastSumLength += carLocationInfo.third + } else { + lastSumLength -= carLocationInfo.third + } + } else { + val lastPoints = endStationInfo.stationPoint + lastSumLength = CoordinateUtils.calculateLineDistance( + lastPoints!!.longitude, lastPoints!!.latitude, + location.longitude, location.latitude + ) + } + d(M_OCHCOMMON+ TAG,"距离终点:$lastSumLength") + if(lastSumLength>maxDistanceAllPoint){ + // 大于最大值需要需要删除此次计算 + writeLog("距离终点:$lastSumLength",locationInfo) + return + } + if(distanceListeners.size>0) { + distanceListeners.forEach { + //val tag = it.key + val listener = it.value + listener.distanceCallback(lastSumLength) + } + } + } + + private fun invokeTrajectory( + carLocationInfo: Triple, + location: MogoLocation + ) { + if (mRoutePoints.isNullOrEmpty()) return + val routeArrivied = mutableListOf() + val routeArriving = mutableListOf() + if(carLocationInfo.second==true){// isNext = true + routeArrivied.addAll(mRoutePoints!!.subList(0,carLocationInfo.first)) + routeArriving.addAll(mRoutePoints!!.subList(carLocationInfo.first,mRoutePoints!!.size)) + }else{// isNext = false + val indexNext = carLocationInfo.first+1 + routeArrivied.addAll(mRoutePoints!!.subList(0,indexNext)) + routeArriving.addAll(mRoutePoints!!.subList(indexNext,mRoutePoints!!.size)) + } + if(trajectoryListeners.size>0) { + trajectoryListeners.forEach { + //val tag = it.key + val listener = it.value + listener.trajectoryCallback(routeArrivied, routeArriving, location) + } + } + } + + private fun invokeTrajectoryWithStation( + carLocationInfo: Triple, + location: MogoLocation + ) { + if (mRoutePoints.isNullOrEmpty()) return + val routeArrivied = mutableListOf() + val routeArriving = mutableListOf() + var fromCut = 0 + var endCut = mRoutePoints!!.size + if (startStationInfo.stationPoint != null + && startStationInfo.isNext != null + && startStationInfo.index != null + && startStationInfo.distance != null + ) { + if(startStationInfo.isNext==true){ + fromCut = startStationInfo.index!! + }else{ + fromCut = startStationInfo.index!!+1 + } + } + + if (endStationInfo.stationPoint != null + && endStationInfo.isNext != null + && endStationInfo.index != null + && endStationInfo.distance != null + ) { + if(endStationInfo.isNext==true){ + endCut = endStationInfo.index!! + }else{ + endCut = endStationInfo.index!!+1 + } + } + d(M_OCHCOMMON+ TAG,"根据站点切个:第一个点:$fromCut 最后一个点$endCut") + if(carLocationInfo.second==true){// isNext = true + routeArrivied.addAll(mRoutePoints!!.subList(fromCut,carLocationInfo.first)) + routeArriving.addAll(mRoutePoints!!.subList(carLocationInfo.first,endCut)) + }else{// isNext = false + val indexNext = carLocationInfo.first+1 + routeArrivied.addAll(mRoutePoints!!.subList(fromCut,indexNext)) + routeArriving.addAll(mRoutePoints!!.subList(indexNext,endCut)) + } + + routeArrivied.add(0, startStationInfo.stationPoint!!) + routeArriving.add(endStationInfo.stationPoint!!) + if(trajectoryWithStationListeners.size>0) { + trajectoryWithStationListeners.forEach { + //val tag = it.key + val listener = it.value + listener.trajectoryWithStationCallback(routeArrivied, routeArriving, location) + } + } + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_OCH, + linkCode = ChainConstant.CHAIN_SOURCE_OCH, + nodeAliasCode = ChainConstant.CHAIN_CODE_OCH_COMMON_DISTANCE, + paramIndexes = [0,1] + ) + fun writeLog(carLocationInfo: String, location: String) { + d(M_OCHCOMMON+ TAG,carLocationInfo) + d(M_OCHCOMMON+ TAG,location) + } + +} \ No newline at end of file diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/net/BusPassengerModelLoopManager.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt similarity index 89% rename from OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/net/BusPassengerModelLoopManager.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt index a0b3b6a44f..aaacdf7319 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/net/BusPassengerModelLoopManager.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/BusPassengerModelLoopManager.kt @@ -1,9 +1,7 @@ -package com.mogo.och.bus.passenger.net +package com.mogo.och.common.module.manager.loopmanager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P -import com.mogo.och.bus.passenger.bean.LoopInfo -import com.mogo.och.bus.passenger.constant.CharterPassengerConst import com.mogo.och.common.module.utils.RxUtils import io.reactivex.Observable import io.reactivex.disposables.Disposable @@ -22,6 +20,9 @@ object BusPassengerModelLoopManager { private val mControllerStatusCallbackMap = ConcurrentHashMap() + const val LOOP_LINE_2S = 2 * 1000L + const val LOOP_LINE_1S = 1 * 1000L + const val LOOP_DELAY = 100L fun setLoopFunction(tag: String, function: LoopInfo) { if (tag.isBlank()) return @@ -56,10 +57,7 @@ object BusPassengerModelLoopManager { return } CallerLogger.i(M_BUS_P + TAG, "startQueryDriverLineLoop()") - mQueryLineDisposable = Observable.interval( - CharterPassengerConst.LOOP_DELAY, - CharterPassengerConst.LOOP_LINE_1S, TimeUnit.MILLISECONDS - ) + mQueryLineDisposable = Observable.interval(LOOP_DELAY, LOOP_LINE_1S, TimeUnit.MILLISECONDS) .map { aLong: Long -> aLong + 1 } .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) diff --git a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/bean/LoopInfo.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt similarity index 63% rename from OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/bean/LoopInfo.kt rename to OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt index 9092b0146a..88aba91287 100644 --- a/OCH/mogo-och-charter-passenger/src/main/java/com/mogo/och/bus/passenger/bean/LoopInfo.kt +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/manager/loopmanager/LoopInfo.kt @@ -1,3 +1,3 @@ -package com.mogo.och.bus.passenger.bean +package com.mogo.och.common.module.manager.loopmanager data class LoopInfo(val interval:Long,val function: () -> Unit,val immediately:Boolean=false) \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java index 513bfa6c34..df497db14a 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/AnimatorDrawableUtil.java @@ -34,6 +34,8 @@ public class AnimatorDrawableUtil { private ImageView mImageView = null; //图片资源的ID列表 private List mResourceIdList = null; + //图片bitmap列表 + private List mBitmapList = null; //定时任务器 private final Timer mTimer = new Timer(); //定时任务 @@ -54,10 +56,17 @@ public class AnimatorDrawableUtil { mImageView = imageview; if(mResourceIdList==null){ mResourceIdList = new ArrayList(); + mBitmapList = new ArrayList<>(); }else{ mResourceIdList.clear(); + mBitmapList.clear(); } mResourceIdList.addAll(resourceIdList); + + //在初始化时候就将资源文件decode + for (int i = 0; i <= resourceIdList.size()-1; i++){ + mBitmapList.add(readBitMap(mImageView.getContext(),resourceIdList.get(i))); + } } /** @@ -67,14 +76,19 @@ public class AnimatorDrawableUtil { this.mImageView = imageview; if(mResourceIdList==null){ mResourceIdList = new ArrayList(); + mBitmapList = new ArrayList<>(); }else{ mResourceIdList.clear(); + mBitmapList.clear(); } loadFromXml(context, resourceId, new OnParseListener() { @Override public void onParse(List res) { mResourceIdList.addAll(res); + for (int i = 0; i <= res.size()-1; i++){ + mBitmapList.add(readBitMap(mImageView.getContext(),res.get(i))); + } } }); } @@ -219,8 +233,13 @@ public class AnimatorDrawableUtil { case MSG_START: { if (mFrameIndex >= 0 && mFrameIndex < mResourceIdList.size() && mState == STATE_RUNNING) { //这里不能使用image.setImageResource 因为源码中也是创建了bitmap 所以这里我们自己创建 - Bitmap bitmap=readBitMap(mImageView.getContext(),mResourceIdList.get(mFrameIndex)); - mImageView.setImageBitmap(bitmap); + if (mBitmapList != null && mBitmapList.size()-1 >= mFrameIndex){ + Bitmap bitmap= mBitmapList.get(mFrameIndex); + mImageView.setImageBitmap(bitmap); + }else { + Bitmap bitmap=readBitMap(mImageView.getContext(),mResourceIdList.get(mFrameIndex)); + mImageView.setImageBitmap(bitmap); + } mFrameIndex++; } } diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java deleted file mode 100644 index c4c38034c1..0000000000 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.java +++ /dev/null @@ -1,504 +0,0 @@ -package com.mogo.och.common.module.utils; - -import android.content.Context; -import android.location.Location; - -import com.amap.api.maps.CoordinateConverter; -import com.amap.api.maps.model.LatLng; -import com.mogo.eagle.core.data.map.MogoLocation; -import com.mogo.eagle.core.utilcode.mogo.logger.Logger; -import com.mogo.eagle.core.utilcode.util.CoordinateUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import kotlin.Triple; -import mogo.telematics.pad.MessagePad; - -/** - * @author: wangmingjun - * @date: 2022/3/28 - */ -public class CoordinateCalculateRouteUtil { - - public static float calculateRouteSumLength(List points){ - if (null == points || points.size() == 0) return 0; - - float sumLength = 0; - - if (points.get(0) instanceof MogoLocation){ - //计算全路径总距离 - for (int i = 0;i + 1< points.size();i++){ - MogoLocation locationPre = (MogoLocation) points.get(i); - MogoLocation location = (MogoLocation) points.get(i+1); - double preLat = locationPre.getLatitude(); - double preLon = locationPre.getLongitude(); - double laLat = location.getLatitude(); - double laLon = location.getLongitude(); - - float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); - sumLength += length; - } - }else if (points.get(0) instanceof Location){ - //计算全路径总距离 - for (int i = 0;i + 1< points.size();i++){ - Location locationPre = (Location) points.get(i); - Location location = (Location) points.get(i+1); - double preLat = locationPre.getLatitude(); - double preLon = locationPre.getLongitude(); - double laLat = location.getLatitude(); - double laLon = location.getLongitude(); - - float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); - sumLength += length; - } - }else if (points.get(0) instanceof LatLng){ - for (int i = 0;i + 1< points.size();i++){ - LatLng locationPre = (LatLng) points.get(i); - LatLng location = (LatLng) points.get(i+1); - double preLat = locationPre.latitude; - double preLon = locationPre.longitude; - double laLat = location.latitude; - double laLon = location.longitude; - - float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); - sumLength += length; - } - } - return sumLength; - } - - public static float calculateRouteSumLength(List mRoutePoints, MogoLocation location, MogoLocation station){ - if (null == mRoutePoints || mRoutePoints.size() == 0) return 0; - - float lastSumLength = 0f; - - //当前位置距离轨迹中最近的点 - int currentRouteIndex = getArrivedPointIndexNew( - 0, mRoutePoints, location.getLongitude(), location.getLatitude() - ); - // 距离当前位置轨迹中最近的轨迹点坐标 - MogoLocation currentPoint = mRoutePoints.get(currentRouteIndex); - // 当前位置距离最近的点的距离 - float calculateCurrentdex = CoordinateUtils.calculateLineDistance( - location.getLongitude(), location.getLatitude(), - currentPoint.getLongitude(), currentPoint.getLatitude() - ); - - - //要前往的站在轨迹中对应的点 - int stationPointInRouteIndex = getArrivedPointIndexNew( - currentRouteIndex, mRoutePoints, - station.getLongitude(), - station.getLatitude() - ); - // 距离站点最近的轨迹点 - MogoLocation stationPointInRoute = mRoutePoints.get(stationPointInRouteIndex); - // 站点距离轨迹中最近点的距离 - float calculateLineDistance = CoordinateUtils.calculateLineDistance( - stationPointInRoute.getLongitude(), stationPointInRoute.getLatitude(), - station.getLongitude(), station.getLatitude() - ); - - if (currentRouteIndex < stationPointInRouteIndex) { - // subList 是[) 需要的是[] - List subList = mRoutePoints.subList(currentRouteIndex, stationPointInRouteIndex + 1); - // 轨迹点所有的距离 - lastSumLength = calculateRouteSumLength(subList); - // region 站点坐标和 站点坐标对应轨迹点的坐标距离 - // 需要加距离 和下一个轨迹点成钝角 - if (stationPointInRouteIndex + 1 < mRoutePoints.size()) { - MogoLocation lastPointsNext = mRoutePoints.get(stationPointInRouteIndex + 1); - double degree = getDegree( - station.getLongitude(),station.getLatitude(), - stationPointInRoute.getLongitude(), stationPointInRoute.getLatitude(), - lastPointsNext.getLongitude(), lastPointsNext.getLatitude()); - if (degree > 90) { - lastSumLength = lastSumLength + calculateLineDistance; - } - } - // 需要减距离 和上一个轨迹点成钝角 - if (stationPointInRouteIndex - 1 >= 0) { - MogoLocation lastPointsPre = mRoutePoints.get(stationPointInRouteIndex - 1); - double degree = getDegree( - station.getLongitude(),station.getLatitude(), - stationPointInRoute.getLongitude(), stationPointInRoute.getLatitude(), - lastPointsPre.getLongitude(), lastPointsPre.getLatitude()); - if (degree > 90) { - lastSumLength = lastSumLength - calculateLineDistance; - } - } - // endregion - - // region 当前位置和 对应轨迹点的坐标距离 - // 需要加距离 和下一个轨迹点成钝角 - if (currentRouteIndex + 1 < stationPointInRouteIndex) { - MogoLocation currentPointsNext = mRoutePoints.get(currentRouteIndex + 1); - double degree = getDegree( - location.getLongitude(),location.getLatitude(), - currentPoint.getLongitude(), currentPoint.getLatitude(), - currentPointsNext.getLongitude(), currentPointsNext.getLatitude()); - if (degree > 90) { - lastSumLength = lastSumLength - calculateCurrentdex; - } - } - - // 需要减距离 和上一个轨迹点成钝角 - if (currentRouteIndex - 1 >= 0) { - MogoLocation lastPointsPre = mRoutePoints.get(currentRouteIndex - 1); - double degree = getDegree( - location.getLongitude(),location.getLatitude(), - currentPoint.getLongitude(), currentPoint.getLatitude(), - lastPointsPre.getLongitude(), lastPointsPre.getLatitude()); - if (degree > 90) { - lastSumLength = lastSumLength + calculateCurrentdex; - } - } - // endregion - - } else { - MogoLocation lastPoints = mRoutePoints.get(stationPointInRouteIndex); - lastSumLength = CoordinateUtils.calculateLineDistance( - lastPoints.getLongitude(), lastPoints.getLatitude(), - location.getLongitude(), location.getLatitude() - ); - } - return lastSumLength; - } - - public static List coordinateConverterWgsToGcjListCommon(Context mContext, List models) { - //转成MogoLatLng集合 - List list = new ArrayList<>(); - for (MessagePad.Location m : models) { - LatLng mogoLatLng = coordinateConverterWgsToGcj(mContext, m); - list.add(mogoLatLng); - } - return list; - } - - public static LatLng coordinateConverterWgsToGcj(Context mContext, MessagePad.Location mogoLatLng) { - CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext); - mCoordinateConverter.from(CoordinateConverter.CoordType.GPS); - mCoordinateConverter.coord(new LatLng(mogoLatLng.getLatitude(), mogoLatLng.getLongitude())); - LatLng latLng = mCoordinateConverter.convert(); - return latLng; - } - - public static LatLng coordinateConverterWgsToGcj(Context mContext, double lon, double lat) { - CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext); - mCoordinateConverter.from(CoordinateConverter.CoordType.GPS); - mCoordinateConverter.coord(new LatLng(lat,lon)); - LatLng latLng = mCoordinateConverter.convert(); - return latLng; - } - - /** - * 简单粗暴 直接比较 todo 需要优化 - * @param mRoutePoints - * @param realLon - * @param realLat - * @return - */ - public static List getRemainPointListByCompare(List mRoutePoints,double realLon,double realLat) { - List latePoints = new ArrayList<>(); - int currentIndex = 0; //记录疑似点 - if (mRoutePoints.size() > 0){ - //基础点 - LatLng baseLatLng = mRoutePoints.get(0); - if (baseLatLng != null){ - float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat - ,baseLatLng.longitude,baseLatLng.latitude);// lon,lat, prelon, prelat - - for (int i= 1; i < mRoutePoints.size(); i++){ - LatLng latLng = mRoutePoints.get(i); - float diff = CoordinateUtils.calculateLineDistance(realLon,realLat - ,latLng.longitude,latLng.latitude); - if (baseDiffDis > diff){ -// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); - baseDiffDis = diff; - currentIndex = i; - } - } -// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+currentIndex+"-------是最近的点------ "); - if (currentIndex == mRoutePoints.size()-1){ - latePoints.add(mRoutePoints.get(currentIndex)); - }else if(currentIndex < mRoutePoints.size()-1){ - latePoints.addAll(mRoutePoints.subList(currentIndex,mRoutePoints.size())); - } - return latePoints; - } - - } - return latePoints; - } - - /** - * 简单粗暴 直接比较 todo 需要优化 - * @param mRoutePoints - * @param realLon - * @param realLat - * @return 返回已经到达点的index - */ - public static int getArrivedPointIndex(List mRoutePoints,double realLon,double realLat) { - int currentIndex = 0; //记录疑似点 - if (mRoutePoints.size() > 0){ - //基础点 - LatLng baseLatLng = mRoutePoints.get(0); - if (baseLatLng != null){ - float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon,realLat - ,baseLatLng.longitude,baseLatLng.latitude);// lon,lat, prelon, prelat - - for (int i= 1; i < mRoutePoints.size(); i++){ - LatLng latLng = mRoutePoints.get(i); - float diff = CoordinateUtils.calculateLineDistance(realLon,realLat - ,latLng.longitude,latLng.latitude); - if (baseDiffDis > diff){ -// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); - baseDiffDis = diff; - currentIndex = i; - } - } - return currentIndex; - } - } - return currentIndex; - } - - public static float calculateRouteSumLengthByLocation(List points){ - if (null == points || points.size() == 0) return 0; - - float sumLength = 0; - - //计算全路径总距离 - for (int i = 0;i + 1< points.size();i++){ - double preLat = points.get(i).getLatitude(); - double preLon = points.get(i).getLongitude(); - double laLat = points.get(i+1).getLatitude(); - double laLon = points.get(i+1).getLongitude(); - - float length = CoordinateUtils.calculateLineDistance(laLon,laLat,preLon,preLat); - sumLength += length; - } - return sumLength; - } - - - public static List coordinateConverterWgsToGcjLocations(Context mContext, List models) { - //转成MogoLatLng集合 - List list = new ArrayList<>(); - for (MessagePad.Location m : models) { - LatLng mogoLatLng = coordinateConverterWgsToGcj(mContext, m); - MogoLocation location = new MogoLocation(); - location.setHeading((float) m.getHeading()); - location.setLatitude(mogoLatLng.latitude); - location.setLongitude(mogoLatLng.longitude); - list.add(location); - } - return list; - } - - public static List coordinateConverterLatlngToLocation(List models) { - //转成MogoLatLng集合 - List list = new ArrayList<>(); - for (LatLng m : models) { - MogoLocation location = new MogoLocation(); - location.setLatitude(m.latitude); - location.setLongitude(m.longitude); - list.add(location); - } - return list; - } - - public static List coordinateConverterLocationToLatLng(Context mContext, List models) { - //转成MogoLatLng集合 - List list = new ArrayList<>(); - for (MogoLocation m : models) { - LatLng mogoLatLng = new LatLng(m.getLatitude(), m.getLongitude()); - list.add(mogoLatLng); - } - return list; - } - - /** - * 根据前一个index,经纬度航向角,确认剩余轨迹 - * @param preIndex - * @param mRoutePoints - * @param realLocation - * @return - */ - public static Map> getRemainPointListByCompareNew(int preIndex, - List mRoutePoints, - MogoLocation realLocation) { - Map> routePonits = new HashMap<>(); - List latePoints = new ArrayList<>(); // 剩余轨迹集合 - int currentIndex = 0; //记录疑似点 - if (mRoutePoints.size() > 0){ - //基础点 - MogoLocation baseLatLng = mRoutePoints.get(0); - float baseDiffDis = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), - realLocation.getLatitude() - ,baseLatLng.getLongitude(),baseLatLng.getLongitude());// lon,lat, prelon, prelat - - for (int i= 0; i < mRoutePoints.size(); i++){ - MogoLocation latLng = mRoutePoints.get(i); - //todo 先看index对应点的方向和realLocation方向是否一致, 方向角度不能过90度 - if (realLocation.getHeading() == realLocation.getHeading() - latLng.getHeading() || - Math.abs(realLocation.getHeading() - latLng.getHeading()) <= 90){ - float diff = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), - realLocation.getLatitude(), - latLng.getLongitude(),latLng.getLatitude()); - if (baseDiffDis > diff ){ -// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); - baseDiffDis = diff; - currentIndex = i; - } - } - } - Logger.d( "calculateRouteSumLength", "点:"+currentIndex+"-------是最近的点------ "); - if (currentIndex == mRoutePoints.size()-1){ - MogoLocation location = mRoutePoints.get(currentIndex); -// LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); - latePoints.add(location); - }else { - List locations = mRoutePoints.subList(currentIndex,mRoutePoints.size()); - for (MogoLocation location: locations) { -// LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); - latePoints.add(location); - } - } - routePonits.put(currentIndex,latePoints); - return routePonits; - } - return routePonits; - } - - public static int getArrivedPointIndexNew(int preIndex, List mRoutePoints, - MogoLocation realLocation) { - int currentIndex = 0; //记录疑似点 //基础点 - MogoLocation baseLatLng = mRoutePoints.get(0); - float baseDiffDis = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), - realLocation.getLatitude() - , baseLatLng.getLongitude(), baseLatLng.getLongitude());// lon,lat, prelon, prelat - - for (int i = 0; i < mRoutePoints.size(); i++) { - MogoLocation latLng = mRoutePoints.get(i); - if (realLocation.getHeading() == realLocation.getHeading() - latLng.getHeading() || - Math.abs(realLocation.getHeading() - latLng.getHeading()) <= 90){ - float diff = CoordinateUtils.calculateLineDistance(realLocation.getLongitude(), - realLocation.getLatitude(), - latLng.getLongitude(), latLng.getLatitude()); - if (baseDiffDis > diff && i>currentIndex) { -// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); - baseDiffDis = diff; - currentIndex = i; - } - } - } - Logger.d("calculateRouteSumLength", "点:" + currentIndex + "-------是最近的点------ "); - return currentIndex; - } - - public static int getArrivedPointIndexNew(int preIndex, List mRoutePoints, - double realLon,double realLat) { - int currentIndex = preIndex; //记录疑似点 //基础点 - MogoLocation baseLatLng = mRoutePoints.get(0); - float baseDiffDis = CoordinateUtils.calculateLineDistance(realLon, - realLat - , baseLatLng.getLongitude(), baseLatLng.getLongitude());// lon,lat, prelon, prelat - - for (int i = preIndex; i < mRoutePoints.size(); i++) { - MogoLocation latLng = mRoutePoints.get(i); -// if (realLocation.getBearing() == realLocation.getBearing() - latLng.getBearing() || -// Math.abs(realLocation.getBearing() - latLng.getBearing()) <= 90){ - float diff = CoordinateUtils.calculateLineDistance(realLon, - realLat, - latLng.getLongitude(), latLng.getLatitude()); - if (baseDiffDis > diff && i>currentIndex) { -// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); - baseDiffDis = diff; - currentIndex = i; - } -// } - } - Logger.d("calculateRouteSumLength", "点:" + currentIndex + "-------是最近的点------ "); - return currentIndex; - } - - /** - * https://blog.csdn.net/Jeanne_0523/article/details/106056255 - * @param vertexPointX - * @param vertexPointY - * @param point0X 角 - * @param point0Y 角 - * @param point1X - * @param point1Y - * @return - */ - public static int getDegree(double vertexPointX, double vertexPointY, double point0X, double point0Y, double point1X, double point1Y) { - //向量的点乘 - double vector = (point0X - vertexPointX) * (point1X - vertexPointX) + (point0Y - vertexPointY) * (point1Y - vertexPointY); - //向量的模乘 - double sqrt = Math.sqrt( - (Math.abs((point0X - vertexPointX) * (point0X - vertexPointX)) + Math.abs((point0Y - vertexPointY) * (point0Y - vertexPointY))) - * (Math.abs((point1X - vertexPointX) * (point1X - vertexPointX)) + Math.abs((point1Y - vertexPointY) * (point1Y - vertexPointY))) - ); - //反余弦计算弧度 - double radian = Math.acos(vector / sqrt); - //弧度转角度制 - return (int) (180 * radian / Math.PI); - } - - - private static Triple ball2xyz(Double thera,Double fie,Double r){ - double x = r * Math.cos(thera) * Math.cos(fie); - double y = r * Math.cos(thera) * Math.sin(fie); - double z = r * Math.sin(thera); - return new Triple(x,y,z); - } - - /** - * https://blog.csdn.net/reborn_lee/article/details/82497577 - * 将地理经纬度转换成笛卡尔坐标系 - */ - private static Triple geo2xyz(double lat,double lng){ - double thera = (Math.PI * lat) / 180; - double fie = (Math.PI * lng) / 180; - return ball2xyz(thera, fie,6400.0); - } - - /** - * 计算3个地理坐标点之间的夹角 - * @param l1 顶点坐标 - * @param l2 - * @param l3 - * @return l1为顶点的角度 精度没有angleOflocation高 - */ - public static double getDegree(LatLng l2,LatLng l1,LatLng l3) { - Triple p1 = geo2xyz(l1.latitude,l1.longitude); - Triple p2 = geo2xyz(l2.latitude,l2.longitude); - Triple p3 = geo2xyz(l3.latitude,l3.longitude); - - double x1 = p1.getFirst(); - double y1 = p1.getSecond(); - double z1 = p1.getThird(); - - double x2 = p2.getFirst(); - double y2 = p2.getSecond(); - double z2 = p2.getThird(); - - double x3 = p3.getFirst(); - double y3 = p3.getSecond(); - double z3 = p3.getThird(); - - // 计算向量 P2P1 和 P2P3 的夹角 https://www.zybang.com/question/3379a30c0dd3041b3ef966803f0bf758.html - double p1P2 = Math.sqrt(Math.pow(x2 - x1,2.0) + Math.pow(y2 - y1,2.0) + Math.pow(z2 - z1,2.0)); - double p2p3 = Math.sqrt(Math.pow(x3 - x2,2.0) + Math.pow(y3 - y2,2.0) + Math.pow(z3 - z2,2.0)); - - double p = (x1 - x2) * (x3 - x2) + (y1 - y2) * (y3 - y2) + (z1 - z2) * (z3 - z2); //P2P1*P2P3 - - return (Math.acos(p / (p1P2 * p2p3)) / Math.PI) * 180; - } - -} diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.kt b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.kt new file mode 100644 index 0000000000..79444f76f5 --- /dev/null +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/CoordinateCalculateRouteUtil.kt @@ -0,0 +1,805 @@ +package com.mogo.och.common.module.utils + +import android.content.Context +import android.location.Location +import com.amap.api.maps.CoordinateConverter +import com.amap.api.maps.model.LatLng +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.CoordinateUtils +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils +import com.mogo.och.common.module.manager.distancemamager.DistanceDegree +import mogo.telematics.pad.MessagePad +import java.util.TreeMap +import kotlin.math.acos +import kotlin.math.atan2 +import kotlin.math.cos +import kotlin.math.pow +import kotlin.math.sin +import kotlin.math.sqrt + +/** + * @author: wangmingjun + * @date: 2022/3/28 + */ +object CoordinateCalculateRouteUtil { + @JvmStatic + fun calculateRouteSumLength(points: List?): Float { + if (null == points || points.size == 0) return 0f + var sumLength = 0f + if (points[0] is MogoLocation) { + //计算全路径总距离 + var i = 0 + while (i + 1 < points.size) { + val locationPre = points[i] as MogoLocation + val location = points[i + 1] as MogoLocation + val preLat = locationPre.latitude + val preLon = locationPre.longitude + val laLat = location.latitude + val laLon = location.longitude + val length = CoordinateUtils.calculateLineDistance(laLon, laLat, preLon, preLat) + sumLength += length + i++ + } + } else if (points[0] is Location) { + //计算全路径总距离 + var i = 0 + while (i + 1 < points.size) { + val locationPre = points[i] as Location + val location = points[i + 1] as Location + val preLat = locationPre.latitude + val preLon = locationPre.longitude + val laLat = location.latitude + val laLon = location.longitude + val length = CoordinateUtils.calculateLineDistance(laLon, laLat, preLon, preLat) + sumLength += length + i++ + } + } else if (points[0] is LatLng) { + var i = 0 + while (i + 1 < points.size) { + val locationPre = points[i] as LatLng + val location = points[i + 1] as LatLng + val preLat = locationPre.latitude + val preLon = locationPre.longitude + val laLat = location.latitude + val laLon = location.longitude + val length = CoordinateUtils.calculateLineDistance(laLon, laLat, preLon, preLat) + sumLength += length + i++ + } + } + return sumLength + } + + fun calculateRouteSumLength( + mRoutePoints: List?, + location: MogoLocation, + station: MogoLocation + ): Float { + if (null == mRoutePoints || mRoutePoints.size == 0) return 0f + var lastSumLength = 0f + + //当前位置距离轨迹中最近的点 + val currentRouteIndex = getArrivedPointIndexNew( + 0, mRoutePoints, location.longitude, location.latitude + ) + // 距离当前位置轨迹中最近的轨迹点坐标 + val currentPoint = mRoutePoints[currentRouteIndex] + // 当前位置距离最近的点的距离 + val calculateCurrentdex = CoordinateUtils.calculateLineDistance( + location.longitude, location.latitude, + currentPoint.longitude, currentPoint.latitude + ) + + + //要前往的站在轨迹中对应的点 + val stationPointInRouteIndex = getArrivedPointIndexNew( + currentRouteIndex, mRoutePoints, + station.longitude, + station.latitude + ) + // 距离站点最近的轨迹点 + val stationPointInRoute = mRoutePoints[stationPointInRouteIndex] + // 站点距离轨迹中最近点的距离 + val calculateLineDistance = CoordinateUtils.calculateLineDistance( + stationPointInRoute.longitude, stationPointInRoute.latitude, + station.longitude, station.latitude + ) + if (currentRouteIndex < stationPointInRouteIndex) { + // subList 是[) 需要的是[] + val subList = mRoutePoints.subList(currentRouteIndex, stationPointInRouteIndex + 1) + // 轨迹点所有的距离 + lastSumLength = calculateRouteSumLength(subList) + // region 站点坐标和 站点坐标对应轨迹点的坐标距离 + // 需要加距离 和下一个轨迹点成钝角 + if (stationPointInRouteIndex + 1 < mRoutePoints.size) { + val lastPointsNext = mRoutePoints[stationPointInRouteIndex + 1] + val degree = getDegree( + station.longitude, station.latitude, + stationPointInRoute.longitude, stationPointInRoute.latitude, + lastPointsNext.longitude, lastPointsNext.latitude + ).toDouble() + if (degree > 90) { + lastSumLength = lastSumLength + calculateLineDistance + } + } + // 需要减距离 和上一个轨迹点成钝角 + if (stationPointInRouteIndex - 1 >= 0) { + val lastPointsPre = mRoutePoints[stationPointInRouteIndex - 1] + val degree = getDegree( + station.longitude, station.latitude, + stationPointInRoute.longitude, stationPointInRoute.latitude, + lastPointsPre.longitude, lastPointsPre.latitude + ).toDouble() + if (degree > 90) { + lastSumLength = lastSumLength - calculateLineDistance + } + } + // endregion + + // region 当前位置和 对应轨迹点的坐标距离 + // 需要加距离 和下一个轨迹点成钝角 + if (currentRouteIndex + 1 < stationPointInRouteIndex) { + val currentPointsNext = mRoutePoints[currentRouteIndex + 1] + val degree = getDegree( + location.longitude, location.latitude, + currentPoint.longitude, currentPoint.latitude, + currentPointsNext.longitude, currentPointsNext.latitude + ).toDouble() + if (degree > 90) { + lastSumLength = lastSumLength - calculateCurrentdex + } + } + + // 需要减距离 和上一个轨迹点成钝角 + if (currentRouteIndex - 1 >= 0) { + val lastPointsPre = mRoutePoints[currentRouteIndex - 1] + val degree = getDegree( + location.longitude, location.latitude, + currentPoint.longitude, currentPoint.latitude, + lastPointsPre.longitude, lastPointsPre.latitude + ).toDouble() + if (degree > 90) { + lastSumLength = lastSumLength + calculateCurrentdex + } + } + // endregion + } else { + val lastPoints = mRoutePoints[stationPointInRouteIndex] + lastSumLength = CoordinateUtils.calculateLineDistance( + lastPoints.longitude, lastPoints.latitude, + location.longitude, location.latitude + ) + } + return lastSumLength + } + + @JvmStatic + fun coordinateConverterWgsToGcjListCommon( + mContext: Context?, + models: List + ): List { + //转成MogoLatLng集合 + val list: MutableList = ArrayList() + for (m in models) { + val mogoLatLng = coordinateConverterWgsToGcj(mContext, m) + list.add(mogoLatLng) + } + return list + } + + @JvmStatic + fun coordinateConverterWgsToGcj( + mContext: Context?, + mogoLatLng: MessagePad.Location + ): LatLng { + val mCoordinateConverter = + CoordinateConverter(mContext) + mCoordinateConverter.from(CoordinateConverter.CoordType.GPS) + mCoordinateConverter.coord( + LatLng( + mogoLatLng.latitude, + mogoLatLng.longitude + ) + ) + return mCoordinateConverter.convert() + } + + @JvmStatic + fun coordinateConverterWgsToGcj( + mContext: Context?, + lon: Double, + lat: Double + ): LatLng { + val mCoordinateConverter = + CoordinateConverter(mContext) + mCoordinateConverter.from(CoordinateConverter.CoordType.GPS) + mCoordinateConverter.coord(LatLng(lat, lon)) + return mCoordinateConverter.convert() + } + + /** + * 简单粗暴 直接比较 todo 需要优化 + * @param mRoutePoints + * @param realLon + * @param realLat + * @return + */ + fun getRemainPointListByCompare( + mRoutePoints: List, + realLon: Double, + realLat: Double + ): List { + val latePoints: MutableList = ArrayList() + var currentIndex = 0 //记录疑似点 + if (mRoutePoints.size > 0) { + //基础点 + val baseLatLng = mRoutePoints[0] + if (baseLatLng != null) { + var baseDiffDis = CoordinateUtils.calculateLineDistance( + realLon, realLat, baseLatLng.longitude, baseLatLng.latitude + ) // lon,lat, prelon, prelat + for (i in 1 until mRoutePoints.size) { + val latLng = mRoutePoints[i] + val diff = CoordinateUtils.calculateLineDistance( + realLon, realLat, latLng.longitude, latLng.latitude + ) + if (baseDiffDis > diff) { +// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); + baseDiffDis = diff + currentIndex = i + } + } + // Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+currentIndex+"-------是最近的点------ "); + if (currentIndex == mRoutePoints.size - 1) { + latePoints.add(mRoutePoints[currentIndex]) + } else if (currentIndex < mRoutePoints.size - 1) { + latePoints.addAll(mRoutePoints.subList(currentIndex, mRoutePoints.size)) + } + return latePoints + } + } + return latePoints + } + + /** + * 简单粗暴 直接比较 todo 需要优化 + * @param mRoutePoints + * @param realLon + * @param realLat + * @return 返回已经到达点的index + */ + fun getArrivedPointIndex(mRoutePoints: List, realLon: Double, realLat: Double): Int { + var currentIndex = 0 //记录疑似点 + if (mRoutePoints.size > 0) { + //基础点 + val baseLatLng = mRoutePoints[0] + if (baseLatLng != null) { + var baseDiffDis = CoordinateUtils.calculateLineDistance( + realLon, realLat, baseLatLng.longitude, baseLatLng.latitude + ) // lon,lat, prelon, prelat + for (i in 1 until mRoutePoints.size) { + val latLng = mRoutePoints[i] + val diff = CoordinateUtils.calculateLineDistance( + realLon, realLat, latLng.longitude, latLng.latitude + ) + if (baseDiffDis > diff) { +// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); + baseDiffDis = diff + currentIndex = i + } + } + return currentIndex + } + } + return currentIndex + } + + fun calculateRouteSumLengthByLocation(points: List?): Float { + if (points.isNullOrEmpty()) return 0f + var sumLength = 0f + + //计算全路径总距离 + var i = 0 + while (i + 1 < points.size) { + val preLat = points[i].latitude + val preLon = points[i].longitude + val laLat = points[i + 1].latitude + val laLon = points[i + 1].longitude + val length = CoordinateUtils.calculateLineDistance(laLon, laLat, preLon, preLat) + sumLength += length + i++ + } + return sumLength + } + + @JvmStatic + fun coordinateConverterWgsToGcjLocations( + mContext: Context?, + models: List + ): MutableList { + //转成MogoLatLng集合 + val list = mutableListOf() + for (m in models) { + val mogoLatLng = coordinateConverterWgsToGcj(mContext, m) + val location = MogoLocation() + location.heading = m.heading.toFloat().toDouble() + location.latitude = mogoLatLng.latitude + location.longitude = mogoLatLng.longitude + list.add(location) + } + return list + } + + @JvmStatic + fun coordinateConverterLatlngToLocation(models: List): List { + //转成MogoLatLng集合 + val list: MutableList = ArrayList() + for (m in models) { + val location = MogoLocation() + location.latitude = m.latitude + location.longitude = m.longitude + list.add(location) + } + return list + } + + @JvmStatic + fun coordinateConverterLocationToLatLng( + mContext: Context?, + models: List + ): List { + //转成MogoLatLng集合 + val list: MutableList = ArrayList() + for (m in models) { + val mogoLatLng = LatLng(m.latitude, m.longitude) + list.add(mogoLatLng) + } + return list + } + + /** + * 根据前一个index,经纬度航向角,确认剩余轨迹 + * @param preIndex + * @param mRoutePoints + * @param realLocation + * @return + */ + @JvmStatic + fun getRemainPointListByCompareNew( + preIndex: Int, + mRoutePoints: List, + realLocation: MogoLocation + ): Map> { + val routePonits: MutableMap> = HashMap() + val latePoints: MutableList = ArrayList() // 剩余轨迹集合 + var currentIndex = 0 //记录疑似点 + if (mRoutePoints.size > 0) { + //基础点 + val baseLatLng = mRoutePoints[0] + var baseDiffDis = CoordinateUtils.calculateLineDistance( + realLocation.longitude, + realLocation.latitude, baseLatLng.longitude, baseLatLng.longitude + ) // lon,lat, prelon, prelat + for (i in mRoutePoints.indices) { + val latLng = mRoutePoints[i] + //todo 先看index对应点的方向和realLocation方向是否一致, 方向角度不能过90度 + if (realLocation.heading == realLocation.heading - latLng.heading || + Math.abs(realLocation.heading - latLng.heading) <= 90 + ) { + val diff = CoordinateUtils.calculateLineDistance( + realLocation.longitude, + realLocation.latitude, + latLng.longitude, latLng.latitude + ) + if (baseDiffDis > diff) { + baseDiffDis = diff + currentIndex = i + } + } + } + Logger.d("calculateRouteSumLength", "点:$currentIndex-------是最近的点------ ") + if (currentIndex == mRoutePoints.size - 1) { + val location = mRoutePoints[currentIndex] + // LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + latePoints.add(location) + } else { + val locations = mRoutePoints.subList(currentIndex, mRoutePoints.size) + for (location in locations) { +// LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); + latePoints.add(location) + } + } + routePonits[currentIndex] = latePoints + return routePonits + } + return routePonits + } + + @JvmStatic + fun getArrivedPointIndexNew( + preIndex: Int, mRoutePoints: List, + realLocation: MogoLocation + ): Int { + var currentIndex = 0 //记录疑似点 //基础点 + val baseLatLng = mRoutePoints[0] + var baseDiffDis = CoordinateUtils.calculateLineDistance( + realLocation.longitude, + realLocation.latitude, baseLatLng.longitude, baseLatLng.longitude + ) // lon,lat, prelon, prelat + for (i in mRoutePoints.indices) { + val latLng = mRoutePoints[i] + if (realLocation.heading == realLocation.heading - latLng.heading || + Math.abs(realLocation.heading - latLng.heading) <= 90 + ) { + val diff = CoordinateUtils.calculateLineDistance( + realLocation.longitude, + realLocation.latitude, + latLng.longitude, latLng.latitude + ) + if (baseDiffDis > diff && i > currentIndex) { + baseDiffDis = diff + currentIndex = i + } + } + } + Logger.d("calculateRouteSumLength", "点:$currentIndex-------是最近的点------ ") + return currentIndex + } + + @JvmStatic + fun getArrivedPointIndexNew( + preIndex: Int, mRoutePoints: List, + realLon: Double, realLat: Double + ): Int { + var currentIndex = preIndex //记录疑似点 //基础点 + val baseLatLng = mRoutePoints[0] + var baseDiffDis = CoordinateUtils.calculateLineDistance( + realLon, + realLat, baseLatLng.longitude, baseLatLng.longitude + ) // lon,lat, prelon, prelat + for (i in preIndex until mRoutePoints.size) { + val latLng = mRoutePoints[i] + // if (realLocation.getBearing() == realLocation.getBearing() - latLng.getBearing() || +// Math.abs(realLocation.getBearing() - latLng.getBearing()) <= 90){ + val diff = CoordinateUtils.calculateLineDistance( + realLon, + realLat, + latLng.longitude, latLng.latitude + ) + if (baseDiffDis > diff && i > currentIndex) { +// Logger.d(M_TAXI + "calculateRouteSumLength", "点:"+i+"-------先记录点----- "); + baseDiffDis = diff + currentIndex = i + } + // } + } + Logger.d("calculateRouteSumLength", "点:$currentIndex-------是最近的点------ ") + return currentIndex + } + + /** + * https://blog.csdn.net/Jeanne_0523/article/details/106056255 + * @param vertexPointX + * @param vertexPointY + * @param point0X 角 + * @param point0Y 角 + * @param point1X + * @param point1Y + * @return + */ + fun getDegree( + vertexPointX: Double, + vertexPointY: Double, + point0X: Double, + point0Y: Double, + point1X: Double, + point1Y: Double + ): Int { + //向量的点乘 + val vector = + (point0X - vertexPointX) * (point1X - vertexPointX) + (point0Y - vertexPointY) * (point1Y - vertexPointY) + //向量的模乘 + val sqrt = Math.sqrt( + (Math.abs((point0X - vertexPointX) * (point0X - vertexPointX)) + Math.abs((point0Y - vertexPointY) * (point0Y - vertexPointY))) + * (Math.abs((point1X - vertexPointX) * (point1X - vertexPointX)) + Math.abs((point1Y - vertexPointY) * (point1Y - vertexPointY))) + ) + //反余弦计算弧度 + val radian = Math.acos(vector / sqrt) + //弧度转角度制 + return (180 * radian / Math.PI).toInt() + } + + private fun ball2xyz(thera: Double, fie: Double, r: Double): Triple { + val x = r * cos(thera) * cos(fie) + val y = r * cos(thera) * sin(fie) + val z = r * sin(thera) + return Triple(x, y, z) + } + + /** + * https://blog.csdn.net/reborn_lee/article/details/82497577 + * 将地理经纬度转换成笛卡尔坐标系 + */ + private fun geo2xyz(lat: Double, lng: Double): Triple { + val thera = Math.PI * lat / 180 + val fie = Math.PI * lng / 180 + return ball2xyz(thera, fie, 6400.0) + } + + /** + * 计算3个地理坐标点之间的夹角 + * @param l1 顶点坐标 + * @param l2 + * @param l3 + * @return l1为顶点的角度 精度没有angleOflocation高 + */ + fun getDegree(l2: MogoLocation, l1: MogoLocation, l3: MogoLocation): Double { + val (x1, y1, z1) = geo2xyz(l1.latitude, l1.longitude) + val (x2, y2, z2) = geo2xyz(l2.latitude, l2.longitude) + val (x3, y3, z3) = geo2xyz(l3.latitude, l3.longitude) + + // 计算向量 P2P1 和 P2P3 的夹角 https://www.zybang.com/question/3379a30c0dd3041b3ef966803f0bf758.html + val p1P2 = sqrt((x2 - x1).pow(2.0) + (y2 - y1).pow(2.0) + (z2 - z1).pow(2.0)) + val p2p3 = sqrt((x3 - x2).pow(2.0) + (y3 - y2).pow(2.0) + (z3 - z2).pow(2.0)) + val p = (x1 - x2) * (x3 - x2) + (y1 - y2) * (y3 - y2) + (z1 - z2) * (z3 - z2) //P2P1*P2P3 + return acos(p / (p1P2 * p2p3)) / Math.PI * 180 + } + + fun getHeadingAngle(location: MogoLocation, nextPoint: MogoLocation): Double { + return getHeadingAngle( + location.longitude, + location.latitude, + nextPoint.longitude, + nextPoint.latitude + ) + } + + fun getHeadingAngle(location: LatLng, nextPoint: LatLng): Double { + return getHeadingAngle( + location.longitude, + location.latitude, + nextPoint.longitude, + nextPoint.latitude + ) + } + fun getHeadingAngle(locationLongitude: Double, locationLatitude: Double, + nextPointLongitude: Double, nextPointLatitude: Double): Double { + val y = sin(nextPointLongitude - locationLongitude) * cos(nextPointLatitude) + val x = cos(locationLatitude) * sin(nextPointLatitude) - sin(locationLatitude) * + cos(nextPointLatitude) * cos(nextPointLongitude - locationLongitude) + var bearing = atan2(y, x) + bearing = Math.toDegrees(bearing) + if (bearing < 0) { + bearing += 360.0 + } + return 360-bearing + } + + + + /** + * 支持带航行角的和不带航向角的 + * 带航向角的会删除 航向角差大于90°的点 + * @param preIndex 上次计算缓存 + * @param mRoutePoints 轨迹点 + * @param location 目标坐标 + * @param type 1 开始站点 2 定位点 3 结束站点 + * @return Triple + * 距离目标坐标最近的轨迹点下标、 + * 最近点坐标是目标坐标的上一个点还是下一个点 + * 目标到最近轨迹点的距离 + */ + @JvmStatic + fun getNearestPointInfo( + preIndex: Int, + endIndex: Int, + mRoutePoints: List, + location: MogoLocation, + type:Int, + size:Int = 4 + ): Triple { + Logger.d(SceneConstant.M_OCHCOMMON + "calculateRouteSumLength", + "参数:[$preIndex $endIndex) mRoutePoints:${mRoutePoints.size} type:$type size:$size" + + " location:(${location.latitude},${location.longitude},${location.heading})") + var currentIndex:Int = preIndex //记录疑似点 //基础点 + // 轨迹中的点和定位点的距离集合 + val distanceMap: TreeMap = TreeMap() + for (index in preIndex until endIndex) { + val latLngIndex = mRoutePoints[index] + val distance = CoordinateUtils.calculateLineDistance( + location.longitude, + location.latitude, + latLngIndex.longitude, + latLngIndex.latitude + ) + distanceMap[DistanceDegree(distance, null,null)] = index + if (distanceMap.size > size) { + distanceMap.pollLastEntry() + } + } + distanceMap.forEach { + val distanceDegree = it.key + val pointIndex = it.value + val currentPoint = mRoutePoints[pointIndex]// 疑似最近的点 + var nextDegree = 0.0 + var preDegree = 0.0 + + if (pointIndex + 1 < mRoutePoints.size) { + val nextPoint = mRoutePoints[pointIndex + 1] + nextDegree = getDegree(location, currentPoint, nextPoint) + }else{ + nextDegree = 135.0 + } + // 需要减距离 和上一个轨迹点成钝角 + if (pointIndex - 1 >= 0) { + val prePoint = mRoutePoints[pointIndex - 1] + preDegree = getDegree( + location, + currentPoint, + prePoint + ) + }else{// 第一个个点处理 + preDegree = 135.0 + } + fun getDegreeNext(){ + if (pointIndex + 1 < mRoutePoints.size) { + val nextPoint = mRoutePoints[pointIndex + 1] + val headingAngle = getHeadingAngle(currentPoint, nextPoint) + distanceDegree.degree = headingAngle + distanceDegree.isNext = false + }else{ + val prePoint = mRoutePoints[pointIndex - 1] + val headingAngle = getHeadingAngle(prePoint,currentPoint) + distanceDegree.degree = headingAngle + distanceDegree.isNext = true + } + } + fun getDegreePre(){ + if (pointIndex - 1 >= 0) { + val prePoint = mRoutePoints[pointIndex - 1] + val headingAngle = getHeadingAngle(prePoint, currentPoint) + distanceDegree.degree = headingAngle; + distanceDegree.isNext = true + }else{ + val nextPoint = mRoutePoints[pointIndex + 1] + val headingAngle = getHeadingAngle(currentPoint,nextPoint) + distanceDegree.degree = headingAngle + distanceDegree.isNext = false + } + } + if(nextDegree>90){ + getDegreeNext() + } + if(preDegree>90){ + getDegreePre() + } + if(preDegree<90&&nextDegree<90&&preDegree+nextDegree>90){ + if (pointIndex + 1 < mRoutePoints.size&&pointIndex - 1 >= 0) { + val nextPoint = mRoutePoints[pointIndex + 1] + val prePoint = mRoutePoints[pointIndex - 1] + val degree = getDegree(currentPoint, prePoint, nextPoint) + if(degree>90) { + getDegreePre() + // isNext 值无所谓了 就 ture和false都行 + // 通过航向角过滤一遍 + if(distanceDegree.degree!=null&&DrivingDirectionUtils.getAngleDiff(location.heading, distanceDegree.degree!!)<90){ + currentIndex = pointIndex + return Triple(currentIndex,distanceDegree.isNext,distanceDegree.distance) + } + } + } + } + } + + // 根据角度来排除一些点 + val iterator = distanceMap.iterator() + // 有航向角比较航向角 + while (iterator.hasNext()) { + val next = iterator.next() + val key = next.key + if (key.degree == null) { + iterator.remove() + } else { + if (location.heading != 0.0) { + key.degree?.let { + val dexAngle = DrivingDirectionUtils.getAngleDiff(location.heading, it) + if (dexAngle > 90) { + iterator.remove() + } + } + } + } + } + + if(distanceMap.size==0&&size<16){ + return getNearestPointInfo(preIndex,endIndex,mRoutePoints,location,type,size+2) + } + + // 最近点中包含上次计算的点和上次计算的最近的一个点 + if(distanceMap.containsValue(preIndex)&&distanceMap.containsValue(preIndex+1)){ + var preIndexDistance:DistanceDegree?=null + var preIndexNextDistance:DistanceDegree?=null + distanceMap.iterator().forEach { en -> + val key = en.key + val value = en.value + if(value==preIndex){ + preIndexDistance = key + }else if(value==preIndex+1){ + preIndexNextDistance = key + } + } + if(preIndexDistance!=null&&preIndexNextDistance!=null){ + if(preIndexDistance!!.distance + val value = en.value + if(valuemaxIndex){ + maxIndex = value + } + } + + val middleVale =minIndex + (maxIndex-minIndex)/2 + when (type) { + 1 -> {// 求开始站点 + val iteratorRemove = distanceMap.iterator() + while (iteratorRemove.hasNext()) { + val next = iteratorRemove.next() + val key = next.key + if(next.value>middleVale){ + iteratorRemove.remove() + } + } + } + 3 -> {// 求结束站点 + val iteratorRemove = distanceMap.iterator() + while (iteratorRemove.hasNext()) { + val next = iteratorRemove.next() + val key = next.key + if(next.value {} + } + + // 根据距离来计算 最近的点 只有一个前面的点 + var tempDistance = Float.MAX_VALUE + var isNext:Boolean? = null + distanceMap.iterator().forEach { en -> + val key = en.key + val value = en.value + // 排除没有第一个值0是 + if(value==preIndex+1&&preIndex!=0){ + currentIndex = value + return Triple(currentIndex,key.isNext,key.distance) + } + key.distance.let { + if (it < tempDistance) { + tempDistance = it + currentIndex = value + isNext = key.isNext + } + } + } + + return Triple(currentIndex,isNext,tempDistance) + } +} \ No newline at end of file diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java index 1af162ef26..2a88ec1dd2 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/utils/NumberFormatUtil.java @@ -30,7 +30,8 @@ public class NumberFormatUtil { */ public static String cutOutNumber(double num,int cutNum){ try{ - BigDecimal bg = new BigDecimal(num).setScale(cutNum, RoundingMode.DOWN); + //注:将double类型转成String类型再处理截取。 使用double部分数据截取有问题 + BigDecimal bg = new BigDecimal(String.valueOf(num)).setScale(cutNum, RoundingMode.DOWN); return String.valueOf(bg.doubleValue()); }catch (Exception e){ diff --git a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java index 8b141d5ded..bd549f2888 100644 --- a/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java +++ b/OCH/mogo-och-common-module/src/main/java/com/mogo/och/common/module/wigets/MarqueeTextView.java @@ -105,6 +105,9 @@ public class MarqueeTextView extends androidx.appcompat.widget.AppCompatTextView } final int textWidth = getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight(); + + if (getLayout() == null) return; + final float lineWidth = getLayout().getLineWidth(0); final float gap = mCustomGap*textWidth; float ghostStart = lineWidth - textWidth + gap; diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerRouteLineInfoCallback.java b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerRouteLineInfoCallback.java index caf252a64e..615185f0e0 100644 --- a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerRouteLineInfoCallback.java +++ b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/callback/IBusPassengerRouteLineInfoCallback.java @@ -9,7 +9,7 @@ import java.util.List; * @date: 2022/4/6 */ public interface IBusPassengerRouteLineInfoCallback { - void updateLineInfo(String lineName, String lineDurTime); + void updateLineInfo(String lineName); void updateStationsInfo(List stations, int currentStationIndex, boolean isArrived); void showNoTaskView(); void hideNoTaskView(); diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java index 87f0874556..0a899b87e2 100644 --- a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java @@ -281,7 +281,7 @@ public class BusPassengerModel { routesResult = result; if (mRouteLineInfoCallback != null){ - mRouteLineInfoCallback.updateLineInfo(result.getName(),result.getRunningDur()); + mRouteLineInfoCallback.updateLineInfo(result.getName()); mRouteLineInfoCallback.hideNoTaskView(); if (result.getSites() != null){ List stations = result.getSites(); @@ -346,7 +346,7 @@ public class BusPassengerModel { IntentManager.getInstance().registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener ); // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, mMapLocationListener); + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, 10,mMapLocationListener); //2021.11.1 自动驾驶路线规划接口 CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); @@ -455,6 +455,16 @@ public class BusPassengerModel { private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + @Override + public void onAutopilotDockerInfo(@NonNull String dockerVersion) { + // TODO: 2023/6/19 mingjun + } + + @Override + public void onAutopilotStatusResponse(int state) { + // TODO: 2023/6/19 mingjun + } + @Override public void onAutopilotRouteLineId(long lineId) { @@ -608,6 +618,9 @@ public class BusPassengerModel { if (mTwoStationsRouts.size() > 0 && mLocation != null){ Map> lastPointsMap = CoordinateCalculateRouteUtil .getRemainPointListByCompareNew(mPreRouteIndex,mTwoStationsRouts,mLocation); + if(lastPointsMap==null){ + return; + } for (int index: lastPointsMap.keySet()) { mPreRouteIndex = index; break; diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java index e7dd425241..c32e05fe05 100644 --- a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java +++ b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/presenter/BaseBusPassengerPresenter.java @@ -127,8 +127,8 @@ public class BaseBusPassengerPresenter extends Presenter mView.updateLineInfo(lineName, lineDurTime)); + public void updateLineInfo(String lineName) { + runOnUIThread(() -> mView.updateLineInfo(lineName)); } @Override diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java index 73fd07a86e..8f5bfed4cd 100644 --- a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java +++ b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerBaseFragment.java @@ -21,6 +21,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener; import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager; import com.mogo.eagle.core.function.hmi.ui.widget.DriverMonitorView; +import com.mogo.eagle.core.function.hmi.ui.widget.RomaPassengerView; import com.mogo.eagle.core.function.view.MapBizView; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -28,6 +29,7 @@ import com.mogo.och.bus.passenger.R; import com.mogo.och.bus.passenger.constant.BusPassengerConst; import com.mogo.och.common.module.utils.NumberFormatUtil; import com.mogo.och.common.module.wigets.OCHBorderShadowLayout; +import com.mogo.eagle.core.utilcode.util.DeviceUtils; /** * Created on 2022/3/31 @@ -39,6 +41,7 @@ public abstract class BusPassengerBaseFragment 0){ + // 起点marker, 终点marker, 过站marker, 未过站marker + + int size = mLineStationsList.size(); + + Marker mStartMarker = mAMap.addMarker(new MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_start_point))); + Marker mEndMarker = mAMap.addMarker(new MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_end_point))); + + mStartMarker.setPosition(mLineStationsList.get(0)); + mLineMarkers.add(0,mStartMarker); + for (int i = 0; i < mLineStationsList.size(); i++) { - if (currentIndex == i){ - Marker mEndMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_view_dir_end_point))); - mEndMarker.setPosition(mLineStationsList.get(i)); - mLineMarkers.add(i,mEndMarker); - }else { - Marker mStartMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_view_dir_way_point))); - mStartMarker.setPosition(mLineStationsList.get(i)); - mLineMarkers.add(i,mStartMarker); + if (currentIndex <= i && i < size-1 && i > 0){ //未到达 + Marker unArrivedMarker = mAMap.addMarker(new MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_unarrived_point))); + unArrivedMarker.setPosition(mLineStationsList.get(i)); + mLineMarkers.add(i,unArrivedMarker); + }else if (i < currentIndex && i > 0){ + Marker arrivedMarker = mAMap.addMarker(new MarkerOptions() + .icon(BitmapDescriptorFactory.fromResource(R.drawable.bus_p_map_arrived_point))); + arrivedMarker.setPosition(mLineStationsList.get(i)); + mLineMarkers.add(i,arrivedMarker); } } + + mEndMarker.setPosition(mLineStationsList.get(size-1)); + mLineMarkers.add(size-1,mEndMarker); } } diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java index 00834c42d4..cbd98e6ba9 100644 --- a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/ui/BusPassengerRouteFragment.java @@ -1,14 +1,9 @@ package com.mogo.och.bus.passenger.ui; -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BUS_P; - import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.text.Html; import android.view.View; -import android.view.animation.Animation; -import android.view.animation.RotateAnimation; -import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -23,12 +18,9 @@ import com.elegant.utils.UiThreadHandler; import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.och.bus.passenger.R; import com.mogo.och.bus.passenger.adapter.BusPassengerLineStationsAdapter; -import com.mogo.och.bus.passenger.bean.BusPassengerStation; -import com.mogo.och.bus.passenger.callback.IBusPassengerMapViewCallback; import com.mogo.och.bus.passenger.constant.BusPassengerConst; import com.mogo.och.bus.passenger.presenter.BaseBusPassengerPresenter; import com.mogo.och.bus.passenger.ui.layoutmanager.CenterLayoutManager; @@ -209,10 +201,7 @@ public class BusPassengerRouteFragment extends } public void changeOperationStatus(boolean status) { - if (status) { - mNoLineInfoView.setVisibility(View.GONE); - mRouteInfoView.setVisibility(View.VISIBLE); - } else { + if (!status) { emptyTv.setText(getString(R.string.bus_p_no_out)); mNoLineInfoView.setVisibility(View.VISIBLE); mRouteInfoView.setVisibility(View.GONE); @@ -242,17 +231,8 @@ public class BusPassengerRouteFragment extends } } -// public void updatePlateNum(String plateNum){ -// if ("".equals(plateNum) || null == plateNum) { -// mCarPlateNum.setText("-- --"); -// }else { -// mCarPlateNum.setText((plateNum)); -// } -// } - - public void updateLineInfo(String lineName, String lineDurTime) { + public void updateLineInfo(String lineName) { mLineName.setText(lineName); -// mOperationTime.setText(lineDurTime); } /** diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_arrived_point.png b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_arrived_point.png new file mode 100644 index 0000000000..ac317649b4 Binary files /dev/null and b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_arrived_point.png differ diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png index 17beb894a6..702f10f265 100644 Binary files a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png and b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_car.png differ diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_end_point.png b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_end_point.png new file mode 100644 index 0000000000..39262e5ecb Binary files /dev/null and b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_end_point.png differ diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_start_point.png b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_start_point.png new file mode 100644 index 0000000000..b2e4c69ada Binary files /dev/null and b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_start_point.png differ diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_unarrived_point.png b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_unarrived_point.png new file mode 100644 index 0000000000..ec6081f5a3 Binary files /dev/null and b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_unarrived_point.png differ diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_end_point.png b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_end_point.png deleted file mode 100644 index 1e64713481..0000000000 Binary files a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_end_point.png and /dev/null differ diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_way_point.png b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_way_point.png deleted file mode 100644 index ff04c01f13..0000000000 Binary files a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/drawable-nodpi/bus_p_map_view_dir_way_point.png and /dev/null differ diff --git a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml index b3dbf98f8c..aa903a44ce 100644 --- a/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml +++ b/OCH/mogo-och-shuttle-passenger/src/jinlvvan/res/layout/bus_p_base_fragment.xml @@ -28,7 +28,7 @@ app:layout_constraintStart_toStartOf="parent" /> = 0 && mNextStationIndex <= mStations.size - 1 @@ -319,11 +312,9 @@ class PM2DrivingModel private constructor() { }else{//非美化模式下 mAutoStatusCallback?.updateAutoStatus(false) } - }else{//自驾状态 2 mAutoStatusCallback?.updateAutoStatus(true) } - mCurrentAutoStatus = status } } diff --git a/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style.data b/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style.data index efcf9bf6c4..d4d4bc8214 100644 Binary files a/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style.data and b/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style.data differ diff --git a/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style_extra.data b/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style_extra.data index ff5d9fb51b..88c4e33256 100644 Binary files a/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style_extra.data and b/OCH/mogo-och-shuttle-passenger/src/main/assets/map_style_extra.data differ diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java index 5affa4b9ac..a76f2be2cb 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/bean/BusUpdateSiteStatusRequest.java @@ -17,11 +17,11 @@ public class BusUpdateSiteStatusRequest { public int siteId;//站点id public long writeVersion; //更新时间戳 - public BusUpdateSiteStatusRequest(int taskId,int siteId,int seq) { + public BusUpdateSiteStatusRequest(int taskId,int siteId,int seq, long writeVersion) { this.sn = MoGoAiCloudClientConfig.getInstance().getSn(); this.seq = seq; this.siteId = siteId; this.taskId = taskId; - this.writeVersion = DateTimeUtil.getCurrentTimeStamp(); + this.writeVersion = writeVersion; } } diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index 2afd1c117d..fcaa20a6ad 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -161,7 +161,7 @@ public abstract class BaseBusTabFragment }); initListener(); - setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + setAutopilotBtnStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState()); ctvAutopilotStatus.setOnClickListener(new OnPreventFastClickListener() { @Override @@ -308,9 +308,6 @@ public abstract class BaseBusTabFragment @Override public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) { -// if (!HmiBuildConfig.isShowBadCaseView && recordPanel != null && recordPanel.getType() == 1 && recordPanel.getStat() == 100) { -// CallerDevaToolsManager.INSTANCE.onReceiveBadCaseRecord(recordPanel); -// } } @Override @@ -455,7 +452,7 @@ public abstract class BaseBusTabFragment public void stopAnimAndUpdateBtnStatus() { stopAutopilotAnimation(); - updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState()); } /** @@ -529,7 +526,7 @@ public abstract class BaseBusTabFragment public void run() { //未启动成功做处理 if (isAnimateRunning) {// 只判断动画是否在进行,根据自动驾驶当前状态去设置自动驾驶状态 stopAutopilotAnimation(); - updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + updateAutopilotStatus(CallerAutoPilotStatusListenerManager.INSTANCE.getState()); } } }, TIMER_START_AUTOPILOT_INTERVAL); diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java index 737a96683a..2ee9511215 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/fragment/BusFragment.java @@ -113,7 +113,7 @@ public class BusFragment extends BaseBusTabFragment groupStationsPanel = findViewById(R.id.group_stations_panel); noDataView = findViewById(R.id.no_line_data_view); - CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + CallerLogger.INSTANCE.d(M_BUS + TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getState()); // 初始化的时候设置 UI 按钮状态 showAutopilotBiz(); @@ -461,7 +461,7 @@ public class BusFragment extends BaseBusTabFragment } //清除鹰眼右下角小地图轨迹 - CallerLogger.INSTANCE.d(SceneConstant.M_MAP, "clearBusStationsMarkers --------->"); + CallerLogger.INSTANCE.d(SceneConstant.M_BUS, "clearBusStationsMarkers --------->"); smallMapView.clearPolyline(); } @@ -535,7 +535,7 @@ public class BusFragment extends BaseBusTabFragment public void onClick(View v) { if (v.getId() == R.id.switch_line_btn) {//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线 //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线 - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { ToastUtils.showLong(getResources().getString(R.string.bus_switch_line_btn_warning1)); return; diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/model/OrderModel.java b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/model/OrderModel.java index 7fe377e205..787429540c 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/model/OrderModel.java @@ -163,8 +163,7 @@ public class OrderModel { mContext = AbsMogoApplication.getApp(); loginService = (LoginService) ARouter.getInstance().build(OchCommonConst.LOGINSERVICE).navigation(); // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,mMapLocationListener); -// CallerChassisLocationGCJ02ListenerManager.INSTANCE.setListenerHz(TAG,2);//设置5hz, 1s返回一次 + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,10,mMapLocationListener); MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); @@ -649,7 +648,8 @@ public class OrderModel { * 车机端展示是离开当前站,下一站设置为当前站, 所以服务端数据回来要做处理,不能直接渲染 */ private void leaveStationSuccess(int leaveIndex, String leaveStation, - String nextStation,String nextStationKr) { + String nextStation,String nextStationKr, + long writeVersion) { onStartAutopilot(leaveIndex); @@ -670,12 +670,13 @@ public class OrderModel { , isLastStop); } - reBuildCacheRouteData(leaveIndex,BusConst.STATION_STATUS_STOPPED,true); + reBuildCacheRouteData(leaveIndex,BusConst.STATION_STATUS_STOPPED,true,writeVersion); } - private void reBuildCacheRouteData(int currentIndex, int currentDrivingStatus, boolean isLeaving) { + private void reBuildCacheRouteData(int currentIndex, int currentDrivingStatus, boolean isLeaving + , long writeVersion) { if (busRoutesResult != null){ - busRoutesResult.setWriteVersion(DateTimeUtil.getCurrentTimeStamp()); + busRoutesResult.setWriteVersion(writeVersion); List sites = busRoutesResult.getSites(); BusStationBean bean = sites.get(currentIndex); bean.setDrivingStatus(currentDrivingStatus); @@ -698,7 +699,7 @@ public class OrderModel { private void onStartAutopilot(int leaveIndex) { //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 isGoingToNextStation = true; - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { startAutopilot(false, leaveIndex); } else { @@ -757,13 +758,15 @@ public class OrderModel { isArrivedStation = true; isGoingToNextStation = false; + + long writeVersion = DateTimeUtil.getCurrentTimeStamp(); arriveStationSuccess(arrivedStationIndex, departureStopName, - arriveStation,arriveStationKr); + arriveStation,arriveStationKr,writeVersion); OrderServiceManager.arriveSiteStation(mContext, stationList.get(arrivedStationIndex).getSeq(), stationList.get(arrivedStationIndex).getSiteId(), - currentTaskId, + currentTaskId,writeVersion, new OchCommonServiceCallback() { @Override public void onSuccess(BaseData o) { @@ -803,7 +806,8 @@ public class OrderModel { } private void arriveStationSuccess(int arrivedStationIndex, String departureStopName, - String arriveStation,String arriveStationKr) { + String arriveStation,String arriveStationKr, + long writeVersion) { if (busRoutesResult != null) { boolean isLastStop = false; if (arrivedStationIndex == busRoutesResult.getSites().size() - 1) { @@ -821,7 +825,7 @@ public class OrderModel { sendArrivedStationToClient(arriveStation); - reBuildCacheRouteData(arrivedStationIndex, BusConst.STATION_STATUS_STOPPED,false); + reBuildCacheRouteData(arrivedStationIndex, BusConst.STATION_STATUS_STOPPED,false,writeVersion); } private void sendTaskDetailsToClients() { @@ -891,13 +895,15 @@ public class OrderModel { isArrivedStation = false; CallerLogger.INSTANCE.d(M_BUS + TAG, "行程日志-离站成功开往下一站===="); + + long writeVersion = DateTimeUtil.getCurrentTimeStamp(); leaveStationSuccess(backgroundCurrentStationIndex, currentStationName, - finalNextStationName,finalNextStationNameKr); + finalNextStationName,finalNextStationNameKr,writeVersion); OrderServiceManager.leaveStation(mContext, stationList.get(backgroundCurrentStationIndex).getSeq(), stationList.get(backgroundCurrentStationIndex).getSiteId(), - currentTaskId, + currentTaskId,writeVersion, new OchCommonServiceCallback() { @Override public void onSuccess(BaseData o) { diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt index a239420e1a..f081f08a34 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/net/OrderServiceManager.kt @@ -106,12 +106,13 @@ object OrderServiceManager { seq: Int, siteId: Int, taskId: Int, + writeVersion: Long, callback: OchCommonServiceCallback? ) { mService.leaveStation( MoGoAiCloudClientConfig.getInstance().serviceAppId, MoGoAiCloudClientConfig.getInstance().token, - BusUpdateSiteStatusRequest(taskId, siteId, seq) + BusUpdateSiteStatusRequest(taskId, siteId, seq,writeVersion) ) .transformTry() .subscribe(OchCommonSubscribeImpl(context, callback, "leaveStation")) @@ -126,13 +127,13 @@ object OrderServiceManager { */ @JvmStatic fun arriveSiteStation( - context: Context, seq: Int, siteId: Int, taskId: Int, + context: Context, seq: Int, siteId: Int, taskId: Int, writeVersion: Long, callback: OchCommonServiceCallback? ) { mService.arriveSiteStation( MoGoAiCloudClientConfig.getInstance().serviceAppId, MoGoAiCloudClientConfig.getInstance().token, - BusUpdateSiteStatusRequest(taskId, siteId, seq) + BusUpdateSiteStatusRequest(taskId, siteId, seq, writeVersion) ) .transformTry() .subscribe(OchCommonSubscribeImpl(context, callback, "arriveSiteStation")) diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java index 0a10e5b41f..ea411d37b0 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/presenter/BusPresenter.java @@ -167,14 +167,14 @@ public class BusPresenter extends Presenter @Override public void onAutopilotSNRequest() { - } @Override public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - if (autopilotStatusInfo == null) return; - int state = autopilotStatusInfo.getState(); -// CallerLogger.INSTANCE.d(M_BUS + TAG, "onStateChange: " + state + "currentAutopilotStatus = " + currentAutopilotStatus); + } + + @Override + public void onAutopilotStatusResponse(int state) { switch (state) { case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE: if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { @@ -210,26 +210,21 @@ public class BusPresenter extends Presenter && ( (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1) && OrderModel.getInstance().isGoingToNextStation() - ) ) { CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); return; } - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE; } - runOnUIThread(() -> { - mView.onAutopilotStatusChanged(currentAutopilotStatus); - }); + runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); break; case IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING: if (FunctionBuildConfig.isDemoMode && ( (mCurrentStation >= 0 && mCurrentStation <= mStationList.size() - 1) && OrderModel.getInstance().isGoingToNextStation() - ) ) { CallerLogger.INSTANCE.d(M_BUS + "BusOrderModel=", "有美化功能"); @@ -238,9 +233,7 @@ public class BusPresenter extends Presenter if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) { currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING; } - runOnUIThread(() -> { - mView.onAutopilotStatusChanged(currentAutopilotStatus); - }); + runOnUIThread(() -> mView.onAutopilotStatusChanged(currentAutopilotStatus)); break; default: runOnUIThread(() -> mView.onAutopilotEnableChange(false)); @@ -279,8 +272,6 @@ public class BusPresenter extends Presenter /** * 测试使用 - * - * @param status */ public void debugAutoPilotStatus(int status) { AutopilotStatusInfo info = new AutopilotStatusInfo(); @@ -345,4 +336,9 @@ public class BusPresenter extends Presenter public void onStartAdasFailure() { runOnUIThread(() -> mView.stopAnimAndUpdateBtnStatus()); } + + @Override + public void onAutopilotDockerInfo(@NonNull String dockerVersion) { + } + } diff --git a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java index b37e399e18..947adbfc0c 100644 --- a/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java +++ b/OCH/mogo-och-shuttle/src/main/java/com/mogo/och/bus/util/BusAnalyticsManager.java @@ -50,13 +50,13 @@ public class BusAnalyticsManager { CallerLogger.INSTANCE.e( M_BUS + "triggerStartAutopilotFailureEvent", failMsg ); - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_CODE, failCode); mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_FAILURE_MSG, failMsg); } mStartAutopilotParams.put(BusConst.EVENT_PARAM_START_RESULT - , CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == + , CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java index 7b607580bd..badb7dee50 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java @@ -2,6 +2,7 @@ package com.mogo.och.taxi.passenger.callback; import com.amap.api.maps.model.LatLng; +import com.mogo.eagle.core.data.map.MogoLocation; import java.util.List; @@ -11,7 +12,7 @@ import mogo.telematics.pad.MessagePad; * @date: 2021/11/1 */ public interface IOCHTaxiPassengerAutopilotPlanningCallback { - void setLineMarker(List models); - void routeResultByServer(List models,int haveArrivedIndex); + void setLineMarker(LatLng startStation,LatLng endStation); + void routeResultByServer(List routeArriviedTemp, List routeArrivingTemp, MogoLocation location); void showRottingMapView(); } \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java index daaf6b231c..f95bba5744 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModel.java @@ -14,7 +14,6 @@ import com.amap.api.maps.model.LatLng; import com.amap.api.navi.model.NaviLatLng; import com.elegant.network.utils.GsonUtil; import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; -import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.module.intent.IMogoIntentListener; import com.mogo.commons.module.intent.IntentManager; import com.mogo.commons.module.status.IMogoStatusChangedListener; @@ -48,6 +47,9 @@ import com.mogo.och.common.module.biz.network.OchCommonServiceCallback; import com.mogo.och.common.module.callback.OchAdasStartFailureCallback; import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager; import com.mogo.och.common.module.manager.OCHAdasAbilityManager; +import com.mogo.och.common.module.manager.distancemamager.IDistanceListener; +import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener; +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager; import com.mogo.och.common.module.map.AmapNaviToDestinationModel; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; @@ -109,7 +111,6 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } private Context mContext; - private volatile int mPrevAPStatus = -1; //前一次自动驾驶状态值 private volatile TaxiPassengerOrderQueryRespBean.Result mCurrentOCHOrder; //当前订单 private volatile List mInServiceList = Collections.emptyList(); //进行中订单 private volatile List mWaitServiceList = Collections.emptyList(); //待服务订单 @@ -241,7 +242,7 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback IntentManager.getInstance().registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); // 定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,mMapLocationListener); + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,10,mMapLocationListener); //2021.11.1 自动驾驶路线规划接口 CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); @@ -255,6 +256,10 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(mAdasStartFailureListener); CallerMsgBoxEventListenerManager.INSTANCE.addListener(TAG,iMsgBoxEventListener); + + TrajectoryAndDistanceManager.INSTANCE.addDistanceListener(TAG,distanceListener); + + TrajectoryAndDistanceManager.INSTANCE.addTrajectoryListener(TAG,trajectoryListener); } private void releaseListeners() { @@ -275,6 +280,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback OCHAdasAbilityManager.getInstance().setAdasStartFailureCallback(null); CallerMsgBoxEventListenerManager.INSTANCE.removeListener(iMsgBoxEventListener); + + TrajectoryAndDistanceManager.INSTANCE.removeListener(TAG); } /** @@ -447,7 +454,27 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } } + //监听网络变化,避免启动机器时无网导致无法更新订单信息 + private final IDistanceListener distanceListener = distance -> { + + }; + + private final ITrajectoryListener trajectoryListener = (routeArrivied, routeArriving, location) -> { + List routeArriviedTemp = new ArrayList<>(); + List routeArrivingTemp = new ArrayList<>(); + LatLng temp; + for (MogoLocation mogoLocation : routeArrivied) { + temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); + routeArriviedTemp.add(temp); + } + for (MogoLocation mogoLocation : routeArriving) { + temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); + routeArrivingTemp.add(temp); + } + mAutopilotPlanningCallback.routeResultByServer(routeArriviedTemp,routeArrivingTemp,location); + setRouteLineMarker(); + }; private final IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { @Override public void onIntentReceived( String intentStr, Intent intent ) { @@ -500,8 +527,11 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ @Override - public void onAutopilotRouteLineId(long lineId) { + public void onAutopilotDockerInfo(@NonNull String dockerVersion) { + } + @Override + public void onAutopilotRouteLineId(long lineId) { } @Override @@ -510,31 +540,26 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback @Override public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { + } + @Override + public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { } private boolean arriveAtEnd = false; //乘客app专用字段 @Override - public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - int state = autopilotStatusInfo.getState(); + public void onAutopilotStatusResponse(int state) { // CallerLogger.INSTANCE.d( M_TAXI_P + TAG, "state = %s", state ); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); if (mCurrentOCHOrder != null - && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.UserArriveAtStart - && state != mPrevAPStatus) { - + && getCurOrderStatus() == TaxiPassengerOrderStatusEnum.UserArriveAtStart) { TaxiPassengerAnalyticsManager.getInstance().triggerStartAutopilotEvent(false, true, mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.orderNo); - - // 当高频返回autopilot 2时,不重复调用订单状态变更 - mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态 startServicePilotDone(); } } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { - mPrevAPStatus = state; - if (FunctionBuildConfig.isDemoMode && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态 @@ -544,11 +569,8 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback arriveAtEnd = false; } } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotEnable(); } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { - mPrevAPStatus = state; - if (FunctionBuildConfig.isDemoMode && AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { // 当美化模式(演示模式)开启时:且是乘客app、且未到终点时,维持自动驾驶icon开启状态 @@ -558,14 +580,12 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback arriveAtEnd = false; } } - if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotDisable(); } } @Override public void onAutopilotSNRequest() { - } @Override @@ -579,14 +599,10 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback || (getCurOrderStatus() == TaxiPassengerOrderStatusEnum.ArriveAtEnd)) { return; } - if (DebugConfig.isDebug()) { - // TipToast.shortTip("到达目的地"); - } } @Override public void onAutopilotStatusRespByQuery(@NonNull SystemStatusInfo.StatusInfo status) { - } }; @@ -596,7 +612,6 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback public void onAutopilotRotting(@Nullable MessagePad.GlobalPathResp routeList) { if (null != routeList && routeList.getWayPointsList().size() > 0){ calculateRouteLineSum(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcjListCommon(mContext,routeList.getWayPointsList())); - setRouteLineMarker(routeList.getWayPointsList()); startToRouteAndWipe(routeList.getWayPointsList()); } } @@ -676,38 +691,26 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback * @param isStart */ public void startOrStopRouteAndWipe(boolean isStart){ - if (isStart){ - TaxiPassengerModelLoopManager.getInstance().startRouteAndWipe(); - }else { - mPreRouteIndex = 0; - TaxiPassengerModelLoopManager.getInstance().stopRouteAndWipe(); - } - } - public void loopRouteAndWipe() { - if (mLocationsModels != null && mLocationsModels.size() > 0 && mLocation != null){ - int haveArrivedIndex = CoordinateCalculateRouteUtil - .getArrivedPointIndexNew(mPreRouteIndex, - mLocationsModels, - mLocation); - mPreRouteIndex = haveArrivedIndex; - if (mAutopilotPlanningCallback != null){ - List latLngsModels = CoordinateCalculateRouteUtil - .coordinateConverterLocationToLatLng(mContext, - mLocationsModels); - mAutopilotPlanningCallback.routeResultByServer(latLngsModels,haveArrivedIndex); - } - } } /** * 设置小地图路径的起终点marker */ - public void setRouteLineMarker(List models){ - List latLngModels = CoordinateCalculateRouteUtil - .coordinateConverterWgsToGcjListCommon(mContext,models); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.setLineMarker(latLngModels); + public void setRouteLineMarker(){ + if (mCurrentOCHOrder.startSiteGcjPoint == null || mCurrentOCHOrder.startSiteGcjPoint.isEmpty() || mCurrentOCHOrder.startSiteGcjPoint.size() < 2|| + mCurrentOCHOrder.endSiteGcjPoint == null || mCurrentOCHOrder.endSiteGcjPoint.isEmpty() || mCurrentOCHOrder.endSiteGcjPoint.size() < 2) { + setMarker(null,null); + return; + } + LatLng startStation = new LatLng(mCurrentOCHOrder.startSiteGcjPoint.get(1),mCurrentOCHOrder.startSiteGcjPoint.get(0)); + LatLng endStation = new LatLng(mCurrentOCHOrder.endSiteGcjPoint.get(1),mCurrentOCHOrder.endSiteGcjPoint.get(0)); + setMarker(startStation,endStation); + } + + private void setMarker(LatLng startStation,LatLng endStation){ + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback.setLineMarker(startStation,endStation); } } @@ -784,9 +787,9 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback if (data != null && data.data != null && data.data != null && data.data.size() > 0){ if (mAutopilotPlanningCallback != null){ calculateRouteLineSum(data.data); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.setLineMarker(data.data); - } +// if (mAutopilotPlanningCallback != null){ +// mAutopilotPlanningCallback.setLineMarker(data.data); +// } mLocationsModels.clear(); List locationsModels = CoordinateCalculateRouteUtil. coordinateConverterLatlngToLocation(data.data); @@ -1056,4 +1059,20 @@ public class TaxiPassengerModel implements IOCHTaxiPassengerNaviChangedCallback } } + public void setStation(){ + if(mCurrentOCHOrder!=null){ + MogoLocation startStation = new MogoLocation(); + startStation.setLongitude(mCurrentOCHOrder.startSiteGcjPoint.get(0)); + startStation.setLatitude(mCurrentOCHOrder.startSiteGcjPoint.get(1)); + MogoLocation endStation = new MogoLocation(); + endStation.setLongitude(mCurrentOCHOrder.endSiteGcjPoint.get(0)); + endStation.setLatitude(mCurrentOCHOrder.endSiteGcjPoint.get(1)); + TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation,endStation,mCurrentOCHOrder.lineId); + } + } + + public void cleanStation(){ + TrajectoryAndDistanceManager.INSTANCE.setStationPoint(null,null,-1L); + } + } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java index f182ba65c3..bb3ebec0dc 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/model/TaxiPassengerModelLoopManager.java @@ -59,45 +59,6 @@ public class TaxiPassengerModelLoopManager { } } - public void startRouteAndWipe() { - CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "startRouteAndWipe()"); - if (mRouteWipeDisposable != null) return; - - mRouteWipeDisposable = new CompositeDisposable(); - Disposable disposable = startLoopRouteAndWipe() - .doOnSubscribe(new Consumer() { - @Override - public void accept(Disposable disposable) throws Exception { - - } - }).doOnError(new Consumer() { - @Override - public void accept(Throwable throwable) throws Exception { - } - }) - .delay(TaxiPassengerConst.LOOP_PERIOD_1S, TimeUnit.MILLISECONDS, true) // 设置delayError为true,表示出现错误的时候也需要延迟5s进行通知,达到无论是请求正常还是请求失败,都是5s后重新订阅,即重新请求。 - .subscribeOn(Schedulers.io()) - .repeat() // repeat保证请求成功后能够重新订阅。 - .retry() // retry保证请求失败后能重新订阅 - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(Integer integer) throws Exception { - } - }); - mRouteWipeDisposable.add(disposable); - } - - public Observable startLoopRouteAndWipe(){ - return Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter emitter) throws Exception { - TaxiPassengerModel.getInstance().loopRouteAndWipe(); - emitter.onComplete(); - } - }); - } - public void stopRouteAndWipe() { if (mRouteWipeDisposable != null) { CallerLogger.INSTANCE.i(M_TAXI_P + TAG, "stopRouteAndWipe()"); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java index d61feb6cc9..655a1a1f6c 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/presenter/BaseTaxiPassengerPresenter.java @@ -172,7 +172,7 @@ public class BaseTaxiPassengerPresenter extends Presenter{ @@ -201,6 +202,7 @@ public class BaseTaxiPassengerPresenter extends Presenter models) { - if (models == null) return; - runOnUIThread(() -> mView.setLineMarker(models)); + public void setLineMarker(LatLng startStation,LatLng endStation) { + if (startStation == null || endStation == null) return; + runOnUIThread(() -> mView.setLineMarker(startStation,endStation)); } @Override - public void routeResultByServer(List models, int haveArrivedIndex) { - if (models == null) return; - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "routeResultByServer:" + models.size() - + " haveArrivedIndex = " + haveArrivedIndex); - runOnUIThread(() ->mView.routeResultByServer(models,haveArrivedIndex)); + public void routeResultByServer(List routeArriviedTemp, List routeArrivingTemp, MogoLocation location) { + runOnUIThread(() ->mView.routeResultByServer(routeArriviedTemp,routeArrivingTemp,location)); } @Override diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/ITaxiPassengerMapDirectionView.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/ITaxiPassengerMapDirectionView.java deleted file mode 100644 index 831abdbe23..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/ITaxiPassengerMapDirectionView.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.mogo.och.taxi.passenger.ui; - -/** - * @author xiaoyuzhou - * @date 2021/6/24 11:33 上午 - */ -public interface ITaxiPassengerMapDirectionView { - - /** - * 绘制路径线 - */ - void drawablePolyline(); - - /** - * 清除路径线 - */ - void clearPolyline(); - - /** - * 设置路径中起终点marker - */ - void setLineMarker(); -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/ITaxiPassengerMapDirectionView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/ITaxiPassengerMapDirectionView.kt new file mode 100644 index 0000000000..4db01025e5 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/ITaxiPassengerMapDirectionView.kt @@ -0,0 +1,24 @@ +package com.mogo.och.taxi.passenger.ui + +import com.amap.api.maps.model.LatLng + +/** + * @author xiaoyuzhou + * @date 2021/6/24 11:33 上午 + */ +interface ITaxiPassengerMapDirectionView { + /** + * 绘制路径线 + */ + fun drawablePolyline() + + /** + * 清除路径线 + */ + fun clearPolyline() + + /** + * 设置路径中起终点marker + */ + fun setLineMarker(startStation: LatLng, endStation: LatLng) +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OverviewFragment.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OverviewFragment.kt index bacbed20e7..7fdd99ff80 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OverviewFragment.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/OverviewFragment.kt @@ -10,6 +10,7 @@ import com.mogo.eagle.core.function.view.OverMapView 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.UiThreadHandler +import com.mogo.och.taxi.passenger.R import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum import com.mogo.och.taxi.passenger.model.TaxiPassengerModel import io.reactivex.Observable @@ -26,23 +27,6 @@ class OverviewFragment : BaseFragment() { private var subscribe: Disposable?=null - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - if (overmapview == null) { - overmapview = OverMapView(requireContext()) - } else { - val viewGroup = overmapview?.parent as ViewGroup - viewGroup.removeView(overmapview) - } - overmapview?.onCreateView(savedInstanceState) - CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"onCreateView") - statusChange(TaxiPassengerModel.getInstance().curOrderStatus) - return overmapview!! - } - override fun onResume() { super.onResume() overmapview?.onResume() @@ -80,7 +64,6 @@ class OverviewFragment : BaseFragment() { if(finalVisable2User){ CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"已经隐藏") finalVisable2User = false - stopAndClear() } } } @@ -111,12 +94,13 @@ class OverviewFragment : BaseFragment() { CallerFuncBizManager.bizProvider.stopQueryV2XEvents() UiThreadHandler.post({ overmapview?.clearV2XMarkers() + overmapview?.clearCustomPolyline() }, UiThreadHandler.MODE.QUEUE) } override fun getLayoutId(): Int { - return 0 + return R.layout.taxi_p_overmap_fragment } override fun getTagName(): String { @@ -127,6 +111,15 @@ class OverviewFragment : BaseFragment() { } + override fun initViews(savedInstanceState: Bundle?) { + super.initViews(savedInstanceState) + overmapview = findViewById(R.id.overMapView) + overmapview?.onCreateView(savedInstanceState) + + CallerLogger.d(SceneConstant.M_TAXI_P + TAG,"onCreateView") + statusChange(TaxiPassengerModel.getInstance().curOrderStatus) + } + companion object{ private const val TAG = "OverviewFragment" @JvmStatic diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java index 3254104ca0..42c739cee9 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerBaseFragment.java @@ -21,7 +21,9 @@ import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxBubbleView; import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxButtonView; import com.mogo.eagle.core.function.hmi.ui.msgbox.PassengerMsgBoxListView; +import com.mogo.eagle.core.function.hmi.ui.widget.RomaPassengerView; import com.mogo.eagle.core.function.view.MapBizView; +import com.mogo.eagle.core.utilcode.util.DeviceUtils; import com.mogo.eagle.core.utilcode.util.OverlayViewUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.map.listener.IMogoMapListener; @@ -58,6 +60,7 @@ public class TaxiPassengerBaseFragment extends MvpFragment mArrivedEndView; private WeakReference mArrivedCheckView; @@ -94,10 +97,17 @@ public class TaxiPassengerBaseFragment extends MvpFragment onAutopilotStatusChanged(CallerAutoPilotStatusListenerManager.INSTANCE.getState()), 1000L); } @NonNull diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.java deleted file mode 100644 index 7b18908634..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.java +++ /dev/null @@ -1,376 +0,0 @@ -package com.mogo.och.taxi.passenger.ui; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; - -import android.content.Context; -import android.os.Bundle; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.RelativeLayout; - -import androidx.annotation.Nullable; - -import com.amap.api.maps.AMap; -import com.amap.api.maps.CameraUpdate; -import com.amap.api.maps.CameraUpdateFactory; -import com.amap.api.maps.CoordinateConverter; -import com.amap.api.maps.TextureMapView; -import com.amap.api.maps.UiSettings; -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.CustomMapStyleOptions; -import com.amap.api.maps.model.LatLng; -import com.amap.api.maps.model.LatLngBounds; -import com.amap.api.maps.model.Marker; -import com.amap.api.maps.model.MarkerOptions; -import com.amap.api.maps.model.Polyline; -import com.amap.api.maps.model.PolylineOptions; -import com.mogo.eagle.core.data.map.MogoLatLng; -import com.mogo.eagle.core.data.map.MogoLocation; -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener; -import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.och.taxi.passenger.R; -import com.mogo.och.taxi.passenger.callback.ITaxiPassengerMapViewCallback; -import com.mogo.och.taxi.passenger.utils.TaxiPassengerMapAssetStyleUtil; - -import java.util.ArrayList; -import java.util.List; - -/** - * 乘客屏小地图 - */ -public class TaxiPassengerMapDirectionView - extends RelativeLayout - implements IMoGoChassisLocationGCJ02Listener, ITaxiPassengerMapDirectionView, AMap.OnCameraChangeListener { - - //小地图名称 - public static final String TAG = "TPMapDirectionView"; - - private TextureMapView mAMapNaviView; - private AMap mAMap; - private Marker mCarMarker; - private Marker mStartMarker; - private Marker mEndMarker; - - private int zoomLevel = 13; - private List mCoordinatesLatLng = new ArrayList<>(); - private Polyline mPolyline; - private CameraUpdate mCameraUpdate; - private Context mContext; - private int mHaveArrivedIndex; - - List textureList = new ArrayList<>(); - List texIndexList = new ArrayList<>(); - - private BitmapDescriptor mArrivedRes; - private BitmapDescriptor mUnArrivedRes; - - private ITaxiPassengerMapViewCallback mITaxiPassengerMapViewCallback; - - public TaxiPassengerMapDirectionView(Context context) { - this(context, null); - } - - public TaxiPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs) { - this(context, attrs, 0); - } - - public TaxiPassengerMapDirectionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - try { - initView(context); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void setTaxiPassengerMapViewCallback(ITaxiPassengerMapViewCallback ITaxiPassengerMapViewCallback){ - this.mITaxiPassengerMapViewCallback = ITaxiPassengerMapViewCallback; - } - - private void initView(Context context) { - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "initView"); - - mContext = context; - - View smpView = LayoutInflater.from(context).inflate(R.layout.taxi_p_map_view, this); - - mAMapNaviView = (TextureMapView) smpView.findViewById(R.id.taxi_p_order_amap_view); - - initAMapView(); - - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); - } - - private void initAMapView() { - mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); - mAMap = mAMapNaviView.getMap(); - // 设置导航地图模式,aMap是地图控制器对象。 - mAMap.setMapType(AMap.MAP_TYPE_NIGHT); - - // 关闭显示实时路况图层,aMap是地图控制器对象。 - mAMap.setTrafficEnabled(false); - - // 设置 锚点 图标 - mCarMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_car)) - .anchor(0.5f, 0.5f)); - mStartMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_view_dir_start))); - mEndMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_view_dir_end))); - - mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_arrived); - mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_un_arrive); - - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(TaxiPassengerMapAssetStyleUtil.getAssetsStyle(getContext(),"map_style.data")) - .setStyleExtraData(TaxiPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(),"map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - - //设置希望展示的地图缩放级别 - mAMap.moveCamera(mCameraUpdate); - - // 设置地图的样式 - UiSettings uiSettings = mAMap.getUiSettings(); - uiSettings.setZoomControlsEnabled(false);// 地图缩放级别的交换按钮 - uiSettings.setAllGesturesEnabled(false);// 所有手势 - uiSettings.setMyLocationButtonEnabled(false); // 显示默认的定位按钮 - uiSettings.setLogoBottomMargin(-150); //设置Logo下边界距离屏幕底部的边距,设置为负值即可 - - mAMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() { - @Override - public void onMapLoaded() { - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "smp---onMapLoaded"); - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(TaxiPassengerMapAssetStyleUtil.getAssetsStyle(getContext(),"map_style.data")) - .setStyleExtraData(TaxiPassengerMapAssetStyleUtil.getAssetsExtraStyle(getContext(),"map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - mAMapNaviView.getMap().setPointToCenter(mAMapNaviView.getWidth() / 2, mAMapNaviView.getHeight() / 2); - } - }); - - //设置地图状态的监听接口 - mAMap.setOnCameraChangeListener(this); - } - - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return true; - } - - @Override - public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { - if (gnssInfo == null){ - return; - } - LatLng currentLatLng = new LatLng(gnssInfo.getLatitude(), gnssInfo.getLongitude()); - - if (mCoordinatesLatLng.size() > 1) { - //圈定地图显示范围 - LatLng endLatLng = mCoordinatesLatLng.get(mCoordinatesLatLng.size() - 1); - //存放经纬度 - LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); - boundsBuilder.include(currentLatLng); - boundsBuilder.include(endLatLng); - //第二个参数为四周留空宽度 - mAMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100,100,100,100)); -// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "onCarLocationChanged2--moveCamera :" + location.getLatitude()+", "+location.getLongitude()); - - } else { - //设置希望展示的地图缩放级别 - CameraPosition cameraPosition = new CameraPosition.Builder() - .target(mCarMarker.getPosition()).tilt(0).bearing((float) gnssInfo.getHeading()).zoom(zoomLevel).build(); - mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); - } - //更新车辆位置 - if (mCarMarker != null) { -// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "location.getBearing() = " + location.getBearing()); - mCarMarker.setRotateAngle((float) (360 - gnssInfo.getHeading())); - mCarMarker.setPosition(currentLatLng); -// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "onCarLocationChanged2--loacation :" + location.getLatitude()+", "+location.getLongitude()); - mCarMarker.setToTop(); - } - } - - @Override - public void setLineMarker() { - if (mStartMarker != null) { - mStartMarker.setVisible(false); - } - if (mEndMarker != null) { - mEndMarker.setVisible(false); - } - if (mCoordinatesLatLng.size() >= 2) { - // 设置开始结束Marker位置 - LatLng startLatLng = mCoordinatesLatLng.get(0); - LatLng endLatLng = mCoordinatesLatLng.get(mCoordinatesLatLng.size() - 1); - if (mStartMarker != null) { - mStartMarker.setPosition(startLatLng); - mStartMarker.setVisible(true); - } - - if (mEndMarker != null) { - mEndMarker.setPosition(endLatLng); - mEndMarker.setVisible(true); - } - } - } - - @Override - public void drawablePolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - if (mAMap != null) { - - addRouteColorList(); - - if (mCoordinatesLatLng.size() >= 2) { - //设置线段纹理 - PolylineOptions polylineOptions = new PolylineOptions(); - polylineOptions.addAll(mCoordinatesLatLng); - polylineOptions.setUseTexture(true); - polylineOptions.width(15); - polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound); - polylineOptions.setCustomTextureList(textureList); - polylineOptions.setCustomTextureIndex(texIndexList); -// polylineOptions.setCustomTexture(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_un_arrive)); - - // 绘制线 - mPolyline = mAMap.addPolyline(polylineOptions); - - } - } - } - - /** - * 添加画线颜色值 - */ - private void addRouteColorList() { - textureList.clear(); - texIndexList.clear(); - for (int i = 0; i < mCoordinatesLatLng.size(); i++){ - if (i <= mHaveArrivedIndex){ - textureList.add(mArrivedRes); - }else { - textureList.add(mUnArrivedRes); - } - texIndexList.add(i); - } - } - - - public LatLng CoordinateConverterFrom84(Context mContext, MogoLatLng mogoLatLng) { - CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext); - mCoordinateConverter.from(CoordinateConverter.CoordType.GPS); - mCoordinateConverter.coord(new LatLng(mogoLatLng.lat, mogoLatLng.lon)); - LatLng latLng = mCoordinateConverter.convert(); - return latLng; - } - - public List CoordinateConverterFrom84ForList(Context mContext, List mogoLatLngList) { - List list = new ArrayList<>(); - for (MogoLatLng m : mogoLatLngList) { - LatLng mogoLatLng = CoordinateConverterFrom84(mContext, m); - list.add(mogoLatLng); - } - return list; - } - - @Override - public void clearPolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - if (mStartMarker != null) { - mStartMarker.setVisible(false); - } - if (mEndMarker != null) { - mEndMarker.setVisible(false); - } - } - - public void resetPolyine() { - mCoordinatesLatLng.clear(); - if (mPolyline != null) { - mPolyline.remove(); - } - if (mStartMarker != null) { - mStartMarker.setVisible(false); - } - if (mEndMarker != null) { - mEndMarker.setVisible(false); - } - } - - public void onCreateView(Bundle savedInstanceState) { - if (mAMapNaviView != null) { - mAMapNaviView.onCreate(savedInstanceState); - } - } - - public void onResume() { - if (mAMapNaviView != null) { - mAMapNaviView.onResume(); - } - } - - public void onPause() { - if (mAMapNaviView != null) { - mAMapNaviView.onPause(); - } - } - - public void onDestroy() { - if (mAMapNaviView != null) { - mAMapNaviView.onDestroy(); - } - } - - public void convert(List coordinates) { - mCoordinatesLatLng.clear(); - List latLngs = CoordinateConverterFrom84ForList(mContext, coordinates); - mCoordinatesLatLng.addAll(latLngs); - } - - public void setCoordinatesLatLng(List latLngs){ - mCoordinatesLatLng.clear(); - mCoordinatesLatLng.addAll(latLngs); - } - - public void setCoordinatesLatLng(List latLngs, int haveArrivedIndex){ - mCoordinatesLatLng.clear(); - mCoordinatesLatLng.addAll(latLngs); - mHaveArrivedIndex = haveArrivedIndex; - } - - @Override - public void onCameraChange(CameraPosition cameraPosition) { - mITaxiPassengerMapViewCallback.onCameraChange(cameraPosition.bearing); - } - - @Override - public void onCameraChangeFinish(CameraPosition cameraPosition) { - - } -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.kt new file mode 100644 index 0000000000..0536e8e49d --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerMapDirectionView.kt @@ -0,0 +1,271 @@ +package com.mogo.och.taxi.passenger.ui + +import android.content.Context +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.widget.RelativeLayout +import com.amap.api.maps.AMap +import com.amap.api.maps.CameraUpdate +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.CustomMapStyleOptions +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.Polyline +import com.amap.api.maps.model.PolylineOptions +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.addListener +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.taxi.passenger.R +import com.mogo.och.taxi.passenger.callback.ITaxiPassengerMapViewCallback +import com.mogo.och.taxi.passenger.utils.TaxiPassengerMapAssetStyleUtil + +/** + * 乘客屏小地图 + */ +class TaxiPassengerMapDirectionView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener, + ITaxiPassengerMapDirectionView, AMap.OnCameraChangeListener { + + companion object { + //小地图名称 + const val TAG = "TaxiPassengerMapDirectionView" + private const val zoomLevel = 13.0f + } + + private lateinit var mAMapNaviView: TextureMapView + private lateinit var mAMap: AMap + private lateinit var mCarMarker: Marker + private lateinit var mStartMarker: Marker + private lateinit var mEndMarker: Marker + private lateinit var mArrivedRes: BitmapDescriptor + private lateinit var mUnArrivedRes: BitmapDescriptor + + private val mCoordinatesLatLng: MutableList = ArrayList() + private var mPolyline: Polyline? = null + private var mCameraUpdate: CameraUpdate? = null + private var mContext: Context? = null + var textureList: MutableList = ArrayList() + var texIndexList: MutableList = ArrayList() + private var mITaxiPassengerMapViewCallback: ITaxiPassengerMapViewCallback? = null + + private val routeArrivied: MutableList = ArrayList() + private val routeArriving: MutableList = ArrayList() + private var location: MogoLocation? = null + + init { + initView(context) + } + + fun setTaxiPassengerMapViewCallback(ITaxiPassengerMapViewCallback: ITaxiPassengerMapViewCallback?) { + mITaxiPassengerMapViewCallback = ITaxiPassengerMapViewCallback + } + + private fun initView(context: Context) { + d(SceneConstant.M_TAXI_P + TAG, "initView") + mContext = context + LayoutInflater.from(context).inflate(R.layout.taxi_p_map_view, this) + mAMapNaviView = findViewById(R.id.taxi_p_order_amap_view) + initAMapView() + + // 注册定位监听 + addListener(TAG, 10, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + } + + private fun initAMapView() { + mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel) + mAMap = mAMapNaviView.map + // 设置导航地图模式,aMap是地图控制器对象。 + mAMap.mapType = AMap.MAP_TYPE_NIGHT + + // 关闭显示实时路况图层,aMap是地图控制器对象。 + mAMap.isTrafficEnabled = false + + // 设置 锚点 图标 + mCarMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_car)).anchor(0.5f, 0.5f)) + mStartMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_view_dir_start))) + mEndMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_view_dir_end))) + mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_arrived) + mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_p_map_arrow_un_arrive) + + // 加载自定义样式 + val customMapStyleOptions = CustomMapStyleOptions() + .setEnable(true) + .setStyleData(TaxiPassengerMapAssetStyleUtil.getAssetsStyle(context, "map_style.data")) + .setStyleExtraData(TaxiPassengerMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data")) + // 设置自定义样式 + mAMap.setCustomMapStyle(customMapStyleOptions) + + //设置希望展示的地图缩放级别 + mAMap.moveCamera(mCameraUpdate) + + // 设置地图的样式 + mAMap.uiSettings.apply { + isZoomControlsEnabled = false // 地图缩放级别的交换按钮 + setAllGesturesEnabled(false) // 所有手势 + isMyLocationButtonEnabled = false // 显示默认的定位按钮 + setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可 + } + + mAMap.setOnMapLoadedListener { + d(SceneConstant.M_TAXI_P + TAG, "smp---onMapLoaded") + // 加载自定义样式 + val options = CustomMapStyleOptions() + .setEnable(true) + .setStyleData( + TaxiPassengerMapAssetStyleUtil.getAssetsStyle(context, "map_style.data") + ) + .setStyleExtraData( + TaxiPassengerMapAssetStyleUtil.getAssetsExtraStyle(context, "map_style_extra.data") + ) + // 设置自定义样式 + mAMap.setCustomMapStyle(options) + mAMapNaviView.map.setPointToCenter(mAMapNaviView.width / 2, mAMapNaviView.height / 2) + } + + //设置地图状态的监听接口 + mAMap.setOnCameraChangeListener(this) + } + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + return true + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (mogoLocation == null) { + return + } + val currentLatLng = LatLng(mogoLocation.latitude, mogoLocation.longitude) + if (mPolyline!=null&&!mPolyline!!.points.isNullOrEmpty()) { + //圈定地图显示范围 + val endLatLng = mPolyline!!.points.last() + //存放经纬度 + val boundsBuilder = LatLngBounds.Builder().apply { + include(currentLatLng) + include(endLatLng) + } + //第二个参数为四周留空宽度 + mAMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100)) + } else { + //设置希望展示的地图缩放级别 + val cameraPosition = CameraPosition.Builder() + .target(mCarMarker.position) + .tilt(0f) + .bearing(mogoLocation.heading.toFloat()) + .zoom(zoomLevel).build() + mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)) + } + //更新车辆位置 + mCarMarker.rotateAngle = (360 - mogoLocation.heading).toFloat() + mCarMarker.position = currentLatLng + mCarMarker.setToTop() + } + + override fun setLineMarker(startStation:LatLng,endStation:LatLng) { + mStartMarker.isVisible = false + mEndMarker.isVisible = false + mStartMarker.position = startStation + mStartMarker.isVisible = true + mEndMarker.position = endStation + mEndMarker.isVisible = true + } + + override fun drawablePolyline() { + if (routeArrivied.isEmpty() && routeArriving.isEmpty()) { + d(SceneConstant.M_TAXI + TAG, "没有点") + return + } + texIndexList.clear() + val allPoints = ArrayList(routeArrivied) + for (i in routeArrivied.indices) { + if (routeArrivied.size > 1 && i < routeArrivied.size - 1) { + texIndexList.add(0) + } + } + texIndexList.add(0) + allPoints.add(LatLng(location!!.latitude, location!!.longitude)) + allPoints.addAll(routeArriving) + for (ignored in routeArrivied) { + texIndexList.add(1) + } + if (mPolyline != null) { + mPolyline!!.points = allPoints + mPolyline!!.options.customTextureIndex = texIndexList + return + } + if(textureList.isEmpty()) { + textureList.add(mArrivedRes) + textureList.add(mUnArrivedRes) + } + //设置线段纹理 + val polylineOptions = PolylineOptions().apply { + addAll(allPoints) + isUseTexture = true + width(15f) + lineCapType(PolylineOptions.LineCapType.LineCapRound) + customTextureList = textureList + customTextureIndex = texIndexList + } + + // 绘制线 + mPolyline = mAMap.addPolyline(polylineOptions) + } + + override fun clearPolyline() { + if (mPolyline != null) { + mPolyline!!.remove() + mPolyline = null + } + mStartMarker.isVisible = false + mEndMarker.isVisible = false + } + + fun onCreateView(savedInstanceState: Bundle?) { + mAMapNaviView.onCreate(savedInstanceState) + } + + fun onResume() { + mAMapNaviView.onResume() + } + + fun onPause() { + mAMapNaviView.onPause() + } + + fun onDestroy() { + mAMapNaviView.onDestroy() + } + + fun setCoordinatesLatLng(routeArrivied: List?, routeArriving: List?, location: MogoLocation?) { + this.routeArrivied.clear() + this.routeArrivied.addAll(routeArrivied!!) + this.routeArriving.clear() + this.routeArriving.addAll(routeArriving!!) + this.location = location + } + + override fun onCameraChange(cameraPosition: CameraPosition) { + mITaxiPassengerMapViewCallback!!.onCameraChange(cameraPosition.bearing) + } + + override fun onCameraChangeFinish(cameraPosition: CameraPosition) {} +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java deleted file mode 100644 index c40834776b..0000000000 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.java +++ /dev/null @@ -1,435 +0,0 @@ -package com.mogo.och.taxi.passenger.ui; - -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI_P; - -import android.animation.Animator; -import android.animation.AnimatorInflater; -import android.os.Build; -import android.os.Bundle; -import android.os.Looper; -import android.view.View; -import android.view.animation.Animation; -import android.view.animation.RotateAnimation; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.RequiresApi; -import androidx.appcompat.widget.AppCompatSeekBar; -import androidx.fragment.app.FragmentTransaction; - -import com.amap.api.maps.model.LatLng; -import com.mogo.commons.mvp.MvpFragment; -import com.mogo.eagle.core.data.map.MogoLocation; -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; -import com.mogo.eagle.core.utilcode.util.UiThreadHandler; -import com.mogo.och.common.module.map.AmapNaviToDestinationModel; -import com.mogo.och.common.module.map.CommonAmapNaviVIew; -import com.mogo.och.common.module.utils.DateTimeUtil; -import com.mogo.och.common.module.utils.NumberFormatUtil; -import com.mogo.och.common.module.wigets.OCHGradientTextView; -import com.mogo.och.common.module.wigets.OCHRadiusImageView; -import com.mogo.och.taxi.passenger.R; -import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean; -import com.mogo.och.taxi.passenger.callback.ITaxiPassengerMapViewCallback; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst; -import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum; -import com.mogo.och.taxi.passenger.model.TaxiPassengerModel; -import com.mogo.och.taxi.passenger.presenter.TaxiPassengerServingOrderPresenter; -import com.mogo.och.taxi.passenger.utils.TPRouteDataTestUtils; - -import java.util.Calendar; -import java.util.List; - -/** - * @author: wangmingjun - * @date: 2022/3/8 - */ -public class TaxiPassengerServingOrderFragment extends - MvpFragment - implements TaxiPassengerTaxiView, ITaxiPassengerMapViewCallback { - - private final String TAG = TaxiPassengerServingOrderFragment.class.getSimpleName(); - - private OCHGradientTextView mTPSpeedTv; - private TextView mTPSpeedTvShadowBg; - - private TextView mTPOrderStatus; - private TextView mTPOrderStartStation; - private TextView mTPOrderEndStation; - private TextView mTPOrderRemainDis; - private TextView mTPOrderRemainDisUnit; - private TextView mTPOrderRemainTime; - private TextView mTPOrderRemainArriveTime; - private ImageView mMapArrowIcon; - - private TaxiPassengerMapDirectionView mMapRottingView; - private CommonAmapNaviVIew mAmapNaviVIew; - - private float lastBearing = 0; - private RotateAnimation rotateAnimation; - - private AppCompatSeekBar mProgressSeekBar; - private TextView mProgessDes; - - private OCHRadiusImageView mSpeedLayoutBg; - - private int mLimitingVelocity = 0;// 返回的道路限速值 - - public static TaxiPassengerServingOrderFragment newInstance() { - - Bundle args = new Bundle(); - - TaxiPassengerServingOrderFragment fragment = new TaxiPassengerServingOrderFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - protected int getLayoutId() { - return R.layout.taxi_p_activity_serving_order_view; - } - - @Override - public String getTagName() { - return "TaxiPassengerServingOrderFragment"; - } - - @Override - protected void initViews() { - - mTPSpeedTv = findViewById(R.id.taxi_p_speed_tv); - mTPSpeedTvShadowBg = findViewById(R.id.taxi_p_speed_tv_bg); - mTPSpeedTv.setVertrial(true); - mTPSpeedTv.setmColorList(new int[]{getResources().getColor(R.color.taxi_p_speed_normal_color1),getResources().getColor(R.color.taxi_p_speed_normal_color2)}); - mTPSpeedTv.setText(String.valueOf(0)); - mTPSpeedTvShadowBg.setText(String.valueOf(0)); - - mTPOrderStatus = findViewById(R.id.taxi_p_order_status_tv); - mTPOrderStartStation = findViewById(R.id.taxi_p_order_status_start_station_tv); - mTPOrderEndStation = findViewById(R.id.taxi_p_order_status_end_station_tv); - mTPOrderRemainDis = findViewById(R.id.taxi_p_order_remain_distance); - mTPOrderRemainDisUnit = findViewById(R.id.taxi_p_order_remain_distance_unit); - mTPOrderRemainTime = findViewById(R.id.taxi_p_order_remain_time); - mTPOrderRemainArriveTime = findViewById(R.id.taxi_p_order_remain_arrive_time); - - mMapArrowIcon = findViewById(R.id.taxi_p_arrow_nor); - mProgressSeekBar = findViewById(R.id.taxi_p_seekbar); - mProgessDes = findViewById(R.id.taxi_p_progress_des); - - mSpeedLayoutBg = findViewById(R.id.taxi_p_speed_bg); - - mTPOrderStatus.setOnLongClickListener(new View.OnLongClickListener() { //测试用 - @Override - public boolean onLongClick(View v) { - TPRouteDataTestUtils.converToRouteData(); - return true; - } - }); - - } - - @Override - protected void initViews(Bundle savedInstanceState) { - super.initViews(savedInstanceState); - initRouteNaviView(savedInstanceState); - initAmapNaviView(savedInstanceState); - } - - private void initAmapNaviView(Bundle savedInstanceState) { - mAmapNaviVIew = mRootView.findViewById(R.id.taxi_p_order_amap_navi_view); - mAmapNaviVIew.onCreate(savedInstanceState); - TaxiPassengerModel.getInstance().startNaviByAmap(); - } - - private void initRouteNaviView(Bundle savedInstanceState) { - mMapRottingView = mRootView.findViewById(R.id.taxi_p_order_rotting_map_view); - mMapRottingView.onCreateView(savedInstanceState); - mMapRottingView.setTaxiPassengerMapViewCallback(this); - } - - @NonNull - @Override - protected TaxiPassengerServingOrderPresenter createPresenter() { - return new TaxiPassengerServingOrderPresenter(this); - } - - /** - * 设置进度条最大值为 起点终点首次规划出的值 - */ - private void setSeekBarMax() { - //计算订单起点和终点距离 - int maxInt = SharedPrefsMgr.getInstance(getContext()).getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,0); - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "maxInt = " + maxInt); - mProgressSeekBar.setMax(maxInt); - } - - /** - * 行驶进度值更新 - */ - @RequiresApi(api = Build.VERSION_CODES.N) - private void updateDriveProcessLoading(int progressLoading) { - int progressInt = SharedPrefsMgr.getInstance(getContext()) - .getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS,0) - progressLoading; - CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"progressInt = "+progressInt); - mProgressSeekBar.setProgress( - progressInt - , true); - mProgressSeekBar.jumpDrawablesToCurrentState(); - } - - private void updateDriveRoadName(String currentRoadName){ - if (mProgessDes != null){ - mProgessDes.setText(currentRoadName); - } - } - - @Override - public void onResume() { - super.onResume(); - if (mMapRottingView != null) { - mMapRottingView.onResume(); - } - if (mAmapNaviVIew != null){ - mAmapNaviVIew.onResume(); - } - TaxiPassengerModel.getInstance().initGeocodeSearch(); - } - - @Override - public void onHiddenChanged(boolean hidden) { - super.onHiddenChanged(hidden); - - if (hidden){//fragment 隐藏, 导航取消c - clearPolyline(); - TaxiPassengerModel.getInstance().destoryGeocodeSearch(); - }else { //fragment 显示, 导航开始 - CallerLogger.INSTANCE.e(M_TAXI_P +"TaxiPassengerNaviTo","initGeocodeSearch"); - TaxiPassengerModel.getInstance().initGeocodeSearch(); - } - } - - @Override - public void onPause() { - super.onPause(); - if (mMapRottingView != null) { - mMapRottingView.onPause(); - } - if (mAmapNaviVIew != null){ - mAmapNaviVIew.onPause(); - } - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (mMapRottingView != null) { - mMapRottingView.onDestroy(); - } - if (mAmapNaviVIew != null){ - mAmapNaviVIew.onDestroy(); - } - AmapNaviToDestinationModel.getInstance(getContext()).destroyAmaNavi(); - TaxiPassengerModel.getInstance().destoryGeocodeSearch(); - } - - public void showRottingMapView(){ - if (mAmapNaviVIew != null && mAmapNaviVIew.getVisibility() == View.VISIBLE){ - mAmapNaviVIew.setVisibility(View.GONE); - } - if (mMapRottingView != null && mMapRottingView.getVisibility() == View.GONE){ - mMapRottingView.setVisibility(View.VISIBLE); - } - } - - public void setLineMarker(List latLngList){ - if (latLngList.size() > 0) { - if (mMapRottingView != null) { - mMapRottingView.setCoordinatesLatLng(latLngList); - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapRottingView.setLineMarker(); - } - }); - } - } else { - clearPolyline(); - } - } - - public void routeResultByServer(List latLngList,int haveArrivedIndex) { - if (latLngList.size() > 0) { - drawablePolylineByServerRoute(latLngList,haveArrivedIndex); - } else { - clearPolyline(); - } - } - - public void drawablePolylineByServerRoute(List mCoordinatesLatLng,int haveArrivedIndex){ - if (mMapRottingView != null){ - mMapRottingView.setCoordinatesLatLng(mCoordinatesLatLng,haveArrivedIndex); - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapRottingView.drawablePolyline(); - } - }); - } - } - private void clearPolyline() { - if (mMapRottingView != null) { - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapRottingView.clearPolyline(); - } - }); - } - } - - public void updateOrderStatusView(TaxiPassengerOrderQueryRespBean.Result order) { - mTPOrderStartStation.setText(order.startSiteAddr); - mTPOrderEndStation.setText(order.endSiteAddr); - - if (TaxiPassengerOrderStatusEnum.ArriveAtStart.getCode() == order.orderStatus) { - mTPOrderStatus.setText(getString(R.string.taxi_p_arrive_to_start)); - mTPOrderRemainDis.setText("--"); - mTPOrderRemainTime.setText("--"); - mTPOrderRemainArriveTime.setText("--"); - setSeekBarMax(); - return; - } - - if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus) { - mTPOrderStatus.setText(R.string.taxi_p_start_to_end); - setSeekBarMax(); - return; - } - } - - /** - * 剩余里程,剩余时间,当前定位点所在道路 - * @param meters 单位 米 - * @param remainTime 单位 秒 - */ - @RequiresApi(api = Build.VERSION_CODES.N) - public void onCurrentOrderDistToEndChanged(long meters, long remainTime) { - String disUnit = "公里"; - String remainDis = "0"; - - if (meters > 0){ - if (meters / 1000 < 1){ - disUnit = "米"; - remainDis = String.valueOf(Math.round(meters)); - }else { - disUnit = "公里"; - remainDis = NumberFormatUtil.formatLong((double) meters / 1000); - } - } - - int time = (int)Math.ceil((double)remainTime/ 60f); - - Calendar beforeTime = Calendar.getInstance(); - beforeTime.add(Calendar.MINUTE,time); - String arriveTime = DateTimeUtil.formatCalendarToString(beforeTime,DateTimeUtil.HH_mm); - updateOrderDisAndTimeView(remainDis, disUnit,time, arriveTime); - updateDriveProcessLoading(new Long(meters).intValue()); - } - - public void onCurrentRoadName(String roadName){ - updateDriveRoadName(roadName); - } - - private void updateOrderDisAndTimeView(String remainDis, String remainDisUnit, int remainTime, String arriveTime) { - mTPOrderRemainDis.setText(remainDis); - mTPOrderRemainDisUnit.setText(remainDisUnit); - mTPOrderRemainTime.setText(String.valueOf(remainTime)); - mTPOrderRemainArriveTime.setText(arriveTime); - - } - - public void onCarLocationChanged(MogoLocation location) { - updateSpeedView((float) location.getGnssSpeed()); - } - - public void onLimitingVelocityChange(int limitingVelocity) { - mLimitingVelocity = limitingVelocity; - } - - /** - * 更新速度 - * - * @param newSpeed - */ - private void updateSpeedView(float newSpeed) { - int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值 - CallerLogger.INSTANCE.d(M_TAXI_P + TAG,"mLimitingVelocity = "+mLimitingVelocity); -// if (mLimitingVelocity > 0 && speed >= mLimitingVelocity) { -// mTPSpeedTv.setmColorList(new int[]{getResources().getColor(R.color.taxi_p_speed_warn_color1),getResources().getColor(R.color.taxi_p_speed_warn_color2)}); -// mTPSpeedTv.setText(String.valueOf(speed)); -// mTPSpeedTvShadowBg.setText(String.valueOf(speed)); -// -// mSpeedLayoutBg.setImageResource(R.drawable.taxi_p_speed_light_red_bg); -// } else { - mTPSpeedTv.setmColorList(new int[]{getResources().getColor(R.color.taxi_p_speed_normal_color1),getResources().getColor(R.color.taxi_p_speed_normal_color2)}); - mTPSpeedTv.setText(String.valueOf(speed)); - mTPSpeedTvShadowBg.setText(String.valueOf(speed)); - - mSpeedLayoutBg.setImageResource(R.drawable.taxi_p_speed_light_green_bg); -// } - } - - private void runOnUIThread(Runnable executor) { - if (executor == null) { - return; - } - if (Looper.myLooper() != Looper.getMainLooper()) { - UiThreadHandler.post(executor); - } else { - executor.run(); - } - } - - @Override - public void onCameraChange(float bearing) { - startIvCompass(bearing); - } - - /** - * 设置指南针旋转 - * - * @param bearing - */ - private void startIvCompass(float bearing) { - bearing = 360 - bearing; - CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "startIvCompass: " + bearing); - rotateAnimation = new RotateAnimation(lastBearing, bearing, Animation.RELATIVE_TO_SELF - , 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); - rotateAnimation.setFillAfter(true); - - mMapArrowIcon.startAnimation(rotateAnimation); - lastBearing = bearing; - } - - @Nullable - @Override - public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) { - if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) { - if (enter) {//普通的进入的动作 - return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_show_f); - } else {//比如一个已经Fragmen被另一个replace,是一个进入动作,被replace的那个就是false - return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_hide_f); - } - } else if (FragmentTransaction.TRANSIT_FRAGMENT_CLOSE == transit) { - if (enter) {//之前被replace的重新进入到界面或者Fragment回到栈顶 - return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_show_f); - } else {//Fragment退出,出栈 - return AnimatorInflater.loadAnimator(getContext(),R.animator.alpha_hide_hide_f); - } - } - return super.onCreateAnimator(transit,enter,nextAnim); - } -} diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt new file mode 100644 index 0000000000..926ee23f72 --- /dev/null +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/TaxiPassengerServingOrderFragment.kt @@ -0,0 +1,370 @@ +package com.mogo.och.taxi.passenger.ui + +import android.animation.Animator +import android.animation.AnimatorInflater +import android.os.Build +import android.os.Bundle +import android.view.View +import android.view.animation.Animation +import android.view.animation.RotateAnimation +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.RequiresApi +import androidx.appcompat.widget.AppCompatSeekBar +import androidx.fragment.app.FragmentTransaction +import com.amap.api.maps.model.LatLng +import com.mogo.commons.mvp.MvpFragment +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.map.AmapNaviToDestinationModel +import com.mogo.och.common.module.map.CommonAmapNaviVIew +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.NumberFormatUtil +import com.mogo.och.common.module.wigets.OCHGradientTextView +import com.mogo.och.common.module.wigets.OCHRadiusImageView +import com.mogo.och.taxi.passenger.R +import com.mogo.och.taxi.passenger.bean.TaxiPassengerOrderQueryRespBean +import com.mogo.och.taxi.passenger.callback.ITaxiPassengerMapViewCallback +import com.mogo.och.taxi.passenger.constant.TaxiPassengerConst +import com.mogo.och.taxi.passenger.constant.TaxiPassengerOrderStatusEnum +import com.mogo.och.taxi.passenger.model.TaxiPassengerModel +import com.mogo.och.taxi.passenger.presenter.TaxiPassengerServingOrderPresenter +import com.mogo.och.taxi.passenger.utils.TPRouteDataTestUtils +import java.util.Calendar + +/** + * @author: wangmingjun + * @date: 2022/3/8 + */ +class TaxiPassengerServingOrderFragment : + MvpFragment(), + TaxiPassengerTaxiView, ITaxiPassengerMapViewCallback { + private val TAG = TaxiPassengerServingOrderFragment::class.java.simpleName + private var mTPSpeedTv: OCHGradientTextView? = null + private var mTPSpeedTvShadowBg: TextView? = null + private var mTPOrderStatus: TextView? = null + private var mTPOrderStartStation: TextView? = null + private var mTPOrderEndStation: TextView? = null + private var mTPOrderRemainDis: TextView? = null + private var mTPOrderRemainDisUnit: TextView? = null + private var mTPOrderRemainTime: TextView? = null + private var mTPOrderRemainArriveTime: TextView? = null + private var mMapArrowIcon: ImageView? = null + private var mMapRottingView: TaxiPassengerMapDirectionView? = null + private var mAmapNaviVIew: CommonAmapNaviVIew? = null + private var lastBearing = 0f + private var rotateAnimation: RotateAnimation? = null + private var mProgressSeekBar: AppCompatSeekBar? = null + private var mProgessDes: TextView? = null + private var mSpeedLayoutBg: OCHRadiusImageView? = null + @Volatile + private var mLimitingVelocity = 0 // 返回的道路限速值 + override fun getLayoutId(): Int { + return R.layout.taxi_p_activity_serving_order_view + } + + override fun getTagName(): String { + return "TaxiPassengerServingOrderFragment" + } + + override fun initViews() { + mTPSpeedTv = findViewById(R.id.taxi_p_speed_tv) + mTPSpeedTvShadowBg = findViewById(R.id.taxi_p_speed_tv_bg) + mTPSpeedTv!!.setVertrial(true) + mTPSpeedTv!!.setmColorList( + intArrayOf( + resources.getColor(R.color.taxi_p_speed_normal_color1), resources.getColor( + R.color.taxi_p_speed_normal_color2 + ) + ) + ) + mTPSpeedTv!!.text = 0.toString() + mTPSpeedTvShadowBg!!.text = 0.toString() + mTPOrderStatus = findViewById(R.id.taxi_p_order_status_tv) + mTPOrderStartStation = findViewById(R.id.taxi_p_order_status_start_station_tv) + mTPOrderEndStation = findViewById(R.id.taxi_p_order_status_end_station_tv) + mTPOrderRemainDis = findViewById(R.id.taxi_p_order_remain_distance) + mTPOrderRemainDisUnit = findViewById(R.id.taxi_p_order_remain_distance_unit) + mTPOrderRemainTime = findViewById(R.id.taxi_p_order_remain_time) + mTPOrderRemainArriveTime = findViewById(R.id.taxi_p_order_remain_arrive_time) + mMapArrowIcon = findViewById(R.id.taxi_p_arrow_nor) + mProgressSeekBar = findViewById(R.id.taxi_p_seekbar) + mProgessDes = findViewById(R.id.taxi_p_progress_des) + mSpeedLayoutBg = findViewById(R.id.taxi_p_speed_bg) + mTPOrderStatus!!.setOnLongClickListener { + TPRouteDataTestUtils.converToRouteData() + true + } + } + + override fun initViews(savedInstanceState: Bundle?) { + super.initViews(savedInstanceState) + initRouteNaviView(savedInstanceState) + initAmapNaviView(savedInstanceState) + } + + private fun initAmapNaviView(savedInstanceState: Bundle?) { + mAmapNaviVIew = findViewById(R.id.taxi_p_order_amap_navi_view) + mAmapNaviVIew?.onCreate(savedInstanceState) + TaxiPassengerModel.getInstance().startNaviByAmap() + } + + private fun initRouteNaviView(savedInstanceState: Bundle?) { + mMapRottingView = findViewById(R.id.taxi_p_order_rotting_map_view) + mMapRottingView?.onCreateView(savedInstanceState) + mMapRottingView?.setTaxiPassengerMapViewCallback(this) + } + + override fun createPresenter(): TaxiPassengerServingOrderPresenter { + return TaxiPassengerServingOrderPresenter(this) + } + + /** + * 设置进度条最大值为 起点终点首次规划出的值 + */ + private fun setSeekBarMax() { + //计算订单起点和终点距离 + val maxInt = SharedPrefsMgr.getInstance(requireContext()) + .getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0) + d(SceneConstant.M_TAXI_P + TAG, "maxInt = $maxInt") + mProgressSeekBar!!.max = maxInt + } + + /** + * 行驶进度值更新 + */ + @RequiresApi(api = Build.VERSION_CODES.N) + private fun updateDriveProcessLoading(progressLoading: Int) { + val progressInt = SharedPrefsMgr.getInstance(requireContext()) + .getInt(TaxiPassengerConst.SP_KEY_ORDER_SUM_DIS, 0) - progressLoading + d(SceneConstant.M_TAXI_P + TAG, "progressInt = $progressInt") + mProgressSeekBar?.setProgress(progressInt, true) + mProgressSeekBar?.jumpDrawablesToCurrentState() + } + + private fun updateDriveRoadName(currentRoadName: String) { + mProgessDes?.text = currentRoadName + } + + override fun onResume() { + super.onResume() + mMapRottingView?.onResume() + mAmapNaviVIew?.onResume() + TaxiPassengerModel.getInstance().initGeocodeSearch() + } + + override fun onHiddenChanged(hidden: Boolean) { + super.onHiddenChanged(hidden) + if (hidden) { //fragment 隐藏, 导航取消c + clearPolyline() + TaxiPassengerModel.getInstance().destoryGeocodeSearch() + } else { //fragment 显示, 导航开始 + e(SceneConstant.M_TAXI_P + "TaxiPassengerNaviTo", "initGeocodeSearch") + TaxiPassengerModel.getInstance().initGeocodeSearch() + } + } + + override fun onPause() { + super.onPause() + mMapRottingView?.onPause() + mAmapNaviVIew?.onPause() + } + + override fun onDestroy() { + super.onDestroy() + mMapRottingView?.onDestroy() + mAmapNaviVIew?.onDestroy() + AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() + TaxiPassengerModel.getInstance().destoryGeocodeSearch() + } + + fun showRottingMapView() { + if (mAmapNaviVIew != null && mAmapNaviVIew!!.visibility == View.VISIBLE) { + mAmapNaviVIew!!.visibility = View.GONE + } + if (mMapRottingView != null && mMapRottingView!!.visibility == View.GONE) { + mMapRottingView!!.visibility = View.VISIBLE + } + } + + fun setLineMarker(startStation: LatLng?, endStation: LatLng?) { + if (startStation != null && endStation != null) { + UiThreadHandler.post { mMapRottingView?.setLineMarker(startStation, endStation) } + } else { + clearPolyline() + } + } + + fun routeResultByServer( + routeArriviedTemp: List?, + routeArrivingTemp: List?, + location: MogoLocation + ) { + if (routeArriviedTemp.isNullOrEmpty()||routeArrivingTemp.isNullOrEmpty()) { + clearPolyline() + } else { + drawablePolylineByServerRoute(routeArriviedTemp, routeArrivingTemp,location) + } + } + + private fun drawablePolylineByServerRoute(routeArrivied: List?, + routeArriving: List?, + location: MogoLocation?) { + mMapRottingView?.setCoordinatesLatLng(routeArrivied, routeArriving,location) + UiThreadHandler.post { mMapRottingView?.drawablePolyline() } + } + + private fun clearPolyline() { + UiThreadHandler.post { mMapRottingView?.clearPolyline() } + } + + fun updateOrderStatusView(order: TaxiPassengerOrderQueryRespBean.Result) { + mTPOrderStartStation!!.text = order.startSiteAddr + mTPOrderEndStation!!.text = order.endSiteAddr + if (TaxiPassengerOrderStatusEnum.ArriveAtStart.code == order.orderStatus) { + mTPOrderStatus!!.text = getString(R.string.taxi_p_arrive_to_start) + mTPOrderRemainDis!!.text = "--" + mTPOrderRemainTime!!.text = "--" + mTPOrderRemainArriveTime!!.text = "--" + setSeekBarMax() + return + } + if (TaxiPassengerOrderStatusEnum.OnTheWayToEnd.code == order.orderStatus) { + mTPOrderStatus!!.setText(R.string.taxi_p_start_to_end) + setSeekBarMax() + return + } + } + + /** + * 剩余里程,剩余时间,当前定位点所在道路 + * @param meters 单位 米 + * @param remainTime 单位 秒 + */ + @RequiresApi(api = Build.VERSION_CODES.N) + fun onCurrentOrderDistToEndChanged(meters: Long, remainTime: Long) { + var disUnit = "公里" + var remainDis = "0" + if (meters > 0) { + if (meters / 1000 < 1) { + disUnit = "米" + remainDis = Math.round(meters.toFloat()).toString() + } else { + disUnit = "公里" + remainDis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) + } + } + val time = Math.ceil(remainTime.toDouble() / 60f).toInt() + val beforeTime = Calendar.getInstance() + beforeTime.add(Calendar.MINUTE, time) + val arriveTime = DateTimeUtil.formatCalendarToString(beforeTime, DateTimeUtil.HH_mm) + updateOrderDisAndTimeView(remainDis, disUnit, time, arriveTime) + updateDriveProcessLoading(meters.toInt()) + } + + fun onCurrentRoadName(roadName: String) { + updateDriveRoadName(roadName) + } + + private fun updateOrderDisAndTimeView( + remainDis: String, + remainDisUnit: String, + remainTime: Int, + arriveTime: String + ) { + mTPOrderRemainDis!!.text = remainDis + mTPOrderRemainDisUnit!!.text = remainDisUnit + mTPOrderRemainTime!!.text = remainTime.toString() + mTPOrderRemainArriveTime!!.text = arriveTime + } + + fun onCarLocationChanged(location: MogoLocation) { + updateSpeedView(location.gnssSpeed) + } + + fun onLimitingVelocityChange(limitingVelocity: Int) { + mLimitingVelocity = limitingVelocity + } + + /** + * 更新速度 + * + * @param newSpeed + */ + private fun updateSpeedView(newSpeed: Float) { + val speed = (Math.abs(newSpeed) * 3.6f).toInt() // 倒车时工控机反馈定位信息中speed为负值 + d(SceneConstant.M_TAXI_P + TAG, "mLimitingVelocity = $mLimitingVelocity") + mTPSpeedTv?.setmColorList( + intArrayOf( + resources.getColor(R.color.taxi_p_speed_normal_color1), resources.getColor( + R.color.taxi_p_speed_normal_color2 + ) + ) + ) + mTPSpeedTv?.text = speed.toString() + mTPSpeedTvShadowBg?.text = speed.toString() + mSpeedLayoutBg?.setImageResource(R.drawable.taxi_p_speed_light_green_bg) + } + + override fun onCameraChange(bearing: Float) { + startIvCompass(360-bearing) + } + + /** + * 设置指南针旋转 + * + * @param bearing + */ + private fun startIvCompass(bearing: Float) { + d(SceneConstant.M_TAXI_P + TAG, "startIvCompass: $bearing") + rotateAnimation = RotateAnimation( + lastBearing, bearing, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f + ) + rotateAnimation!!.fillAfter = true + mMapArrowIcon!!.startAnimation(rotateAnimation) + lastBearing = bearing + } + + override fun onCreateAnimator(transit: Int, enter: Boolean, nextAnim: Int): Animator? { + if (transit == FragmentTransaction.TRANSIT_FRAGMENT_OPEN) { + return if (enter) { //普通的进入的动作 + AnimatorInflater.loadAnimator( + context, + R.animator.alpha_hide_show_f + ) + } else { //比如一个已经Fragmen被另一个replace,是一个进入动作,被replace的那个就是false + AnimatorInflater.loadAnimator( + context, + R.animator.alpha_hide_hide_f + ) + } + } else if (FragmentTransaction.TRANSIT_FRAGMENT_CLOSE == transit) { + return if (enter) { //之前被replace的重新进入到界面或者Fragment回到栈顶 + AnimatorInflater.loadAnimator( + context, + R.animator.alpha_hide_show_f + ) + } else { //Fragment退出,出栈 + AnimatorInflater.loadAnimator( + context, + R.animator.alpha_hide_hide_f + ) + } + } + return super.onCreateAnimator(transit, enter, nextAnim) + } + + companion object { + @JvmStatic + fun newInstance(): TaxiPassengerServingOrderFragment { + val args = Bundle() + val fragment = TaxiPassengerServingOrderFragment() + fragment.arguments = args + return fragment + } + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt index 548280ca96..545947b0ef 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/comment/TaxiPassengerArrivedView.kt @@ -259,7 +259,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { .setDuration(120) alpha.addUpdateListener(object : ValueAnimator.AnimatorUpdateListener{ var isStart = false - override fun onAnimationUpdate(animation: ValueAnimator?) { + override fun onAnimationUpdate(animation: ValueAnimator) { val animatedValue = animation?.getAnimatedValue("alpha") animatedValue as Float if(animatedValue>0.45&&!isStart){ @@ -293,7 +293,7 @@ class TaxiPassengerArrivedView :RelativeLayout, View.OnClickListener { if(currentAnimarion==maxIndex) { // 最后一个动画结束后提交积分 set.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) // 启动变高动画 startChangeHeightAnimarion() diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt index f16747eef7..d833aab94a 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/leftmenu/OverlayLeftViewUtils.kt @@ -226,8 +226,8 @@ object OverlayLeftViewUtils { windowManager?.updateViewLayout(overlayView, params) } valueAnimator.addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator?) {} - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationStart(animation: Animator) {} + override fun onAnimationEnd(animation: Animator) { acivOpenClose?.apply { pivotX = (width /2).toFloat() pivotY = (height /2).toFloat() @@ -239,8 +239,8 @@ object OverlayLeftViewUtils { WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL windowManager?.updateViewLayout(overlayView, params) } - override fun onAnimationCancel(animation: Animator?) {} - override fun onAnimationRepeat(animation: Animator?) {} + override fun onAnimationCancel(animation: Animator) {} + override fun onAnimationRepeat(animation: Animator) {} }) valueAnimator.start() } @@ -324,8 +324,8 @@ object OverlayLeftViewUtils { } } valueAnimator.addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animation: Animator?) {} - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationStart(animation: Animator) {} + override fun onAnimationEnd(animation: Animator) { acivOpenClose?.apply { pivotX = (width /2).toFloat() pivotY = (height /2).toFloat() @@ -340,8 +340,8 @@ object OverlayLeftViewUtils { } } - override fun onAnimationCancel(animation: Animator?) {} - override fun onAnimationRepeat(animation: Animator?) {} + override fun onAnimationCancel(animation: Animator) {} + override fun onAnimationRepeat(animation: Animator) {} }) valueAnimator.start() } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselLayoutManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselLayoutManager.java index e77f40efe4..326341e950 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselLayoutManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/ui/video/layoutmanage/CarouselLayoutManager.java @@ -934,7 +934,7 @@ public class CarouselLayoutManager extends RecyclerView.LayoutManager implements } private CarouselSavedState(@NonNull final Parcel in) { - mSuperState = in.readParcelable(Parcelable.class.getClassLoader()); + mSuperState = in.readParcelable(RecyclerView.LayoutManager.class.getClassLoader()); mCenterItemPosition = in.readInt(); } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java index 7bd9a381ea..d837a76b89 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TPRouteDataTestUtils.java @@ -37,7 +37,6 @@ public class TPRouteDataTestUtils { builder.setLongitude(s.getDouble("lon")); list.add(builder.build()); } - TaxiPassengerModel.getInstance().setRouteLineMarker(list); TaxiPassengerModel.getInstance().startToRouteAndWipe(list); } catch (JSONException e) { e.printStackTrace(); diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java index 21ff9ef517..a3b8d863a1 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/utils/TaxiPassengerAnalyticsManager.java @@ -52,7 +52,7 @@ public class TaxiPassengerAnalyticsManager { CallerLogger.INSTANCE.e( M_BUS + "triggerStartAutopilotFailureEvent", failMsg ); - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_FAILURE_CODE, failCode); mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_FAILURE_MSG, @@ -60,7 +60,7 @@ public class TaxiPassengerAnalyticsManager { } mStartAutopilotParams.put(TaxiPassengerConst.EVENT_PARAM_START_RESULT - , CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == + , CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); diff --git a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml index 85eba2cdd4..a5533567ba 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml +++ b/OCH/mogo-och-taxi-passenger/src/main/res/layout/taxi_p_base_fragment.xml @@ -50,6 +50,7 @@ app:layout_constraintStart_toStartOf="parent" /> + + + + \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java index bdd1d074cc..481bb3c470 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java @@ -2,6 +2,7 @@ package com.mogo.och.taxi.callback; import com.amap.api.maps.model.LatLng; +import com.mogo.eagle.core.data.map.MogoLocation; import java.util.List; @@ -10,6 +11,6 @@ import java.util.List; * @date: 2021/11/1 */ public interface IOCHTaxiAutopilotPlanningCallback { - void setLineMarker(List models); - void routeResult(List models, int haveArrivedIndex); + void setLineMarker(LatLng startStation,LatLng endStation); + void routeResult(List routeArrivied,List routeArriving, MogoLocation location); } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java index d07526da74..edae674246 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/TaxiModel.java @@ -1,5 +1,10 @@ package com.mogo.och.taxi.model; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_CODE_OCH_TAXI_START_AUTOPILOT; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_SOURCE_ADAS; +import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT; +import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; + import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; @@ -32,6 +37,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.CoordinateUtils; +import com.mogo.eagle.core.utilcode.util.DrivingDirectionUtils; import com.mogo.eagle.core.utilcode.util.NetworkUtils; import com.mogo.eagle.core.utilcode.util.ToastUtils; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; @@ -44,6 +50,9 @@ import com.mogo.och.common.module.biz.provider.LoginService; import com.mogo.och.common.module.callback.OchAdasStartFailureCallback; import com.mogo.och.common.module.manager.AbnormalFactorsLoopManager; import com.mogo.och.common.module.manager.OCHAdasAbilityManager; +import com.mogo.och.common.module.manager.distancemamager.IDistanceListener; +import com.mogo.och.common.module.manager.distancemamager.ITrajectoryListener; +import com.mogo.och.common.module.manager.distancemamager.TrajectoryAndDistanceManager; import com.mogo.och.common.module.map.AmapNaviToDestinationModel; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.PinYinUtil; @@ -75,7 +84,6 @@ import com.mogo.och.taxi.utils.OrderUtil; import com.mogo.och.taxi.utils.TaxiAnalyticsManager; import com.mogo.och.taxi.utils.TaxiTrajectoryManager; import com.zhjt.service.chain.ChainLog; -import com.zhjt.service.chain.TracingConstants; import org.jetbrains.annotations.NotNull; @@ -83,7 +91,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; import io.reactivex.exceptions.UndeliverableException; import io.reactivex.functions.Consumer; @@ -92,11 +99,6 @@ import mogo.telematics.pad.MessagePad; import mogo_msg.MogoReportMsg; import system_master.SystemStatusInfo; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_ALIAS_CODE_OCH_TAXI_START_AUTOPILOT; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_ADAS; -import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT; -import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_TAXI; - /** * Created by pangfan on 2021/8/19 *

@@ -115,7 +117,6 @@ public class TaxiModel { } private Context mContext; - private volatile int mPrevAPStatus = -1; //前一次自动驾驶状态值 private volatile String mPrevOrderNo = ""; //前一次的新到单id(当次和前一次orderId相同时,本次不再弹出) private volatile OrderQueryRespBean.Result mNewBookingOrder; //新到待抢预约单 private volatile OrderQueryRespBean.Result mCurrentOCHOrder; //当前订单 @@ -134,7 +135,7 @@ public class TaxiModel { private int mPreRouteIndex = 0; private double mLongitude, mLatitude; - private MogoLocation mLocation = null; + private MogoLocation mLocation = null; private LoginService loginService; @@ -224,7 +225,7 @@ public class TaxiModel { MogoStatusManager.getInstance().registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); //定位监听, 传false是高德坐标系 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,mMapLocationLIstener); + CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG,10, mMapLocationListener); //2021.11.1 自动驾驶路线规划接口 CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); @@ -238,6 +239,9 @@ public class TaxiModel { AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); + TrajectoryAndDistanceManager.INSTANCE.addDistanceListener(TAG,distanceListener); + TrajectoryAndDistanceManager.INSTANCE.addTrajectoryListener(TAG,trajectoryListener); + } private final IMogoOnMessageListener mMogoOnMessageListener = @@ -249,13 +253,13 @@ public class TaxiModel { @Override public void onMsgReceived(OCHOperationalMessage obj) { - if (obj == null){ + if (obj == null) { CallerLogger.INSTANCE.d(M_TAXI + TAG, "onMsgReceived = null"); return; } - CallerLogger.INSTANCE.d(M_TAXI + TAG, "onMsgReceived = "+obj.getMessage()); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "onMsgReceived = " + obj.getMessage()); OCHSocketMessageManager.INSTANCE.pushAppOperationalMsgBox(obj.getPushTimeStamp(), - obj.getMessage(),OCHSocketMessageManager.OPERATION_SYSTEM); + obj.getMessage(), OCHSocketMessageManager.OPERATION_SYSTEM); } }; @@ -289,11 +293,11 @@ public class TaxiModel { //更新接单状态 public void updateCarStatus() { - if(!LoginStatusManager.isLogin()){ + if (!LoginStatusManager.isLogin()) { loginService.queryLoginStatusByNet(); return; } - TaxiServiceManager.changeOrderServing(mContext,TaxtServingStatusManager.isOpeningOrderStatus(), + TaxiServiceManager.changeOrderServing(mContext, TaxtServingStatusManager.isOpeningOrderStatus(), new OchCommonServiceCallback() { @Override public void onSuccess(BaseData data) { @@ -348,8 +352,8 @@ public class TaxiModel { //1.1.2. 当本地有currentOrder: //orderId不一致时:通过currentOrder.orderId查询订单状态,并通知ui更新 //orderId一致且orderStatus不一致时:则更新currentOrder,并通知ui更新 - CallerLogger.INSTANCE.d(M_TAXI + TAG,"AutopilotControl-mCurrentOCHOrder = "+mCurrentOCHOrder.orderStatus - + ", orderStatus = " +data.data.servicing.get(0).orderStatus); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "AutopilotControl-mCurrentOCHOrder = " + mCurrentOCHOrder.orderStatus + + ", orderStatus = " + data.data.servicing.get(0).orderStatus); if (!mCurrentOCHOrder.orderNo.equals(data.data.servicing.get(0).orderNo)) { queryCurOrderStatus(); } else if (mCurrentOCHOrder.orderStatus != data.data.servicing.get(0).orderStatus) { @@ -461,7 +465,7 @@ public class TaxiModel { @Override public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); + ToastUtilsOch.showWithCodeMessage(code, msg); } }); } @@ -490,7 +494,7 @@ public class TaxiModel { @Override public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); + ToastUtilsOch.showWithCodeMessage(code, msg); } }); } @@ -544,7 +548,7 @@ public class TaxiModel { @Override public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); + ToastUtilsOch.showWithCodeMessage(code, msg); } }); } @@ -638,7 +642,7 @@ public class TaxiModel { @Override public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); + ToastUtilsOch.showWithCodeMessage(code, msg); } }); } @@ -732,7 +736,7 @@ public class TaxiModel { @Override public void onFail(int code, String msg) { - ToastUtilsOch.showWithCodeMessage(code,msg); + ToastUtilsOch.showWithCodeMessage(code, msg); } }); } @@ -748,7 +752,7 @@ public class TaxiModel { TaxiServiceManager.confirmAutopilotConditionByDriver(mContext, mCurrentOCHOrder.orderNo, result, - new OchCommonServiceCallback(){ + new OchCommonServiceCallback() { @Override public void onSuccess(TaxiDataBaseRespBean data) { @@ -762,19 +766,19 @@ public class TaxiModel { }); } - public void updateAutopilotStatus(boolean isSafe){ - if (mOrderStatusCallback != null){ + public void updateAutopilotStatus(boolean isSafe) { + if (mOrderStatusCallback != null) { mOrderStatusCallback.onDriverHasCheckedPilotCondition(isSafe); } } - public void queryAutopilotStatus(boolean isStart){ - if (isStart){ + public void queryAutopilotStatus(boolean isStart) { + if (isStart) { queryAutopilotStatus(); } } - public void queryAutopilotStatus(){ + public void queryAutopilotStatus() { if (mCurrentOCHOrder == null) return; TaxiServiceManager.queryAutopilotStatus(mContext, mCurrentOCHOrder.orderNo, new OchCommonServiceCallback() { @@ -820,7 +824,7 @@ public class TaxiModel { SharedPrefsMgr.getInstance(mContext).putString(TaxiConst.SP_KEY_OCH_TAXI_ORDER, GsonUtil.jsonFromObject(data)); - if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()){ + if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.OnTheWayToEnd.getCode()) { if (FunctionBuildConfig.isDemoMode) { // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; @@ -831,7 +835,7 @@ public class TaxiModel { updateAutopilotControlParameters(); } - if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.getCode()){ + if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.getCode()) { if (FunctionBuildConfig.isDemoMode) { CallerLogger.INSTANCE.d(M_TAXI + TAG, "setIPCDemoMode:false"); CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(false); @@ -847,7 +851,7 @@ public class TaxiModel { private void updateAutopilotControlParameters() { AutopilotControlParameters parameters = initAutopilotControlParameters(); - if (null == parameters){ + if (null == parameters) { CallerLogger.INSTANCE.e(M_TAXI + TAG, "AutopilotControlParameters is empty."); return; } @@ -855,7 +859,7 @@ public class TaxiModel { CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(parameters); } - private void clearAutopilotControlParameters(){ + private void clearAutopilotControlParameters() { CallerLogger.INSTANCE.d(M_TAXI + TAG, "AutopilotControlParameters is clear."); CallerAutoPilotStatusListenerManager.INSTANCE.updateAutopilotControlParameters(null); } @@ -891,12 +895,10 @@ public class TaxiModel { * 以当前订单为基础,开启自动驾驶 **/ @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_OCH_TAXI_START_AUTOPILOT, - paramIndexes = {-1}, // - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_OCH_TAXI_START_AUTOPILOT, + paramIndexes = {-1} ) public void startAutoPilot() { @@ -908,19 +910,19 @@ public class TaxiModel { //根据开关和后台是否发布轨迹启动自驾 if (FunctionBuildConfig.isPassStartAutopilotCommand && TextUtils.isEmpty(mCurrentOCHOrder.csvFileUrl) - && TextUtils.isEmpty(mCurrentOCHOrder.csvFileUrlDPQP)){ + && TextUtils.isEmpty(mCurrentOCHOrder.csvFileUrlDPQP)) { ToastUtils.showLong("无发布轨迹, 请发布后重试"); CallerLogger.INSTANCE.e(M_TAXI + TAG, "isPassStartAutopilotCommand = " + FunctionBuildConfig.isPassStartAutopilotCommand - + "busRoutesResult.csvFileUrl = "+ mCurrentOCHOrder.csvFileUrl - + "busRoutesResult.csvFileUrlDPQP = "+mCurrentOCHOrder.csvFileUrlDPQP); + + "busRoutesResult.csvFileUrl = " + mCurrentOCHOrder.csvFileUrl + + "busRoutesResult.csvFileUrlDPQP = " + mCurrentOCHOrder.csvFileUrlDPQP); return; } CallerLogger.INSTANCE.e(M_TAXI + TAG, "isPassStartAutopilotCommand = " + FunctionBuildConfig.isPassStartAutopilotCommand); - if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()){ + if (!FunctionBuildConfig.isDemoMode && !OCHAdasAbilityManager.getInstance().getAutopilotAbilityStatus()) { ToastUtils.showLong(OCHAdasAbilityManager.getInstance().getAutopilotUnAbilityReason() + ", 请稍候重试"); TaxiAnalyticsManager.getInstance().triggerUnableStartAPReasonEvent( @@ -929,17 +931,11 @@ public class TaxiModel { return; } - if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE - == CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { - // TODO: 2021/11/28 工控机存在刚开始状态为0,但是可以开启变为2,工控机解决前不显示此toast -// ToastUtils.showShort("自动驾驶状态为不可用!"); - } - //点击开始自动驾驶按钮订单状态去流转, 不再与自动驾驶是否启动成功挂钩 - if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.getCode()){ + if (mCurrentOCHOrder.orderStatus == TaxiOrderStatusEnum.UserArriveAtStart.getCode()) { startServicePilotDone(); isRestartAutopilot = false; - }else { + } else { isRestartAutopilot = true; } @@ -953,9 +949,9 @@ public class TaxiModel { CallerAutoPilotControlManager.INSTANCE.startAutoPilot(parameters); CallerLogger.INSTANCE.d(M_TAXI + TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters) - + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr - + "isRestartAutopilot = "+isRestartAutopilot); + + "isRestartAutopilot = " + isRestartAutopilot); TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, false, mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.lineId, mCurrentOCHOrder.orderNo); @@ -1026,7 +1022,6 @@ public class TaxiModel { if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { arrivedStartPoint(); - return; } } @@ -1037,7 +1032,7 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "onIntentReceived = %s", intentStr); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) { if (NetworkUtils.isConnected(mContext)) { - startOrStopOrderLoop(LoginStatusManager.isLogin()&&TaxtServingStatusManager.isOpeningOrderStatus()); + startOrStopOrderLoop(LoginStatusManager.isLogin() && TaxtServingStatusManager.isOpeningOrderStatus()); loginService.queryLoginStatusByNet(); } } @@ -1048,8 +1043,8 @@ public class TaxiModel { @Override public void onStartAutopilotFailure(@NotNull String startFailedCode, @NonNull String startFailedMessage) { TaxiAnalyticsManager.getInstance().triggerStartAutopilotFailureEventByAdas(startFailedCode, startFailedMessage); - if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode){ - CallerLogger.INSTANCE.e(M_TAXI + TAG, "mAdasStartFailureListener = "+startFailedMessage); + if (mADASStatusCallback != null && !FunctionBuildConfig.isDemoMode) { + CallerLogger.INSTANCE.e(M_TAXI + TAG, "mAdasStartFailureListener = " + startFailedMessage); mADASStatusCallback.onStartAdasFailure(); } } @@ -1068,7 +1063,7 @@ public class TaxiModel { }; // 自车定位 - private final IMoGoChassisLocationGCJ02Listener mMapLocationLIstener = new IMoGoChassisLocationGCJ02Listener() { + private final IMoGoChassisLocationGCJ02Listener mMapLocationListener = new IMoGoChassisLocationGCJ02Listener() { @Override public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { //位置变化时,通过围栏判断是否到达x点 @@ -1078,7 +1073,7 @@ public class TaxiModel { judgeStartStation(gnssInfo); } if (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd && - mPrevAPStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ + CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { judgeEndStation(gnssInfo); } } @@ -1092,27 +1087,47 @@ public class TaxiModel { } }; - private void judgeEndStation(MogoLocation location) { + private void judgeEndStation(MogoLocation currentLocation) { if (mCurrentOCHOrder == null || mCurrentOCHOrder.endSiteGcjPoint == null || mCurrentOCHOrder.endSiteGcjPoint.size() < 2) { return; } - double startLon = mCurrentOCHOrder.endSiteGcjPoint.get(0); - double startLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); + double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0); + double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); double distance = CoordinateUtils.calculateLineDistance( - startLon, startLat, - location.getLongitude(), location.getLatitude()); + endLon, endLat, + currentLocation.getLongitude(), currentLocation.getLatitude()); CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeEndStation() distance = " + distance); - if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { + if (distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { //1、当前位置和站点围栏15m内 + if (!checkCurrentOCHOrder() || (getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) { CallerLogger.INSTANCE.i(M_TAXI + TAG, "order exception or order ArriveAtEnd"); return; } - arriveTerminal(); - return; + + //2、开始计算当前位置和站点的向量角度 < 90度 未经过 >90度 经过 + double stationAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( + currentLocation.getLongitude(), + currentLocation.getLatitude(), + endLon, + endLat, + (int) currentLocation.getHeading()); + + CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeEndStation() stationAngle = " + stationAngle); + + //3、刚过站且过站距离在15m内, 提交到站 + if (stationAngle > 90 && distance <= TaxiConst.ARRIVE_AT_START_STATION_DISTANCE){ + if (!checkCurrentOCHOrder() + || (getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) { + CallerLogger.INSTANCE.i(M_TAXI + TAG, "order exception or order ArriveAtEnd"); + return; + } + CallerLogger.INSTANCE.i(M_TAXI + TAG, "judgeEndStation() = 刚过站且在15m内"); + arriveTerminal(); + } } } @@ -1161,8 +1176,11 @@ public class TaxiModel { private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { @Override - public void onAutopilotRouteLineId(long lineId) { + public void onAutopilotDockerInfo(@NonNull String dockerVersion) { + } + @Override + public void onAutopilotRouteLineId(long lineId) { } @Override @@ -1176,26 +1194,24 @@ public class TaxiModel { @Override public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - int state = autopilotStatusInfo.getState(); + } + + @Override + public void onAutopilotStatusResponse(int state) { if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { - if (state != mPrevAPStatus && mADASStatusCallback != null){ + if (mADASStatusCallback != null) { mADASStatusCallback.onAutopilotRunning(); } if (mCurrentOCHOrder != null - && TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == mCurrentOCHOrder.orderStatus){ - if (state != mPrevAPStatus) { - // 当高频返回autopilot 2时,不重复调用订单状态变更 - mPrevAPStatus = state; // 每个状态单独赋值,解决无订单时已经是2的状态导致的新订单来时无法进入此逻辑更新状态 - - TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, true, - mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.lineId, mCurrentOCHOrder.orderNo); - if (FunctionBuildConfig.isDemoMode) { - // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true - FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; - CallerAutoPilotControlManager.INSTANCE.setIgnoreConditionDraw(true); - CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(true); - CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为true(到达出发点且已开启自动驾驶)"); - } + && TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == mCurrentOCHOrder.orderStatus) { + TaxiAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestartAutopilot, true, + mCurrentOCHOrder.startSiteAddr, mCurrentOCHOrder.endSiteAddr, mCurrentOCHOrder.lineId, mCurrentOCHOrder.orderNo); + if (FunctionBuildConfig.isDemoMode) { + // 当美化模式(演示模式)开启时: 订单对应自动驾驶开启后,置true + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = true; + CallerAutoPilotControlManager.INSTANCE.setIgnoreConditionDraw(true); + CallerAutoPilotControlManager.INSTANCE.setIPCDemoMode(true); + CallerLogger.INSTANCE.d(M_TAXI + TAG, "美化模式-ignore:置为true(到达出发点且已开启自动驾驶)"); } } } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { @@ -1206,10 +1222,9 @@ public class TaxiModel { // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 return; } - if (mADASStatusCallback != null){ + if (mADASStatusCallback != null) { mADASStatusCallback.onAutopilotEnable(); } - mPrevAPStatus = state; } else if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { if (FunctionBuildConfig.isDemoMode && checkCurrentOCHOrder() @@ -1218,34 +1233,30 @@ public class TaxiModel { // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 return; } - if (mADASStatusCallback != null){ + if (mADASStatusCallback != null) { mADASStatusCallback.onAutopilotDisable(); } - mPrevAPStatus = state; - - }else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING){ - if (FunctionBuildConfig.isDemoMode){ + } else if (state == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING) { + if (FunctionBuildConfig.isDemoMode) { if (checkCurrentOCHOrder() && (getCurOrderStatus() == TaxiOrderStatusEnum.OnTheWayToEnd - || getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)){//订单中 + || getCurOrderStatus() == TaxiOrderStatusEnum.ArriveAtEnd)) {//订单中 // 当美化模式(演示模式)开启时:且有订单、且为去往目的地状态,维持自动驾驶icon开启状态 - }else { //美化模式下没订单,显示人工驾驶 - if (mADASStatusCallback != null){ + } else { //美化模式下没订单,显示人工驾驶 + if (mADASStatusCallback != null) { mADASStatusCallback.onAutopilotDisable(); } } return; } - if (mADASStatusCallback != null){ + if (mADASStatusCallback != null) { mADASStatusCallback.onManMachineCoDriving(); } - mPrevAPStatus = state; } } @Override public void onAutopilotSNRequest() { - } @Override @@ -1277,7 +1288,7 @@ public class TaxiModel { @Override public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) { - if (null != routeList && routeList.getWayPointsList() != null){ + if (null != routeList && routeList.getWayPointsList() != null) { CallerLogger.INSTANCE.d(M_TAXI + TAG, "getWayPointsList = " + routeList.getWayPointsList().size()); } @@ -1291,13 +1302,26 @@ public class TaxiModel { /** * 设置路径规划起终点 - * @param latLngModels + * */ - public void setRouteLineMarker(List latLngModels) { -// List latLngModels = CoordinateCalculateRouteUtil -// .coordinateConverterWgsToGcjListCommon(mContext,models); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.setLineMarker(latLngModels); + public void setRouteLineMarker() { + OrderQueryRespBean.Result currentOCHOrder = getCurrentOCHOrder(); + if(currentOCHOrder!=null) { + if (currentOCHOrder.startSiteGcjPoint == null || currentOCHOrder.startSiteGcjPoint.isEmpty() || currentOCHOrder.startSiteGcjPoint.size() < 2|| + currentOCHOrder.endSiteGcjPoint == null || currentOCHOrder.endSiteGcjPoint.isEmpty() || currentOCHOrder.endSiteGcjPoint.size() < 2) { + cleanLineMarker(); + return; + } + LatLng startStation = new LatLng(currentOCHOrder.startSiteGcjPoint.get(1),currentOCHOrder.startSiteGcjPoint.get(0)); + LatLng endStation = new LatLng(currentOCHOrder.endSiteGcjPoint.get(1),currentOCHOrder.endSiteGcjPoint.get(0)); + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback.setLineMarker(startStation,endStation); + } + } + } + public void cleanLineMarker(){ + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback.setLineMarker(null,null); } } @@ -1351,7 +1375,7 @@ public class TaxiModel { CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------计算出sumLength开始---------- "); //转换成高德坐标系 - if (mRoutePoints.size() > 0){ + if (mRoutePoints.size() > 0) { mRoutePoints.clear(); } mRoutePoints.addAll(CoordinateCalculateRouteUtil @@ -1367,14 +1391,14 @@ public class TaxiModel { } CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size()); - if (mRoutePoints.size() > 0){ + if (mRoutePoints.size() > 0) { reportTotalDisAndTime(); } //开启实时计算剩余距离,剩余时间,预计时间 startOrStopCalculateRouteInfo(true); AmapNaviToDestinationModel.getInstance(mContext).destroyAmaNavi(); - if (mOrderStatusCallback != null){ - mOrderStatusCallback.onNaviToEnd(false,false); + if (mOrderStatusCallback != null) { + mOrderStatusCallback.onNaviToEnd(false, false); } } @@ -1389,62 +1413,95 @@ public class TaxiModel { * 实时计算当前剩余里程和时间 */ public void dynamicCalculateRouteInfo() { - if (mLocation == null){ - return; +// if (mLocation == null) { +// return; +// } +// if (mRoutePoints.size() > 0 && mLocation != null) { +// Map> lastPointsMap = CoordinateCalculateRouteUtil +// .getRemainPointListByCompareNew(mPreRouteIndex, mRoutePoints, mLocation); +// +// for (int index : lastPointsMap.keySet()) { +// mPreRouteIndex = index; +// break; +// } +// for (List lastPoints : lastPointsMap.values()) { +// float lastSumLength = 0; +// if (lastPoints.size() == 1) { //只是最后一个点,计算当前位置和最后一个点的距离 +// lastSumLength = CoordinateUtils.calculateLineDistance( +// lastPoints.get(0).getLongitude(), lastPoints.get(0).getLatitude(), +// mLocation.getLongitude(), mLocation.getLatitude()); +// } else { +// lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints); +// } +// updateDistance(lastSumLength); +// break; +// } +// routeAndWipe(); +// } + } + + private void updateDistance(float lastSumLength){ + double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒 + CallerLogger.INSTANCE.d(M_TAXI + "dynamicCalculateRouteInfo" + , "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime + + " thread = " + Thread.currentThread().getName()); + + if (mCurrentOCHOrder != null) { + mCurrentOCHOrder.decreaseTravelDistance(lastSumLength); } - if (mRoutePoints.size() > 0 && mLocation != null){ - Map> lastPointsMap = CoordinateCalculateRouteUtil - .getRemainPointListByCompareNew(mPreRouteIndex,mRoutePoints, mLocation); - - for (int index: lastPointsMap.keySet()) { - mPreRouteIndex = index; - break; - } - for (List lastPoints: lastPointsMap.values()){ - float lastSumLength = 0; - if (lastPoints.size() == 1) { //只是最后一个点,计算当前位置和最后一个点的距离 - lastSumLength = CoordinateUtils.calculateLineDistance( - lastPoints.get(0).getLongitude(), lastPoints.get(0).getLatitude(), - mLocation.getLongitude(), mLocation.getLatitude()); - } else { - lastSumLength = CoordinateCalculateRouteUtil.calculateRouteSumLength(lastPoints); - } - - double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒 - CallerLogger.INSTANCE.d(M_TAXI + "dynamicCalculateRouteInfo" - , "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime - + " thread = "+ Thread.currentThread().getName()); - - if (mCurrentOCHOrder != null){ - mCurrentOCHOrder.decreaseTravelDistance(lastSumLength); - } - if (mOrderStatusCallback != null) { - mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) lastSumLength, (long) lastTime); - } - - reportOrderRemain((long) lastSumLength, (long) lastTime); - break; - } - routeAndWipe(); + if (mOrderStatusCallback != null) { + mOrderStatusCallback.onCurrentOrderDistToEndChanged((long) lastSumLength, (long) lastTime); } + + reportOrderRemain((long) lastSumLength, (long) lastTime); } private void routeAndWipe() { - if (mRoutePoints != null && mRoutePoints.size() > 0 && mLocation != null){ + if (mRoutePoints != null && mRoutePoints.size() > 0 && mLocation != null) { int haveArrivedIndex = CoordinateCalculateRouteUtil .getArrivedPointIndexNew(mPreRouteIndex, mRoutePoints, mLocation.getLongitude(), mLocation.getLatitude()); List routePoints = CoordinateCalculateRouteUtil - .coordinateConverterLocationToLatLng(mContext,mRoutePoints); - if (mAutopilotPlanningCallback != null){ - mAutopilotPlanningCallback.routeResult(routePoints,haveArrivedIndex); + .coordinateConverterLocationToLatLng(mContext, mRoutePoints); + List routeArrivied = new ArrayList<>(); + List routeArriving = new ArrayList<>(); + for (int i = 0; i < routePoints.size(); i++){ + if (i <= haveArrivedIndex){ + routeArrivied.add(routePoints.get(i)); + }else { + routeArriving.add(routePoints.get(i)); + } } - setRouteLineMarker(routePoints); + if (mAutopilotPlanningCallback != null) { + mAutopilotPlanningCallback.routeResult(routeArrivied,routeArriving, mLocation); + } + setRouteLineMarker(); } } + private final IDistanceListener distanceListener = this::updateDistance; + + private final ITrajectoryListener trajectoryListener = (routeArrivied, routeArriving, location) -> { + if (mAutopilotPlanningCallback != null) { + List routeArriviedTemp = new ArrayList<>(); + List routeArrivingTemp = new ArrayList<>(); + LatLng temp; + for (MogoLocation mogoLocation : routeArrivied) { + temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); + routeArriviedTemp.add(temp); + } + for (MogoLocation mogoLocation : routeArriving) { + temp = new LatLng(mogoLocation.getLatitude(),mogoLocation.getLongitude()); + routeArrivingTemp.add(temp); + } + mAutopilotPlanningCallback.routeResult(routeArriviedTemp, routeArrivingTemp,location); + setRouteLineMarker(); + } + }; + + /** * 查询当前订单的全局路径 (当自动驾驶开启后,订单前往乘客上车点,杀掉应用再次进来时候) */ @@ -1540,7 +1597,7 @@ public class TaxiModel { }); } - public void startServicePilotDone(){ + public void startServicePilotDone() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); @@ -1561,7 +1618,7 @@ public class TaxiModel { }); } - public void arrivedStartPoint(){ + public void arrivedStartPoint() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); result.lat = mLatitude; @@ -1582,7 +1639,7 @@ public class TaxiModel { }); } - public void arriveTerminal(){ + public void arriveTerminal() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); result.lat = mLatitude; @@ -1603,7 +1660,7 @@ public class TaxiModel { }); } - public void orderCompleted(){ + public void orderCompleted() { if (mCurrentOCHOrder == null) return; TaxiOrPassengerReadyReqBean.Result result = new TaxiOrPassengerReadyReqBean.Result(); result.lat = mLatitude; @@ -1625,30 +1682,47 @@ public class TaxiModel { // 登出 public void logout() { - loginService.loginOut(mLatitude,mLongitude); + loginService.loginOut(mLatitude, mLongitude); } //导航去订单终点目的地 - public void startNaviToEndStation(boolean isShow){ - if (mRoutePoints.size() > 0 ){ //使用自驾轨迹 - if (mOrderStatusCallback != null){ - mOrderStatusCallback.onNaviToEnd(false,isShow); + public void startNaviToEndStation(boolean isShow) { + if (mRoutePoints.size() > 0) { //使用自驾轨迹 + if (mOrderStatusCallback != null) { + mOrderStatusCallback.onNaviToEnd(false, isShow); } - }else {//若直接要显示导航地图则直接导航, 若不是则2s后若无轨迹数据使用高德导航 - if (isShow && mRoutePoints.size() == 0 && mOrderStatusCallback != null){ + } else {//若直接要显示导航地图则直接导航, 若不是则2s后若无轨迹数据使用高德导航 + if (isShow && mRoutePoints.size() == 0 && mOrderStatusCallback != null) { - mOrderStatusCallback.onNaviToEnd(true,true); - }else { + mOrderStatusCallback.onNaviToEnd(true, true); + } else { UiThreadHandler.postDelayed(new Runnable() { @Override public void run() { - if (mRoutePoints.size() == 0 && mOrderStatusCallback != null){ - mOrderStatusCallback.onNaviToEnd(true,false); + if (mRoutePoints.size() == 0 && mOrderStatusCallback != null) { + mOrderStatusCallback.onNaviToEnd(true, false); } } - },2000l); + }, 2000l); } } } + + public void setStation(){ + OrderQueryRespBean.Result currentOCHOrder = getCurrentOCHOrder(); + if(currentOCHOrder!=null){ + MogoLocation startStation = new MogoLocation(); + startStation.setLongitude(currentOCHOrder.startSiteGcjPoint.get(0)); + startStation.setLatitude(currentOCHOrder.startSiteGcjPoint.get(1)); + MogoLocation endStation = new MogoLocation(); + endStation.setLongitude(currentOCHOrder.endSiteGcjPoint.get(0)); + endStation.setLatitude(currentOCHOrder.endSiteGcjPoint.get(1)); + TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation,endStation,currentOCHOrder.lineId); + } + } + + public void cleanStation(){ + TrajectoryAndDistanceManager.INSTANCE.setStationPoint(null,null,-1L); + } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java index 1c98be1ad8..112ed99f50 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/NaviPresenter.java @@ -10,6 +10,7 @@ import androidx.lifecycle.LifecycleOwner; import com.amap.api.maps.model.LatLng; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback; @@ -65,12 +66,12 @@ public class NaviPresenter extends Presenter implements } @Override - public void setLineMarker(List models) { - runOnUIThread(() -> mView.setLineMarker(models)); + public void setLineMarker(LatLng startStation, LatLng endStation) { + runOnUIThread(() -> mView.setLineMarker(startStation,endStation)); } @Override - public void routeResult(List models, int haveArrivedIndex) { - mView.routeResult(models,haveArrivedIndex); + public void routeResult(List routeArrivied, List routeArriving, MogoLocation location) { + mView.routeResult(routeArrivied,routeArriving,location); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java index 72c76408eb..d53d3e16f3 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/TaxiPresenter.java @@ -240,10 +240,12 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS CallerLogger.INSTANCE.d(M_TAXI + TAG,"order = "+order.toString()); if (TaxiOrderStatusEnum.UserArriveAtStart.getCode() == order.orderStatus){ TaxiModel.getInstance().queryAutopilotStatus(true); + TaxiModel.getInstance().setStation(); } if (TaxiOrderStatusEnum.OnTheWayToEnd.getCode() == order.orderStatus){ TaxiModel.getInstance().startDynamicCalculateRouteInfo(); + TaxiModel.getInstance().setStation(); runOnUIThread(() -> { mView.updateCtvAutopilotStatusTag(true); CallerOrderListenerManager.INSTANCE.invokeOrderStatus(true); @@ -255,7 +257,8 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiOrderStatusEnum.Cancel.getCode() == order.orderStatus || TaxiOrderStatusEnum.JourneyCompleted.getCode() == order.orderStatus){ TaxiModel.getInstance().startOrStopCalculateRouteInfo(false); - TaxiModel.getInstance().setRouteLineMarker(null); + TaxiModel.getInstance().cleanLineMarker(); + TaxiModel.getInstance().cleanStation(); runOnUIThread(() -> { if(TaxiOrderStatusEnum.ArriveAtEnd.getCode() == order.orderStatus){ CallerOrderListenerManager.INSTANCE.invokeOrderStatus(false); @@ -329,7 +332,6 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS if (null != location){ runOnUIThread(() -> { mView.updateSpeedView((float) location.getGnssSpeed()); - mView.updateLocation(location.getLatitude(),location.getLongitude()); }); } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java index 2bd1fc7c0d..8b928582cb 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseTaxiTabFragment.java @@ -228,7 +228,7 @@ public abstract class BaseTaxiTabFragment @@ -363,9 +363,6 @@ public abstract class BaseTaxiTabFragment grabOrderFragmentWR; + private WeakReference serverOrdersFragmentWR; private WeakReference personalDialogFragment = null; - protected double mCurLatitude = 0.0; - protected double mCurLongitude = 0.0; private LoginService loginService; @Override @@ -120,32 +118,34 @@ public class TaxiFragment extends BaseTaxiTabFragment(TaxiServerOrdersFragment.newInstance()); + grabOrderFragmentWR = new WeakReference<>(TaxiGrabOrderFragment.newInstance()); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); //默认显示OCHTaxiServerOrdersFragment - transaction.add(R.id.fragment_container, serverOrdersFragment).show(serverOrdersFragment); - transaction.add(R.id.fragment_container, grabOrderFragment).hide(grabOrderFragment); + transaction.add(R.id.fragment_container, serverOrdersFragmentWR.get()).show(serverOrdersFragmentWR.get()); + transaction.add(R.id.fragment_container, grabOrderFragmentWR.get()).hide(grabOrderFragmentWR.get()); transaction.commitAllowingStateLoss(); } private void showGrabFragmentAndUpdate() { FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - if (grabOrderFragment == null) { - grabOrderFragment = TaxiGrabOrderFragment.newInstance(); - transaction.add(R.id.fragment_container, grabOrderFragment).show(grabOrderFragment).commitAllowingStateLoss(); + if (grabOrderFragmentWR == null || grabOrderFragmentWR.get() == null) { + grabOrderFragmentWR = new WeakReference<>(TaxiGrabOrderFragment.newInstance()); + transaction.add(R.id.fragment_container, grabOrderFragmentWR.get()) + .show(grabOrderFragmentWR.get()).commitAllowingStateLoss(); } else { - transaction.show(grabOrderFragment).hide(serverOrdersFragment).commitAllowingStateLoss(); + transaction.show(grabOrderFragmentWR.get()).hide(serverOrdersFragmentWR.get()).commitAllowingStateLoss(); } } public void showServerFragmentAndUpdate() { FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - if (serverOrdersFragment == null) { - serverOrdersFragment = TaxiServerOrdersFragment.newInstance(); - transaction.add(R.id.fragment_container, serverOrdersFragment).show(serverOrdersFragment); + if (serverOrdersFragmentWR == null || serverOrdersFragmentWR.get() == null) { + serverOrdersFragmentWR = new WeakReference<>(TaxiServerOrdersFragment.newInstance()); + transaction.add(R.id.fragment_container, serverOrdersFragmentWR.get()) + .show(serverOrdersFragmentWR.get()); } else { - transaction.show(serverOrdersFragment).hide(grabOrderFragment).commitAllowingStateLoss(); + transaction.show(serverOrdersFragmentWR.get()).hide(grabOrderFragmentWR.get()).commitAllowingStateLoss(); } } @@ -210,8 +210,8 @@ public class TaxiFragment extends BaseTaxiTabFragment waitServiceList) { if (null == waitServiceList) return; - if (null == serverOrdersFragment) return; - serverOrdersFragment.onOrdersWaitServiceChanged(waitServiceList); + if (null == serverOrdersFragmentWR || serverOrdersFragmentWR.get() == null) return; + serverOrdersFragmentWR.get().onOrdersWaitServiceChanged(waitServiceList); } public void queryCurOrderRouteInfo() { @@ -333,18 +333,13 @@ public class TaxiFragment extends BaseTaxiTabFragment mCoordinatesLatLng = new ArrayList<>(); - private Polyline mPolyline; - private CameraUpdate mCameraUpdate; - private Context mContext; - private int mHaveArrivedIndex; - - List textureList = new ArrayList<>(); - List texIndexList = new ArrayList<>(); - - private BitmapDescriptor mArrivedRes; - private BitmapDescriptor mUnArrivedRes; - - public TaxiMapDirectionView(Context context) { - this(context, null); - } - - public TaxiMapDirectionView(Context context, @Nullable AttributeSet attrs) { - this(context, attrs, 0); - } - - public TaxiMapDirectionView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - try { - initView(context); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - private void initView(Context context) { - CallerLogger.INSTANCE.d(M_TAXI + TAG, "initView"); - - mContext = context; - - View smpView = LayoutInflater.from(context).inflate(R.layout.taxi_map_view, this); - - mAMapNaviView = (TextureMapView) smpView.findViewById(R.id.taxi_amap_view); - - initAMapView(); - - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.addListener(TAG, this); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - // 注册定位监听 - CallerChassisLocationGCJ02ListenerManager.INSTANCE.removeListener(TAG); - } - - private void initAMapView() { - mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel); - mAMap = mAMapNaviView.getMap(); - // 设置导航地图模式,aMap是地图控制器对象。 - mAMap.setMapType(AMap.MAP_TYPE_NIGHT); - - // 关闭显示实时路况图层,aMap是地图控制器对象。 - mAMap.setTrafficEnabled(false); - - // 设置 锚点 图标 - mCarMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_car)) - .anchor(0.5f, 0.5f)); - mStartMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_view_dir_start))); - mEndMarker = mAMap.addMarker(new MarkerOptions() - .icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_view_dir_end))); - mStartMarker.setVisible(false); - mEndMarker.setVisible(false); - - mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_arrived); - mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_un_arrive); - - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(TaxiMapAssetStyleUtil.getAssetsStyle(getContext(),"map_style.data")) - .setStyleExtraData(TaxiMapAssetStyleUtil.getAssetsExtraStyle(getContext(),"map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - - //设置希望展示的地图缩放级别 - mAMap.moveCamera(mCameraUpdate); - - // 设置地图的样式 - UiSettings uiSettings = mAMap.getUiSettings(); - uiSettings.setZoomControlsEnabled(false);// 地图缩放级别的交换按钮 - uiSettings.setAllGesturesEnabled(false);// 所有手势 - uiSettings.setMyLocationButtonEnabled(false); // 显示默认的定位按钮 - uiSettings.setLogoBottomMargin(-150); //设置Logo下边界距离屏幕底部的边距,设置为负值即可 - - mAMap.setOnMapLoadedListener(new AMap.OnMapLoadedListener() { - @Override - public void onMapLoaded() { - CallerLogger.INSTANCE.d(M_TAXI + TAG, "smp---onMapLoaded"); - // 加载自定义样式 - CustomMapStyleOptions customMapStyleOptions = new CustomMapStyleOptions() - .setEnable(true) - .setStyleData(TaxiMapAssetStyleUtil.getAssetsStyle(getContext(),"map_style.data")) - .setStyleExtraData(TaxiMapAssetStyleUtil.getAssetsExtraStyle(getContext(),"map_style_extra.data")); - // 设置自定义样式 - mAMap.setCustomMapStyle(customMapStyleOptions); - mAMapNaviView.getMap().setPointToCenter(mAMapNaviView.getWidth() / 2, mAMapNaviView.getHeight() / 2); - } - }); - - //设置地图状态的监听接口 - mAMap.setOnCameraChangeListener(this); - } - - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - return true; - } - - @Override - public void onChassisLocationGCJ02(@Nullable MogoLocation gnssInfo) { - if (gnssInfo == null){ - return; - } - try { - LatLng currentLatLng = new LatLng(gnssInfo.getLatitude(), gnssInfo.getLongitude()); - if (mCoordinatesLatLng.size() > 1) { - //圈定地图显示范围 - LatLng endLatLng = mCoordinatesLatLng.get(mCoordinatesLatLng.size() - 1); - //存放经纬度 - LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); - boundsBuilder.include(currentLatLng); - boundsBuilder.include(endLatLng); - //第二个参数为四周留空宽度 - mAMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100,100,100,100)); -// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "onCarLocationChanged2--moveCamera :" + location.getLatitude()+", "+location.getLongitude()); - - } else { - //设置希望展示的地图缩放级别 - CameraPosition cameraPosition = new CameraPosition.Builder() - .target(mCarMarker.getPosition()).tilt(0).bearing((float) gnssInfo.getHeading()).zoom(zoomLevel).build(); - mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); - } - //更新车辆位置 - if (mCarMarker != null) { -// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "location.getBearing() = " + location.getBearing()); - mCarMarker.setRotateAngle((float) (360 - gnssInfo.getHeading())); - mCarMarker.setPosition(currentLatLng); -// CallerLogger.INSTANCE.d(M_TAXI_P + TAG, "onCarLocationChanged2--loacation :" + location.getLatitude()+", "+location.getLongitude()); - mCarMarker.setToTop(); - } - }catch (Exception e){ - - } - } - - @Override - public void setLineMarker() { -// if (mStartMarker != null) { -// mStartMarker.setVisible(false); -// } -// if (mEndMarker != null) { -// mEndMarker.setVisible(false); -// } - if (mStartMarker != null && mEndMarker != null - && mStartMarker.isVisible() && mEndMarker.isVisible()) { - return; - } - - if (mCoordinatesLatLng.size() > 2) { - // 设置开始结束Marker位置 - LatLng startLatLng = mCoordinatesLatLng.get(0); - LatLng endLatLng = mCoordinatesLatLng.get(mCoordinatesLatLng.size() - 1); - if (mStartMarker != null) { - mStartMarker.setPosition(startLatLng); - mStartMarker.setVisible(true); - } - if (mEndMarker != null) { - mEndMarker.setPosition(endLatLng); - mEndMarker.setVisible(true); - } - } - } - - @Override - public void drawablePolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - if (mAMap != null) { - - addRouteColorList(); - - if (mCoordinatesLatLng.size() > 2) { - //设置线段纹理 - PolylineOptions polylineOptions = new PolylineOptions(); - polylineOptions.addAll(mCoordinatesLatLng); - polylineOptions.setUseTexture(true); - polylineOptions.width(15); - polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapRound); - polylineOptions.setCustomTextureList(textureList); - polylineOptions.setCustomTextureIndex(texIndexList); - - // 绘制线 - mPolyline = mAMap.addPolyline(polylineOptions); - - } - } - } - - /** - * 添加画线颜色值 - */ - private void addRouteColorList() { - textureList.clear(); - texIndexList.clear(); - for (int i = 0; i < mCoordinatesLatLng.size(); i++){ - if (i <= mHaveArrivedIndex){ - textureList.add(mArrivedRes); - }else { - textureList.add(mUnArrivedRes); - } - texIndexList.add(i); - } - } - - - public LatLng CoordinateConverterFrom84(Context mContext, MogoLatLng mogoLatLng) { - CoordinateConverter mCoordinateConverter = new CoordinateConverter(mContext); - mCoordinateConverter.from(CoordinateConverter.CoordType.GPS); - mCoordinateConverter.coord(new LatLng(mogoLatLng.lat, mogoLatLng.lon)); - LatLng latLng = mCoordinateConverter.convert(); - return latLng; - } - - public List CoordinateConverterFrom84ForList(Context mContext, List mogoLatLngList) { - List list = new ArrayList<>(); - for (MogoLatLng m : mogoLatLngList) { - LatLng mogoLatLng = CoordinateConverterFrom84(mContext, m); - list.add(mogoLatLng); - } - return list; - } - - @Override - public void clearPolyline() { - if (mPolyline != null) { - mPolyline.remove(); - } - if (mStartMarker != null) { - mStartMarker.setVisible(false); - } - if (mEndMarker != null) { - mEndMarker.setVisible(false); - } - } - - public void resetPolyLine() { - mCoordinatesLatLng.clear(); - if (mPolyline != null) { - mPolyline.remove(); - } - if (mStartMarker != null) { - mStartMarker.setVisible(false); - } - if (mEndMarker != null) { - mEndMarker.setVisible(false); - } - } - - public void onCreateView(Bundle savedInstanceState) { - if (mAMapNaviView != null) { - mAMapNaviView.onCreate(savedInstanceState); - } - } - - public void onResume() { - if (mAMapNaviView != null) { - mAMapNaviView.onResume(); - } - } - - public void onPause() { - if (mAMapNaviView != null) { - mAMapNaviView.onPause(); - } - } - - public void onDestroy() { - if (mAMapNaviView != null) { - mAMapNaviView.onDestroy(); - } - } - - public void convert(List coordinates) { - mCoordinatesLatLng.clear(); - List latLngs = CoordinateConverterFrom84ForList(mContext, coordinates); - mCoordinatesLatLng.addAll(latLngs); - } - - public void setCoordinatesLatLng(List latLngs){ - mCoordinatesLatLng.clear(); - mCoordinatesLatLng.addAll(latLngs); - } - - public void setCoordinatesLatLng(List latLngs, int haveArrivedIndex){ - mCoordinatesLatLng.clear(); - mCoordinatesLatLng.addAll(latLngs); - mHaveArrivedIndex = haveArrivedIndex; - } - - @Override - public void onCameraChange(CameraPosition cameraPosition) { - - } - - @Override - public void onCameraChangeFinish(CameraPosition cameraPosition) { - - } -} diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt new file mode 100644 index 0000000000..5718ed6a16 --- /dev/null +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiMapDirectionView.kt @@ -0,0 +1,289 @@ +package com.mogo.och.taxi.ui + +import android.content.Context +import android.os.Bundle +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.MotionEvent +import android.widget.RelativeLayout +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.CustomMapStyleOptions +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.LatLngBounds +import com.amap.api.maps.model.Marker +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.Polyline +import com.amap.api.maps.model.PolylineOptions +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.och.taxi.R +import com.mogo.och.taxi.utils.TaxiMapAssetStyleUtil + +/** + * taxi司机端前往目的地小地图导航 + */ +class TaxiMapDirectionView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : RelativeLayout(context, attrs, defStyleAttr), IMoGoChassisLocationGCJ02Listener, + ITaxiMapDirectionView, AMap.OnCameraChangeListener { + private lateinit var mAMapNaviView: TextureMapView + private lateinit var mAMap: AMap + private var mCarMarker: Marker? = null + private lateinit var mStartMarker: Marker + private lateinit var mEndMarker: Marker + private val zoomLevel = 13 + private val routeArrivied: MutableList = ArrayList() + private val routeArriving: MutableList = ArrayList() + private var location: MogoLocation? = null + private var startStation: LatLng? = null + private var endStation: LatLng? = null + private var mPolyline: Polyline? = null + var textureList: MutableList = ArrayList() + var texIndexList: MutableList = ArrayList() + private var mArrivedRes: BitmapDescriptor? = null + private var mUnArrivedRes: BitmapDescriptor? = null + + init { + try { + initView(context) + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun initView(context: Context) { + d(SceneConstant.M_TAXI + TAG, "initView") + val smpView = LayoutInflater.from(context).inflate(R.layout.taxi_map_view, this) + mAMapNaviView = smpView.findViewById(R.id.taxi_amap_view) + initAMapView() + + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 10, this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + // 注册定位监听 + CallerChassisLocationGCJ02ListenerManager.removeListener(TAG) + } + + private fun initAMapView() { + val mCameraUpdate = CameraUpdateFactory.zoomTo(zoomLevel.toFloat()) + mAMap = mAMapNaviView.map + // 设置导航地图模式,aMap是地图控制器对象。 + mAMap.mapType = AMap.MAP_TYPE_NIGHT + + // 关闭显示实时路况图层,aMap是地图控制器对象。 + mAMap.isTrafficEnabled = false + + // 设置 锚点 图标 + mCarMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_car)).anchor(0.5f, 0.5f)) + mStartMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_view_dir_start))) + mEndMarker = mAMap.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_view_dir_end))) + mStartMarker.isVisible = false + mEndMarker.isVisible = false + mArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_arrived) + mUnArrivedRes = BitmapDescriptorFactory.fromResource(R.drawable.taxi_map_arrow_un_arrive) + + // 加载自定义样式 + val customMapStyleOptions = CustomMapStyleOptions() + .setEnable(true) + .setStyleData(TaxiMapAssetStyleUtil.getAssetsStyle(context, "map_style.data")) + .setStyleExtraData( + TaxiMapAssetStyleUtil.getAssetsExtraStyle( + context, + "map_style_extra.data" + ) + ) + // 设置自定义样式 + mAMap.setCustomMapStyle(customMapStyleOptions) + + //设置希望展示的地图缩放级别 + mAMap.moveCamera(mCameraUpdate) + + // 设置地图的样式 + mAMap.uiSettings.apply { + isZoomControlsEnabled = false // 地图缩放级别的交换按钮 + setAllGesturesEnabled(false) // 所有手势 + isMyLocationButtonEnabled = false // 显示默认的定位按钮 + setLogoBottomMargin(-150) //设置Logo下边界距离屏幕底部的边距,设置为负值即可 + } + mAMap.setOnMapLoadedListener(AMap.OnMapLoadedListener { + d(SceneConstant.M_TAXI + TAG, "smp---onMapLoaded") + // 加载自定义样式 + val customMapStyleOptions = CustomMapStyleOptions() + .setEnable(true) + .setStyleData(TaxiMapAssetStyleUtil.getAssetsStyle(context, "map_style.data")) + .setStyleExtraData( + TaxiMapAssetStyleUtil.getAssetsExtraStyle( + context, + "map_style_extra.data" + ) + ) + // 设置自定义样式 + mAMap.setCustomMapStyle(customMapStyleOptions) + mAMapNaviView.map.setPointToCenter( + mAMapNaviView.width / 2, + mAMapNaviView.height / 2 + ) + }) + + //设置地图状态的监听接口 + mAMap.setOnCameraChangeListener(this) + } + + override fun onInterceptTouchEvent(ev: MotionEvent): Boolean { + return true + } + + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + if (mogoLocation == null) { + return + } + try { + val currentLatLng = LatLng(mogoLocation.latitude, mogoLocation.longitude) + if (mPolyline != null && mPolyline!!.points.size > 1) { + val points = mPolyline!!.points + //圈定地图显示范围 + val endLatLng = points[points.size - 1] + //存放经纬度 + val boundsBuilder = LatLngBounds.Builder() + boundsBuilder.include(currentLatLng) + boundsBuilder.include(endLatLng) + //第二个参数为四周留空宽度 + mAMap.moveCamera( + CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100) + ) + } else { + //设置希望展示的地图缩放级别 + val cameraPosition = CameraPosition.Builder() + .target(mCarMarker!!.position).tilt(0f).bearing(mogoLocation.heading.toFloat()) + .zoom(zoomLevel.toFloat()).build() + mAMap.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)) + } + //更新车辆位置 + if (mCarMarker != null) { + mCarMarker!!.rotateAngle = (360 - mogoLocation.heading).toFloat() + mCarMarker!!.position = currentLatLng + mCarMarker!!.setToTop() + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun setLineMarker() { + if (mStartMarker.isVisible && mEndMarker.isVisible + ) { + return + } + if (startStation != null && endStation != null) { + // 设置开始结束Marker位置 + mStartMarker.position = startStation + mStartMarker.isVisible = true + mEndMarker.position = endStation + mEndMarker.isVisible = true + } + } + + override fun drawablePolyline() { + if (routeArrivied.isEmpty() && routeArriving.isEmpty()) { + d(SceneConstant.M_TAXI + TAG, "没有点") + return + } + texIndexList.clear() + val allPoints = ArrayList(routeArrivied) + for (i in routeArrivied.indices) { + if (routeArrivied.size > 1 && i < routeArrivied.size - 1) { + texIndexList.add(0) + } + } + texIndexList.add(0) + allPoints.add(LatLng(location!!.latitude, location!!.longitude)) + allPoints.addAll(routeArriving) + for (ignored in routeArrivied) { + texIndexList.add(1) + } + if (mPolyline != null) { + mPolyline!!.points = allPoints + mPolyline!!.options.customTextureIndex = texIndexList + return + } + if(textureList.isEmpty()) { + textureList.add(mArrivedRes) + textureList.add(mUnArrivedRes) + } + //设置线段纹理 + val polylineOptions = PolylineOptions().apply { + addAll(allPoints) + isUseTexture = true + width(15f) + lineCapType(PolylineOptions.LineCapType.LineCapRound) + customTextureList = textureList + customTextureIndex = texIndexList + } + + // 绘制线 + mPolyline = mAMap.addPolyline(polylineOptions) + } + + override fun clearPolyline() { + if (mPolyline != null) { + mPolyline!!.remove() + mPolyline = null + } + mStartMarker.isVisible = false + mEndMarker.isVisible = false + } + + fun onCreateView(savedInstanceState: Bundle?) { + mAMapNaviView.onCreate(savedInstanceState) + } + + fun onResume() { + mAMapNaviView.onResume() + } + + fun onPause() { + mAMapNaviView.onPause() + } + + fun onDestroy() { + mAMapNaviView.onDestroy() + } + + fun setStartMarkAndEndMark(startStation: LatLng?, endStation: LatLng?) { + this.startStation = startStation + this.endStation = endStation + } + + fun setCoordinatesLatLng( + routeArrivied: List?, + routeArriving: List?, + location: MogoLocation? + ) { + this.routeArrivied.clear() + this.routeArrivied.addAll(routeArrivied!!) + this.routeArriving.clear() + this.routeArriving.addAll(routeArriving!!) + this.location = location + } + + override fun onCameraChange(cameraPosition: CameraPosition) {} + override fun onCameraChangeFinish(cameraPosition: CameraPosition) {} + + companion object { + //小地图名称 + const val TAG = "TaxiMapDirectionView" + } +} \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiRottingNaviFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiRottingNaviFragment.java index d237e395cd..003c211eaa 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiRottingNaviFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiRottingNaviFragment.java @@ -6,6 +6,7 @@ import androidx.annotation.NonNull; import com.amap.api.maps.model.LatLng; import com.mogo.commons.mvp.MvpFragment; +import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; import com.mogo.och.taxi.R; import com.mogo.och.taxi.presenter.NaviPresenter; @@ -79,49 +80,34 @@ public class TaxiRottingNaviFragment extends MvpFragment latLngList, int haveArrivedIndex){ - if (latLngList.size() > 0) { - drawablePolylineByRoute(latLngList,haveArrivedIndex); + public void routeResult(List routeArrivied, List routeArriving, MogoLocation location){ + if ((routeArrivied.size()+routeArriving.size()) > 0) { + drawablePolylineByRoute(routeArrivied,routeArriving,location); } else { clearPolyline(); } } - public void setLineMarker(List latLngList){ - if (null != latLngList && latLngList.size() > 0) { + public void setLineMarker(LatLng startStation, LatLng endStation){ + if (startStation!=null&&endStation!=null) { if (mMapDirectionView != null) { - mMapDirectionView.setCoordinatesLatLng(latLngList); - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapDirectionView.setLineMarker(); - } - }); + mMapDirectionView.setStartMarkAndEndMark(startStation,endStation); + UiThreadHandler.post(() -> mMapDirectionView.setLineMarker()); } } else { clearPolyline(); } } - public void drawablePolylineByRoute(List mCoordinatesLatLng,int haveArrivedIndex){ + public void drawablePolylineByRoute(List routeArrivied, List routeArriving, MogoLocation location){ if (mMapDirectionView != null){ - mMapDirectionView.setCoordinatesLatLng(mCoordinatesLatLng,haveArrivedIndex); - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapDirectionView.drawablePolyline(); - } - }); + mMapDirectionView.setCoordinatesLatLng(routeArrivied,routeArriving,location); + UiThreadHandler.post(() -> mMapDirectionView.drawablePolyline()); } } private void clearPolyline() { if (mMapDirectionView != null) { - UiThreadHandler.post(new Runnable() { - @Override - public void run() { - mMapDirectionView.clearPolyline(); - } - }); + UiThreadHandler.post(() -> mMapDirectionView.clearPolyline()); } } } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java index c0e75d16ad..c43e4617c6 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/utils/TaxiAnalyticsManager.java @@ -56,14 +56,14 @@ public class TaxiAnalyticsManager { if (mStartAutopilotParams.isEmpty()) return; CallerLogger.INSTANCE.e(M_TAXI + "triggerStartAutopilotFailureEvent", failMsg); - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_FAILURE_CODE, failCode); mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_FAILURE_MSG, failMsg); } mStartAutopilotParams.put(TaxiConst.EVENT_PARAM_START_RESULT, - CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == + CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); diff --git a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java index bcacdb6ffb..fd3b224b17 100644 --- a/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java +++ b/OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java @@ -658,4 +658,15 @@ public class SweeperTaskModel implements IMoGoSweeperFutianCloudTaskListener, IM CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onSweeperFutianCloudTaskUnknown:" + string); } + @Override + public void onAutopilotStatusResponse(int state) { + IMoGoAutopilotStatusListener.super.onAutopilotStatusResponse(state); + // TODO: 2023/6/19 bingbing + } + + @Override + public void onAutopilotDockerInfo(@NonNull String dockerVersion) { + IMoGoAutopilotStatusListener.super.onAutopilotDockerInfo(dockerVersion); + // TODO: 2023/6/19 bingbing + } } diff --git a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java index acf46f64f6..7e18efb729 100644 --- a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java +++ b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java @@ -117,16 +117,17 @@ public class SweeperPresenter extends Presenter @Override public void onAutopilotRouteLineId(long lineId) { - } @Override public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { - if (autopilotStatusInfo == null) return; - CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onAutopilotStatusResponse state:" + autopilotStatusInfo.getState()); - SweeperTaskModel.getInstance().setAutopilotState(autopilotStatusInfo.getState()); - ThreadUtils.runOnUiThread(() -> mView.startAutoBtn(autopilotStatusInfo.getState())); - switch (autopilotStatusInfo.getState()) { + } + + @Override + public void onAutopilotStatusResponse(int state) { + SweeperTaskModel.getInstance().setAutopilotState(state); + ThreadUtils.runOnUiThread(() -> mView.startAutoBtn(state)); + switch (state) { case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE://不可自动驾驶 break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE://人工驾驶 @@ -207,8 +208,6 @@ public class SweeperPresenter extends Presenter } /** * 测试使用 - * - * @param status */ public void debugAutoPilotStatus(int status) { AutopilotStatusInfo info = new AutopilotStatusInfo(); @@ -237,12 +236,10 @@ public class SweeperPresenter extends Presenter @Override public void onAutopilotSNRequest() { - } @Override public void onStartAdasFailure() { - } public void onArriveTaskEnd(@Nullable MessagePad.ArrivalNotification arrivalNotification) { @@ -251,9 +248,6 @@ public class SweeperPresenter extends Presenter @Override public void onSweeperFutianCleanSystemState(@NonNull ChassisStatesOuterClass.SweeperFuTianTaskSystemStates cleanSystemState) { - if (cleanSystemState == null) { - return; - } long current = System.currentTimeMillis(); if (current - mVehicleStateCurrentTimeMillis <= VEHICLE_STATE_INTERVAL_MILLIS) { return; @@ -279,30 +273,29 @@ public class SweeperPresenter extends Presenter // 纯扫 模式判断:不是另外其他3个模式,同时有清扫方向,说明开启了纯扫模式 boolean clean_mode_pure_sweep = SweeperFutianCmdUtil.checkIfCleanModePureSweep(cleanSystemState); - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("开关:") - .append(clean_open_requirement) - .append("\n") - .append("纯扫:") - .append(clean_mode_wash_sweep) - .append("纯洗:") - .append(clean_mode_pure_wash) - .append("纯吸:") - .append(clean_mode_pure_draw) - .append("纯扫:") - .append("\n") - .append(clean_mode_pure_sweep) - .append("左侧:") - .append(clean_direction_left_side) - .append("右侧:") - .append(clean_direction_right_side) - .append("两侧:") - .append("\n") - .append(clean_direction_both_side) - .append("标准:") - .append(clean_intensity_standard) - .append("强力:") - .append(clean_intensity_strong); + String stringBuilder = "开关:" + + clean_open_requirement + + "\n" + + "纯扫:" + + clean_mode_wash_sweep + + "纯洗:" + + clean_mode_pure_wash + + "纯吸:" + + clean_mode_pure_draw + + "纯扫:" + + "\n" + + clean_mode_pure_sweep + + "左侧:" + + clean_direction_left_side + + "右侧:" + + clean_direction_right_side + + "两侧:" + + "\n" + + clean_direction_both_side + + "标准:" + + clean_intensity_standard + + "强力:" + + clean_intensity_strong; CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onSweeperFutianCleanSystemState:" + stringBuilder); mView.onSweeperFutianCleanSystemState(cleanSystemState); @@ -310,27 +303,23 @@ public class SweeperPresenter extends Presenter @Override public void onSweeperFutianTaskIndexData(@NonNull RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex roboSweeperTaskIndex) { - if (roboSweeperTaskIndex == null) { - return; - } long current = System.currentTimeMillis(); if (current - mWeltDataCurrentTimeMillis <= WELT_DATA_INTERVAL_MILLIS) { return; } mWeltDataCurrentTimeMillis = current; - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("清扫模式:") - .append(roboSweeperTaskIndex.getCleanMode()) - .append("清扫方向:") - .append(roboSweeperTaskIndex.getCleanDirection()) - .append("清扫强度:") - .append(roboSweeperTaskIndex.getCleanIntensity()) - .append("贴边距离:") - .append(roboSweeperTaskIndex.getDistToRefEdgePoint()) - .append("经度:") - .append(roboSweeperTaskIndex.getLocLon()) - .append("纬度:") - .append(roboSweeperTaskIndex.getLocLat()); + String stringBuilder = "清扫模式:" + + roboSweeperTaskIndex.getCleanMode() + + "清扫方向:" + + roboSweeperTaskIndex.getCleanDirection() + + "清扫强度:" + + roboSweeperTaskIndex.getCleanIntensity() + + "贴边距离:" + + roboSweeperTaskIndex.getDistToRefEdgePoint() + + "经度:" + + roboSweeperTaskIndex.getLocLon() + + "纬度:" + + roboSweeperTaskIndex.getLocLat(); CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onSweeperFutianTaskIndexData:" + stringBuilder); String tempLongitude=NumberFormatUtil.cutOutNumber(roboSweeperTaskIndex.getLocLon(), 6); String tempLatitude=NumberFormatUtil.cutOutNumber(roboSweeperTaskIndex.getLocLat(), 6); @@ -458,4 +447,9 @@ public class SweeperPresenter extends Presenter public void setRouteList(@NonNull ArrayList routeList) { mView.setTaskRouteList(routeList); } + + @Override + public void onAutopilotDockerInfo(@NonNull String dockerVersion) { + } + } diff --git a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java index bf01bbf0b5..5977e000fb 100644 --- a/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java +++ b/OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/util/SweeperAnalyticsManager.java @@ -51,13 +51,13 @@ public class SweeperAnalyticsManager { CallerLogger.INSTANCE.e( M_SWEEPER + "triggerStartAutopilotFailureEvent", failMsg ); - if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() != + if (CallerAutoPilotStatusListenerManager.INSTANCE.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_FAILURE_CODE, failCode); mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_FAILURE_MSG, failMsg); } mStartAutopilotParams.put(SweeperConst.EVENT_PARAM_START_RESULT - , CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() == + , CallerAutoPilotStatusListenerManager.INSTANCE.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING); MogoAnalyticUtils.INSTANCE.track(mStartAutopilotKey, mStartAutopilotParams); diff --git a/app/bugly/BuglySymtabLog.txt b/app/bugly/BuglySymtabLog.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/bugly/BuglyUploadLog.txt b/app/bugly/BuglyUploadLog.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/config/tempConfig.json b/app/config/tempConfig.json index 87f52a3f09..6b5b6e6a76 100644 --- a/app/config/tempConfig.json +++ b/app/config/tempConfig.json @@ -28,7 +28,71 @@ }, { "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357834634/5.m4v", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "title": "5" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676358660379/6.m4v", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "title": "6" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360154589/7.jpg", "type": 0, + "cacheImgPath": "", + "title": "7" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360185500/8.jpg", + "type": 0, + "cacheImgPath": "", + "title": "8" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360224773/9.png", + "type": 0, + "cacheImgPath": "", + "title": "9" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360274126/10.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360224773/9.png", + "title": "10" + } + ] + }, + "buspassengerochjl": { + "ads": [ + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357256102/1.jpg", + "type": 0, + "cacheImgPath": "", + "title": "1" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357382357/2.png", + "type": 0, + "cacheImgPath": "", + "title": "2" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357557335/3.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357382357/2.png", + "title": "3" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "type": 0, + "cacheImgPath": "", + "title": "4" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357834634/5.m4v", + "type": 1, "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", "title": "5" }, @@ -110,7 +174,71 @@ }, { "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357834634/5.m4v", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "title": "5" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676358660379/6.m4v", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "title": "6" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360154589/7.jpg", "type": 0, + "cacheImgPath": "", + "title": "7" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360185500/8.jpg", + "type": 0, + "cacheImgPath": "", + "title": "8" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360224773/9.png", + "type": 0, + "cacheImgPath": "", + "title": "9" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360274126/10.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360224773/9.png", + "title": "10" + } + ] + }, + "buspassengerochjl": { + "ads": [ + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357256102/1.jpg", + "type": 0, + "cacheImgPath": "", + "title": "1" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357382357/2.png", + "type": 0, + "cacheImgPath": "", + "title": "2" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357557335/3.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357382357/2.png", + "title": "3" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "type": 0, + "cacheImgPath": "", + "title": "4" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357834634/5.m4v", + "type": 1, "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", "title": "5" }, @@ -180,6 +308,22 @@ } ] }, + "buspassengerochjl": { + "ads": [ + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1681210971943/yangmadou.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1680774790614/yangmadao_photo.jpg", + "title": "1" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1681210971943/yangmadou.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1680774790614/yangmadao_photo.jpg", + "title": "2" + } + ] + }, "shuttlepassengerochm2": { "ads": [ { @@ -226,7 +370,71 @@ }, { "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357834634/5.m4v", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "title": "5" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676358660379/6.m4v", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "title": "6" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360154589/7.jpg", "type": 0, + "cacheImgPath": "", + "title": "7" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360185500/8.jpg", + "type": 0, + "cacheImgPath": "", + "title": "8" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360224773/9.png", + "type": 0, + "cacheImgPath": "", + "title": "9" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360274126/10.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676360224773/9.png", + "title": "10" + } + ] + }, + "buspassenger": { + "ads": [ + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357256102/1.jpg", + "type": 0, + "cacheImgPath": "", + "title": "1" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357382357/2.png", + "type": 0, + "cacheImgPath": "", + "title": "2" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357557335/3.mp4", + "type": 1, + "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357382357/2.png", + "title": "3" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", + "type": 0, + "cacheImgPath": "", + "title": "4" + }, + { + "path": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357834634/5.m4v", + "type": 1, "cacheImgPath": "https://img.zhidaohulian.com/fileServer/online_car_hailing/1676357598483/4.jpg", "title": "5" }, diff --git a/app/config/urlConfig.json b/app/config/urlConfig.json index 3f1a8642b2..e5c9512703 100644 --- a/app/config/urlConfig.json +++ b/app/config/urlConfig.json @@ -115,25 +115,25 @@ }, "saas": { "qa": { - "och_url": "https://och-a.zhidaozhixing.com", - "shuttle_url": "https://och-a.zhidaozhixing.com", - "passport_url": "https://och-a.zhidaozhixing.com/arch/passport/", - "socket_base_url": "https://och-a.zhidaozhixing.com/arch/push/", - "socket_tech_url": "https://och-a.zhidaozhixing.com/arch/", - "eagle_mis_url": "http://eagle-mis-a.zhidaozhixing.com/", - "eagle_dns_url": "http://eagle-dns-a.zhidaozhixing.com/", - "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=asafety&sn=%1$s", + "och_url": "https://mogogo-driver-qa.zhidaozhixing.com", + "shuttle_url": "https://mogogo-driver-qa.zhidaozhixing.com", + "passport_url": "https://mogogo-driver-qa.zhidaozhixing.com/arch/passport/", + "socket_base_url": "https://mogogo-driver-qa.zhidaozhixing.com/arch/push/", + "socket_tech_url": "https://mogogo-driver-qa.zhidaozhixing.com/arch/", + "eagle_mis_url": "https://mogogo-qa.zhidaozhixing.com/", + "eagle_dns_url": "https://mogogo-qa.zhidaozhixing.com/", + "bind_driver_qr_url": "https://och-mini-mogogo.zhidaozhixing.com?pipe=mogogosafety&sn=%1$s", "chart_socket_url":"" }, "online": { - "och_url": "https://tech.zhidaohulian.com", + "och_url": "https://mogogo-driver.zhidaozhixing.com", "shuttle_url": "https://mogogo-driver.zhidaozhixing.com", "passport_url": "https://mogogo-driver.zhidaozhixing.com/arch/passport/", "socket_base_url": "https://mogogo-driver.zhidaozhixing.com/arch/push/", "socket_tech_url": "https://mogogo-driver.zhidaozhixing.com/arch/", "eagle_mis_url": "https://mogogo.zhidaozhixing.com/", "eagle_dns_url": "https://mogogo.zhidaozhixing.com/", - "bind_driver_qr_url": "https://tech.zhidaohulian.com?pipe=asafety&sn=%1$s", + "bind_driver_qr_url": "https://och-mini-mogogo.zhidaozhixing.com?pipe=mogogosafety&sn=%1$s", "chart_socket_url":"" }, "demo": { diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index f35d8258c0..1c46d04e73 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -11,6 +11,7 @@ import com.mogo.eagle.core.utilcode.util.SharedPrefs; import com.mogo.launcher.crash.CrashSystem; import com.mogo.launcher.startup.ARouterStartUp; import com.mogo.launcher.startup.ConfigStartUp; +import com.zhjt.service.chain.TraceNodeCore; /** * @author congtaowang @@ -22,9 +23,9 @@ public class MogoApplication extends MainMoGoApplication { @Override public void onCreate() { + TraceNodeCore.Companion.getTraceNodeCore().setDebugMode(true); //todo ARouterStartUp.init(this); ConfigStartUp.init(this); - CallerStartUpManager.initStageOne(); tryEnableStrictMode(); super.onCreate(); } diff --git a/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java b/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java new file mode 100644 index 0000000000..80865299b8 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/lancet/WindowCallbackLancet.java @@ -0,0 +1,148 @@ +package com.mogo.launcher.lancet; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.Window; +import android.view.WindowManager; +import android.widget.PopupWindow; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.knightboost.lancet.api.Origin; +import com.knightboost.lancet.api.Scope; +import com.knightboost.lancet.api.This; +import com.knightboost.lancet.api.annotations.Group; +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.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider; +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; +import com.mogo.launcher.R; + +@Keep +@Weaver +@Group("window_callback") +public class WindowCallbackLancet { + + @Insert(mayCreateSuper = true) + @TargetClass(value = "androidx.appcompat.app.AppCompatActivity", scope = Scope.SELF) + @TargetMethod(methodName = "onCreate") + protected void onCreate(@Nullable Bundle savedInstanceState) { + Origin.callVoid(); + Object o = This.get(); + if (o instanceof Activity) { + Activity activity = (Activity) o; + IMoGoMoFangProvider mofang = CallerDevaToolsManager.INSTANCE.mofang(); + if (mofang != null) { + Window.Callback callback = mofang.provideWindowCallback(activity.getWindow().getCallback()); + activity.getWindow().setCallback(callback); + } + } + } + + @Insert(mayCreateSuper = true) + @TargetClass(value = "androidx.fragment.app.DialogFragment", scope = Scope.SELF) + @TargetMethod(methodName = "onCreateDialog") + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + Dialog dialog = (Dialog) Origin.call(); + IMoGoMoFangProvider mofang = CallerDevaToolsManager.INSTANCE.mofang(); + if (dialog.getWindow() != null && mofang != null) { + dialog.getWindow().setCallback(mofang.provideWindowCallback(dialog.getWindow().getCallback())); + } + return dialog; + } + + @TargetClass(value = "android.view.WindowManager",scope = Scope.SELF) + @TargetMethod(methodName = "addView") + @ReplaceInvoke + public static void proxyWindowManagerAddView(WindowManager manager, View view, ViewGroup.LayoutParams params) { + view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + private final GlobalFocusChangedListener listener = new GlobalFocusChangedListener(); + private boolean isAdd = false; + @Override + public void onViewAttachedToWindow(@NonNull View v) { + try { + v.getRootView().getViewTreeObserver().addOnGlobalFocusChangeListener(listener); + isAdd = true; + } catch (Throwable t) { + t.printStackTrace(); + } + } + @Override + public void onViewDetachedFromWindow(@NonNull View v) { + try { + if (isAdd) { + v.getRootView().getViewTreeObserver().removeOnGlobalFocusChangeListener(listener); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + }); + manager.addView(view, params); + } + + @TargetClass(value = "android.widget.PopupWindow",scope = Scope.ALL) + @TargetMethod(methodName = "setContentView") + @ReplaceInvoke + public static void proxyPopupWindowSetContentView(PopupWindow window, View view) { + view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + private final GlobalFocusChangedListener listener = new GlobalFocusChangedListener(); + private boolean isAdd = false; + @Override + public void onViewAttachedToWindow(@NonNull View v) { + try { + v.getRootView().getViewTreeObserver().addOnGlobalFocusChangeListener(listener); + isAdd = true; + } catch (Throwable t) { + t.printStackTrace(); + } + } + @Override + public void onViewDetachedFromWindow(@NonNull View v) { + try { + if (isAdd) { + v.getRootView().getViewTreeObserver().removeOnGlobalFocusChangeListener(listener); + } + } catch (Throwable t) { + t.printStackTrace(); + } + } + }); + window.setContentView(view); + } + + private static class GlobalFocusChangedListener implements ViewTreeObserver.OnGlobalFocusChangeListener { + + private Window.Callback mCallBack = null; + + @Override + public void onGlobalFocusChanged(View oldFocus, View newFocus) { + if (newFocus != null) { + Object tag = newFocus.getTag(R.id.on_key_set); + if (tag == null) { + newFocus.setTag(R.id.on_key_set, 1); + newFocus.setOnKeyListener((v, keyCode, event) -> { + if (mCallBack == null) { + IMoGoMoFangProvider mofang = CallerDevaToolsManager.INSTANCE.mofang(); + if (mofang != null) { + mCallBack = mofang.provideWindowCallback(null); + } + } + if (mCallBack != null) { + return mCallBack.dispatchKeyEvent(event); + } + return false; + }); + } + } + } + } +} diff --git a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt index 5ccbec8187..afc38df8b6 100644 --- a/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt +++ b/app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt @@ -36,6 +36,7 @@ object ConfigStartUp { AppConfigInfo.workingBranchName = BuildConfig.WORKING_BRANCH_NAME AppConfigInfo.workingBranchHash = BuildConfig.WORKING_BRANCH_HASH AppConfigInfo.appBuildTime = BuildConfig.APP_BUILD_TIME + AppConfigInfo.flavor = BuildConfig.FLAVOR // 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU FunctionBuildConfig.gpsProvider = BuildConfig.GPS_PROVIDER // 演示模式,上一次勾选的数据 @@ -132,7 +133,6 @@ object ConfigStartUp { val mapParams = MapParams.init() mapParams.setDebugMode(false) // 1-使用本地地图数据,0-使用在线地图数据 //.setDataFileSource(1) - .setDebugMode(false) .setIsRecordLogs(false) .setCoordinateType(MapParams.COORDINATETYPE_GCJ02) .setPerspectiveMode(MapParams.MAP_PERSPECTIVE_UP_CAR) diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 0000000000..fbde1ec5f4 --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 92ae14d02d..3349642047 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ buildscript { classpath "com.alibaba:arouter-register:10.0.5_mogo" classpath 'com.tencent.bugly:symtabfileuploader:2.2.1' classpath "com.bytedance.android.byteX:base-plugin:${plugin_version}" - classpath "com.mogo.cloud:hook:${plugin_version}" + classpath "com.mogo.cloud:hook:${service_chain_version}" classpath "com.mogo.cloud:bizconfig:${plugin_version}" classpath 'com.volcengine:apm_insight_plugin:1.4.2' classpath "com.mogo.thread.opt:plg:${plugin_version}" diff --git a/config.gradle b/config.gradle index f0867bb959..f237a3ad74 100644 --- a/config.gradle +++ b/config.gradle @@ -94,7 +94,7 @@ ext { // obu sdk obusdk : "com.zhidao.enterprise.smartv2x:smartv2x:1.0.0.3", - mogoobu : 'com.mogo.support.obu:mogo-obu:1.1.0', + mogoobu : 'com.mogo.support.obu:mogo-obu:1.1.1', // google googlezxing : "com.google.zxing:core:3.3.3", @@ -113,8 +113,8 @@ ext { circleimageview : "de.hdodenhof:circleimageview:3.0.1", //plugin - mogochainbase : "com.mogo.cloud:service-chain:${plugin_version}", - mogochainplugin : "com.mogo.cloud:hook:${plugin_version}", + mogochainbase : "com.mogo.cloud:service-chain:${service_chain_version}", + mogochainplugin : "com.mogo.cloud:hook:${service_chain_version}", mogoservicebiz : "com.mogo.cloud:service-biz:${plugin_version}", mogobizconfig : "com.mogo.cloud:bizconfig:${plugin_version}", @@ -214,7 +214,12 @@ ext { //========================= autosize ====================== androidautoSize : 'com.github.JessYanCoding:AndroidAutoSize:v1.2.1', - thread_opt : "com.mogo.thread.opt:lib:${plugin_version}" + thread_opt : "com.mogo.thread.opt:lib:${plugin_version}", + + weak_network : "com.mogo.weak:network:1.0.0", + + mofang_runtime : "com.mogo.eagle.core.mofang:runtime:2.0.5", + log_runtime : "com.mogo.eagle.core.log.record:runtime:1.0.6" ] android = [ launcherApplicationId : "com.mogo.launcher", @@ -225,7 +230,7 @@ ext { bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a", commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3", commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f", - compileSdkVersion : 29, + compileSdkVersion : 33, buildToolsVersion : "29.0.2", minSdkVersion : 23, targetSdkVersion : 27, 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 b8bc49e6b7..4305686ca9 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 @@ -3,7 +3,6 @@ package com.mogo.eagle.function.biz.dispatch import android.content.Context import android.os.Handler import android.os.Message -import android.util.Log import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.commons.voice.AIAssist @@ -16,12 +15,13 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoPlanningRottingListener import com.mogo.eagle.core.function.api.hmi.autopilot.IMoGoCheckAutoPilotBtnListener 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.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getState import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BIZ import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.function.biz.dispatch.network.DispatchServiceModel.Companion.DISPATCH_COMPLETED @@ -36,7 +36,7 @@ import com.zhjt.mogo.adas.data.bean.MogoReport import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg - +//todo emArrow 添加biz链路日志 //负责监听自动驾驶状态并进行状态上报,自动驾驶路线上报,接收调度指令展示指令弹窗 class DispatchAutoPilotManager private constructor() : IMogoOnMessageListener, @@ -73,10 +73,7 @@ class DispatchAutoPilotManager private constructor() : msg.obj as DispatchAdasAutoPilotLocReceiverBean CallerHmiManager.showDispatchDialog(msgData) } else if (msg.what == MSG_TYPE_UPLOAD_AUTOPILOT_STATUS) { - dispatchServiceModel.uploadAutopilotStatus( - getAutoPilotStatusInfo().state, - getAutoPilotStatusInfo().reason - ) + dispatchServiceModel.uploadAutopilotStatus(getState(), "") sendEmptyMessageDelayed(MSG_TYPE_UPLOAD_AUTOPILOT_STATUS, 1000L) } else if(msg.what == MSG_TYPE_UPLOAD_AUTOPILOT_ROTTING){ val data = msg.obj as MessagePad.GlobalPathResp @@ -119,7 +116,7 @@ class DispatchAutoPilotManager private constructor() : } override fun onMsgReceived(adasAutoPilotLocReceiverBean: DispatchAdasAutoPilotLocReceiverBean?) { - Log.i(TAG,"onMsgReceived 收到云调度长链接") + CallerLogger.i("$M_BIZ$TAG","onMsgReceived 收到云调度长链接, adasAutoPilotLocReceiver:${adasAutoPilotLocReceiverBean?:""}") if (adasAutoPilotLocReceiverBean != null && adasAutoPilotLocReceiverBean.startLat != 0.0 && adasAutoPilotLocReceiverBean.startLon != 0.0) { receiverBean = adasAutoPilotLocReceiverBean val message = Message() @@ -133,41 +130,9 @@ class DispatchAutoPilotManager private constructor() : val mAutoPilotLine = AutopilotControlParameters.AutoPilotLine(it.lineId.toLong(),it.trajUrl,it.trajMd5,it.stopUrl,it.stopMd5,it.timestamp, it.vehicleModel,it.trajUrl_dpqp,it.trajMd5_dpqp,it.stopUrl_dpqp,it.stopMd5_dpqp,it.timestamp_dpqp) CallerAutoPilotControlManager.sendTrajectoryDownloadReq(mAutoPilotLine) - Log.i(TAG,"调用路线下载逻辑") + CallerLogger.i("$M_BIZ$TAG","调用路线下载逻辑") } } - - adasAutoPilotLocReceiverBean?.let { - Log.i(TAG,"taskId="+it.taskId) - Log.i(TAG,"type="+it.type) - Log.i(TAG,"source="+it.source) - Log.i(TAG,"lineName="+it.lineName) - Log.i(TAG,"stopMd5_dpqp="+it.stopMd5_dpqp) - Log.i(TAG,"stopUrl_dpqp="+it.stopUrl_dpqp) - Log.i(TAG,"trajMd5_dpqp="+it.trajMd5_dpqp) - Log.i(TAG,"trajUrl_dpqp="+it.trajUrl_dpqp) - Log.i(TAG,"stopMd5_dpqp="+it.stopMd5_dpqp) - Log.i(TAG,"stopMd5="+it.stopMd5) - Log.i(TAG,"stopUrl="+it.stopUrl) - Log.i(TAG,"trajUrl="+it.trajUrl) - Log.i(TAG,"trajMd5="+it.trajMd5) - Log.i(TAG,"endLocAddress="+it.endLocAddress) - Log.i(TAG,"flightInfo="+it.flightInfo) - Log.i(TAG,"poiId="+it.poiId) - Log.i(TAG,"startLocAddress="+it.startLocAddress) - Log.i(TAG,"taskInfo="+it.taskInfo) - Log.i(TAG,"taskTime="+it.taskTime) - Log.i(TAG,"vehicleModel="+it.vehicleModel) - Log.i(TAG,"endLat="+it.endLat) - Log.i(TAG,"endLon="+it.endLon) - Log.i(TAG,"lineId="+it.lineId) - Log.i(TAG,"startLat="+it.startLat) - Log.i(TAG,"startLon="+it.startLon) - Log.i(TAG,"stopsList="+it.stopsList) - Log.i(TAG,"timestamp="+it.timestamp) - Log.i(TAG,"systemTime="+it.systemTime) - Log.i(TAG,"timestamp_dpqp="+it.timestamp_dpqp) - } } private fun startAutoPilot() { @@ -231,8 +196,7 @@ class DispatchAutoPilotManager private constructor() : currentAutopilot.endLatLon = AutopilotControlParameters.AutoPilotLonLat(it.endLat, it.endLon) currentAutopilot.vehicleType = 10 - CallerLogger.d(SceneConstant.Companion.M_DISPATCH + TAG, "开启自动驾驶====$currentAutopilot") - Log.i(TAG,"开启自动驾驶====$currentAutopilot") + CallerLogger.d(M_BIZ + TAG, "开启自动驾驶====$currentAutopilot") CallerAutoPilotControlManager.startAutoPilot(currentAutopilot) } } @@ -260,7 +224,7 @@ class DispatchAutoPilotManager private constructor() : onSuccess = { //取消自动驾驶 CallerAutoPilotControlManager.cancelAutoPilot() - Log.i(TAG,"stopAffirm 取消自动驾驶") + CallerLogger.i("$M_BIZ$TAG","stopAffirm 取消自动驾驶") }, onError = {}) } } @@ -330,10 +294,9 @@ class DispatchAutoPilotManager private constructor() : } CallerLogger.d( - SceneConstant.Companion.M_DISPATCH + TAG, + SceneConstant.Companion.M_BIZ + TAG, "onArriveAt data : $arrivalNotification" ) - Log.i(TAG,"onArriveAt data : $arrivalNotification") if (arrivalNotification.endLocation == null) { return } @@ -344,12 +307,11 @@ class DispatchAutoPilotManager private constructor() : receiverBean!!.endLon, receiverBean!!.endLat, endLon, endLat ) CallerLogger.d( - SceneConstant.Companion.M_DISPATCH + TAG, + SceneConstant.Companion.M_BIZ + TAG, "onArriveAt cal distance : $distanceFromSelf" ) - Log.i(TAG,"onArriveAt cal distance : $distanceFromSelf") if (distanceFromSelf < 10) { - CallerLogger.d(SceneConstant.Companion.M_DISPATCH + TAG, "onArriveAt end location") + CallerLogger.d(SceneConstant.Companion.M_BIZ + TAG, "onArriveAt end location") isDispatch = false isArriveEnd = true //到站,调度完成 @@ -371,7 +333,7 @@ class DispatchAutoPilotManager private constructor() : */ override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { if (guardianInfo == null || !guardianInfo.hasCode()) return - Log.i(TAG,"onAutopilotGuardian "+guardianInfo.code) + CallerLogger.i("$M_BIZ$TAG","onAutopilotGuardian "+guardianInfo.code) //掉自驾 when(guardianInfo.code){ MogoReport.Code.Error.EMAP.EXIT_AUTOPILOT_FOR_PLANNING, @@ -397,15 +359,15 @@ class DispatchAutoPilotManager private constructor() : } } if ("ISYS_INIT_TRAJECTORY_START".equals(guardianInfo.code)){ - Log.i(TAG,"onAutopilotGuardian ISYS_INIT_TRAJECTORY_START 轨迹管理_轨迹开始下载(本地已有对应轨迹也触发)") + CallerLogger.i("$M_BIZ$TAG","onAutopilotGuardian ISYS_INIT_TRAJECTORY_START 轨迹管理_轨迹开始下载(本地已有对应轨迹也触发)") }else if ("ISYS_INIT_TRAJECTORY_SUCCESS".equals(guardianInfo.code)){ - Log.i(TAG,"onAutopilotGuardian ISYS_INIT_TRAJECTORY_SUCCESS 轨迹管理_轨迹下载成功(本地已有对应轨迹也触发)") + CallerLogger.i("$M_BIZ$TAG","onAutopilotGuardian ISYS_INIT_TRAJECTORY_SUCCESS 轨迹管理_轨迹下载成功(本地已有对应轨迹也触发)") }else if ("ISYS_INIT_TRAJECTORY_FAILURE".equals(guardianInfo.code)){ - Log.i(TAG,"onAutopilotGuardian ISYS_INIT_TRAJECTORY_FAILURE 轨迹管理_轨迹下载失败,本地无对应轨迹") + CallerLogger.i("$M_BIZ$TAG","onAutopilotGuardian ISYS_INIT_TRAJECTORY_FAILURE 轨迹管理_轨迹下载失败,本地无对应轨迹") }else if ("ISYS_INIT_TRAJECTORY_WARNING".equals(guardianInfo.code)){ - Log.i(TAG,"onAutopilotGuardian ISYS_INIT_TRAJECTORY_WARNING 轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功") + CallerLogger.i("$M_BIZ$TAG","onAutopilotGuardian ISYS_INIT_TRAJECTORY_WARNING 轨迹管理_轨迹下载失败,本地有对应轨迹,认为成功") }else if ("ISYS_INIT_TRAJECTORY_TIMEOUT".equals(guardianInfo.code)){ - Log.i(TAG,"onAutopilotGuardian ISYS_INIT_TRAJECTORY_TIMEOUT 轨迹管理_轨迹下载超时") + CallerLogger.i("$M_BIZ$TAG","onAutopilotGuardian ISYS_INIT_TRAJECTORY_TIMEOUT 轨迹管理_轨迹下载超时") } } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/monitoring/CronTaskManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/monitoring/CronTaskManager.kt index d788a76cc0..421f97626e 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/monitoring/CronTaskManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/monitoring/CronTaskManager.kt @@ -11,7 +11,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02Lis import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MONITOR +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BIZ import com.mogo.eagle.function.biz.monitoring.net.ICameraListServices import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers @@ -48,7 +48,6 @@ class CronTaskManager { CRON_TASK_TYPE -> { removeMessages(CRON_TASK_TYPE) // 路测和车侧摄像头列表分开调用 -// requestCameraList() requestDeviceList() requestCarCameraList() sendEmptyMessageDelayed(CRON_TASK_TYPE, 10000) @@ -57,35 +56,6 @@ class CronTaskManager { } } - @Deprecated("已废弃", ReplaceWith("requestDeviceList()"), DeprecationLevel.WARNING) - private fun requestCameraList() { - // 衡阳可直播的摄像头有限,先写死roadId便于调试 - disposable = MoGoRetrofitFactory.getInstance(HostConst.CAMERA_STREAM_HOST) - .create(ICameraListServices::class.java) - .getCameraList("10849") - .subscribeOn(Schedulers.io()) - .map { cameraListInfo -> - cameraListInfo.result?.crossings?.flatMap { crossing -> - crossing.cameras.filter { camera -> - !camera.flvUrl.isNullOrEmpty() - }.map { - CameraEntity( - it.flvUrl, "", it.roadName, - it.crossingName, it.getHeadingStr(), it.ip - ) - } - } ?: ArrayList() - } - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - cameraList = it - CallerLogger.d("$M_MONITOR$TAG", "requestCameraList返回结果为:$it") - }, { - it.printStackTrace() - CallerLogger.e("$M_MONITOR$TAG", "message is:${it.message}, cause is:${it.cause}") - }) - } - /** * 请求路口一定范围内的设备信息(包含:摄像头、灯) */ @@ -110,21 +80,21 @@ class CronTaskManager { .observeOn(AndroidSchedulers.mainThread()) .subscribe({ cameraList = it -// CallerLogger.d("$M_MONITOR$TAG", "requestDeviceList返回结果为:$it") +// CallerLogger.d("$M_BIZ$TAG", "requestDeviceList返回结果为:$it") }, { it.printStackTrace() CallerLogger.e( - "$M_MONITOR$TAG", + "$M_BIZ$TAG", "requestDeviceList:message is:${it.message}, cause is:${it.cause}" ) }) }?: run { - CallerLogger.e("$M_MONITOR$TAG", "CurrentLocation is null!") + CallerLogger.e("$M_BIZ$TAG", "CurrentLocation is null!") } } private fun requestCarCameraList() { - CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02()?.let { location -> + CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().let { location -> carDisposable = MoGoRetrofitFactory.getInstance(HostConst.getEagleHost()) .create(ICameraListServices::class.java) .getCarCameraList(ReqLiveCarBean(location.longitude, location.latitude)) @@ -143,49 +113,17 @@ class CronTaskManager { .observeOn(AndroidSchedulers.mainThread()) .subscribe({ carCameraList = it -// CallerLogger.d("$M_MONITOR$TAG", "requestCarCameraList返回结果为:$it") +// CallerLogger.d("$M_BIZ$TAG", "requestCarCameraList返回结果为:$it") }, { CallerLogger.e( - "$M_MONITOR$TAG", + "$M_BIZ$TAG", "message is:${it.message}, cause is:${it.cause}" ) it.printStackTrace() }) - } ?: run { - CallerLogger.e("$M_MONITOR$TAG", "CurrentLocation is null!") } } - /** - * 开启从摄像头拉流 - */ - @Deprecated("已废弃", ReplaceWith("requestDeviceList()"), DeprecationLevel.WARNING) - fun requestOpenCamera(cameraIp: String) { - streamDisposable?.let { - if (!it.isDisposed) it.dispose() - } - streamDisposable = MoGoRetrofitFactory.getInstance(HostConst.OPEN_CAMERA_STREAM_HOST) - .create(ICameraListServices::class.java) - .openCameraStream(cameraIp) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - CallerLogger.d("$M_MONITOR$TAG", "openCameraStream返回结果为:$it") - it.result?.let { streamResult -> - if (!streamResult.flvUrl.isNullOrEmpty()) CallerHmiManager.startRoadCameraLive( - streamResult.flvUrl!! - ) - } - }, { - CallerLogger.e( - "$M_MONITOR$TAG", - "openCameraStream&message is:${it.message}, cause is:${it.cause}" - ) - CallerHmiManager.showNoSignalView() - it.printStackTrace() - }) - } - /** * 打开单个视频推流 */ @@ -199,7 +137,7 @@ class CronTaskManager { .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ - CallerLogger.d("$M_MONITOR$TAG", "reqOpenCameraStream返回结果为:$it") + CallerLogger.d("$M_BIZ$TAG", "reqOpenCameraStream返回结果为:$it") if (!it.flvUrl.isNullOrEmpty()) { CallerHmiManager.startRoadCameraLive(it.flvUrl!!) } else { @@ -207,7 +145,7 @@ class CronTaskManager { } }, { CallerLogger.e( - "$M_MONITOR$TAG", + "$M_BIZ$TAG", "reqOpenCameraStream&message is:${it.message}, cause is:${it.cause}" ) CallerHmiManager.showNoSignalView() @@ -236,7 +174,7 @@ class CronTaskManager { .observeOn(AndroidSchedulers.mainThread()) .retryWhen(RetryWithDelay()) .subscribe({ - CallerLogger.d("$M_MONITOR$TAG", "reqOpenCameraStream返回结果为:$it") + CallerLogger.d("$M_BIZ$TAG", "reqOpenCameraStream返回结果为:$it") if (it.code == 200 || it.code == 0) { val flvString = it.flvUrl if (!flvString.isNullOrEmpty()) { @@ -249,7 +187,7 @@ class CronTaskManager { } }, { CallerLogger.e( - "$M_MONITOR$TAG", + "$M_BIZ$TAG", "reqOpenCameraStream&message is:${it.message}, cause is:${it.cause}" ) error(it) diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/NoticeSocketManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/NoticeSocketManager.kt index 376e8d1e33..e40142f09c 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/NoticeSocketManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/notice/NoticeSocketManager.kt @@ -59,7 +59,7 @@ internal class NoticeSocketManager { if (obj == null) { return } - d(SceneConstant.M_NOTICE + TAG, "100-- 普通公告数据:" + GsonUtil.jsonFromObject(obj)) + d(SceneConstant.M_BIZ + TAG, "100-- 普通公告数据:" + GsonUtil.jsonFromObject(obj)) val noticeFromCloudMsg = NoticeFrCloudMsg(obj, null, 0) saveMsgBox(MsgBoxBean(MsgBoxType.NOTICE, noticeFromCloudMsg)) } @@ -78,7 +78,7 @@ internal class NoticeSocketManager { if (obj == null) { return } - d(SceneConstant.M_NOTICE + TAG, "301001-- 交警类型公告数据:" + GsonUtil.jsonFromObject(obj)) + d(SceneConstant.M_BIZ + TAG, "301001-- 交警类型公告数据:" + GsonUtil.jsonFromObject(obj)) val noticeFromCloudMsg = NoticeFrCloudMsg(null, obj, 1) saveMsgBox(MsgBoxBean(MsgBoxType.NOTICE, noticeFromCloudMsg)) } 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 eb23eb9a94..5eec21a195 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,28 +1,24 @@ package com.mogo.eagle.function.biz.v2x -import com.mogo.commons.debug.DebugConfig +import android.util.* 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.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants class V2XBizTrace { companion object { @ChainLog( - linkChainLog = ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N, - linkCode = ChainConstant.CHAIN_LINK_CLOUD, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_CLOUD_V2N, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, + nodeAliasCode = ChainConstant.CHAIN_CODE_V2X_MSG, + paramIndexes = [0, 1] ) fun onAck(data: Any, data1: Any) { - if (DebugConfig.isDebug()) { - CallerLogger.d("$M_V2X${data.toString()}", data1) - } + Log.d("V2X", "tag:$data, msg: $data1") } } } \ 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/obu/V2xObuEventManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/obu/V2xObuEventManager.kt index a16a7f3f71..afaaa4585a 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/obu/V2xObuEventManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/obu/V2xObuEventManager.kt @@ -5,7 +5,6 @@ import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.V2XMsg -import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuSaveMessageListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.call.obu.CallerObuSaveMessageListenerManager @@ -37,20 +36,19 @@ object V2xObuEventManager : IMoGoObuSaveMessageListener { * @param content 事件内容 * @param tts 事件语音播报 //30秒内同一个事件只出现一次 TODO 临时添加,后面宏宇统一在数据中心处理 */ - override fun onMoGoObuSaveMessage(type: String, content: String, tts: String, source: DataSourceType) { + override fun onMoGoObuSaveMessage(type: String, content: String, tts: String, sourceType: DataSourceType) { if (content.isNotEmpty()) { if (obuDataMap.containsKey(type)) { - var oldTime = obuDataMap[type] - var timeDiff = (System.currentTimeMillis() - oldTime!!) / 1000 - if (timeDiff < 30) { - return + val oldTime = obuDataMap[type] + oldTime?.let { + val timeDiff = (System.currentTimeMillis() - it) / 1000 + if (timeDiff < 30) { + return + } + obuDataMap.remove(type) } - obuDataMap.remove(type) - obuDataMap[type] = System.currentTimeMillis() - } else { - obuDataMap[type] = System.currentTimeMillis() } - + obuDataMap[type] = System.currentTimeMillis() CallerLogger.d("${SceneConstant.M_OBU}${TAG}", "onMoGoObuSaveMessage type = $type ---content = $content ---tts = $tts ") CallerMsgBoxManager.saveMsgBox( MsgBoxBean( @@ -61,7 +59,7 @@ object V2xObuEventManager : IMoGoObuSaveMessageListener { tts ) ).apply { - sourceType = source + this.sourceType = sourceType } ) } diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt index 1f0f568a4d..6685379ae7 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/overview/OverViewDataManager.kt @@ -85,7 +85,7 @@ object OverViewDataManager { // 1分钟查询一次 disposable = Observable.interval(2000, 60000, TimeUnit.MILLISECONDS) .flatMap { - val lineId = getLineId() + val lineId = CallerAutoPilotStatusListenerManager.getLineId() if (lineId > 0) { MoGoRetrofitFactory.getInstance(HostConst.getHost()) .create(OverViewServiceApi::class.java) @@ -119,20 +119,4 @@ object OverViewDataManager { disposable?.dispose() } - private fun getLineId(): Long { - var lineId: Long = -1 - val parameter = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo() - .autopilotControlParameters - if (parameter != null) { - if (parameter.autoPilotLine != null) { - lineId = parameter.autoPilotLine!!.lineId - CallerLogger.d(SceneConstant.M_MAP + TAG, "lineId为:$lineId") - } else { - CallerLogger.d(SceneConstant.M_MAP + TAG, "parameter.autoPilotLine为null") - } - } else { - CallerLogger.d(SceneConstant.M_MAP + TAG, "parameter为null") - } - return lineId - } } \ 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 c9e60c8cf7..40e98389fc 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 @@ -6,9 +6,9 @@ import android.util.* import androidx.annotation.* import androidx.localbroadcastmanager.content.* import com.mogo.eagle.core.data.config.* -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_CLOUD_V2N -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CLOUD_V2N +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_V2X_MSG +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.enums.* import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.EventTypeEnumNew.Companion.isRoadEvent @@ -16,17 +16,13 @@ import com.mogo.eagle.core.data.enums.WarningDirectionEnum.ALERT_WARNING_TOP import com.mogo.eagle.core.data.map.* import com.mogo.eagle.core.data.map.entity.* import com.mogo.eagle.core.data.msgbox.* -import com.mogo.eagle.core.data.traffic.* import com.mogo.eagle.core.data.v2x.* import com.mogo.eagle.core.function.api.autopilot.* import com.mogo.eagle.core.function.api.cloud.* -import com.mogo.eagle.core.function.api.hmi.warning.* -import com.mogo.eagle.core.function.api.map.angle.* import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02 import com.mogo.eagle.core.function.call.cloud.* import com.mogo.eagle.core.function.call.hmi.* -import com.mogo.eagle.core.function.call.map.* import com.mogo.eagle.core.function.call.msgbox.* import com.mogo.eagle.core.utilcode.mogo.* import com.mogo.eagle.core.utilcode.mogo.logger.* @@ -148,12 +144,10 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, * V2XEvent事件回调 */ @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CLOUD_V2N, - linkCode = CHAIN_LINK_CLOUD, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_CLOUD_V2N, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_V2X, + linkCode = CHAIN_SOURCE_CLOUD, + nodeAliasCode = CHAIN_CODE_V2X_MSG, + paramIndexes = [0] ) override fun onAck(event: V2XEvent) { Log.d("$M_V2X$TAG", "OK->: $event") @@ -185,12 +179,10 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, @RequiresApi(Build.VERSION_CODES.N) @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CLOUD_V2N, - linkCode = CHAIN_LINK_CLOUD, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_CLOUD_V2N, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_V2X, + linkCode = CHAIN_SOURCE_CLOUD, + nodeAliasCode = CHAIN_CODE_V2X_MSG, + paramIndexes = [0] ) override fun onAutopilotIdentifyPlanningObj(planningObjects: List?) { super.onAutopilotIdentifyPlanningObj(planningObjects) @@ -215,7 +207,7 @@ object V2XEventManager : IMoGoChassisLocationGCJ02Listener, IV2XCallback, return } } - CallerLogger.d("$M_V2X$TAG", "poiType : $poiType , 触发道路事件") + V2XBizTrace.onAck("$M_V2X$TAG","poiType : $poiType , 触发道路事件") CallerHmiManager.warningV2X( poiType, tts, diff --git a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt index 9fa780cba4..ffe57a4287 100644 --- a/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt +++ b/core/function-impl/mogo-core-function-biz/src/main/java/com/mogo/eagle/function/biz/v2x/v2n/V2XPoiLoader.kt @@ -11,8 +11,6 @@ import com.mogo.eagle.core.data.v2x.V2XEvent import com.mogo.eagle.core.data.v2x.V2XMarkerResponse import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager 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 import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.eagle.function.biz.v2x.v2n.network.V2XRefreshModel import com.mogo.eagle.function.biz.v2x.v2n.network.callback.IV2XCallback @@ -143,33 +141,16 @@ class V2XPoiLoader private constructor() { fun queryWholeRoadEvents() { V2XRefreshModel.roadEventDispose() val sn = MoGoAiCloudClientConfig.getInstance().sn - val lineId = getLineId() + val lineId = CallerAutoPilotStatusListenerManager.getLineId() if (lineId > 0) { realQueryV2xEvents(lineId.toString(), sn) } else { UiThreadHandler.postDelayed({ - realQueryV2xEvents(getLineId().toString(), sn) + realQueryV2xEvents(CallerAutoPilotStatusListenerManager.getLineId().toString(), sn) }, 500) } } - private fun getLineId(): Long { - var lineId: Long = -1 - val parameter = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo() - .autopilotControlParameters - if (parameter != null) { - if (parameter.autoPilotLine != null) { - lineId = parameter.autoPilotLine!!.lineId - CallerLogger.d(SceneConstant.M_V2X + TAG, "lineId为:$lineId") - } else { - CallerLogger.d(SceneConstant.M_V2X + TAG, "parameter.autoPilotLine为null") - } - } else { - CallerLogger.d(SceneConstant.M_V2X + TAG, "parameter为null") - } - return lineId - } - private fun realQueryV2xEvents(lineId: String, sn: String) { V2XRefreshModel.getRoadEvents(lineId, sn) { val size = it?.size ?: 0 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 bc3d66fdc5..1bfea7b0eb 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 @@ -76,6 +76,7 @@ internal object V2NIdentifyDrawer { 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("V2NIdentifyDrawer","绘制poi事件:$poiType") saveMsgBox(MsgBoxBean(V2X, V2XMsg(poiType, alertContent, ttsContent))) CallerHmiManager.warningV2X(poiType, alertContent, ttsContent, object : IMoGoWarningStatusListener { override fun onShow() { @@ -200,13 +201,6 @@ internal object V2NIdentifyDrawer { override fun onAutopilotIdentifyDataUpdate(trafficData: List?) { super.onAutopilotIdentifyDataUpdate(trafficData) - try { - if (trafficData != null) { - V2XBizTrace.onAck("onAutopilotIdentifyDataUpdate", trafficData) - } - } catch (t: Throwable) { - t.printStackTrace() - } val shiGong = trafficData?.filter { it.type == 501 || it.type == 502 } if (shiGong != null && shiGong.isNotEmpty()) { drawShiGong(shiGong) 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 6a7bbadd8c..861dd2d1f1 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 @@ -5,7 +5,6 @@ import android.graphics.Color import android.os.Handler import android.os.HandlerThread import android.os.Looper -import android.util.Log import android.view.animation.DecelerateInterpolator import androidx.core.util.Pair import com.mogo.eagle.core.data.map.MogoLatLng @@ -83,7 +82,6 @@ class AiRoadMarker { marker.entity?.apply { roadMarker.drawMarkers(this, wrapper) } } if (drawRoadLine) { - Log.d(TAG, "--- marker --- 1 ---") //施工中心点前方的自车行驶方向上300米距离 val l1 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo( marker.poi_lon, @@ -92,7 +90,6 @@ class AiRoadMarker { 300f ) //施工中心点后方的自车行驶方向上300米距离 - Log.d(TAG, "--- marker --- 3 --- l1:$l1") V2XBizTrace.onAck("$TAG --- marker --- 3 --- l1:", l1) val l2 = MogoMap.getInstance().mogoMap.getCenterLineRangeInfo( marker.poi_lon, @@ -101,11 +98,9 @@ class AiRoadMarker { -300f ) if (l1.points.isEmpty() || l2.points.isEmpty()) { - Log.d(TAG, " --- marker --- 3 --- return ----") V2XBizTrace.onAck("$TAG --- marker --- 3 --- return ----", "") return@post } - Log.d(TAG, " --- marker --- 4 --- l2: $l2") V2XBizTrace.onAck("$TAG --- marker --- 4 --- l2:", l2) val points = LinkedList() if (l2 != null && l2.points.isNotEmpty()) { @@ -115,7 +110,6 @@ class AiRoadMarker { } val centerX = marker.poi_lon val centerY = marker.poi_lat - Log.d(TAG, "--- marker --- 5 --- marker: $marker") V2XBizTrace.onAck("$TAG --- marker --- 5 --- marker:", marker) val farthestPoint = marker.polygon?.let { var find: Pair = Pair(centerX, centerY) @@ -136,7 +130,6 @@ class AiRoadMarker { MogoLatLng(find.second, find.first) } ?: MogoLatLng(centerY, centerX) marker.farthestPoint = Pair(farthestPoint.lon, farthestPoint.lat) - Log.d(TAG, "--- marker --- 6 --- marker:$marker") V2XBizTrace.onAck("$TAG --- marker --- 6 --- marker:", marker) if (l1 != null && l1.points.isNotEmpty()) { for (l in l1.points) { @@ -169,7 +162,6 @@ class AiRoadMarker { builder.points(points) builder.colors(colors) builder.setVisible(true) - Log.d(TAG, "--- marker --- 7 --- points:${points.size}") V2XBizTrace.onAck("$TAG --- marker --- 7 --- points:", "${points.size}") val line = overlayManager?.showOrUpdateLine(builder.build()) if (line != null) { @@ -186,10 +178,8 @@ class AiRoadMarker { private fun removeLine() { val old = line.get() - Log.d(TAG, " --- removeRedLine --- 1") V2XBizTrace.onAck("$TAG --- removeRedLine --- 1", "") if (old != null) { - Log.d(TAG,"--- removeRedLine --- 2") V2XBizTrace.onAck("$TAG --- removeRedLine --- 2", "") line.set(null) old.delegate?.remove() @@ -198,7 +188,6 @@ class AiRoadMarker { private fun unMarker(marker: Marker) { v2nDrawHandler.post { - Log.d(TAG,"$TAG --- unMarker ---") V2XBizTrace.onAck("$TAG --- unMarker ---", "") this.marker.set(null) removeLine() @@ -209,13 +198,11 @@ class AiRoadMarker { } fun receive() { - Log.d(TAG, " --- receive --- 1 ---") V2XBizTrace.onAck("$TAG --- receive --- 1 ---", "") val poi = this.marker.get() val car = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() if (poi != null) { val distance = CoordinateUtils.calculateLineDistance(car.longitude, car.latitude, poi.poi_lon, poi.poi_lat) - Log.d(TAG ," --- receive --- 2 ---car:[${car.longitude}, ${car.latitude}] -> poi:[${poi.poi_lon}, ${poi.poi_lat}] --> distance:$distance") V2XBizTrace.onAck( "$TAG --- receive --- 2 ---", "car:[${car.longitude}, ${car.latitude}] -> poi:[${poi.poi_lon}, ${poi.poi_lat}] --> distance:$distance" 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 be0d509a70..0af5af6b95 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 @@ -17,6 +17,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager 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; +import com.mogo.eagle.function.biz.v2x.V2XBizTrace; import com.mogo.eagle.function.biz.v2x.v2n.scenario.impl.AbsV2XScenario; import com.mogo.eagle.function.biz.v2x.v2n.scenario.view.IV2XMarker; import com.mogo.eagle.core.network.utils.GsonUtil; @@ -44,7 +45,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario imp @Override public void init(V2XMessageEntity v2XMessageEntity) { try { - Logger.d(TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity)); + V2XBizTrace.Companion.onAck("v2XMessageEntity",GsonUtil.jsonFromObject(v2XMessageEntity)); 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 22c130c403..8aef9cd6de 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 @@ -8,24 +8,22 @@ import android.util.Log import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult +import com.mogo.eagle.core.data.biz.trafficlight.currentRoadTrafficLight +import com.mogo.eagle.core.data.biz.trafficlight.isGreen import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VIP import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.V2XMsg -import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult -import com.mogo.eagle.core.data.biz.trafficlight.currentRoadTrafficLight -import com.mogo.eagle.core.data.biz.trafficlight.isGreen -import com.mogo.eagle.core.data.biz.trafficlight.isRed import com.mogo.eagle.core.data.v2x.VipMessage import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager -import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.function.call.v2x.CallVipSetListenerManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -49,12 +47,16 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } private var mContext: Context? = null + @Volatile private var turnLight = false + + @Volatile private var vip: Boolean = false @Volatile private var exit: Boolean = false + @Volatile private var result: TrafficLightResult? = null private val vipNetWorkModel = VipNetWorkModel() @@ -87,14 +89,14 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe @BizConfig(V2N, "", BIZ_VIP) override fun onMsgReceived(vipMessage: VipMessage?) { - CallerLogger.d("$M_V2X$TAG", "onMsgReceived vipMessage : ${vipMessage.toString()}") + V2XBizTrace.onAck("$M_V2X$TAG", "onMsgReceived vipMessage : ${vipMessage.toString()}") vipMessage?.let { when (it.vipType) { 0 -> { //取消VIP cancelVip() } 1 -> { //设置VIP - CallerLogger.d( + V2XBizTrace.onAck( "$M_V2X$TAG", "设置handler超时时间 " + ", time : ${System.currentTimeMillis() - vipMessage.timeOut}" ) @@ -110,36 +112,25 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe } if (exit) { - CallerLogger.d("$M_V2X$TAG", "驶离路口,返回 , then resetConditions") - V2XBizTrace.onAck("驶离路口","resetConditions") + V2XBizTrace.onAck("$M_V2X$TAG", "驶离路口 resetConditions") resetConditions() exit = false return } if (trafficLightResult.currentRoadTrafficLight() == null) { - CallerLogger.d( - "$M_V2X$TAG", - "vip 获取到灯态,但没找到对应车道数据 trafficLightResult : $trafficLightResult , then resetConditions" - ) + V2XBizTrace.onAck("$M_V2X$TAG", "vip获取到灯态,但没找到对应车道数据 trafficLight:$$trafficLightResult") result = null return } val currentResult = trafficLightResult.currentRoadTrafficLight() - val lastResult = result?.currentRoadTrafficLight() - CallerLogger.d( - "$M_V2X$TAG", - "检查是否变灯 last.remain : ${lastResult?.remain} , color : ${lastResult?.color} , current.remain : ${currentResult?.remain} , color : ${currentResult?.color}, turnLight : $turnLight" - ) - this.result = trafficLightResult if (!turnLight) { // 首次判断,变灯 turnLight = true val controlTime = if (currentResult!!.isGreen()) 45 - currentResult.remain else 45 - CallerLogger.d("$M_V2X$TAG", "触发变灯 , controlTime : $controlTime") turnLight(controlTime) } @@ -157,7 +148,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe MSG_WHAT_VIP_CANCEL, cancelDelayTime - System.currentTimeMillis() ) - V2XBizTrace.onAck("setVip","time:$cancelDelayTime") + V2XBizTrace.onAck("$M_V2X$TAG", "setVip time:$cancelDelayTime") CallVipSetListenerManager.invokeVipSetStatus(true) CallerTrafficLightListenerManager.addListener(TAG, this) } @@ -167,7 +158,7 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe if (handler.hasMessages(MSG_WHAT_VIP_CANCEL)) { handler.removeMessages(MSG_WHAT_VIP_CANCEL) } - V2XBizTrace.onAck("cancelVip","resetConditions") + V2XBizTrace.onAck("$M_V2X$TAG", "cancelVip resetConditions") resetConditions() CallVipSetListenerManager.invokeVipSetStatus(false) CallerTrafficLightListenerManager.removeListener(TAG) @@ -184,7 +175,6 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe cancelVip() } }, { - CallerLogger.e("$M_V2X$TAG", "获取VIP信息失败, 准备间隔5秒重新获取") handler.sendEmptyMessageDelayed(MSG_WHAT_VIP_SEARCH, 5_000L) }) } @@ -198,41 +188,39 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe private fun turnLight(controlTime: Int) { if (result == null || mContext == null) return - val mogoLocation = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84() - if (mogoLocation != null) { - val bearing = mogoLocation.heading - CallerLogger.d("$M_V2X$TAG", "-- turnLight -- ") - MogoTrafficLightManager.INSTANCE.turnLightToGreen( - result!!.lightId, result!!.crossId, bearing, controlTime, + val bearing = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().heading + V2XBizTrace.onAck("$M_V2X$TAG", "触发变灯 controlTime : $controlTime , bearing: $bearing") + MogoTrafficLightManager.INSTANCE.turnLightToGreen( + result!!.lightId, result!!.crossId, bearing, controlTime, // 100445, "10037", 90.0, controlTime, //衡阳25号路口测试数据 - { - V2XBizTrace.onAck( - TAG + "turnLight", "code:${it.code}" + - ",light:${this.result ?: ""}" + - ",lightId:${result?.lightId}" + - ",crossId:${result?.crossId}" + - ",bearing:$bearing" + - ",controlTime:$controlTime" - ) - // 请求变灯成功,直接提示 - if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { - CallerLogger.d("$M_V2X$TAG", "变灯请求成功") - val light = this.result?.currentRoadTrafficLight() - if (light != null && light.isGreen()) { - showWarning( - EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_EXTEND.poiType, - EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_EXTEND.content, - EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_EXTEND.tts - ) - } else { - showWarning( - EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_PASS.poiType, - EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_PASS.content, - EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_PASS.tts - ) - } - return@turnLightToGreen + { + V2XBizTrace.onAck( + "$M_V2X$TAG turnLight", "code:${it.code}" + + ",light:${this.result ?: ""}" + + ",lightId:${result?.lightId}" + + ",crossId:${result?.crossId}" + + ",bearing:$bearing" + + ",controlTime:$controlTime" + ) + // 请求变灯成功,直接提示 + if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) { + V2XBizTrace.onAck("$M_V2X$TAG", "变灯请求成功") + val light = this.result?.currentRoadTrafficLight() + if (light != null && light.isGreen()) { + showWarning( + EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_EXTEND.poiType, + EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_EXTEND.content, + EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_EXTEND.tts + ) + } else { + showWarning( + EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_PASS.poiType, + EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_PASS.content, + EventTypeEnumNew.TYPE_VIP_IDENTIFICATION_PASS.tts + ) } + return@turnLightToGreen + } // // 如果当前为红灯,则提示 // if (this.result!!.currentRoadTrafficLight()!!.isRed()) { @@ -257,19 +245,18 @@ class VipCarManager : IMogoOnMessageListener, IMoGoTrafficLightListe // "变灯请求失败,当前为非红灯不做展示 , light : ${result.toString()} , trafficLightControl : $it" // ) // } - }, - { errorMsg -> - CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg") - V2XBizTrace.onAck( - TAG + "turnLight", "变灯请求失败 msg:$errorMsg" + - ",lightId:${result?.lightId}" + - ",crossId:${result?.crossId}" + - ",bearing:$bearing" + - ",controlTime:$controlTime" - ) - ToastUtils.showLong("服务异常,请稍后重试") - }) - } + }, + { errorMsg -> + V2XBizTrace.onAck( + "$M_V2X$TAG turnLight", "变灯请求失败 msg:$errorMsg" + + ",loc:${CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()}" + + ",lightId:${result?.lightId}" + + ",crossId:${result?.crossId}" + + ",bearing:$bearing" + + ",controlTime:$controlTime" + ) + ToastUtils.showLong("服务异常,请稍后重试") + }) } private fun showWarning( diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index f538aa58b0..876a5a4af2 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -17,16 +17,17 @@ import com.mogo.eagle.core.data.constants.MoGoConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.badcase.BagManagerEntity import com.mogo.eagle.core.data.deva.chain.ChainConstant -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_MULTI_CONNECT -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_ADAS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_MULTI_CONNECT +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_ADAS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_AUTOPILOT import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotControlProvider import com.mogo.eagle.core.function.api.map.collect.IMoGoMapDataCollectProvider import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager import com.mogo.eagle.core.function.datacenter.autopilot.adapter.MoGoAdasListenerImpl import com.mogo.eagle.core.function.datacenter.autopilot.adapter.MoGoAdasMsgConnectStatusListenerImpl import com.mogo.eagle.core.function.datacenter.autopilot.server.AsyncDataToAutopilotServer @@ -35,7 +36,7 @@ import com.mogo.eagle.core.function.datacenter.autopilot.telematic.IMsgHandler import com.mogo.eagle.core.function.datacenter.autopilot.telematic.TeleMsgHandler 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_ADAS_IMPL +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_D_C import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.mogo.eagle.core.utilcode.util.ParseVersionUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils @@ -51,10 +52,12 @@ import com.mogo.telematic.server.netty.NettyTcpServer import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.AdasOptions import com.zhidao.support.adas.high.OnMultiDeviceListener +import com.zhidao.support.adas.high.chain.AdasChain import com.zhidao.support.adas.high.common.Constants import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS import com.zhidao.support.adas.high.common.CupidLogUtils import com.zhidao.support.adas.high.common.MessageType +import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo.adas.data.bean.MogoReport import com.zhjt.mogo.adas.data.sweeper.bootable.SweeperBootable import com.zhjt.mogo.adas.data.sweeper.task.SweeperTask @@ -62,7 +65,6 @@ import com.zhjt.mogo.adas.data.sweeper.task.SweeperTaskSuspendResume import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants import io.netty.channel.Channel import mogo.telematics.pad.MessagePad import java.util.* @@ -91,7 +93,7 @@ class MoGoAutopilotControlProvider : get() = TAG override fun init(context: Context) { - CallerLogger.i("$M_ADAS_IMPL$TAG", "初始化工控机连接……") + CallerLogger.i("$M_D_C$TAG", "初始化工控机连接……") mContext = context // 初始化ADAS 域控制器 CupidLogUtils.setEnableLog(false) @@ -142,6 +144,7 @@ class MoGoAutopilotControlProvider : } }, 1000, 10000) invokeNettyConnResult("司机端服务启动成功!") + CallerTelematicStatusListenerManager.invokeServerStatusChanged(true) } override fun onStopServer() { @@ -149,6 +152,7 @@ class MoGoAutopilotControlProvider : timer?.cancel() timer = null invokeNettyConnResult("司机端服务停止!") + CallerTelematicStatusListenerManager.invokeServerStatusChanged(false) } override fun onChannelConnect(channel: Channel?) { @@ -156,7 +160,7 @@ class MoGoAutopilotControlProvider : } override fun onChannelDisConnect(channel: Channel?) { - CallerLogger.d("$M_ADAS_IMPL$TAG", "onChannelDisConnect") + CallerLogger.d("$M_D_C$TAG", "onChannelDisConnect") } override fun onReceiveClientSign(channel: Channel?, sn: String?) { @@ -219,7 +223,7 @@ class MoGoAutopilotControlProvider : } }) CallerAutopilotCarConfigListenerManager.addListener(TAG, this) - CallerLogger.i("$M_ADAS_IMPL$TAG", "initServer……") + CallerLogger.i("$M_D_C$TAG", "initServer……") // 同步数据给工控机的服务 AsyncDataToAutopilotServer.INSTANCE.initServer() } @@ -252,7 +256,7 @@ class MoGoAutopilotControlProvider : NSDNettyManager.getInstance() .sendMsgToAllClients(MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes)) } else { - CallerLogger.d("$M_ADAS_IMPL$TAG", "司机端Server未启动!") + CallerLogger.d("$M_D_C$TAG", "司机端Server未启动!") } } @@ -310,18 +314,26 @@ class MoGoAutopilotControlProvider : override fun onMapCollectStart(cmdId: Int, cmdTime: Long) { val result = recordPackage(2, cmdId) - CallerLogger.d("$M_ADAS_IMPL$TAG", "开始记录包: [$cmdId, $result]") + CallerLogger.d("$M_D_C$TAG", "开始记录包: [$cmdId, $result]") } override fun onMapCollectEnd(cmdId: Int, cmdTime: Long) { val result = stopRecord(2, cmdId) - CallerLogger.d("$M_ADAS_IMPL$TAG", "结束记录包: [$cmdId, $result]") + CallerLogger.d("$M_D_C$TAG", "结束记录包: [$cmdId, $result]") } + + @ChainLog( + linkChainLog = AdasChain.CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = AdasChain.CHAIN_SOURCE_ADAS, + nodeAliasCode = AdasChain.CHAIN_CODE_ADAS_START_AUTOPILOT, + paramIndexes = [0] + ) override fun startAutoPilot(controlParameters: AutopilotControlParameters) { startAutoPilot(controlParameters, Constants.AUTOPILOT_SOURCE.PAD) } + //todo chainlog override fun startAutoPilotByMoFang(controlParameters: AutopilotControlParameters?) { if (controlParameters==null){ startAutoPilotWithNoParameter(Constants.AUTOPILOT_SOURCE.MO_FANG) @@ -341,7 +353,7 @@ class MoGoAutopilotControlProvider : invokeAutoPilotResult(if (invokeResult) "无参自动驾驶调用成功" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶 无参") - CallerLogger.e("$M_ADAS_IMPL$TAG", "车机与工控机链接失败,无法开启自动驾驶") + CallerLogger.e("$M_D_C$TAG", "车机与工控机链接失败,无法开启自动驾驶") } } } @@ -357,21 +369,20 @@ class MoGoAutopilotControlProvider : invokeAutoPilotResult(if (invokeResult) "自动驾驶调用成功" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶") - CallerLogger.e("$M_ADAS_IMPL$TAG", "车机与工控机链接失败,无法开启自动驾驶") + CallerLogger.e("$M_D_C$TAG", "车机与工控机链接失败,无法开启自动驾驶") } } } @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_EAGLE_START_AUTOPILOT_RESULT, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + parentNodeAliasCode = ChainConstant.CHAIN_CODE_EAGLE_START_AUTOPILOT, + nodeAliasCode = ChainConstant.CHAIN_CODE_EAGLE_START_AUTOPILOT_RESULT, + paramIndexes = [0] ) private fun invokeAutoPilotResult(status: String) { - CallerLogger.e("$M_ADAS_IMPL$TAG", status) + CallerLogger.e("$M_D_C$TAG", status) } override fun sendTrafficLightData(trafficLightResult: TrafficLightResult) { @@ -398,7 +409,7 @@ class MoGoAutopilotControlProvider : if (AdasManager.getInstance().ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.CONNECTED) { AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null) } else { - CallerLogger.e("$M_ADAS_IMPL$TAG", "车机与工控机链接失败,无法断开自动驾驶") + CallerLogger.e("$M_D_C$TAG", "车机与工控机链接失败,无法断开自动驾驶") } } @@ -492,7 +503,7 @@ class MoGoAutopilotControlProvider : ) ) } else { - CallerLogger.d("$M_ADAS_IMPL$TAG", "同步美化模式状态时司机端Server未启动!") + CallerLogger.d("$M_D_C$TAG", "同步美化模式状态时司机端Server未启动!") } } } @@ -515,7 +526,7 @@ class MoGoAutopilotControlProvider : ) ) } else { - CallerLogger.d("$M_ADAS_IMPL$TAG", "同步美化模式状态时司机端Server未启动!") + CallerLogger.d("$M_D_C$TAG", "同步美化模式状态时司机端Server未启动!") } } } @@ -553,9 +564,9 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendDetouring(isEnable: Boolean): Boolean { - return if(isEnable){ + return if (isEnable) { AdasManager.getInstance().sendDetouring(1) - }else{ + } else { AdasManager.getInstance().sendDetouring(0) } } @@ -576,31 +587,31 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendWeakNetSlowDown(isEnable: Boolean): Boolean { - return if(isEnable){ + return if (isEnable) { AdasManager.getInstance().sendWeakNetSlowDown(1) - }else{ + } else { AdasManager.getInstance().sendWeakNetSlowDown(0) } } /** * 获取全部参数 - * 结果回调{@link OnAdasListener#onGetParamResp(MessagePad.Header, MessagePad.SetParamReq)} + * 结果回调{@link OnAdasListener#onGetParamResp(MessagePad.Header, MessagePad.SetParamReq, AdasParam)} * * @return boolean */ override fun sendGetAllParamReq(): Boolean { - return AdasManager.getInstance().sendGetAllParamReq() + return AdasManager.getInstance().sendGetAllParamReq() } /** * 参数获取请求 - * 结果回调{@link OnAdasListener#onGetParamResp(MessagePad.Header, MessagePad.SetParamReq)} + * 结果回调{@link OnAdasListener#onGetParamResp(MessagePad.Header, MessagePad.SetParamReq, AdasParam)} * - * @param paramType 参数类型{@link com.zhidao.support.adas.high.common.Constants.PARAM_TYPE} + * @param paramType 参数类型:libraries/mogo-adas-data/src/main/proto/personal/adas_constants.proto * @return boolean */ - override fun sendGetParamReq(paramType: Int): Boolean { + override fun sendGetParamReq(paramType: AdasConstants.MapSystemParamType): Boolean { return AdasManager.getInstance().sendGetParamReq(paramType) } @@ -640,7 +651,7 @@ class MoGoAutopilotControlProvider : bagManager.descReq = descReq.build() // 空间使用信息,获取响应且reqType=1时有效 - for(diskSpaceInfoEntity in bagManagerEntity.spaceInfoResp){ + for (diskSpaceInfoEntity in bagManagerEntity.spaceInfoResp) { val spaceInfoResp = BagManagerOuterClass.BagSpaceInfo .newBuilder() val diskSpaceInfo = BagManagerOuterClass.SpaceInfo @@ -652,7 +663,7 @@ class MoGoAutopilotControlProvider : .build() spaceInfoResp .setHost(diskSpaceInfoEntity.host).diskSpaceInfo = diskSpaceInfo - for(entity in diskSpaceInfoEntity.BagDirsSpaceInfo){ + for (entity in diskSpaceInfoEntity.BagDirsSpaceInfo) { val bagDirsSpaceInfo = BagManagerOuterClass.SpaceInfo .newBuilder() .setDirectory(entity.directory) @@ -666,8 +677,8 @@ class MoGoAutopilotControlProvider : } // 包信息列表,获取响应且reqType=2时有效 - for(bagsInfoRespEntity in bagManagerEntity.bagsInfoResp){ - if(bagsInfoRespEntity.itemType == 0){ + for (bagsInfoRespEntity in bagManagerEntity.bagsInfoResp) { + if (bagsInfoRespEntity.itemType == 0) { // 包描述信息 val bagDescription = BagManagerOuterClass.BagDescription .newBuilder() @@ -689,7 +700,7 @@ class MoGoAutopilotControlProvider : .setDescription(bagDescription.build()) // 子包信息 - for(subBagEntity in bagsInfoRespEntity.subBags){ + for (subBagEntity in bagsInfoRespEntity.subBags) { val subBag = BagManagerOuterClass.SubBag .newBuilder() .setKey(subBagEntity.key) @@ -875,15 +886,18 @@ class MoGoAutopilotControlProvider : } msgHandler.synMsgToAllClients() } else {// 乘客屏 - CallerDevaToolsManager.getBindingCarInfo( carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn) + CallerDevaToolsManager.getBindingCarInfo( + carConfigResp.macAddress, + MoGoAiCloudClientConfig.getInstance().sn + ) invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为:${carConfigResp.macAddress}") } - if(carConfigResp.dockVersion.isNotEmpty()){ - if(carConfigResp.dockVersion.contains("taxi")){ + if (carConfigResp.dockVersion.isNotEmpty()) { + if (carConfigResp.dockVersion.toLowerCase(Locale.getDefault()).contains("taxi")) { //修改雨天模式开关默认状态为开启(仅针对taxi320及以上的版本)-sop 215 - val num = ParseVersionUtils.parseVersion(true,carConfigResp.dockVersion) - if(num >= 30200){ + val num = ParseVersionUtils.parseVersion(true, carConfigResp.dockVersion) + if (num >= 30200) { FunctionBuildConfig.isRainMode = true } } @@ -893,15 +907,13 @@ class MoGoAutopilotControlProvider : } @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = CHAIN_LINK_ADAS, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_MULTI_CONNECT, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_MULTI_CONNECT, + paramIndexes = [0] ) private fun invokeNettyConnResult(status: String) { - CallerLogger.d("$M_ADAS_IMPL$TAG", status) + CallerLogger.d("$M_D_C$TAG", status) } override fun getTeleTimeStamp(): Long { 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 2766475f6f..ca07517c0c 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 @@ -7,42 +7,35 @@ import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HdMapBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_ADAS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_ARRIVE +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_GUARDIAN +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_RECORD +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_ROUTE +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_TRAJECTORY +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_VEHICLE +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_CONFIG +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_CAR_LOC +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_ACTIONS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_P_OBJECTS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_ADAS_STATUS_QUERY_RESP +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_ADAS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_GNSS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_AUTOPILOT +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_TRAJECTORY +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_SOCKET_VEHICLE import com.mogo.eagle.core.function.call.autopilot.* -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeArriveAtStation -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeAutoPilotStatus import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeAutopilotGuardian import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeAutopilotSNRequest import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.invokeAutopilotStatusRespByQuery +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutoPilotDockerInfo +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutoPilotStatus import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotActionsListenerManager.invokeAutopilotAbility import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager.invokeAutopilotCarConfigData import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyDataUpdate import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager.invokeAutopilotIdentifyPlanningObj -import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotIdentifyListenerManager.invokeAutopilotWarnMessage import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordConfig import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager.invokeAutopilotRecordResult import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotStatisticsListenerManager.invokeAutopilotStatistics @@ -55,12 +48,11 @@ import com.mogo.eagle.core.function.call.obu.CallerObuWarningRsiListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningRsmListenerManager import com.mogo.eagle.core.function.call.obu.CallerObuWarningSpatListenerManager import com.mogo.eagle.core.function.call.v2x.* -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.support.obu.ObuScene -import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasListener -import com.zhidao.support.adas.high.bean.AdasParam +import com.zhjt.mogo.adas.data.bean.AdasParam import com.zhidao.support.adas.high.common.ProtocolStatus import com.zhjt.mogo.adas.data.bean.AutopilotStatistics import com.zhjt.mogo.adas.data.sweeper.SweeperCloudTask @@ -72,8 +64,6 @@ import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants -import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD import function_state_management.FunctionStates import mogo.telematics.pad.MessagePad import mogo.telematics.pad.MessagePad.TrackedObject @@ -87,10 +77,6 @@ import record_cache.RecordPanelOuterClass import system_master.SystemStatusInfo /** - * @author emArrow - * @since 2022/3/11 - * - * * 适配ADAS 回调监听分发,这里不做业务,只做数据包装及分发处理 */ class MoGoAdasListenerImpl : OnAdasListener { @@ -101,12 +87,10 @@ class MoGoAdasListenerImpl : OnAdasListener { //车前引导线 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAJECTORY, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_TRAJECTORY, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_TRAJECTORY, + paramIndexes = [0, 1] ) override fun onTrajectory(header: MessagePad.Header, trajectory: MessagePad.Trajectory?) { if (HdMapBuildConfig.isMapLoaded) { @@ -120,10 +104,8 @@ class MoGoAdasListenerImpl : OnAdasListener { // @ChainLog( // linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED, // linkCode = CHAIN_LINK_ADAS, -// endpoint = PAD, // nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_RECT_DATA, -// paramIndexes = [0, 1], -// clientPkFileName = "sn" +// paramIndexes = [0, 1] // ) override fun onTrackedObjects( header: MessagePad.Header, @@ -136,20 +118,17 @@ class MoGoAdasListenerImpl : OnAdasListener { //自车定位信息 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_STATE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_GNSS, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_CAR_LOC, + paramIndexes = [0, 1] ) override fun onGnssInfo(header: MessagePad.Header, gnssInfo: MessagePad.GnssInfo) { CallerChassisGnssListenerManager.invokeChassisGnssListener(gnssInfo) - if (gnssInfo != null) { if (1 == FunctionBuildConfig.gpsProvider) { // 同步更新经纬度和系统时间至 AutoPilotStatusListener - CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( + CallerAutoPilotStatusListenerManager.updateAutoPilotLocAndTime( gnssInfo.satelliteTime, gnssInfo.longitude, gnssInfo.latitude @@ -167,12 +146,10 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param vehicleState 数据 */ @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_VEHICLE, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_VEHICLE, + paramIndexes = [0, 1] ) override fun onVehicleState( header: MessagePad.Header, @@ -229,12 +206,10 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param vehicleState 数据 */ @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_VEHICLE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_VEHICLE, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_VEHICLE, + paramIndexes = [0, 1] ) override fun onChassisStates( header: MessagePad.Header, @@ -290,12 +265,10 @@ class MoGoAdasListenerImpl : OnAdasListener { //自动驾驶状态 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_STATUS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_STATUS, + paramIndexes = [0, 1] ) override fun onAutopilotState( header: MessagePad.Header, @@ -305,40 +278,17 @@ class MoGoAdasListenerImpl : OnAdasListener { //工控机模拟时间 CallerAutopilotVehicleStateListenerManager.invokeAutopilotTime(header.timestamp.toLong()) if (HdMapBuildConfig.isMapLoaded) { - // 初始化自动驾驶状态信息 - val autopilotStatusInfo = getAutoPilotStatusInfo() - autopilotStatusInfo.state = autopilotState.state - autopilotStatusInfo.pilotmode = autopilotState.autopilotMode - autopilotStatusInfo.reason = autopilotState.reason - autopilotStatusInfo.version = AdasManager.getInstance().adasVersion - if (autopilotStatusInfo.connectIP == null) { - autopilotStatusInfo.connectIP = AdasManager.getInstance().ipcConnectedIp - } - if (autopilotStatusInfo.connectPort == null) { - autopilotStatusInfo.connectPort = AdasManager.getInstance().ipcConnectedPort - } - AdasManager.getInstance().carConfig?.let { - autopilotStatusInfo.dockVersion = it.dockVersion - } - CallerLogger.d( - "Upgrade", - "origin = ${autopilotStatusInfo.connectStatus} -----now = ${AppConfigInfo.isConnectAutopilot} " - ) - AppConfigInfo.isConnectAutopilot = autopilotStatusInfo.connectStatus - AppConfigInfo.connectStatusDescribe = autopilotStatusInfo.connectStatusDescribe - invokeAutoPilotStatus() + updateAutoPilotStatus(autopilotState.state, autopilotState.autopilotMode) } } } //监控 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_GUARDIAN, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_GUARDIAN, + paramIndexes = [0, 1] ) override fun onReportMessage( header: MessagePad.Header, @@ -350,14 +300,6 @@ class MoGoAdasListenerImpl : OnAdasListener { } //感知红绿灯 - @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_TRAFFIC_LIGHT, - paramIndexes = [0, 1], - clientPkFileName = "sn" - ) override fun onPerceptionTrafficLight( header: MessagePad.Header?, trafficLights: TrafficLightOuterClass.TrafficLights? @@ -377,19 +319,21 @@ class MoGoAdasListenerImpl : OnAdasListener { //他车轨迹预测 } + //todo 新增稳定设备类型需要添加,目的避免在nuc设备上使用此类功能 + private val limit = DeviceUtils.isLenovoModel() || DeviceUtils.isEB5Model() override fun onPointCloud(header: MessagePad.Header, pointCloud: ByteArray?) { - //点云数据透传 - CallerAutopilotPointCloudListenerManager.invokeAutopilotPointCloudDataUpdate(pointCloud) + if(limit){ + //点云数据透传 + CallerAutopilotPointCloudListenerManager.invokeAutopilotPointCloudDataUpdate(pointCloud) + } } //planning障碍物 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_OBJECTS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_P_OBJECTS, + paramIndexes = [0, 1] ) override fun onPlanningObjects( header: MessagePad.Header?, @@ -410,18 +354,17 @@ class MoGoAdasListenerImpl : OnAdasListener { //工控机基础配置信息 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_CAR_CONFIG, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_CAR_CONFIG, + paramIndexes = [0, 1] ) override fun onCarConfigResp( header: MessagePad.Header, carConfigResp: MessagePad.CarConfigResp? ) { if (carConfigResp != null) { + updateAutoPilotDockerInfo(carConfigResp.dockVersion) AppConfigInfo.dockerVersion = carConfigResp.dockVersion AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号 AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址 @@ -433,12 +376,10 @@ class MoGoAdasListenerImpl : OnAdasListener { //全局路径规划 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ROUTE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_ROUTE, + paramIndexes = [0, 1] ) override fun onGlobalPathResp( header: MessagePad.Header, @@ -449,12 +390,10 @@ class MoGoAdasListenerImpl : OnAdasListener { //数据采集,badCase @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_RECORD, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_RECORD, + paramIndexes = [0, 1] ) override fun onRecordResult( header: MessagePad.Header, @@ -465,27 +404,15 @@ class MoGoAdasListenerImpl : OnAdasListener { } } - //预警信息 -// @ChainLog( -// linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, -// linkCode = CHAIN_LINK_ADAS, -// endpoint = PAD, -// nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_WARN, -// paramIndexes = [0, 1], -// clientPkFileName = "sn" -// ) override fun onWarn(header: MessagePad.Header, warn: MessagePad.Warn?) { - invokeAutopilotWarnMessage(warn) } //到站回调 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_ARRIVE, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_ARRIVE, + paramIndexes = [0, 1] ) override fun onArrivalNotification( header: MessagePad.Header, @@ -496,12 +423,10 @@ class MoGoAdasListenerImpl : OnAdasListener { //状态查询应答 @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_STATUS_QUERY_RESP, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_STATUS_QUERY_RESP, + paramIndexes = [0, 1] ) override fun onStatusQueryResp( header: MessagePad.Header?, @@ -526,12 +451,10 @@ class MoGoAdasListenerImpl : OnAdasListener { * planning决策状态, 透传 */ @ChainLog( - linkChainLog = CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS, - linkCode = CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_ADAS_MESSAGE_PLANNING_ACTIONS, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_P_ACTIONS, + paramIndexes = [0, 1] ) override fun onPlanningActionMsg( header: MessagePad.Header?, @@ -620,7 +543,10 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param header 头 * @param roboSweeperTaskIndex 数据 */ - override fun onSweeperTaskIndexData(header: MessagePad.Header?, roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex?) { + override fun onSweeperTaskIndexData( + header: MessagePad.Header?, + roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex? + ) { roboSweeperTaskIndex?.let { //清扫车(福田)清扫控制系统状态 CallerSweeperFutianCleanSystemListenerManager.invokeSweeperFutianCleanTaskIndexData(it) @@ -752,12 +678,10 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param rsi 数据 */ @ChainLog( - linkChainLog = ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N, - linkCode = ChainConstant.CHAIN_LINK_CLOUD, - endpoint = PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_CLOUD_V2N, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, + nodeAliasCode = ChainConstant.CHAIN_CODE_V2X_MSG, + paramIndexes = [0, 1] ) override fun onV2nCongestionEvent(header: MessagePad.Header, rsi: MogoV2X.RSI_PB) { CallerAutopilotIdentifyListenerManager.invokeAutopilotV2nCongestionEvent(header, rsi) @@ -774,15 +698,26 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param parkingViolation 违停 ---包含 静态障碍车 */ @ChainLog( - linkChainLog = ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N, - linkCode = ChainConstant.CHAIN_LINK_CLOUD, - endpoint = PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_CLOUD_V2N, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = ChainConstant.CHAIN_TYPE_V2X, + linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, + nodeAliasCode = ChainConstant.CHAIN_CODE_V2X_MSG, + paramIndexes = [0] ) - override fun onV2nGlobalPathEvents(header: MessagePad.Header, roadOverview: RoadOverviewEvents.RoadOverviewData, construct: MogoV2X.RSI_PB?, triangle: MogoV2X.RSI_PB?, congestion: MogoV2X.RSI_PB?, parkingViolation: MogoV2X.RSM_PB?) { - CallerV2XListenerManager.dispatchV2nGlobalPathEvents(roadOverview.eventCount, construct, triangle, congestion, parkingViolation) + override fun onV2nGlobalPathEvents( + header: MessagePad.Header, + roadOverview: RoadOverviewEvents.RoadOverviewData, + construct: MogoV2X.RSI_PB?, + triangle: MogoV2X.RSI_PB?, + congestion: MogoV2X.RSI_PB?, + parkingViolation: MogoV2X.RSM_PB? + ) { + CallerV2XListenerManager.dispatchV2nGlobalPathEvents( + roadOverview.eventCount, + construct, + triangle, + congestion, + parkingViolation + ) } /** @@ -796,6 +731,7 @@ class MoGoAdasListenerImpl : OnAdasListener { * @param adasParam 解析后的配置参数 */ override fun onGetParamResp(header: MessagePad.Header, getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) { + CallerAutopilotGetParamResponseDispatcher.dispatchResponse(header, getParamResp, adasParam) } /** diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index f77595e303..f23ba9dc35 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.datacenter.autopilot.adapter import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.debug.DebugConfig.* +import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.cloud.IMoGoCloudListener @@ -10,7 +11,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager 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_ADAS_IMPL +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_D_C import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhidao.support.adas.high.AdasManager import com.zhidao.support.adas.high.OnAdasConnectStatusListener @@ -24,11 +25,11 @@ import com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.PASSENGER * ADAS-SDK与工控机连接状态回调 */ class MoGoAdasMsgConnectStatusListenerImpl : - OnAdasConnectStatusListener, - IMoGoAutopilotStatusListener, - IMoGoCloudListener { + OnAdasConnectStatusListener, + IMoGoAutopilotStatusListener, + IMoGoCloudListener { - companion object{ + companion object { private const val TAG = "ConnectStatus" } @@ -40,53 +41,63 @@ class MoGoAdasMsgConnectStatusListenerImpl : override fun onConnectionIPCStatus(ipcConnectionStatus: Int, reason: String?) { CallerAutoPilotStatusListenerManager.invokeAutoPilotIPCStatusChanged( - ipcConnectionStatus, - reason + ipcConnectionStatus, + reason ) - if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.CONNECTED) { - CallerLogger.d("$M_ADAS_IMPL$TAG", "webSocket 连接成功") - connectStatus = true - // 初始化自动驾驶状态信息 - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectIP = + AppConfigInfo.connectStatusDescribe = reason + when (ipcConnectionStatus) { + Constants.IPC_CONNECTION_STATUS.CONNECTED -> { + CallerLogger.d("$M_D_C$TAG", "webSocket 连接成功") + connectStatus = true + // 初始化自动驾驶状态信息 + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectIP = AdasManager.getInstance().ipcConnectedIp - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectPort = + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectPort = AdasManager.getInstance().ipcConnectedPort - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = true - // 同步SN给工控机 - syncBasicInfoToAutopilot() - //每次工控机连接成功后,需同步当前设置的美化模式状态 - CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) - //当连接状态是关闭美化模式时,同步给工控机 - if (!FunctionBuildConfig.isDemoMode) { - CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode) - } - //每次工控机连接成功后,需同步当前设置的雨天模式状态 - CallerAutoPilotControlManager.setRainMode(FunctionBuildConfig.isRainMode) - } else if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { - CallerLogger.d("$M_ADAS_IMPL$TAG", "webSocket 连接失败 reason:$reason") - if (connectStatus) { - reason?.let { - ToastUtils.showLong("工控机连接断开,原因:$it , 等待重连") + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().version = + AdasManager.getInstance().adasVersion + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = true + AppConfigInfo.isConnectAutopilot = true + // 同步SN给工控机 + syncBasicInfoToAutopilot() + //每次工控机连接成功后,需同步当前设置的美化模式状态 + CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) + //当连接状态是关闭美化模式时,同步给工控机 + if (!FunctionBuildConfig.isDemoMode) { + CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode) } - connectStatus = false + //每次工控机连接成功后,需同步当前设置的雨天模式状态 + CallerAutoPilotControlManager.setRainMode(FunctionBuildConfig.isRainMode) } - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectIP = + Constants.IPC_CONNECTION_STATUS.DISCONNECTED -> { + CallerLogger.d("$M_D_C$TAG", "webSocket 连接失败 reason:$reason") + if (connectStatus) { + reason?.let { + ToastUtils.showLong("工控机连接断开,原因:$it , 等待重连") + } + connectStatus = false + } + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectIP = AdasManager.getInstance().ipcConnectedIp - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectPort = + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectPort = AdasManager.getInstance().ipcConnectedPort - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = false - //与工控机断开连接,需要重置自动驾驶状态(包括上传至云平台缓存信息),等待连接成功后同步状态信息 - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state = 0 - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().pilotmode = 0 - } else if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.CONNECTING) { - CallerLogger.d("$M_ADAS_IMPL$TAG", "webSocket 正在连接") - } else if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.SEARCH_ADDRESS) { - CallerLogger.d("$M_ADAS_IMPL$TAG", "webSocket 正在搜索工控机IP") - } else if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.NOT_FOUND_ADDRESS) { - CallerLogger.d("$M_ADAS_IMPL$TAG", "webSocket 找不到可用IP 传入的IP不可用或固定IP列表中所有IP不可用") + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatus = false + AppConfigInfo.isConnectAutopilot = false + //与工控机断开连接,需要重置自动驾驶状态(包括上传至云平台缓存信息),等待连接成功后同步状态信息 + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().state = 0 + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().pilotmode = 0 + } + Constants.IPC_CONNECTION_STATUS.CONNECTING -> { + CallerLogger.d("$M_D_C$TAG", "webSocket 正在连接") + } + Constants.IPC_CONNECTION_STATUS.SEARCH_ADDRESS -> { + CallerLogger.d("$M_D_C$TAG", "webSocket 正在搜索工控机IP") + } + Constants.IPC_CONNECTION_STATUS.NOT_FOUND_ADDRESS -> { + CallerLogger.d("$M_D_C$TAG", "webSocket 找不到可用IP 传入的IP不可用或固定IP列表中所有IP不可用") + } } - CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().ipcConnStatus = - ipcConnectionStatus + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().ipcConnStatus = ipcConnectionStatus CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatusDescribe = reason CallerAutoPilotStatusListenerManager.invokeAutoPilotStatus() } @@ -105,24 +116,24 @@ class MoGoAdasMsgConnectStatusListenerImpl : /** * 同步SN信息给工控机 */ - private fun syncBasicInfoToAutopilot(sn: String? = null) { - CallerLogger.d("$M_ADAS_IMPL$TAG", "同步PAD的SN给工控机……") + private fun syncBasicInfoToAutopilot() { + CallerLogger.d("$M_D_C$TAG", "同步PAD的SN给工控机……") if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { // 设置PAD-SN给工控,网络环境 AdasManager.getInstance() - .sendBasicInfoResp( - MoGoAiCloudClientConfig.getInstance().sn, - getEnvironment(), - getTerminalRole() - ) + .sendBasicInfoResp( + MoGoAiCloudClientConfig.getInstance().sn, + getEnvironment(), + getTerminalRole() + ) } else { // 乘客屏先不传sn AdasManager.getInstance() - .sendBasicInfoResp( - "", - getEnvironment(), - getTerminalRole() - ) + .sendBasicInfoResp( + "", + getEnvironment(), + getTerminalRole() + ) } } @@ -145,7 +156,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : } override fun tokenGot(token: String, sn: String) { - syncBasicInfoToAutopilot(sn) + syncBasicInfoToAutopilot() } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/server/AsyncDataToAutopilotServer.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/server/AsyncDataToAutopilotServer.kt index e982acba0f..97815c2539 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/server/AsyncDataToAutopilotServer.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/server/AsyncDataToAutopilotServer.kt @@ -1,7 +1,5 @@ package com.mogo.eagle.core.function.datacenter.autopilot.server -import android.annotation.SuppressLint -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener @@ -13,12 +11,10 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.zhidao.support.adas.high.AdasManager import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger /** * @author xiaoyuzhou @@ -37,7 +33,6 @@ class AsyncDataToAutopilotServer private constructor() : IMoGoTrafficLightListen } } - private var mPreAutoStatus = AtomicInteger(-1) private var createSubscribe: Disposable? = null fun initServer() { @@ -45,30 +40,24 @@ class AsyncDataToAutopilotServer private constructor() : IMoGoTrafficLightListen CallerTrafficLightListenerManager.addListener(TAG, this) } - @SuppressLint("CheckResult") - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - super.onAutopilotStatusResponse(autoPilotStatusInfo) - val state = autoPilotStatusInfo.state - if (mPreAutoStatus.get() != state) { - mPreAutoStatus.set(state) - createSubscribe?.let { - if (!it.isDisposed) { - bizLog(SceneConstant.M_ADAS_IMPL + TAG, "自动驾驶状态变化,取消前置轨迹请求,间隔2s重新请求底盘轨迹") - createSubscribe?.dispose() - } + override fun onAutopilotStatusResponse(state: Int) { + bizLog(SceneConstant.M_D_C + TAG, "自动驾驶状态变化:$state") + createSubscribe?.let { + if (!it.isDisposed) { + bizLog(SceneConstant.M_D_C + TAG, "自动驾驶状态变化,取消前置轨迹请求,间隔2s重新请求底盘轨迹") + createSubscribe?.dispose() } - - when (state) { - IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { - createSubscribe = Observable.timer(2000L, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - bizLog(SceneConstant.M_ADAS_IMPL + TAG, "请求底盘轨迹") - CallerAutoPilotControlManager.getGlobalPath() - } - } - else -> {} + } + when (state) { + IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING -> { + createSubscribe = Observable.timer(2000L, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + bizLog(SceneConstant.M_D_C + TAG, "请求底盘轨迹") + CallerAutoPilotControlManager.getGlobalPath() + } } + else -> {} } } @@ -82,12 +71,10 @@ class AsyncDataToAutopilotServer private constructor() : IMoGoTrafficLightListen } @ChainLog( - linkChainLog = ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT, - linkCode = ChainConstant.CHAIN_LINK_ADAS, - endpoint = PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_ADAS_MESSAGE_AUTOPILOT_BIZ, - paramIndexes = [0, 1], - clientPkFileName = "sn" + linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_ROUTE_REQ, + paramIndexes = [0, 1] ) private fun bizLog(tag: String, msg: String) { CallerLogger.d(tag, msg) diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt index a55a2e7795..1b55e0fd3a 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt @@ -9,7 +9,7 @@ import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.setDemoMode @@ -28,7 +28,6 @@ import com.mogo.telematic.client.NettyTcpClient import com.mogo.telematic.client.status.ConnectState import com.zhidao.support.adas.high.AdasManager import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants import io.netty.channel.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -66,10 +65,7 @@ class TeleMsgHandler : IMsgHandler { AdasManager.getInstance().decoderRaw(it.body) } catch (e: Exception) { e.printStackTrace() - CallerLogger.e( - "${SceneConstant.M_ADAS_IMPL}$TAG", - "乘客屏解析数据过程中出现异常:${e.message}" - ) + invokeNettyConnResult("乘客屏解析数据过程中出现异常:${e.message}") } } MogoProtocolMsg.SYNC_MODE_STATUS -> { @@ -145,11 +141,6 @@ class TeleMsgHandler : IMsgHandler { CallerTrafficLightListenerManager.invokeEnterCrossRoad(false) } } - TelematicConstant.OPEN_ROMA_STATUS -> { - ThreadUtils.runOnUiThread { - CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.OPEN_ROMA_STATUS,it.body) - } - } TelematicConstant.CONTROL_PASSENGER_DRIVER_MONITOR -> { ThreadUtils.runOnUiThread { CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.CONTROL_PASSENGER_DRIVER_MONITOR,it.body) @@ -224,11 +215,6 @@ class TeleMsgHandler : IMsgHandler { TelematicConstant.BUSINESS_STRING -> { CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.BUSINESS_STRING, it.body) } - TelematicConstant.OPEN_ROMA_STATUS -> { - ThreadUtils.runOnUiThread { - CallerTelematicListenerManager.invokeReceivedMsg(TelematicConstant.OPEN_ROMA_STATUS,it.body) - } - } else -> { } } @@ -242,7 +228,7 @@ class TeleMsgHandler : IMsgHandler { override fun handleClientConn2Server(channel: Channel?) { val socketAddress = channel?.remoteAddress().toString() - CallerLogger.d("${SceneConstant.M_ADAS_IMPL}$TAG", "Client ip is:${socketAddress}") + CallerLogger.d("${SceneConstant.M_D_C}$TAG", "Client ip is:${socketAddress}") setDemoMode(FunctionBuildConfig.isDemoMode) setIgnoreConditionDraw(FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData) } @@ -294,15 +280,13 @@ class TeleMsgHandler : IMsgHandler { override fun handleServerConnStatus(statusCode: Int, content: String?, channel: Channel) {} @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = ChainConstant.CHAIN_LINK_ADAS, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_MULTI_CONNECT, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_MULTI_CONNECT, + paramIndexes = [0] ) private fun invokeNettyConnResult(status: String) { - CallerLogger.d("${SceneConstant.M_ADAS_IMPL}$TAG", status) + CallerLogger.d("${SceneConstant.M_D_C}$TAG", status) } /** diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt index 422fe23fb5..31160ae060 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/location/MoGoLocationDispatcher.kt @@ -79,7 +79,6 @@ object MoGoLocationDispatcher : lastGnssLocation.errorCode = it.errorCode lastGnssLocation.errorInfo = it.errorInfo } - //FileUtils.writeToFile("/sdcard/Download/", "location_wgs84.txt", "${gnssInfo.longitude},${gnssInfo.latitude}\n") if (1 == FunctionBuildConfig.gpsProvider) { // WGS84坐标系高精度位置信息 CallerChassisLocationWGS84ListenerManager.invokeChassisLocationWGS84( @@ -102,7 +101,6 @@ object MoGoLocationDispatcher : override fun onMoGoLocationChanged(mogoLocation: MogoLocation) { // 更新GaoDe 信息 lastGaoDeLocation = mogoLocation - // 计算最后一次工控机同步的定位是否超时,如果超时则切换为高德地图定位,暂定超过30秒需要切换 if (1 == FunctionBuildConfig.gpsProvider) { if (TimeUtils.getNowMills() - lastGnssLocation.lastReceiveTime > 10000) { diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt index 7b4f7e6b00..62be1f6cb6 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoObuDcCombineManager.kt @@ -129,18 +129,31 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } alertContent = EventTypeEnumNew.getWarningContent(appId) ttsContent = EventTypeEnumNew.getWarningTts(appId) - alertContent = String.format( //事件才有影响范围 - alertContent, - Math.round(rsiWarningData.warningMsgList[0].distance).toString(), - Math.round(rsiWarningData.warningMsgList[0].eventRadius).toString() - ) - ttsContent = String.format( - ttsContent, - ConvertUtils.intToChinese( - rsiWarningData.warningMsgList[0].distance.roundToInt()), - ConvertUtils.intToChinese( - rsiWarningData.warningMsgList[0].eventRadius.roundToInt()) - ) + //他车超速行驶 + if(EventTypeEnumNew.TYPE_USECASE_ID_SLW.poiType == appId){ + //同向正后方、同向邻道左后方、同向邻道右后方 提示他车超速行驶 + if(rsiWarningData.warningMsgList[0].targetPosition == MogoObuShowConstants.VEH_TARGET_POSITION.BEHEAD_IN_LANE + || rsiWarningData.warningMsgList[0].targetPosition == MogoObuShowConstants.VEH_TARGET_POSITION.BEHEAD_LEFT + || rsiWarningData.warningMsgList[0].targetPosition == MogoObuShowConstants.VEH_TARGET_POSITION.BEHEAD_RIGHT){ + alertContent = String.format(alertContent, direction.desc) + ttsContent = String.format(ttsContent, direction.desc) + }else{ + return + } + }else{ + alertContent = String.format( //事件才有影响范围 + alertContent, + Math.round(rsiWarningData.warningMsgList[0].distance).toString(), + Math.round(rsiWarningData.warningMsgList[0].eventRadius).toString() + ) + ttsContent = String.format( + ttsContent, + ConvertUtils.intToChinese( + rsiWarningData.warningMsgList[0].distance.roundToInt()), + ConvertUtils.intToChinese( + rsiWarningData.warningMsgList[0].eventRadius.roundToInt()) + ) + } } //车内标牌 @@ -290,6 +303,10 @@ class MogoObuDcCombineManager private constructor() : IMoGoObuWarningRsiListener } MogoObuShowConstants.STATUS.UPDATE -> { // 更新 + if(EventTypeEnumNew.TYPE_USECASE_ID_SLW.poiType == appId){ + saveObuToDcData(appId, alertContent, ttsContent) + showWarning(appId, alertContent, ttsContent, direction) + } } // 删除 diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt index 0f146c3a9f..5029e4e954 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/obu/MogoPrivateObuNewManager.kt @@ -1,7 +1,6 @@ package com.mogo.eagle.core.function.datacenter.obu import android.content.Context -import android.util.Log import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig @@ -116,7 +115,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } fun setHvInfoSendCycle(time: Int) { - ObuManager.getInstance().setHvInfoPushCycle(time); + ObuManager.getInstance().setHvInfoPushCycle(time) } /** @@ -137,8 +136,8 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { */ fun deleteObuFile() { UiThreadHandler.post { - var isDeleteSuccess = FileUtils.delete(Config.downLoadObuPath) - var isDeleteUnzipSuccess = FileUtils.delete(Config.downLoadUnzipObuPath) + val isDeleteSuccess = FileUtils.delete(Config.downLoadObuPath) + val isDeleteUnzipSuccess = FileUtils.delete(Config.downLoadUnzipObuPath) CallerLogger.d( "$M_OBU${MogoObuConst.TAG_UPGRADE_OBU}", "deleteObuFile isDeleteSuccess = $isDeleteSuccess ----isDeleteUnzipSuccess = $isDeleteUnzipSuccess" @@ -155,11 +154,11 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { /** * 传递obu升级包给硬件 - * @param upgradePackage 升级包文件绝对路径 只能包含 升级包MD5文件和升级包文件 - * @param isUpgradeNow 是否立即升级 + * upgradePackage 升级包文件绝对路径 只能包含 升级包MD5文件和升级包文件 + * isUpgradeNow 是否立即升级 * false:OBU设备下次上电时执行升级程序 * ture: OBU设备立即执行升级程序 TODO 警告:执行立即升级时请确保车辆是静止状态。车辆在运行过程中升级设备可能会影响驾驶,严重时可能造成安全隐患!!! - * @param listener 升级回调 + * listener 升级回调 * @return 是否调用成功 */ fun uploadObuPack(filePathArray: Array) { @@ -232,8 +231,11 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } override fun onObuCallResult(result: BaseResult?) { + if(result == null){ + return + } val builder = StringBuilder("调用结果:\n") - when (result!!.function) { + when (result.function) { MogoObuConstants.CALL_FUNCTION.CONFIG -> { val configResult = result as MogoObuCallConfigResult builder.append(configResult.type.desc).append("配置调用= ") @@ -280,16 +282,12 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { */ override fun onGnssInfo(gnssInfo: MessagePad.GnssInfo?) { if (gnssInfo != null) { - CallerLogger.d( - "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "onGnssInfo lon = ${gnssInfo.longitude} --- lat = ${gnssInfo.latitude} ---speed = ${gnssInfo.gnssSpeed} ---heading = ${gnssInfo.heading} --acceleration = ${gnssInfo.acceleration} --yawRate = ${gnssInfo.yawRate}" - ) // 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU if (2 == FunctionBuildConfig.gpsProvider) { // 同步给MAP地图 CallerObuLocationWGS84ListenerManager.invokeObuLocationWGS84(gnssInfo) // 同步更新经纬度和系统时间至 AutoPilotStatusListener - CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon( + CallerAutoPilotStatusListenerManager.updateAutoPilotLocAndTime( System.currentTimeMillis() / 1000.0, gnssInfo.longitude, gnssInfo.latitude @@ -396,6 +394,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { // } MogoObuShowConstants.RTE.RTI_TYPE_SPEEDING -> { //超速行驶 appId = EventTypeEnumNew.TYPE_USECASE_ID_SLW.poiType + } MogoObuShowConstants.RTE.RTI_TYPE_RETRIGRADE -> { //车辆逆行 appId = @@ -404,18 +403,31 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } alertContent = EventTypeEnumNew.getWarningContent(appId) ttsContent = EventTypeEnumNew.getWarningTts(appId) - alertContent = String.format( //事件才有影响范围 - alertContent, - Math.round(data.warningMsgList[0].distance).toString(), - Math.round(data.warningMsgList[0].eventRadius).toString() - ) - ttsContent = String.format( - ttsContent, - ConvertUtils.intToChinese( - data.warningMsgList[0].distance.roundToInt()), - ConvertUtils.intToChinese( - data.warningMsgList[0].eventRadius.roundToInt()) - ) + //他车超速行驶 + if(EventTypeEnumNew.TYPE_USECASE_ID_SLW.poiType == appId){ + //同向正后方、同向邻道左后方、同向邻道右后方 提示他车超速行驶 + if(data.warningMsgList[0].targetPosition == MogoObuShowConstants.VEH_TARGET_POSITION.BEHEAD_IN_LANE + || data.warningMsgList[0].targetPosition == MogoObuShowConstants.VEH_TARGET_POSITION.BEHEAD_LEFT + || data.warningMsgList[0].targetPosition == MogoObuShowConstants.VEH_TARGET_POSITION.BEHEAD_RIGHT){ + alertContent = String.format(alertContent, direction.desc) + ttsContent = String.format(ttsContent, direction.desc) + }else{ + return + } + }else{ + alertContent = String.format( //事件才有影响范围 + alertContent, + Math.round(data.warningMsgList[0].distance).toString(), + Math.round(data.warningMsgList[0].eventRadius).toString() + ) + ttsContent = String.format( + ttsContent, + ConvertUtils.intToChinese( + data.warningMsgList[0].distance.roundToInt()), + ConvertUtils.intToChinese( + data.warningMsgList[0].eventRadius.roundToInt()) + ) + } } //车内标牌 @@ -583,6 +595,10 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } MogoObuShowConstants.STATUS.UPDATE -> { // 更新 + if(EventTypeEnumNew.TYPE_USECASE_ID_SLW.poiType == appId){ + saveObuData(appId, alertContent, ttsContent) + showWarning(appId, alertContent, ttsContent, direction) + } } MogoObuShowConstants.STATUS.DELETE -> { // 删除 @@ -615,13 +631,13 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { ) { CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", - "onMogoObuRsmWarning ------> ${data.toString()}" + "onMogoObuRsmWarning ------> ${data?.toString()}" ) if (HmiBuildConfig.isShowObuV2iView) { if (HmiBuildConfig.isShowObuWeaknessTrafficView) { // 交通参与者类型 0x0:未知 UNKNOWN | 1机动车 2:非机动车 NON_MOTOR | 3:行人 PEDESTRIAN 4:obu if (data != null && data.participant != null) { - var v2xType = when (data.participant.ptcType) { + val v2xType = when (data.participant.ptcType) { 1 -> { //机动车 EventTypeEnumNew.TYPE_USECASE_ID_VRUCW_MOTOR_VEHICLES.poiType } @@ -637,7 +653,6 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } val ttsContent = EventTypeEnumNew.getWarningTts(v2xType) val alertContent = EventTypeEnumNew.getWarningContent(v2xType) - var level = -1 val direction = getMessageDirection(data.participant.targetPosition) CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", @@ -645,10 +660,9 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { ) when (data.status) { MogoObuShowConstants.STATUS.ADD -> { // 添加 - // 更新数据,模型变色的时候是不是update,如果不是更新,可能导致模型不变色,(add的时候,是否有level高的) TODO + // 更新数据,模型变色的时候是不是update,如果不是更新,可能导致模型不变色,(add的时候,是否有level高的) TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data) ?.let { - TrafficMarkerDrawer.updateITrafficThreatLevelInfo(it) } } @@ -657,7 +671,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { } MogoObuShowConstants.STATUS.DELETE -> { // 删除 - // 更新数据 TODO 删除原来的,改变颜色,删除marker。不影响别的模型添加 + // 更新数据 删除原来的,改变颜色,删除marker。不影响别的模型添加 TrafficDataConvertUtilsNew.cvxPtcThreatIndInfo2TrafficData(data) ?.let { // 事件结束,还原交通参与者颜色 @@ -672,7 +686,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { //预警status if (data.warningMsg != null && data.warningMsg.warningDataList != null && data.warningMsg.warningDataList.size > 0) { - level = data.warningMsg.warningDataList[0].warningLevel //默认是1个 + val level = data.warningMsg.warningDataList[0].warningLevel //默认是1个 CallerLogger.d( "$M_OBU${MogoObuConst.TAG_MOGO_NEW_OBU}", "onMogoObuRsmWarning ---status---> ${data.status} ---data.warningMsg.warningData[0].status = ${data.warningMsg.warningDataList[0].status} ---v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent ---level = $level" @@ -775,7 +789,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { /** * 构造对应展示数据和场景 根据obu的场景,add change delete确定是否展示 * @param appId 使用WarningTypeEnum获取icon、提示内容、tts内容 - * @see com.mogo.module.common.enums.EventTypeEnumNew + * @see com.mogo.eagle.core.data.enums.EventTypeEnumNew * EventTypeEnumNew在定义的id为了防止重复,和原始数据是不一样的,有对应关系 */ private fun handleSdkObu( @@ -990,7 +1004,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { // 添加 MogoObuShowConstants.STATUS.ADD, MogoObuShowConstants.STATUS.UPDATE -> { - if (lights != null && lights.isNotEmpty()) { + if (lights.isNotEmpty()) { changeTrafficLightStatus(appId, lights) } } @@ -1057,8 +1071,8 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { if (HmiBuildConfig.isShowGreenWaveView) { if (!isShowGreenWave) { isShowGreenWave = true - var minSpeedTemp = Math.round(currentLight.suggestMinSpeed * 3.6) - var maxSpeedTemp = Math.round(currentLight.suggestMaxSpeed * 3.6) + var minSpeedTemp = (currentLight.suggestMinSpeed * 3.6).roundToInt() + val maxSpeedTemp = (currentLight.suggestMaxSpeed * 3.6).roundToInt() if (minSpeedTemp == maxSpeedTemp) { minSpeedTemp -= 5 } @@ -1078,7 +1092,7 @@ class MogoPrivateObuNewManager private constructor() : OnUpgradeListener { val maxSpeed = currentLight.suggestMaxSpeed if (maxSpeed > 0) { - var currentSpeed = + val currentSpeed = CallerChassisLocationGCJ02ListenerManager.getChassisLocationGCJ02().gnssSpeed.toDouble() if (currentSpeed > 0) { ttsContentNew = diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt index c5794a901e..bca8361b3e 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/v2x/TrafficLightDispatcher.kt @@ -5,6 +5,7 @@ import android.os.CountDownTimer import android.os.Handler import com.mogo.eagle.core.data.biz.trafficlight.* import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.enums.DataSourceType import com.mogo.eagle.core.data.enums.TrafficLightEnum import com.mogo.eagle.core.data.multidisplay.TelematicConstant @@ -17,6 +18,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.zhjt.service.chain.ChainLog import perception.TrafficLightOuterClass import perception.TrafficLightOuterClass.TrafficLight @@ -64,7 +66,7 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight @Volatile private var hasObuLightStatus: Boolean = false - private var lightCountDownTimer: CountDownTimer?= null + private var lightCountDownTimer: CountDownTimer? = null private var lastLightTime: Long = System.currentTimeMillis() fun initServer(context: Context) { @@ -80,16 +82,20 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight * @param trafficLights 感知红绿灯 */ override fun onAutopilotPerceptionTrafficLight(trafficLights: TrafficLightOuterClass.TrafficLights?) { + CallerLogger.d( + "${SceneConstant.M_D_C}${TAG}", + "onAutopilotPerceptionTrafficLight ---- hasObuLightStatus = $hasObuLightStatus ----hasAiLightStatus = $hasAiLightStatus " + ) if (!hasObuLightStatus) { if (!hasAiLightStatus) { lastLightTime = System.currentTimeMillis() - if(lightCountDownTimer==null){ - lightCountDownTimer = object: CountDownTimer(300000,1000){ + if (lightCountDownTimer == null) { + lightCountDownTimer = object : CountDownTimer(300000, 1000) { override fun onTick(millisUntilFinished: Long) { - if((System.currentTimeMillis() - lastLightTime)>1000){ + if ((System.currentTimeMillis() - lastLightTime) > 1000) { //隐藏红绿灯显示 - CallerTrafficLightListenerManager.disableTrafficLight() + hide("感知倒计时结束隐藏", DataSourceType.TELEMATIC) lightCountDownTimer?.cancel() lightCountDownTimer = null } @@ -115,9 +121,13 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight } else if (it.hasUTurn()) { light = it.uTurn } + CallerLogger.d( + "${SceneConstant.M_D_C}${TAG}", + "onAutopilotPerceptionTrafficLight light = $light " + ) if (light == null) { //隐藏红绿灯显示 - hide() + hide("感知light为null隐藏", DataSourceType.TELEMATIC) } else { onTrafficLightPlusSource(light.convert(), 0, DataSourceType.TELEMATIC) } @@ -131,10 +141,17 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight */ override fun onTrafficLightStatus(trafficLightResult: TrafficLightResult) { if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.SHOW_TRAFFIC_LIGHT, GsonUtils.toJson(trafficLightResult).toByteArray()) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.SHOW_TRAFFIC_LIGHT, + GsonUtils.toJson(trafficLightResult).toByteArray() + ) } if (!hasObuLightStatus) { hasAiLightStatus = true + CallerLogger.d( + "${SceneConstant.M_D_C}${TAG}", + "onTrafficLightStatus trafficLightResult = $trafficLightResult " + ) updateTrafficLight(trafficLightResult) } } @@ -144,18 +161,22 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight * @param enter true:进入路口;false:离开路口 */ override fun onEnterCrossRoad(enter: Boolean) { + CallerLogger.d("${SceneConstant.M_D_C}${TAG}", "onEnterCrossRoad enter = $enter ") if (!enter) { Handler().postDelayed({ hasAiLightStatus = false hasObuLightStatus = false }, 5000) if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { - CallerTelematicManager.sendMsgToAllClients(TelematicConstant.HIDE_TRAFFIC_LIGHT, "0".toByteArray()) + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.HIDE_TRAFFIC_LIGHT, + "0".toByteArray() + ) } //如果没有OBU灯态则进行隐藏,如果有OBU灯态,则交由OBU管理 - if(!hasObuLightStatus){ + if (!hasObuLightStatus) { CallerTrafficLightListenerManager.resetTrafficLightStatus(!hasObuLightStatus) - hide() + hide("云端离开路口隐藏", DataSourceType.AICLOUD) } } } @@ -165,9 +186,13 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight */ override fun onTrafficRequestError() { hasAiLightStatus = false + CallerLogger.d( + "${SceneConstant.M_D_C}${TAG}", + "onTrafficRequestError hasObuLightStatus = $hasObuLightStatus ------> " + ) CallerTrafficLightListenerManager.resetTrafficLightStatus(!hasObuLightStatus) - if(!hasObuLightStatus){ - hide() + if (!hasObuLightStatus) { + hide("云端红绿灯接口请求失败隐藏", DataSourceType.AICLOUD) } } @@ -175,30 +200,46 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight * obu数据消失 */ override fun onObuTrafficLightDisapper() { + CallerLogger.d("${SceneConstant.M_D_C}${TAG}", "onObuTrafficLightDisapper ------> ") hasObuLightStatus = false - hide() + hide("OBU红绿灯消息关闭隐藏", DataSourceType.OBU) } /** * 是否重置红绿灯数据,需要确保,在obu的红绿灯显示的时候,不执行。否则会闪屏 */ override fun resetTrafficLight(isReset: Boolean) { - CallerLogger.d("${SceneConstant.M_OBU}${TAG}", "resetTrafficLight ------> isReset = $isReset ---hasObuLightStatus = $hasObuLightStatus") + CallerLogger.d( + "${SceneConstant.M_D_C}${TAG}", + "resetTrafficLight ------> isReset = $isReset ---hasObuLightStatus = $hasObuLightStatus" + ) if (!hasObuLightStatus) { - if(isReset){ - hide() + if (isReset) { + hide("云端重置红绿灯数据", DataSourceType.AICLOUD) } } } - private fun hide(){ - CallerLogger.d("${SceneConstant.M_OBU}${TAG}", "hide() ---------> ") + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_TRAFFIC_LIGHT_HIDE, + paramIndexes = [0, 1] + ) + private fun hide(msg: String, sourceType: DataSourceType) { + CallerLogger.d("${SceneConstant.M_D_C}${TAG}", "hide() :$msg type :$sourceType") CallerTrafficLightListenerManager.disableTrafficLight() } /** - * obu 红绿灯数据 + * 红绿灯数据 */ + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT, + linkCode = ChainConstant.CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_TRAFFIC_LIGHT, + paramIndexes = [0, 1, 2] + ) override fun onTrafficLightPlusSource( light: TrafficLightEnum, remain: Int, @@ -208,7 +249,10 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight if (lightSource == DataSourceType.OBU) { hasObuLightStatus = true } - + CallerLogger.d( + "${SceneConstant.M_D_C}${TAG}", + "onTrafficLightPlusSource ----- light = $light ---remain = $remain ---lightSource = $lightSource ---hasObuLightStatus = $hasObuLightStatus ---hasAiLightStatus = $hasAiLightStatus" + ) CallerTrafficLightListenerManager.showTrafficLight(light, lightSource) if (remain == -1) { CallerTrafficLightListenerManager.disableTrafficLightCountDown() @@ -226,10 +270,10 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight CallerTrafficLightListenerManager.changeCountdownYellow(remain) } TrafficLightEnum.BLACK -> { - CallerTrafficLightListenerManager.disableTrafficLight() + hide("感知数据BLACK隐藏", lightSource) } else -> { - hide() + hide("未知红绿灯类型隐藏", lightSource) } } @@ -237,6 +281,10 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight private fun updateTrafficLight(trafficLightResult: TrafficLightResult) { val currentTrafficLight = trafficLightResult.currentRoadTrafficLight() + CallerLogger.d( + "${SceneConstant.M_D_C}${TAG}", + "updateTrafficLight ----- currentTrafficLight = $currentTrafficLight" + ) currentTrafficLight?.let { val remain = if (it.remain > 99) { 99 @@ -245,9 +293,9 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight } onTrafficLightPlusSource(it.convert(), remain, DataSourceType.AICLOUD) } - } + fun destroy() { //取消注册监听AI云.OBU,路侧获取红绿灯状态 CallerTrafficLightListenerManager.removeListener(TAG) diff --git a/core/function-impl/mogo-core-function-devatools/build.gradle b/core/function-impl/mogo-core-function-devatools/build.gradle index 276ae1e585..cdeaff375c 100644 --- a/core/function-impl/mogo-core-function-devatools/build.gradle +++ b/core/function-impl/mogo-core-function-devatools/build.gradle @@ -89,11 +89,14 @@ dependencies { implementation rootProject.ext.dependencies.androidautoSize implementation rootProject.ext.dependencies.koomnative implementation rootProject.ext.dependencies.koomxhook + implementation rootProject.ext.dependencies.mofang_runtime + implementation rootProject.ext.dependencies.log_runtime implementation group: "com.tencent.matrix", name: "matrix-android-lib", version: MATRIX_VERSION, changing: true implementation group: "com.tencent.matrix", name: "matrix-android-commons", version: MATRIX_VERSION, changing: true implementation group: "com.tencent.matrix", name: "matrix-trace-canary", version: MATRIX_VERSION, changing: true implementation group: "com.tencent.matrix", name: "matrix-io-canary", version: MATRIX_VERSION, changing: true implementation group: "com.tencent.matrix", name: "matrix-hooks", version: MATRIX_VERSION, changing: true + implementation rootProject.ext.dependencies.weak_network implementation project(':foudations:mogo-commons') implementation project(':core:mogo-core-utils') 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 2b3cfffca7..46d186b687 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 @@ -1,6 +1,7 @@ package com.zhjt.mogo_core_function_devatools import android.app.Activity +import android.app.Application import android.content.Context import android.view.View import android.view.ViewGroup @@ -18,8 +19,10 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider import com.mogo.eagle.core.function.api.devatools.apm.* import com.mogo.eagle.core.function.api.devatools.strict.* -import com.mogo.eagle.core.function.call.map.* import com.mogo.eagle.core.function.api.devatools.download.* +import com.mogo.eagle.core.function.api.devatools.logcat.* +import com.mogo.eagle.core.function.api.devatools.mofang.* +import com.mogo.eagle.core.function.api.lookaround.* import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.w import com.tencent.matrix.Matrix @@ -33,6 +36,7 @@ import com.tencent.matrix.trace.config.SharePluginInfo import com.tencent.matrix.trace.config.TraceConfig import com.zhjt.mogo_core_function_devatools.apm.* import com.mogo.eagle.core.function.api.upgrade.* +import com.mogo.weak.network.SdtManager import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.binding.* @@ -40,9 +44,11 @@ import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl import com.zhjt.mogo_core_function_devatools.koom.KoomInitTask +import com.zhjt.mogo_core_function_devatools.logcat.* import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager +import com.zhjt.mogo_core_function_devatools.lookaround.* import com.zhjt.mogo_core_function_devatools.matrix.DynamicConfigImpl -import com.zhjt.mogo_core_function_devatools.mofang.MoFangManager.Companion.moFangManager +import com.zhjt.mogo_core_function_devatools.mofang.* import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager import com.zhjt.mogo_core_function_devatools.monitor.db.MonitorDb import com.zhjt.mogo_core_function_devatools.monitor.db.MonitorDb.Companion.getDb @@ -53,8 +59,9 @@ import com.zhjt.mogo_core_function_devatools.strict.* import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager import com.zhjt.mogo_core_function_devatools.tts.TtsManager.Companion.ttsManager import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager +import com.zhjt.mogo_core_function_devatools.weaknetwork.DetectResultImpl +import com.zhjt.mogo_core_function_devatools.weaknetwork.WeakNetworkStrategy import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD @Route(path = MogoServicePaths.PATH_DEVA_TOOLS) class DevaToolsProvider : IDevaToolsProvider { @@ -69,6 +76,13 @@ class DevaToolsProvider : IDevaToolsProvider { private val strictModeProvider by lazy { StrictModeProviderImpl() } + + private val lookAroundDataProvider by lazy { MoGoLookAroundProviderImpl() } + + private val mofangProvider by lazy { MoGoMoFangProviderImpl() } + + private val logRecordProvider by lazy { MoGoLogRecordProviderImpl() } + @Volatile private var mDockerVersion: String? = null @@ -83,20 +97,31 @@ class DevaToolsProvider : IDevaToolsProvider { KoomInitTask.init(AbsMogoApplication.getApp()) initMatrix() } - ttsManager.initTts(mContext!!) //todo + ttsManager.initTts(mContext!!) //todo 扶风 优化 bizConfigCenter.init(mContext!!) + upgradeManager.updateUpgradeProgress() FuncConfigImpl.init() MogoLogCatchManager.init(mContext!!) - // 视角切换功能初始化,监听路口及停止线回调 - CallerVisualAngleManager.init() - //升级(鹰眼/工控)与监控服务 iPCReportManager.initServer() - moFangManager.init(mContext!!) BindingCarManager.init(mContext!!) apmEnvProvider.init(if(DebugConfig.isDebug()) "0" else "1", "${ DebugConfig.getNetMode() }", mDockerVersion ?: "") BadCaseManager.init() + if (DebugConfig.isDebug()) { + SdtManager.init(mContext!!, true, DetectResultImpl()) + // 监听弱网 + WeakNetworkStrategy.startListen() + } + lookAroundDataProvider.init(mContext!!) + (mContext as? Application)?.also { + mofangProvider.init(it) + } + + mContext?.also { + logRecordProvider.init(it) + logRecordProvider.start() + } } override fun checkMonitorDb() { @@ -179,12 +204,10 @@ class DevaToolsProvider : IDevaToolsProvider { } @ChainLog( - linkChainLog = ChainConstant.CHAIN_LINK_LOG_ANR, - linkCode = ChainConstant.CHAIN_LINK_ANR, - endpoint = PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_RECORD_ANR, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = ChainConstant.CHAIN_TYPE_ANR_LEAK, + linkCode = ChainConstant.CHAIN_SOURCE_ANR_LEAK, + nodeAliasCode = ChainConstant.CHAIN_CODE_RECORD_ANR, + paramIndexes = [0] ) private fun printEvilMsg(evilMethod: String) { w("TraceCanary", evilMethod) @@ -267,7 +290,7 @@ class DevaToolsProvider : IDevaToolsProvider { } override fun updateUpgradeProgress() { - upgradeManager.updateUpgradeProgress() + } override fun showStatusBar(ctx: Context, container: ViewGroup) { @@ -348,4 +371,10 @@ class DevaToolsProvider : IDevaToolsProvider { return upgradeManager.upgradeProvider() } override fun strict(): IStrictModeProvider = strictModeProvider + + override fun lookAroundDataProvider(): IMoGoLookAroundProvider = lookAroundDataProvider + + override fun mofang(): IMoGoMoFangProvider = mofangProvider + + override fun logRecord(): IMoGoLogRecordProvider = logRecordProvider } \ 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 ddc8257335..65a2c104ac 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 @@ -4,14 +4,13 @@ import android.os.Process import android.text.TextUtils import android.widget.Toast import com.mogo.commons.debug.DebugConfig -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_INIT_ENV_RESTART -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_INIT -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_INIT_ENV_RESTART +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_SOURCE_INIT +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_TYPE_INIT_STATUS import com.mogo.eagle.core.function.api.devatools.apm.* import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.apm.config.* import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD import kotlinx.coroutines.* import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicReference @@ -111,12 +110,10 @@ class ApmEnvProviderImpl: IApmEnvProvider, CoroutineScope { } @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = CHAIN_LINK_INIT, - endpoint = PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_INIT_ENV_RESTART, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkCode = CHAIN_SOURCE_INIT, + nodeAliasCode = CHAIN_CODE_INIT_ENV_RESTART, + paramIndexes = [0] ) private fun restartApp(envStr:String) { launch(Dispatchers.Main) { 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 cedb44ffac..22bc2a120b 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 @@ -7,23 +7,18 @@ import android.view.View import android.view.WindowManager import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle.Event -import androidx.lifecycle.LifecycleCoroutineScope import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.lifecycleScope import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager -import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA @@ -34,14 +29,10 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord import com.zhjt.mogo_core_function_devatools.ext.enqueuePop import kotlinx.coroutines.* -import kotlinx.coroutines.channels.Channel import me.jessyan.autosize.utils.AutoSizeUtils import record_cache.RecordPanelOuterClass -import java.lang.ref.WeakReference -import java.util.concurrent.TimeUnit -internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener, - IMoGoChassisLocationWGS84Listener { +internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener { const val TAG = "BadCase" @@ -50,13 +41,8 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis @Volatile private var record: AutoPilotRecord? = null - private var longitude: Double = 0.0 - private var latitude: Double?= 0.0 - - fun init(){ + fun init() { CallerAutopilotRecordListenerManager.addListener(TAG, this) - // 添加 ADAS车辆状态&定位 监听 - CallerChassisLocationWGS84ListenerManager.addListener(TAG, this) } /** @@ -83,15 +69,20 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis /** * 展示BadCase录包管理页面 */ - fun showBadCaseManagerWindow(context: Context){ + fun showBadCaseManagerWindow(context: Context) { val badCaseManagerView = BadCaseManagerView(context) - badCaseManagerView.setOnClickListener(object: BadCaseManagerView.ClickListener{ + badCaseManagerView.setOnClickListener(object : BadCaseManagerView.ClickListener { override fun onClose() { hideFloat?.invoke() hideFloat = null } }) - context.enqueuePop(badCaseManagerView,AutoSizeUtils.dp2px(context,960f), WindowManager.LayoutParams.MATCH_PARENT, key = "BadCaseManagerView").also { + context.enqueuePop( + badCaseManagerView, + AutoSizeUtils.dp2px(context, 960f), + WindowManager.LayoutParams.MATCH_PARENT, + key = "BadCaseManagerView" + ).also { hideFloat = it } } @@ -246,29 +237,32 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis ) ) ) + val lat = + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude + val lon = + CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude //埋点统计 - BadCaseAnalyticsManager.bagRecordReceive(recordPanel.key.toString(),recordPanel.filename, - System.currentTimeMillis().toString(),recordPanel.stat.toString(), - AppConfigInfo.plateNumber,recordPanel.duration.toString(), - MoGoAiCloudClientConfig.getInstance().sn,BadCaseConfig.dockerVersion ?:"", - AppUtils.getAppVersionName(),latitude.toString(),longitude.toString()) + BadCaseAnalyticsManager.bagRecordReceive( + recordPanel.key.toString(), recordPanel.filename, + System.currentTimeMillis().toString(), recordPanel.stat.toString(), + AppConfigInfo.plateNumber, recordPanel.duration.toString(), + MoGoAiCloudClientConfig.getInstance().sn, BadCaseConfig.dockerVersion ?: "", + AppUtils.getAppVersionName(), lat.toString(), lon.toString() + ) //日志埋点 - CallerLogger.i("$M_DEVA$TAG", "BadCase Receive Analytics="+"key="+recordPanel.key+" filename="+recordPanel.filename+ - " receiveTime="+System.currentTimeMillis()+" stat="+recordPanel.stat+" plateNumber="+AppConfigInfo.plateNumber+ - " totalDuration="+recordPanel.duration+" carSn="+MoGoAiCloudClientConfig.getInstance().sn+" mapVersion="+BadCaseConfig.dockerVersion+ - " eyeVersion="+AppUtils.getAppVersionName()+" latitude="+latitude+" longitude="+longitude) + CallerLogger.i( + "$M_DEVA$TAG", + "BadCase Receive Analytics=" + "key=" + recordPanel.key + " filename=" + recordPanel.filename + + " receiveTime=" + System.currentTimeMillis() + " stat=" + recordPanel.stat + " plateNumber=" + AppConfigInfo.plateNumber + + " totalDuration=" + recordPanel.duration + " carSn=" + MoGoAiCloudClientConfig.getInstance().sn + " mapVersion=" + BadCaseConfig.dockerVersion + + " eyeVersion=" + AppUtils.getAppVersionName() + " latitude=" + lat + " longitude=" + lon + ) } } } - override fun onStateChanged(source: LifecycleOwner, event: Event) { } - override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { - latitude = gnssInfo.latitude - longitude = gnssInfo.longitude - } - } 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 13becfbf20..ad824820f9 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,7 +12,6 @@ import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager @@ -37,7 +36,7 @@ import java.util.* * @since: 2022/7/12 */ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener, - IMoGoAutopilotRecordListener, IMoGoChassisLocationWGS84Listener { + IMoGoAutopilotRecordListener { companion object { const val TAG = "AIDataCollectWindow" @@ -68,8 +67,6 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener @Volatile private var recordFileName: String? = null //录制文件包名 - private var longitude: Double? = null - private var latitude: Double? = null private lateinit var mFloatLayout: View private var mInViewX = 0f @@ -116,8 +113,6 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}" //采集结果回调监听 CallerAutopilotRecordListenerManager.addListener(this.hashCode().toString(), this) - // 添加 ADAS车辆状态&定位 监听 - CallerChassisLocationWGS84ListenerManager.addListener(this.hashCode().toString(), this) //开始录制AI数据采集Bag包 CallerAutoPilotControlManager.recordPackage( 99, @@ -234,7 +229,8 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener itx["audioUrl"] = "" //音频COS地址 itx["mapVersion"] = BadCaseConfig.dockerVersion ?: "" //工控机版本 itx["eyeVersion"] = AppUtils.getAppVersionName() //鹰眼版本 - itx["coordinate"] = "latitude:${latitude};longitude:${longitude}" //坐标 + itx["coordinate"] = + "latitude:${CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().latitude};longitude:${CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().longitude}" //坐标 }) if (uploadResult == null || uploadResult.code != 200) { @@ -332,7 +328,7 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener // 默认固定位置,靠屏幕右边缘的中间 mWindowManager!!.defaultDisplay.getMetrics(metrics) mWindowParams!!.x = metrics.widthPixels - mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-950 + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight() - 950 mWindowManager!!.addView(mFloatLayout, mWindowParams) } } @@ -353,9 +349,4 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener fun closeWindow() } - override fun onChassisLocationWGS84(gnssInfo: MogoLocation) { - latitude = gnssInfo.latitude - longitude = gnssInfo.longitude - } - } \ 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/BindingCarManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt index ba4bb5357a..32368ffc0d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/binding/BindingCarManager.kt @@ -18,7 +18,6 @@ import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isDriver import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.Logger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr import com.zhjt.mogo_core_function_devatools.upgrade.IPCUpgradeManager.Companion.ipcUpgradeManager @@ -27,6 +26,7 @@ import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeAppNetWorkManager import mogo.telematics.pad.MessagePad /** + * //todo emArrow 链路biz * 车辆绑定 */ @SuppressLint("StaticFieldLeak") @@ -61,9 +61,9 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener { } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { - Logger.d("${SceneConstant.M_BINDING}${TAG}", "onAutopilotCarConfig ----------> ") + CallerLogger.d("${SceneConstant.M_DEVA}${TAG}", "onAutopilotCarConfig ----------> ") if (!TextUtils.isEmpty(carConfigResp.macAddress)) { - Logger.d("${SceneConstant.M_BINDING}${TAG}", + CallerLogger.d("${SceneConstant.M_DEVA}${TAG}", "onAutopilotCarConfig carConfigResp.macAddress = ${carConfigResp.macAddress} ") getBindingCarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn) } @@ -75,24 +75,21 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener { * @param macAddress */ fun getBindingCarInfo(macAddress: String, widevineIDWithMd5: String) { - Log.d("UPGRADE", "-- getBindingCarInfo -- 1 -- : [mac: $macAddress, md5: $widevineIDWithMd5]") var flag = false if (!TextUtils.isEmpty(macAddress) && TextUtils.isEmpty(mAddress)) { - Log.d("UPGRADE", "-- getBindingCarInfo -- 2 -- : [mac: $macAddress, md5: $widevineIDWithMd5]") flag = true } if (!TextUtils.isEmpty(macAddress) && !TextUtils.equals(macAddress, mAddress)) { mAddress = macAddress } if (flag) { - Log.d("UPGRADE", "-- getBindingCarInfo -- 3 -- : [mac: $macAddress, md5: $widevineIDWithMd5]") queryAppUpgrade() val obuVersion = mObuVersion if (obuVersion != null && !TextUtils.isEmpty(obuVersion)) { queryObuUpgrade(obuVersion) } } - CallerLogger.d("${SceneConstant.M_BINDING}${TAG}", + CallerLogger.d("${SceneConstant.M_DEVA}${TAG}", "getBindingcarInfo macAddress = $macAddress--widevineIDWithMd5 = $widevineIDWithMd5 ---screenType = $screenType" ) SharedPrefsMgr.getInstance(mContext!!).putString(SharedPrefsConstants.APP_MAC, macAddress) @@ -126,7 +123,7 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener { } fun modifyCarInfo(callBack: (ModifyBindingcarInfo) -> Unit) { - BindingCarNetWorkManager.instance.modifyBindingCar(mContext!!, mAddress, mWidevineIDWithMd5, callBack, screenType) + BindingCarNetWorkManager.instance.modifyBindingCar(mAddress, mWidevineIDWithMd5, callBack, screenType) } private fun driverScreen(macAddress: String, widevineIDWithMd5: String) { @@ -205,10 +202,10 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener { */ fun queryObuUpgrade(obuVersionName: String) { mObuVersion = obuVersionName - CallerLogger.d("${SceneConstant.M_OBU}${MogoObuConst.TAG_UPGRADE_OBU}", "screenType = $screenType ----role = $role") + CallerLogger.d("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", "screenType = $screenType ----role = $role") if (screenType == 1) { - CallerLogger.d("${SceneConstant.M_OBU}${MogoObuConst.TAG_UPGRADE_OBU}","queryObuUpgrade isConnected = ${CallerObuApiManager.isConnected()} --- mAddress = $mAddress") - ObuUpgradeAppNetWorkManager.instance?.getObuUpgradeInfo(mContext, if(!mAddress.isNullOrEmpty()) mAddress else SharedPrefsMgr.getInstance(mContext!!).getString(SharedPrefsConstants.APP_MAC), obuVersionName) + CallerLogger.d("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}","queryObuUpgrade isConnected = ${CallerObuApiManager.isConnected()} --- mAddress = $mAddress") + ObuUpgradeAppNetWorkManager.instance?.getObuUpgradeInfo(if(!mAddress.isNullOrEmpty()) mAddress else SharedPrefsMgr.getInstance(mContext!!).getString(SharedPrefsConstants.APP_MAC), obuVersionName) } } } 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 205aa21dcf..3a0b9d64d3 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 @@ -72,7 +72,7 @@ class BindingCarNetWorkManager private constructor() { override fun onSubscribe(d: Disposable) {} override fun onNext(info: BindingCarInfo) { if (info != null && info.getData() != null) { - d(SceneConstant.M_BINDING + TAG, "getBindingCarInfo data =" + info.getData().toString() + "---getDefaultId() : ${getDefaultId()}") + d(SceneConstant.M_DEVA + TAG, "getBindingCarInfo data =" + info.getData().toString() + "---getDefaultId() : ${getDefaultId()}") SharedPrefsMgr.getInstance(context).putString( SharedPrefsConstants.CAR_INFO, GsonUtils.toJson(info.getData()) @@ -85,13 +85,13 @@ class BindingCarNetWorkManager private constructor() { updateCarVrIconRes(info.getData().brandId) } else { SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, "") - e(SceneConstant.M_BINDING + TAG, "getBindingCarInfo data = null ---getDefaultId() : ${getDefaultId()} ") + e(SceneConstant.M_DEVA + TAG, "getBindingCarInfo data = null ---getDefaultId() : ${getDefaultId()} ") } } override fun onError(e: Throwable) { SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.CAR_INFO, "") - e(SceneConstant.M_BINDING + TAG, "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message + "---getDefaultId() : ${getDefaultId()}") + e(SceneConstant.M_DEVA + TAG, "getBindingCarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message + "---getDefaultId() : ${getDefaultId()}") } override fun onComplete() {} @@ -103,7 +103,6 @@ class BindingCarNetWorkManager private constructor() { * mac: 48:b0:2d:3a:9c:19 */ fun modifyBindingCar( - context: Context, macAddress: String?, widevineIDWithMd5: String?, callBack: (ModifyBindingcarInfo) -> Unit, @@ -128,13 +127,13 @@ class BindingCarNetWorkManager private constructor() { override fun onNext(info: ModifyBindingcarInfo) { if (info != null) { callBack.invoke(info) - d(SceneConstant.M_BINDING + TAG, "modifyBindingCar onNext code = " + info.code + "---msg = " + info.msg + "--info.toString() = " + info.toString()) + d(SceneConstant.M_DEVA + TAG, "modifyBindingCar onNext code = " + info.code + "---msg = " + info.msg + "--info.toString() = " + info.toString()) updateCarVrIconRes(info.data.brandId) } } override fun onError(e: Throwable) { - e(SceneConstant.M_BINDING + TAG, "modifyBindingCar onError e = " + e.toString() + "---e.getMessage = " + e.message) + e(SceneConstant.M_DEVA + TAG, "modifyBindingCar onError e = " + e.toString() + "---e.getMessage = " + e.message) } override fun onComplete() {} @@ -142,18 +141,18 @@ class BindingCarNetWorkManager private constructor() { } private fun updateCarVrIconRes(brandId: String?) { - d(SceneConstant.M_BINDING + TAG, "CarModelChange : ${DebugConfig.isCarModelChange()}") + d(SceneConstant.M_DEVA + TAG, "CarModelChange : ${DebugConfig.isCarModelChange()}") if(!DebugConfig.isCarModelChange()){ return } if (brandId == null || brandId.isEmpty()) { return } - d(SceneConstant.M_BINDING + TAG, "getDefaultId() : ${getDefaultId()} ---- brandId = $brandId") + d(SceneConstant.M_DEVA + TAG, "getDefaultId() : ${getDefaultId()} ---- brandId = $brandId") if (getDefaultId() == brandId) { return } - d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes : $brandId") + d(SceneConstant.M_DEVA + TAG, "updateCarVrIconRes : $brandId") when (brandId) { "1" -> { //东风 CallerMapUIServiceManager.getMapUIController()?.changeCurrentIcon(R.raw.chuzuche) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt index 98126c024b..efdd65d59b 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/FuncConfigCenter.kt @@ -4,9 +4,9 @@ import android.content.Context import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.commons.AbsMogoApplication -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD -import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS +import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_CODE_FUNC_CONFIG_CHANGED +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_INIT_STATUS import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager @@ -18,7 +18,6 @@ import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companio import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.defaultFuncConfig import com.zhjt.mogo_core_function_devatools.funcconfig.network.FuncConfigNetWorkModel import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants import com.zhjt.service_biz.BizManager import com.zhjt.service_biz.FuncConfig import mogo.telematics.pad.MessagePad @@ -72,12 +71,10 @@ class FuncConfigCenter : IMogoOnMessageListener, IMoGoAutopilotCarCo } @ChainLog( - linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = CHAIN_LINK_CLOUD, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = CHAIN_TYPE_INIT_STATUS, + linkCode = CHAIN_SOURCE_CLOUD, + nodeAliasCode = CHAIN_CODE_FUNC_CONFIG_CHANGED, + paramIndexes = [0] ) private fun refreshConfig(funcConfig: FuncConfig) { BizManager.updateBizConfigData(funcConfig) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt new file mode 100644 index 0000000000..509435a7ba --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt @@ -0,0 +1,78 @@ +package com.zhjt.mogo_core_function_devatools.logcat + +import android.content.* +import android.os.Process +import android.util.* +import com.mogo.core.log.record.* +import com.mogo.core.log.record.config.* +import com.mogo.core.log.record.config.crash.* +import com.mogo.eagle.core.function.api.devatools.logcat.* +import com.mogo.eagle.core.utilcode.util.* +import com.zhjt.mogo_core_function_devatools.logcat.uploader.* +import kotlinx.coroutines.* +import java.io.* +import java.util.concurrent.TimeUnit.MINUTES +import java.util.concurrent.atomic.AtomicBoolean + +internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider { + + private val flag by lazy { AtomicBoolean(false) } + + private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) } + + override fun init(context: Context) { + val zipDir = File(context.getExternalFilesDir(null), "logcat/zip") + LogcatManager.init(LogcatConfig.Builder().context(context) + .recordPeriod(MINUTES.toMillis(1)) // 1分钟一个文件 + .maxSizeInLogDir((512 * 1024 * 1024).toLong()) // 512M最大容量 + .recordDir(File(context.getExternalFilesDir(null), "logcat")) + .pid(Process.myPid()) + .generateZipDir(zipDir.absolutePath) + .crashConfig(CrashConfig.Builder() + .enabled(true) + .crashDir(File(context.getExternalFilesDir(null), "logcat/crash")) + .javaCrash(true) + .anr(true) + .build()) + .uploader(LogRecordUploader())) + scope.launch { + try { + if (zipDir.exists()) { + zipDir.listFiles()?.forEach { + it.delete() + } + } + } catch (t: Throwable) { + t.printStackTrace() + } + } + } + + + override fun start() { + if (flag.get()) { + return + } + flag.set(true) + LogcatManager.start() + } + + override fun stop() { + if (!flag.get()) { + return + } + flag.set(false) + LogcatManager.stop() + } + + override fun upload(startTime: Long, endTime: Long) { + scope.launch { + val result = LogcatManager.upload(startTime, endTime) + Log.d(TAG, "上传日志:[startTime:$startTime, endTime: $endTime], 结果: $result") + } + } + + override fun export(): File? { + return LogcatManager.export() + } +} \ 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/logcat/uploader/LogRecordUploader.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/uploader/LogRecordUploader.kt new file mode 100644 index 0000000000..4f03953bf8 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/uploader/LogRecordUploader.kt @@ -0,0 +1,11 @@ +package com.zhjt.mogo_core_function_devatools.logcat.uploader + +import com.mogo.core.log.record.config.uploader.* +import com.mogo.core.log.record.model.* + +internal class LogRecordUploader: ILogcatUploader { + + override suspend fun upload(startTime: Long, endTime: Long, generatedZipPath: String): UploadState { + throw AssertionError("Not Implementation") + } +} \ 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/logcatch/MogoLogCatchManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt index 19edc0f1b3..01c89acbde 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcatch/MogoLogCatchManager.kt @@ -218,8 +218,11 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl */ private fun openLoggerLevel() { Logger.init(LogLevel.DEBUG) - MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = true - MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowNetDebugLog = true + val config = MoGoAiCloudClient.getInstance().aiCloudClientConfig + if(config != null){ + config.isShowDebugLog = true + config.isShowNetDebugLog = true + } CallerAutoPilotControlManager.setEnableLog(true) } @@ -228,8 +231,11 @@ object MogoLogCatchManager : IMogoOnMessageListener, Handl */ private fun closeLoggerLevel() { Logger.init(if (DebugConfig.isDebug()) LogLevel.DEBUG else LogLevel.OFF) - MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = false - MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowNetDebugLog = false + val config = MoGoAiCloudClient.getInstance().aiCloudClientConfig + if(config != null){ + config.isShowDebugLog = false + config.isShowNetDebugLog = false + } CallerAutoPilotControlManager.setEnableLog(false) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/lookaround/MoGoLookAroundProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/lookaround/MoGoLookAroundProviderImpl.kt new file mode 100644 index 0000000000..da9114b729 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/lookaround/MoGoLookAroundProviderImpl.kt @@ -0,0 +1,160 @@ +package com.zhjt.mogo_core_function_devatools.lookaround + +import android.content.* +import android.graphics.BitmapFactory +import android.util.* +import androidx.core.util.Pools +import com.mogo.eagle.core.data.config.* +import com.mogo.eagle.core.function.api.autopilot.* +import com.mogo.eagle.core.function.api.lookaround.* +import com.mogo.eagle.core.function.api.lookaround.data.* +import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.utilcode.mogo.* +import com.zhjt.mogo.adas.data.* +import com.zhjt.mogo.adas.data.bean.* +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.* +import kotlinx.coroutines.channels.Channel.Factory.CONFLATED +import kotlinx.coroutines.flow.* +import mogo.telematics.pad.MessagePad.Header +import mogo.telematics.pad.MessagePad.SetParamReq +import java.util.concurrent.atomic.AtomicInteger +import kotlin.concurrent.* + +internal class MoGoLookAroundProviderImpl: IMoGoLookAroundProvider, IMoGoSweeperFutianBackCameraVideoListener, IMoGoRoboBusJinlvM1StitchedVideoListener, IMoGoGetParamResponseListener { + + companion object { + private const val TAG = "MoGoLookAroundProvider" + } + + @OptIn(ExperimentalCoroutinesApi::class) + private var channel: Channel = Channel(CONFLATED) + get() { + return if (field.isClosedForReceive || field.isClosedForSend) { + Channel(CONFLATED) + } else { + field + } + } + + private val pool by lazy { Pools.SynchronizedPool(10) } + + private val bitmapWidth by lazy { AtomicInteger(0) } + + private val bitmapHeight by lazy { AtomicInteger(0) } + + //276,319,147,366 + private val targetX by lazy { AtomicInteger(0) } + + private val targetY by lazy { AtomicInteger(0) } + + private val targetWidth by lazy { AtomicInteger(0) } + + private val targetHeight by lazy { AtomicInteger(0) } + + private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) } + + @Volatile + private var job: Job? = null + + override fun init(ctx: Context) { + CallerSweeperFutianBackCameraVideoListenerManager.addListener(TAG, this) + CallerRoboBusJinlvM1StitchedVideoListenerManager.addListener(TAG, this) + CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this) + if (AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) { + sendReqForParamPeriod() + } + } + + private fun sendReqForParamPeriod() { + scope.launch { + while (targetX.get() == 0 || targetY.get() == 0) { + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.M1_STITCHED_VIDEO_SELF_VEHICLE_PARAM) + delay(2000) + } + }.also { + job = it + } + } + + @OptIn(ExperimentalCoroutinesApi::class) + override fun flow(): Flow = channelFlow { + val iterator = this@MoGoLookAroundProviderImpl.channel.iterator() + while (iterator.hasNext()) { + send(iterator.next()) + } + }.flowOn(Dispatchers.IO) + + override fun onRoboBusJinlvM1StitchedVideo(data: ByteArray) { + if (bitmapWidth.get() == 0 || bitmapHeight.get() == 0) { + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeByteArray(data,0 , data.size, options) + bitmapWidth.set(options.outWidth) + bitmapHeight.set(options.outHeight) + } + Log.d(TAG, "-- onRoboBusJinlvM1StitchedVideo -- bitmap:[${bitmapWidth.get()}, ${bitmapHeight.get()}] -- data: ${data.size}") + var old = pool.acquire() + try { + if (old == null) { + old = LookAroundData(data, bitmapWidth.get(), bitmapHeight.get(), targetX.get(), targetY.get(), targetWidth.get(), targetHeight.get()) + } else { + old.data = data + old.bitmapWidth = bitmapWidth.get() + old.bitmapHeight = bitmapHeight.get() + old.targetX = targetX.get() + old.targetY = targetY.get() + old.targetWidth = targetWidth.get() + old.targetHeight = targetHeight.get() + } + channel.trySend(old) + } finally { + if (old != null) { + pool.release(old) + } + } + + } + + override fun onSweeperFutianBackCameraVideo(data: ByteArray) { + if (bitmapWidth.get() == 0 || bitmapHeight.get() == 0) { + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeByteArray(data,0 , data.size, options) + bitmapWidth.set(options.outWidth) + bitmapHeight.set(options.outHeight) + } + Log.d(TAG, "-- onSweeperFutianBackCameraVideo -- bitmap:[${bitmapWidth.get()}, ${bitmapHeight.get()}] -- data: ${data.size}") + var old = pool.acquire() + try { + if (old == null) { + old = LookAroundData(data, bitmapWidth.get(), bitmapHeight.get(), targetX.get(), targetY.get(), targetWidth.get(), targetHeight.get()) + } else { + old.data = data + old.bitmapWidth = bitmapWidth.get() + old.bitmapHeight = bitmapHeight.get() + old.targetX = targetX.get() + old.targetY = targetY.get() + old.targetWidth = targetWidth.get() + old.targetHeight = targetHeight.get() + } + channel.trySend(old) + } finally { + if (old != null) { + pool.release(old) + } + } + } + + override fun onGetParamResp(header: Header, getParamResp: SetParamReq, adasParam: AdasParam) { + Log.d(TAG, "-- onGetParamResp -- 1 --") + val parse = adasParam.m1StitchedVideoSelfVehicleParamParse + if (parse != null) { + targetX.set(parse.x) + targetY.set(parse.y) + targetWidth.set(parse.width) + targetHeight.set(parse.height) + Log.d(TAG, "-- onGetParamResp -- 2 --:[x: ${parse.x}, y: ${parse.y}, width: ${parse.width}, height: ${parse.height}]") + } + } +} \ 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/mofang/MoFangAnalyticUtils.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt new file mode 100644 index 0000000000..5e67e5f4e7 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangAnalyticUtils.kt @@ -0,0 +1,47 @@ +package com.zhjt.mogo_core_function_devatools.mofang + +import android.os.Handler +import android.os.HandlerThread +import android.os.Process +import com.mogo.commons.utils.* + +internal class MoFangAnalyticUtils { + + companion object { + + // 魔方连接状态 + const val EVENT_MOFANG_CONNECT = "event_mofang_connect" + const val EVENT_SUB_START_CONNECT = "event_sub_start_connect" + const val EVENT_SUB_CONNECT_SUCCESS = "event_sub_connect_success" + const val EVENT_SUB_START_DISCONNECT = "event_sub_start_disconnect" + const val EVENT_SUB_DISCONNECT_SUCCESS = "event_sub_disconnect_success" + + // 魔方电量 + const val EVENT_BATTERY = "event_mofang_battery" + const val EVENT_BATTERY_VALUE = "battery" + + + // 收到魔方按键指令 + const val EVENT_INPUT = "event_mofang_input" + const val EVENT_INPUT_SUB_KEYCODE = "keycode" + const val EVENT_INPUT_SUB_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 + + // 执行魔方按键指令 + const val EVENT_EXECUTE = "event_mofang_execute" + const val EVENT_EXECUTE_SUB_KEYCODE = "keycode" + const val EVENT_EXECUTE_SUB_TYPE = "input_type" // 1:单击,2:长按, 3:组合键 + + private val handler by lazy { HandlerThread("mofang-analytic-worker", Process.THREAD_PRIORITY_BACKGROUND).let { it.start(); Handler(it.looper) } } + + @JvmStatic + fun track(event: String, params: MutableMap) { + handler.post { + try { + MogoAnalyticUtils.track(event, params) + } catch (t: Throwable) { + t.printStackTrace() + } + } + } + } +} \ 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/mofang/MoFangCommandExecutor.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt new file mode 100644 index 0000000000..bc472a3f42 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt @@ -0,0 +1,294 @@ +package com.zhjt.mogo_core_function_devatools.mofang + +import android.os.* +import android.util.* +import android.view.KeyEvent +import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.network.utils.GsonUtil +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_SUB_KEYCODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_EXECUTE_SUB_TYPE + +internal class MoFangCommandExecutor { + + companion object { + private const val TAG = "MoFangCommandExecutor" + private const val MSG_WHAT_KEY_CODE_A = 0x01 + private const val MSG_WHAT_KEY_CODE_B = 0x02 + private const val MSG_WHAT_KEY_CODE_BL = 0x03 + private const val MSG_WHAT_KEY_CODE_C = 0x04 + private const val MSG_WHAT_KEY_CODE_D = 0x05 + private const val MSG_WHAT_KEY_CODE_E = 0x06 + private const val MSG_WHAT_KEY_CODE_EL = 0x07 + private const val MSG_WHAT_KEY_CODE_AB = 0x08 + } + + @Volatile + private var linkedLog: MoFangLinkedLog? = null + + fun setLinkedLog(log: MoFangLinkedLog) { + this.linkedLog = log + } + + private val handlerCallback = Handler.Callback { msg -> + val message = whatToString(msg.what, ", msg_info:[obj:${msg.obj}, arg1: ${msg.arg1}, arg2: ${msg.arg2}]") + linkedLog?.record(mapOf("收到:${System.currentTimeMillis()}" to "$message")) + when(msg.what) { + MSG_WHAT_KEY_CODE_A, MSG_WHAT_KEY_CODE_B, MSG_WHAT_KEY_CODE_AB, MSG_WHAT_KEY_CODE_BL -> { + var send = false + try { + val acc = msg.obj as? Double + if (acc != null) { + send = acc != 0.0 + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $acc")) + CallerAutoPilotControlManager.sendOperatorSetAcceleratedSpeed(acc) + } + } catch (t: Throwable) { + t.printStackTrace() + Log.e(TAG, "error: ${t.message}, msg-> $msg") + } finally { + if (send) { + msg.target.sendMessageDelayed(Message.obtain(msg), 500) + } + } + } + MSG_WHAT_KEY_CODE_C, MSG_WHAT_KEY_CODE_D -> { + try { + if (msg.arg1 != -1 && msg.arg1 != 1) { + return@Callback true + } + val isLeft = msg.arg1 == -1 + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + if (isLeft) { + linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message")) + Log.d(TAG, "--- 左变道执行了 ----") + CallerAutoPilotControlManager.sendOperatorChangeLaneLeft() + } else { + Log.d(TAG, "--- 右变道执行了 ----") + linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message")) + CallerAutoPilotControlManager.sendOperatorChangeLaneRight() + } + } catch (t: Throwable) { + t.printStackTrace() + Log.e(TAG, "error: ${t.message}, msg-> $msg") + } + } + MSG_WHAT_KEY_CODE_E -> { + try { + val autoPilotStatusInfo = CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo() + val parameters = autoPilotStatusInfo.autopilotControlParameters + val json = GsonUtil.jsonFromObject(parameters) + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $json")) + Log.d(TAG, "--- 启动自驾 ----入参:$json") + CallerAutoPilotControlManager.startAutoPilot(parameters) + } catch (t: Throwable) { + t.printStackTrace() + Log.e(TAG, "error: ${t.message}, msg-> $msg") + } + } + MSG_WHAT_KEY_CODE_EL -> { + var send = false + try { + val value = msg.obj as? Double + if (value != null && value != 0.0) { + send = value != 2.0 + Log.d(TAG, "--- 长按鸣笛 ---入参:$value") + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf(EVENT_EXECUTE_SUB_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), EVENT_EXECUTE_SUB_TYPE to (getInputTypeByWhat(msg.what) ?: ""))) + linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $value")) + CallerAutoPilotControlManager.sendOperatorSetHorn(value) + } + } catch (t: Throwable) { + t.printStackTrace() + Log.e(TAG, "error: ${t.message}, msg-> $msg") + } finally { + if (send) { + msg.target.sendMessageDelayed(Message.obtain(msg).also { it.obj = 2.0 }, 500) + } + } + } + } + true + } + + private val handler by lazy { + HandlerThread("mf-command-executor").let { + it.start() + Handler(it.looper, handlerCallback) + } + } + + private fun whatToString(what: Int, extra: String = ""): String? { + return when(what) { + MSG_WHAT_KEY_CODE_A -> { + "单击键A->加速度每隔500ms,减少1$extra" + } + MSG_WHAT_KEY_CODE_AB -> { + "组合键AB->加速度每隔500毫秒,减小2$extra" + } + MSG_WHAT_KEY_CODE_B -> { + "单击键B->复原$extra" + } + MSG_WHAT_KEY_CODE_BL -> { + "长按键B->加速度每隔500ms,增加1$extra" + } + MSG_WHAT_KEY_CODE_C -> { + "单击键C->左变道$extra" + } + MSG_WHAT_KEY_CODE_D -> { + "单击键D->右变道$extra" + } + MSG_WHAT_KEY_CODE_E -> { + "单击键E->开启自驾$extra" + } + MSG_WHAT_KEY_CODE_EL -> { + "长按键E->鸣笛$extra" + } + else -> null + } + } + + private fun getKeycodeByWhat(what: Int): String? { + return when(what) { + MSG_WHAT_KEY_CODE_A -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A) + MSG_WHAT_KEY_CODE_B,MSG_WHAT_KEY_CODE_BL -> 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) + MSG_WHAT_KEY_CODE_E, MSG_WHAT_KEY_CODE_EL -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_E) + MSG_WHAT_KEY_CODE_AB -> "${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A)},${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B)}" + else -> null + } + } + + private fun getInputTypeByWhat(what: Int): String? { + return when(what) { + MSG_WHAT_KEY_CODE_A, + MSG_WHAT_KEY_CODE_B, + MSG_WHAT_KEY_CODE_C, + MSG_WHAT_KEY_CODE_D, + MSG_WHAT_KEY_CODE_E -> { + "1" + } + MSG_WHAT_KEY_CODE_BL,MSG_WHAT_KEY_CODE_EL -> { + "2" + } + MSG_WHAT_KEY_CODE_AB -> { + "3" + } + else -> { + null + } + } + } + + + fun handleSingleClick(keycode: Int) { + if (keycode == KeyEvent.KEYCODE_A) { + Log.d(TAG, "--- 单机键A --- 加速度每隔500ms减少1 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_A) + handler.removeMessages(MSG_WHAT_KEY_CODE_B) + handler.removeMessages(MSG_WHAT_KEY_CODE_AB) + handler.removeMessages(MSG_WHAT_KEY_CODE_BL) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_A + it.obj = -1.0 + }) + linkedLog?.record(mapOf("发送[A]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_A)}")) + } + if (keycode == KeyEvent.KEYCODE_B) { + Log.d(TAG, "--- 单机键B --- 复原 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_A) + handler.removeMessages(MSG_WHAT_KEY_CODE_B) + handler.removeMessages(MSG_WHAT_KEY_CODE_AB) + handler.removeMessages(MSG_WHAT_KEY_CODE_BL) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_B + it.obj = 0.0 + }) + linkedLog?.record(mapOf("发送[B]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_B)}")) + } + + if (keycode == KeyEvent.KEYCODE_C) { + Log.d(TAG, "--- 单机键C --- 左变道 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_C) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_C + it.arg1 = -1 + }) + linkedLog?.record(mapOf("发送[C]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_C)}")) + } + + if (keycode == KeyEvent.KEYCODE_D) { + Log.d(TAG, "--- 单机键D --- 右变道 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_D) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_D + it.arg1 = 1 + }) + linkedLog?.record(mapOf("发送[D]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_D)}")) + } + + if (keycode == KeyEvent.KEYCODE_E) { + Log.d(TAG, "--- 单机键E --- 启动自驾 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_E) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_E + }) + linkedLog?.record(mapOf("发送[E]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_E)}")) + } + + } + + fun handleLongClick(keyCode: Int) { + if (keyCode == KeyEvent.KEYCODE_E) { + Log.d(TAG, "--- 长按键E --- 鸣笛 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_EL) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_EL + it.obj = 1.0 + }) + linkedLog?.record(mapOf("发送[EL]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_EL)}")) + } + if (keyCode == KeyEvent.KEYCODE_B) { + Log.d(TAG, "--- 长按键B --- 加速度加1 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_A) + handler.removeMessages(MSG_WHAT_KEY_CODE_B) + handler.removeMessages(MSG_WHAT_KEY_CODE_AB) + handler.removeMessages(MSG_WHAT_KEY_CODE_BL) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_BL + it.obj = 1.0 + }) + linkedLog?.record(mapOf("发送[BL]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_BL)}")) + } + } + + fun handleCombineClick(vararg keyCodes: Int) { + if (isCombineEqual(KeyEvent.KEYCODE_A, KeyEvent.KEYCODE_B, *keyCodes)) { + //AB组合键,加速度每隔500毫秒,减小2 + Log.d(TAG, "---- 组合键AB ---- 按下,加速度每隔500毫秒,减小2 ---") + handler.removeMessages(MSG_WHAT_KEY_CODE_A) + handler.removeMessages(MSG_WHAT_KEY_CODE_B) + handler.removeMessages(MSG_WHAT_KEY_CODE_AB) + handler.removeMessages(MSG_WHAT_KEY_CODE_BL) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_AB + it.obj = -2.0 + }) + linkedLog?.record(mapOf("发送[AB]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_AB)}")) + } + } + + private fun isCombineEqual(key1: Int, key2: Int, vararg keyCodes: Int): Boolean { + if (keyCodes.size < 2) { + return false + } + val k1 = keyCodes[0] + val k2 = keyCodes[1] + if ((k1 == key1 && k2 == key2) || (k1 == key2 && k2 == key1)) { + return true + } + return false + } +} \ 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/mofang/MoFangLinkedLog.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangLinkedLog.kt new file mode 100644 index 0000000000..5018c98c57 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangLinkedLog.kt @@ -0,0 +1,23 @@ +package com.zhjt.mogo_core_function_devatools.mofang + +import com.mogo.eagle.core.data.deva.chain.* +import com.zhjt.service.chain.* + +internal class MoFangLinkedLog { + + fun record(extra: Map) { + try { + recordInternal(extra) + } catch (t: Throwable) { + t.printStackTrace() + } + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_HMI, + linkCode = ChainConstant.CHAIN_SOURCE_HMI, + nodeAliasCode = ChainConstant.CHAIN_CODE_MO_FANG_CONNECT, + paramIndexes = [0] + ) + private fun recordInternal(extra: Map) {} +} \ 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/mofang/MoFangManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt deleted file mode 100644 index 1923955f1c..0000000000 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangManager.kt +++ /dev/null @@ -1,359 +0,0 @@ -package com.zhjt.mogo_core_function_devatools.mofang - -import android.annotation.SuppressLint -import android.bluetooth.BluetoothAdapter -import android.bluetooth.BluetoothDevice -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.view.KeyEvent -import com.mogo.commons.context.ContextHolderUtil -import com.mogo.eagle.core.data.config.FunctionBuildConfig -import com.mogo.eagle.core.data.config.HmiBuildConfig -import com.mogo.eagle.core.data.deva.mofang.MfConstants -import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangListener -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.sendOperatorChangeLaneLeft -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.sendOperatorChangeLaneRight -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.sendOperatorSetAcceleratedSpeed -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.sendOperatorSetHorn -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilot -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager.startAutoPilotByMoFang -import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager.invokeMoFangStatus -import com.mogo.eagle.core.function.call.mofang.CallerMofangListenerManager -import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_F -import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import java.util.* - - -/** - * 魔方连接状态和设备管理 - */ -@SuppressLint("StaticFieldLeak") -class MoFangManager private constructor() : IMoGoMoFangListener { - - companion object { - val moFangManager: MoFangManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { - MoFangManager() - } - } - - private var mContext: Context? = null - private val TAG = "MoFangManager" - private lateinit var mBluetoothAdapter: BluetoothAdapter - private var isMfConnect: Boolean = false //添加状态判断 - - private var startPressTime: Long = 0 //开始按键时间 - private var isPressEnd = false //按键是否结束 - @Volatile - private var isCombinationKey = 0 //是否是组合按键 1单击,2长按,3组合 - private var pressADownTime: Long = 0 - private var pressAUpTime: Long = 0 - private var pressBDownTime: Long = 0 - private var pressBUpTime: Long = 0 - private var pressCDownTime: Long = 0 - private var pressCUpTime: Long = 0 - private var pressDDownTime: Long = 0 - private var pressDUpTime: Long = 0 - private var pressEDownTime: Long = 0 - private var pressEUpTime: Long = 0 - - private val clickTime = 300 //单击 - private val clickTimeInterval = 330 - private val longPressTime = 670 - private val longPressTimeInterval = 700 - private var timerHorn: Timer? = null - private var timerAcc: Timer? = null - - - fun init(context: Context) { - mContext = context - initBluetooth(context) - mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter() - if (!mBluetoothAdapter.isEnabled) { - mBluetoothAdapter.enable() - } - mBluetoothAdapter.startDiscovery() - showBondedDevice(mBluetoothAdapter) - - CallerMofangListenerManager.addListener(TAG, this) - } - - fun release() { - CallerMofangListenerManager.removeListener(TAG) - } - - /** - * 初始化蓝牙广播 - */ - private fun initBluetooth(context: Context) { - val intentFilter = IntentFilter(); - // 监视蓝牙关闭和打开的状态 - intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED) - // 监视蓝牙设备与APP连接的状态 - intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED) - intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED) - // 注册广播 - context.registerReceiver(bluetoothMonitorReceiver, intentFilter) - } - - /** - * 查找蓝牙连接过的蓝牙设备 - */ - private fun showBondedDevice(bluetoothAdapter: BluetoothAdapter) { - if (bluetoothAdapter != null) { - val deviceList = bluetoothAdapter.bondedDevices - for (device in deviceList) { - try { - //使用反射调用获取设备连接状态方 - val isConnectedMethod = BluetoothDevice::class.java.getDeclaredMethod("isConnected") - isConnectedMethod.isAccessible = true - val isConnected = isConnectedMethod.invoke(device) as Boolean - d("$M_F${TAG}"," showBondedDevice name = ${device.name} ---address = ${device.address}----isMfConnect = $isMfConnect ---isConnected = $isConnected") - if (device.name == "MINI_KEYBOARD") { //并且连接 - mContext?.let { SharedPrefsMgr.getInstance(it).putString(MfConstants.BLUETOOTH_NAME, device.name) } - UiThreadHandler.postDelayed({ - invokeMoFangStatus(isConnected) - }, 1000) - } - - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean(MfConstants.BLUETOOTH_STATUS, isConnected) } - if (isConnected) { - isMfConnect = true - } - } catch (e: NoSuchMethodException) { - e.printStackTrace() - } - } - } - } - - - private val bluetoothMonitorReceiver: BroadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - when (intent.action) { - BluetoothAdapter.ACTION_STATE_CHANGED -> { //中间状态 - d("$M_F${TAG}","bluetoothMonitorReceiver ACTION_STATE_CHANGED action = ${intent.action}") - } - - BluetoothDevice.ACTION_ACL_CONNECTED -> { //蓝牙设备已连接 - if (!isMfConnect) { -// showBondedDevice(mBluetoothAdapter) - invokeMoFangStatus(true) - isMfConnect = true - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean(MfConstants.BLUETOOTH_STATUS, true) } - } - d("$M_F${TAG}","bluetoothMonitorReceiver ACTION_ACL_CONNECTED ----- isMfConnect = $isMfConnect") - } - - BluetoothDevice.ACTION_ACL_DISCONNECTED -> { //蓝牙设备已断开 主动更新 - d("$M_F${TAG}","bluetoothMonitorReceiver ACTION_ACL_DISCONNECTED ----- isMfConnect = $isMfConnect ") - if (isMfConnect) { - invokeMoFangStatus(false) - isMfConnect = false - mContext?.let { SharedPrefsMgr.getInstance(it).putBoolean(MfConstants.BLUETOOTH_STATUS, false) } - } - } - } - } - } - - /** - * 魔方按键处理 - */ - override fun onMofangHandle(keyCode: Int, action: Int): Boolean { - val bluetoothName = SharedPrefsMgr.getInstance(ContextHolderUtil.getContext()).getString( - MfConstants.BLUETOOTH_NAME) - if (bluetoothName == "MINI_KEYBOARD") { - if (!isPressEnd) { - isPressEnd = true - startPressTime = System.currentTimeMillis() - } - e(M_F + "MoFangManager", - "dispatchKeyEvent ------ bluetoothName = $bluetoothName ---code = $keyCode -----action = $action ---HmiBuildConfig.isShowMfToastView = ${HmiBuildConfig.isShowMfToastView}") - if (keyCode == KeyEvent.KEYCODE_A) { //单击 -1,长按无操作,AB组合-2 - if (action == KeyEvent.ACTION_DOWN) { - pressADownTime = System.currentTimeMillis() - d(M_F + "MoFangManager", - "dispatchKeyEvent A down pressADownTime = " + pressADownTime + "---" + (pressADownTime - startPressTime) + "----isCombinationKey = " + isCombinationKey + "--pressBDownTime = " + pressBDownTime) - if (pressADownTime - startPressTime in (clickTimeInterval + 1) until longPressTime && pressBDownTime > 0) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 A 按AB组合 +1 timeInterval: ${pressADownTime - startPressTime}ms---$pressBDownTime") - } - sendAcc(true, +1.0) - isCombinationKey = 3 - } - if (isCombinationKey != 3 && isCombinationKey != 1) { - if (pressADownTime - startPressTime > longPressTimeInterval) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 长按A -2 timeInterval: ${pressADownTime - startPressTime}ms") - } - sendAcc(true, -2.0) - isCombinationKey = 2 - } - } - } else if (action == KeyEvent.ACTION_UP) { - pressAUpTime = System.currentTimeMillis() - d(M_F + "MoFangManager", - "dispatchKeyEvent A up pressAUpTime = " + pressAUpTime + "---" + (pressAUpTime - startPressTime) + "--pressBDownTime = " + pressBDownTime + "---isCombinationKey = $isCombinationKey") - if (pressAUpTime - startPressTime < clickTime && isCombinationKey != 3) { - isCombinationKey = 1 - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 单击A -1 timeInterval: ${pressAUpTime - startPressTime}ms") - } - sendAcc(true, -1.0) - } - pressADownTime = 0 - isPressEnd = false - UiThreadHandler.postDelayed({ isCombinationKey = 0 }, 300) - } - } else if (keyCode == KeyEvent.KEYCODE_B) { //单击复原,长按+1,AB组合-2 - if (action == KeyEvent.ACTION_DOWN) { - pressBDownTime = System.currentTimeMillis() - d(M_F + "MoFangManager", - "dispatchKeyEvent B down pressBDownTime = " + pressBDownTime + "--差-" + (pressBDownTime - startPressTime) + "---isCombinationKey = " + isCombinationKey + "--pressADownTime = " + pressADownTime - ) - if (pressBDownTime - startPressTime > clickTimeInterval && pressBDownTime - startPressTime < longPressTime && pressADownTime > 0) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 B 按AB组合 +1 timeInterval: ${pressBDownTime - startPressTime}ms ---pressADownTime = $pressADownTime ") - } - sendAcc(true, +1.0) - isCombinationKey = 3 - } - if (isCombinationKey != 3 && isCombinationKey != 1) { - if (pressBDownTime - startPressTime > longPressTimeInterval) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 长按B 无操作 timeInterval: ${pressBDownTime - startPressTime}ms") - } - isCombinationKey = 2 - } - } - } else if (action == KeyEvent.ACTION_UP) { - pressBUpTime = System.currentTimeMillis() - d(M_F + "MoFangManager", - "dispatchKeyEvent B up pressBUpTime = " + pressBUpTime + "--差-" + (pressBUpTime - startPressTime) + "--pressADownTime = " + pressADownTime + "----isCombinationKey = $isCombinationKey") - if (pressBUpTime - startPressTime < clickTime && isCombinationKey != 3) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 单击B 0 timeInterval: ${pressBUpTime - startPressTime}ms") - } - sendAcc(false, 0.0) - isCombinationKey = 1 - } - pressBDownTime = 0 - isPressEnd = false - UiThreadHandler.postDelayed({ isCombinationKey = 0 }, 300) - } - } else if (keyCode == KeyEvent.KEYCODE_C) { //单击左变道,长按无操作 - if (action == KeyEvent.ACTION_DOWN) { - pressCDownTime = System.currentTimeMillis() - d(M_F + "MoFangManager", - "dispatchKeyEvent 方块 长按C 无操作 time dif = " + (pressCDownTime - startPressTime)) - if (pressCDownTime - startPressTime > longPressTimeInterval) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 长按C 无操作 timeInterval: ${pressCDownTime - startPressTime}ms") - } - } - } else if (action == KeyEvent.ACTION_UP) { - pressCUpTime = System.currentTimeMillis() - isPressEnd = false - d(M_F + "MoFangManager", - "dispatchKeyEvent 方块 单击C ← 向左变道 time dif = " + (pressCUpTime - startPressTime)) - if (pressCUpTime - startPressTime < clickTime) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 单击C ← 向左变道 timeInterval: ${pressCUpTime - startPressTime}ms") - } - sendOperatorChangeLaneLeft() - } - } - } else if (keyCode == KeyEvent.KEYCODE_D) { //单击向右变道,双击无操作 - if (action == KeyEvent.ACTION_DOWN) { - pressDDownTime = System.currentTimeMillis() - d(M_F + "MoFangManager", - "dispatchKeyEvent 方块 长按D 无操作 time dif = " + (pressDDownTime - startPressTime)) - if (pressDDownTime - startPressTime > longPressTimeInterval) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 长按D 无操作 timeInterval: ${pressDDownTime - startPressTime}ms") - } - } - } else if (action == KeyEvent.ACTION_UP) { - pressDUpTime = System.currentTimeMillis() - isPressEnd = false - d(M_F + "MoFangManager", - "dispatchKeyEvent 方块 单击D → 向右变道 time dif = " + (pressDUpTime - startPressTime)) - if (pressDUpTime - startPressTime < clickTime) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 单击D → 向右变道 timeInterval: ${pressDUpTime - startPressTime}ms") - } - sendOperatorChangeLaneRight() - } - } - } else if (keyCode == KeyEvent.KEYCODE_E) { //单击启动自驾,长按鸣笛 - if (action == KeyEvent.ACTION_DOWN) { - pressEDownTime = System.currentTimeMillis() - d(M_F + "MoFangManager", - "dispatchKeyEvent 方块 长按E 鸣笛 time dif = " + (pressEDownTime - startPressTime)) - if (pressEDownTime - startPressTime > longPressTimeInterval) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 长按E 鸣笛 timeInterval: ${pressEDownTime - startPressTime}ms") - } - sendOperatorSetHorn(1.0) - if (timerHorn == null) { - timerHorn = Timer() - } - timerHorn!!.schedule(object : TimerTask() { - override fun run() { - sendOperatorSetHorn(2.0) - timerHorn = null - } - }, 500) - } - } else if (action == KeyEvent.ACTION_UP) { - pressEUpTime = System.currentTimeMillis() - isPressEnd = false - d(M_F + "MoFangManager", - "方块 单击E 开启自动驾驶 time dif = " + (pressEUpTime - startPressTime)) - if (pressEUpTime - startPressTime < clickTime) { - if (HmiBuildConfig.isShowMfToastView) { - ToastUtils.showShort("方块 单击E 开启自动驾驶 timeInterval: ${pressEUpTime - startPressTime}ms") - } - //清扫车有FSM模块,魔方启动自驾时需要将Source修改为魔方,以便telamatics做区分并在转发时增加flag标记 - if (AppIdentityModeUtils.isSweeper(FunctionBuildConfig.appIdentityMode)) { - startAutoPilotByMoFang(getAutoPilotStatusInfo().autopilotControlParameters) - } else{ - startAutoPilot(getAutoPilotStatusInfo().autopilotControlParameters) - } - } - } - } - } - return false - } - - @Synchronized - private fun sendAcc(isSend: Boolean, acc: Double) { - if (isSend) { - if (timerAcc == null) { - timerAcc = Timer() - timerAcc!!.schedule(object : TimerTask() { - override fun run() { - sendOperatorSetAcceleratedSpeed(acc) - } - }, 0, 500) - } - } else { - if (timerAcc != null) { - timerAcc!!.cancel() - timerAcc = null - } - sendOperatorSetAcceleratedSpeed(acc) - } - } - -} - diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt new file mode 100644 index 0000000000..a4ed1a2a8f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoGoMoFangProviderImpl.kt @@ -0,0 +1,300 @@ +package com.zhjt.mogo_core_function_devatools.mofang + +import android.annotation.* +import android.app.* +import android.bluetooth.* +import android.graphics.* +import android.graphics.drawable.ColorDrawable +import android.util.* +import android.view.* +import android.view.Window.Callback +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.* +import androidx.lifecycle.* +import com.mogo.core.mofang.connect.MoFangManager +import com.mogo.core.mofang.connect.device.* +import com.mogo.core.mofang.connect.listener.* +import com.mogo.eagle.core.function.api.devatools.mofang.* +import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider.OnMoFangStatusListener +import com.mogo.eagle.core.utilcode.floating.* +import com.mogo.eagle.core.utilcode.util.* +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY_VALUE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_KEYCODE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_TYPE +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_CONNECT_SUCCESS +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_DISCONNECT_SUCCESS +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_CONNECT +import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_DISCONNECT +import kotlinx.coroutines.* +import me.jessyan.autosize.utils.AutoSizeUtils +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger +import java.util.concurrent.atomic.AtomicReference + +internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListener { + + companion object { + private const val TAG = "MoGoMoFangProviderImpl" + + private const val SP_KEY_TEST_ENABLE = "sp_mofang_test_enable" + } + + private val listeners by lazy { ConcurrentHashMap() } + + private val executor by lazy { MoFangCommandExecutor() } + + private val linkedLog by lazy { MoFangLinkedLog().also { executor.setLinkedLog(it) } } + + private val isTest by lazy { AtomicBoolean(SPUtils.getInstance().getBoolean(SP_KEY_TEST_ENABLE) && isConnected()) } + + private var toast: MoGoPopWindow? = null + + private var job: Job? = null + + override fun enableTest(enable: Boolean) { + isTest.set(enable) + SPUtils.getInstance().put(SP_KEY_TEST_ENABLE, enable) + } + + override fun isEnableTest(): Boolean { + return isTest.get() + } + + override fun init(app: Application) { + try { + linkedLog.record(mapOf("init" to "start")) + MoFangManager.init(MoFangDevice.Builder().application(app).listener(this)) + linkedLog.record(mapOf("init" to "success")) + } catch (t: Throwable) { + t.printStackTrace() + linkedLog.record(mapOf("init" to "error: ${t.message}")) + throw t + } + } + + override fun onBluetoothStartConnect() { + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_START_CONNECT to "${System.currentTimeMillis()}")) + linkedLog.record(mapOf("connect" to "real-start")) + } + + override fun connect() { + try { + linkedLog.record(mapOf("connect" to "[手动触发]:${System.currentTimeMillis()}")) + MoFangManager.connect() + } catch (t: Throwable) { + t.printStackTrace() + linkedLog.record(mapOf("connect" to "[手动触发]:error -> ${t.message}")) + throw t + } + } + + override fun disconnect() { + try { + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_START_DISCONNECT to "${System.currentTimeMillis()}")) + linkedLog.record(mapOf("disconnect" to "start")) + MoFangManager.disconnect() + linkedLog.record(mapOf("disconnect" to "success")) + } catch (t: Throwable) { + t.printStackTrace() + linkedLog.record(mapOf("disconnect" to "error:${t.message}")) + throw t + } + } + + override fun isConnected(): Boolean { + return try { + linkedLog.record(mapOf("isConnected" to "start")) + val ret = MoFangManager.isConnected() + linkedLog.record(mapOf("isConnected" to "success: $ret")) + ret + } catch (t: Throwable) { + t.printStackTrace() + linkedLog.record(mapOf("isConnected" to "error: ${t.message}")) + false + } + } + + override fun provideWindowCallback(delegate: Callback?): Callback { + val ret = MoFangManager.provideWindowCallback() + ret.setDelegate(delegate) + return ret + } + + override fun registerMoFangStatusListener(tag: String, listener: OnMoFangStatusListener) { + listeners[tag] = listener + } + + override fun unRegisterMoFangStatusListener(listener: OnMoFangStatusListener) { + listeners.entries.find { it.value == listener }?.also { listeners.remove(it.key) } + } + + override fun onBluetoothBatteryChanged(battery: Int) { + linkedLog.record(mapOf("callback" to "onBluetoothBatteryChanged:$battery")) + MoFangAnalyticUtils.track(EVENT_BATTERY, mutableMapOf(EVENT_BATTERY_VALUE to "$battery")) + UiThreadHandler.post { + listeners.values.forEach { + it.onMoFangBatteryChanged(battery) + } + } + } + + @SuppressLint("MissingPermission") + override fun onBluetoothConnected(device: BluetoothDevice?) { + try { + linkedLog.record(mapOf("callback" to "onBluetoothConnected:${device?.name}")) + } catch (t: Throwable) { + t.printStackTrace() + } + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_CONNECT_SUCCESS to "${System.currentTimeMillis()}")) + UiThreadHandler.post { + listeners.values.forEach { + it.onMoFangConnected() + } + } + } + + @SuppressLint("MissingPermission") + override fun onBluetoothDisconnected(device: BluetoothDevice?, systemOff: Boolean) { + try { + linkedLog.record(mapOf("callback" to "onBluetoothDisconnected:name -> ${device?.name}, systemOff: $systemOff")) + } catch (t: Throwable) { + t.printStackTrace() + } + MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_DISCONNECT_SUCCESS to "${System.currentTimeMillis()}")) + UiThreadHandler.post { + listeners.values.forEach { + it.onMoFangDisconnected() + } + } + } + + override fun onBluetoothKeyBoardCombineClicked(vararg keyCodes: Int) { + val keycodesText = keyCodes.joinToString(",") { KeyEvent.keyCodeToString(it).replace("KEYCODE_", "", true) } + if (isTest.get()) { + showToast("组合键[$keycodesText]触发了") + } + try { + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keycodesText, EVENT_INPUT_SUB_TYPE to "3")) + linkedLog.record(mapOf("command" to "combine_clicked: $keycodesText")) + executor.handleCombineClick(*keyCodes) + } finally { + UiThreadHandler.post { listeners.values.forEach { + it.onMoFangCombineClicked(*keyCodes) + } } + } + } + + override fun onBluetoothKeyBoardLongClicked(keyCode: Int) { + if (isTest.get()) { + showToast("长按键[${KeyEvent.keyCodeToString(keyCode).replace("KEYCODE_", "", true)}]触发了") + } + try { + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "2")) + linkedLog.record(mapOf("command" to "long_clicked: ${ KeyEvent.keyCodeToString(keyCode) }")) + executor.handleLongClick(keyCode) + } finally { + UiThreadHandler.post { + listeners.values.forEach { + it.onMoFangLongClicked(keyCode) + } + } + } + } + + override fun onBluetoothKeyboardClicked(keyCode: Int) { + val keycodeText = KeyEvent.keyCodeToString(keyCode) + if (isTest.get()) { + showToast("单击键[${keycodeText.replace("KEYCODE_", "", true)}]触发了") + } + try { + MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "1")) + linkedLog.record(mapOf("command" to "clicked: $keycodeText")) + executor.handleSingleClick(keyCode) + } finally { + UiThreadHandler.post { + listeners.values.forEach { + it.onMoFangClicked(keyCode) + } + } + } + } + + private fun showToast(text: String) { + toast?.hide() + val activity = AppStateManager.currentActivity() + if (activity !is AppCompatActivity) { + return + } + val padding = AutoSizeUtils.dp2px(activity, 10.0f) + MoGoPopWindow.Builder() + .attachToActivity(activity) + .contentView(TextView(activity).also { + it.setPadding(padding) + it.setTextColor(Color.WHITE) + it.background = ColorDrawable(Color.BLACK) + it.textSize = AutoSizeUtils.sp2px(activity, 12f).toFloat() + it.text = text + }) + .width(WindowManager.LayoutParams.WRAP_CONTENT) + .height(WindowManager.LayoutParams.WRAP_CONTENT) + .gravityInActivity(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL) + .offsetY(AutoSizeUtils.dp2px(activity, 200.0f)) + .onDismissed { + toast = null + } + .onShowed { + job?.cancel() + activity.lifecycleScope.launch { + delay(2000) + toast?.hide() + }.also { job = it } + } + .build().also { toast = it }.show() + } + + override fun onBluetoothKeyboardEvent(event: KeyEvent) { } + + override fun onBluetoothKeyboardInputInvalid() { + Log.d(TAG, "--- onBluetoothKeyboardInputInvalid ---") + linkedLog.record(mapOf("callback" to "onBluetoothKeyboardInputInvalid")) + UiThreadHandler.post { + listeners.values.forEach { + it.onMoFangStatusError("检测到鹰眼未处于前台, 魔方指令暂不能使用, 请将鹰眼切换到前台运行...") + } + } + } + + override fun onBluetoothKeyboardInputValid() { + Log.d(TAG, "--- onBluetoothKeyboardInputValid ---") + linkedLog.record(mapOf("callback" to "onBluetoothKeyboardInputValid")) + } + + override fun onBluetoothOpenAgreed() { + Log.d(TAG, "--- onBluetoothOpenAgreed ---") + linkedLog.record(mapOf("callback" to "onBluetoothOpenAgreed")) + } + + override fun onBluetoothOpenDenied() { + Log.d(TAG, "--- onBluetoothOpenDenied ---") + linkedLog.record(mapOf("callback" to "onBluetoothOpenDenied")) + } + + override fun onBluetoothSettingRequest() { + Log.d(TAG, "--- onBluetoothSettingRequest ---") + linkedLog.record(mapOf("callback" to "onBluetoothSettingRequest")) + UiThreadHandler.post { + Toast.makeText(Utils.getApp(), "检测到魔方未正确连接,请在系统蓝牙设置页面,找到魔方并配对连接...", Toast.LENGTH_SHORT).show() + } + } + + override fun onBluetoothKeyboardAbnormalDisconnected(status: Int) { + Log.d(TAG, "--- onBluetoothKeyboardAbnormalDisconnected(status: $status) ---") + linkedLog.record(mapOf("callback" to "onBluetoothKeyboardAbnormalDisconnected:$status")) + } +} \ 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/scene/SceneManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt index 0004ae3307..fa289a6d2c 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/scene/SceneManager.kt @@ -6,16 +6,13 @@ import com.mogo.eagle.core.data.deva.scene.SceneModuleTAG import com.mogo.eagle.core.data.deva.scene.SceneTAG import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.scene.Scene.Companion.scene -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ADAS_IMPL +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_D_C import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_CHAT import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_NETWORK import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OBU -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OLD_ROUTE -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OTHER import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_SWEEPER import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_TAXI_P @@ -29,19 +26,16 @@ class SceneManager { companion object { private const val ADAS = "ADAS" - private const val CALLCHAT = "CALLCHAT" private const val DEVA = "DEVA" private const val HMI = "HMI" private const val OBU = "OBU" private const val V2X = "V2X" private const val MAP = "MAP" - private const val ROUTE = "ROUTE" private const val NET = "NET" private const val BUS = "BUS" private const val TAXI = "TAXI" private const val SWEEPER = "SWEEPER" private const val TAXI_P = "TAXI_P" - private const val OTHER = "OTHER" val sceneManager: SceneManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { SceneManager() @@ -53,20 +47,17 @@ class SceneManager { init { //过滤所需条件 - sceneModuleTAG.map[ADAS] = SceneModule(true, M_ADAS_IMPL) - sceneModuleTAG.map[CALLCHAT] = SceneModule(false, M_CHAT) + sceneModuleTAG.map[ADAS] = SceneModule(true, M_D_C) sceneModuleTAG.map[DEVA] = SceneModule(false, M_DEVA) sceneModuleTAG.map[HMI] = SceneModule(false, M_HMI) - sceneModuleTAG.map[OBU] = SceneModule(false, M_OBU) + sceneModuleTAG.map[OBU] = SceneModule(true, M_OBU) sceneModuleTAG.map[V2X] = SceneModule(true, M_V2X) sceneModuleTAG.map[MAP] = SceneModule(true, M_MAP) - sceneModuleTAG.map[ROUTE] = SceneModule(true, M_OLD_ROUTE) sceneModuleTAG.map[NET] = SceneModule(true, M_NETWORK) sceneModuleTAG.map[BUS] = SceneModule(true, M_BUS) sceneModuleTAG.map[TAXI] = SceneModule(true, M_TAXI) sceneModuleTAG.map[TAXI_P] = SceneModule(true, M_TAXI_P) sceneModuleTAG.map[SWEEPER] = SceneModule(true, M_SWEEPER) - sceneModuleTAG.map[OTHER] = SceneModule(true, M_OTHER) sceneLogTAG.map[TAXI] = SceneTAG(false) sceneLogTAG.map[BUS] = SceneTAG(false) @@ -148,28 +139,25 @@ class SceneManager { sceneCache[M_TAXI]?.logger = logger sceneCache[M_TAXI_P]?.logger = logger sceneCache[M_NETWORK]?.logger = logger - sceneCache[M_ADAS_IMPL]?.logger = logger + sceneCache[M_D_C]?.logger = logger sceneCache[M_HMI]?.logger = logger sceneCache[M_DEVA]?.logger = logger - sceneCache[M_OLD_ROUTE]?.logger = logger scene.updateSceneCache(sceneCache) } BUS -> { sceneCache[M_BUS]?.logger = logger sceneCache[M_NETWORK]?.logger = logger - sceneCache[M_ADAS_IMPL]?.logger = logger + sceneCache[M_D_C]?.logger = logger sceneCache[M_HMI]?.logger = logger sceneCache[M_DEVA]?.logger = logger - sceneCache[M_OLD_ROUTE]?.logger = logger scene.updateSceneCache(sceneCache) } SWEEPER -> { sceneCache[M_SWEEPER]?.logger = logger sceneCache[M_NETWORK]?.logger = logger - sceneCache[M_ADAS_IMPL]?.logger = logger + sceneCache[M_D_C]?.logger = logger sceneCache[M_HMI]?.logger = logger sceneCache[M_DEVA]?.logger = logger - sceneCache[M_OLD_ROUTE]?.logger = logger scene.updateSceneCache(sceneCache) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt index 98bffc7f57..755b7a2012 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/StatusManager.kt @@ -8,31 +8,29 @@ import androidx.lifecycle.* import androidx.lifecycle.Lifecycle.Event import androidx.lifecycle.Lifecycle.Event.ON_CREATE import androidx.lifecycle.Lifecycle.Event.ON_DESTROY -import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.* -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus -//import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus import com.zhjt.mogo_core_function_devatools.status.entity.Status import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus +import com.zhjt.mogo_core_function_devatools.status.entity.* +//import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus import com.zhjt.mogo_core_function_devatools.status.model.StatusModel import com.zhjt.mogo_core_function_devatools.status.flow.IFlow +import com.zhjt.mogo_core_function_devatools.status.flow.OverViewImpl import com.zhjt.mogo_core_function_devatools.status.flow.can.CanImpl import com.zhjt.mogo_core_function_devatools.status.flow.gps.GpsImpl import com.zhjt.mogo_core_function_devatools.status.flow.ipc.IpcImpl -//import com.zhjt.mogo_core_function_devatools.status.flow.nets.NetsImpl import com.zhjt.mogo_core_function_devatools.status.flow.rtk.RTKImpl import com.zhjt.mogo_core_function_devatools.status.flow.trace.TracingImpl import com.zhjt.mogo_core_function_devatools.status.ui.StatusView import kotlinx.coroutines.* import kotlinx.coroutines.flow.* -import mogo_msg.MogoReportMsg import java.lang.ref.* import java.util.concurrent.* @@ -42,52 +40,14 @@ object StatusManager { private const val TAG = "StatusManager" private lateinit var model: StatusModel -// private var timer: Job? = null private var hasInit = false private val listeners by lazy { CopyOnWriteArrayList() } private var container: WeakReference? = null -// private val listener = object : IMoGoAutopilotStatusListener { -// override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { -// super.onAutopilotGuardian(guardianInfo) -// guardianInfo?.code?.takeIf { -// CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian ---: code: $it") -// it.contains("RTK_STATUS", true) || it.contains("CAN", true) || it == "ILCT_RTK_OR_SLAM_CHANGE" -// }?.run { -// CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian trigger req ---: code: $this") -// req() -// } -// } -// } - -// private val appStateListener = object : IAppStateListener { -// -// override fun onAppStateChanged(isForeground: Boolean) { -// if (isForeground) { -// req() -// } else { -// timer?.cancel() -// } -// } -// } - private val flows: ArrayList> by lazy { ArrayList() } -// private fun req() { -// timer?.cancel() -// model.viewModelScope.launch(Dispatchers.IO) { -// CallerAutoPilotManager.sendStatusQueryReq() -// while (true) { -// delay(60000) //一分钟主动请求一次 -// CallerAutoPilotManager.sendStatusQueryReq() -// } -// }.also { -// timer = it -// } -// } - fun init(ctx: Context) { if (hasInit) { return @@ -109,17 +69,14 @@ object StatusManager { private fun onCreate(ctx: Context) { val values = model.status.value?.second ?: throw IllegalStateException("state is not right.") -// CallerAutoPilotStatusListenerManager.addListener(TAG, listener) -// AppStateManager.registerAppStateListener(appStateListener) -// req() values.map { when (it) { is CanStatus -> CanImpl(ctx) is IpcStatus -> IpcImpl(ctx) -// is NetStatus -> NetsImpl(ctx) is GpsStatus -> GpsImpl(ctx) is TracingStatus -> TracingImpl(ctx) is RTKStatus -> RTKImpl(ctx) + is OverViewStatus -> OverViewImpl(ctx) } }.also { flows += it } for (f in flows) { @@ -138,16 +95,6 @@ object StatusManager { } } - - fun registerListener(listener: IStatusListener) { - listeners.add(listener) - } - - - fun unRegisterListener(listener: IStatusListener) { - listeners.remove(listener) - } - fun show(container: ViewGroup) { if (container.childCount > 0) { if (container.visibility != View.VISIBLE) { @@ -166,9 +113,6 @@ object StatusManager { private fun onDestroy(ctx: Context) { hasInit = false -// CallerAutoPilotStatusListenerManager.removeListener(TAG) -// AppStateManager.unRegisterAppStateListener(appStateListener) -// timer?.cancel() flows.forEach { it.onDestroy() } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt index 84bc45f909..1cff920d33 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/entity/Status.kt @@ -1,5 +1,6 @@ package com.zhjt.mogo_core_function_devatools.status.entity +import com.mogo.eagle.core.data.status.StatusSummaryEntity import com.mogo.eagle.core.function.api.autopilot.* import com.mogo.eagle.core.function.call.autopilot.* import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing @@ -228,6 +229,24 @@ class TracingStatus(var state: Tracing = UNKNOWN): Status() { override fun isException(): Boolean = state.isException() } +class OverViewStatus(var hasException: Boolean = false): Status() { + override fun isException(): Boolean { + return hasException + } + + override fun equals(other: Any?): Boolean { + if (javaClass != other?.javaClass) return false + other as OverViewStatus + if (hasException != other.hasException) return false + return true + } + + override fun hashCode(): Int { + return 0 + } + +} + fun String.toState(msg: String?): Tracing? { val ss = msg?.split("|") var extra: Map? = null 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 new file mode 100644 index 0000000000..e2ce2558bd --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/OverViewImpl.kt @@ -0,0 +1,282 @@ +package com.zhjt.mogo_core_function_devatools.status.flow + +import android.Manifest +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.location.LocationManager +import android.util.Log +import androidx.core.location.LocationManagerCompat +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.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener +import com.mogo.eagle.core.function.api.telematic.IConnectStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.telematic.CallerTelematicStatusListenerManager +import com.mogo.eagle.core.utilcode.util.AppStateManager +import com.mogo.eagle.core.utilcode.util.IAppStateListener +import com.mogo.eagle.core.utilcode.util.PermissionUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.zhjt.mogo_core_function_devatools.status.entity.OverViewStatus +import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus +import com.zhjt.mogo_core_function_devatools.status.entity.toState +import mogo_msg.MogoReportMsg +import java.util.concurrent.atomic.AtomicBoolean + +internal class OverViewImpl(ctx: Context) : IFlow(ctx), + IMoGoDevaToolsListener, IMoGoAutopilotStatusListener, + IConnectStatusListener, IMogoStatusChangedListener { + + companion object { + const val TAG = "OverViewImpl" + } + + // =====GPS相关===== + private val registered = AtomicBoolean(false) + + private var receiver: CheckLocationReceiver? = null + + @Volatile + private var isServerException = false + + @Volatile + private var isGpsException = false + + @Volatile + private var isCloudSocketException = false + + @Volatile + private var isTracingException = false + + @Volatile + private var isFirst = true + + inner class CheckLocationReceiver(private val onClose: ()->Unit, private val onOpen:()-> Unit) : BroadcastReceiver() { + + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action == LocationManager.MODE_CHANGED_ACTION) { + if (isLocationEnabled()) { + onOpen.invoke() + } else { + onClose.invoke() + } + } + } + } + + private val onClose = { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } + + private val onOpen = { + if (!isGrandFineLocation()) { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } else { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } + } + + private fun isGrandFineLocation(): Boolean = try { + PermissionUtils.isGranted(Manifest.permission.ACCESS_FINE_LOCATION) + } catch (t: Throwable) { + t.printStackTrace() + false + } + + private val onStateListener = object : IAppStateListener { + + override fun onAppStateChanged(isForeground: Boolean) { + if (isForeground) { + val enable = isLocationEnabled() + val grant = isGrandFineLocation() + if (!enable || !grant) { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } else { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } + } + } + } + + override fun onCreate() { +// // 蓝牙魔方状态 +// CallerDevaToolsListenerManager.addListener(TAG, this) + // 司机屏Server服务是否开启的状态 + CallerTelematicStatusListenerManager.addListener(TAG, this) + // 云socket连接状态 + MogoStatusManager.getInstance() + .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + + val isGranted = checkIsGpsException() + if (!isGranted) { + PermissionUtils.requestAccessFineLocation(object : PermissionUtils.SimpleCallback { + override fun onGranted() { + Log.d(TAG,"权限: ${Manifest.permission.ACCESS_FINE_LOCATION} 被授予了....") + if (isLocationEnabled()) { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } else { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } + } + + override fun onDenied() { + ToastUtils.showShort("定位权限被拒绝, 可能导致RTK定位不准确,请开启~") + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } + }) + } + + if (registered.compareAndSet(false, true)) { + ctx.registerReceiver(CheckLocationReceiver(onClose, onOpen).also { receiver = it }, IntentFilter().also { it.addAction(LocationManager.MODE_CHANGED_ACTION) }) + } +// // 工控机连接状态外层状态栏已显示,先隐藏 +// CallerAutoPilotStatusListenerManager.addListener(TAG, this) + } + + private fun checkIsGpsException(): Boolean { + val isGranted = isGrandFineLocation() + AppStateManager.registerAppStateListener(onStateListener) + if (isLocationEnabled() && isGranted) { + isGpsException = false + checkIfNotException() + CallerDevaToolsListenerManager.invokeGpsStatus(true) + } else { + isGpsException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeGpsStatus(false) + } + return isGranted + } + + /** + * App定位是否打开 + */ + private fun isLocationEnabled() = LocationManagerCompat.isLocationEnabled(ctx.getSystemService(Context.LOCATION_SERVICE) as LocationManager) + + /** + * 魔方状态 + */ + override fun mofangStatus(status: Boolean) { + super.mofangStatus(status) +// if (!status) { +// send(OverViewStatus(true)) +// } + } + + /** + * 司机屏服务是否启动的状态 + */ + override fun onServerStatusChanged(isStarted: Boolean) { + super.onServerStatusChanged(isStarted) + if (!isStarted) { + isServerException = true + send(OverViewStatus(true)) + } else { + isServerException = false + checkIfNotException() + } + } + + /** + * 只监听云Socket状态 + */ + override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) { + if (StatusDescriptor.CLOUD_SOCKET == descriptor) { + if (!isTrue) { + isCloudSocketException = true + send(OverViewStatus(true)) + } else { + isCloudSocketException = false + checkIfNotException() + } + } + } + + /** + * 工控机监控节点 + */ + override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { + super.onAutopilotGuardian(guardianInfo) + val code = guardianInfo?.code + val message = guardianInfo?.msg + val newState = code?.toState(message) + if (newState != null) { + when (newState) { + TracingStatus.Tracing.MAP_DATA_NOT_EXIST, TracingStatus.Tracing.TRACK_NOT_EXIST, + TracingStatus.Tracing.TRACK_LOAD_FAIL, TracingStatus.Tracing.ROUTE_FAILED, TracingStatus.Tracing.UNKNOWN -> { + if (!isTracingException) { + isTracingException = true + send(OverViewStatus(true)) + CallerDevaToolsListenerManager.invokeTracingStatus(false) + } + } + TracingStatus.Tracing.MAP_TRA_TYPE, TracingStatus.Tracing.MAP_DATA_EXIST, + TracingStatus.Tracing.TRACK_FINDED, TracingStatus.Tracing.TRACK_LOADED, + TracingStatus.Tracing.ROUTE_LOADED -> { + // 默认是false,需要加第一次的判断 + if (isFirst || isTracingException) { + isFirst = false + isTracingException = false + // 不加锁,并行时多触发几次可接受 + checkIfNotException() + CallerDevaToolsListenerManager.invokeTracingStatus(true) + } + } + } + } + } + + private fun checkIfNotException() { + if (!isServerException && !isCloudSocketException && !isTracingException && !isGpsException) { + send(OverViewStatus(false)) + } + } + + /** + * 工控机连接状态 + */ + override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) { + super.onAutopilotIpcConnectStatusChanged(status, reason) + } + + + override fun onDestroy() { + super.onDestroy() +// CallerDevaToolsListenerManager.removeListener(TAG) + CallerTelematicStatusListenerManager.removeListener(TAG) + MogoStatusManager.getInstance() + .unregisterStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + CallerAutoPilotStatusListenerManager.removeListener(TAG) +// CallerAutoPilotStatusListenerManager.removeListener(TAG) + + try { + if (registered.compareAndSet(true, false) && receiver != null) { + ctx.unregisterReceiver(receiver) + } + } catch (t: Throwable) { + t.printStackTrace() + } + AppStateManager.unRegisterAppStateListener(onStateListener) + } +} \ 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/status/flow/trace/TracingImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt index c9f9ff338c..f04a3971ec 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/flow/trace/TracingImpl.kt @@ -1,7 +1,6 @@ package com.zhjt.mogo_core_function_devatools.status.flow.trace import android.content.* -import com.mogo.eagle.core.data.autopilot.* import com.mogo.eagle.core.function.api.autopilot.* import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener.Companion.STATUS_AUTOPILOT_RUNNING import com.mogo.eagle.core.function.call.autopilot.* @@ -37,7 +36,6 @@ internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopi CallerAutoPilotStatusListenerManager.addListener(TAG, this) } - override fun onAutopilotGuardian(guardianInfo: MogoReportMessage?) { super.onAutopilotGuardian(guardianInfo) val code = guardianInfo?.code @@ -70,9 +68,7 @@ internal class TracingImpl(ctx: Context): IFlow(ctx), IMoGoAutopi } } - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - super.onAutopilotStatusResponse(autoPilotStatusInfo) - val state = autoPilotStatusInfo.state + override fun onAutopilotStatusResponse(state: Int) { try { if (ipcStatus.get() != state) { if (state != STATUS_AUTOPILOT_RUNNING) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt index 18d353881f..91d6115301 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/model/StatusModel.kt @@ -2,13 +2,8 @@ package com.zhjt.mogo_core_function_devatools.status.model import androidx.lifecycle.* import com.mogo.eagle.core.function.call.autopilot.* -import com.zhjt.mogo_core_function_devatools.status.entity.CanStatus -import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus -import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus +import com.zhjt.mogo_core_function_devatools.status.entity.* //import com.zhjt.mogo_core_function_devatools.status.entity.NetStatus -import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus -import com.zhjt.mogo_core_function_devatools.status.entity.Status -import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.UNKNOWN import java.util.concurrent.atomic.* import kotlin.Pair @@ -19,12 +14,13 @@ internal class StatusModel : ViewModel() { const val TAG = "StatusModel" val DEFAULTS = Pair(null, ArrayList().also { + it += OverViewStatus() it += IpcStatus(CallerAutoPilotControlManager.isConnected()) it += CanStatus(false) - it += TracingStatus(UNKNOWN) +// it += TracingStatus(UNKNOWN) it += RTKStatus("", -1) // it += NetStatus(false) - it += GpsStatus(enabled = false, isGranted = false) +// it += GpsStatus(enabled = false, isGranted = false) }) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt new file mode 100644 index 0000000000..1845640015 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/StatusSummaryView.kt @@ -0,0 +1,34 @@ +package com.zhjt.mogo_core_function_devatools.status.ui + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.zhjt.mogo_core_function_devatools.R + +/** + * 状态汇总View控件 + */ +class StatusSummaryView@JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : FrameLayout( + context, + attrs, + defStyleAttr +), IMoGoAutopilotStatusListener { + companion object{ + private const val TAG = "SummaryStatusView" + } + + init { + LayoutInflater.from(context).inflate(R.layout.view_initiative_bad_case, this, true) + initView() + } + + private fun initView() { + + } +} \ 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/status/ui/adapter/StatusAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt index 8eb2ccbe6f..89f3963252 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/status/ui/adapter/StatusAdapter.kt @@ -5,10 +5,10 @@ import android.view.* import android.widget.* import androidx.core.content.* import androidx.recyclerview.widget.* +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.logger.* import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA -import com.mogo.eagle.core.utilcode.util.* import com.zhjt.mogo_core_function_devatools.R import com.zhjt.mogo_core_function_devatools.R.drawable import com.zhjt.mogo_core_function_devatools.status.entity.* @@ -39,9 +39,14 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec } fun bind(status: Status) { -// itemView.onClick { + itemView.onClick { // ToastUtils.showShort(getText(status)) -// } + if (status is OverViewStatus) { + CallerHmiManager.showStatusSummaryDialog() + } + } + iv.setBackgroundResource(0) + iv.setImageDrawable(null) when(status) { is IpcStatus -> { if (status.enabled) { @@ -99,6 +104,15 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_rtk_unknow) } } + is OverViewStatus -> { + if (status.hasException) { + iv.scaleType = ImageView.ScaleType.FIT_CENTER + iv.setImageResource(drawable.icon_red_warning) + } else { + iv.scaleType = ImageView.ScaleType.FIT_CENTER + iv.setImageResource(drawable.icon_grey_warning) + } + } } } @@ -140,6 +154,9 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList): Rec UNKNOWN -> "暂无轨迹" } } + is OverViewStatus -> { + "" + } } } } \ 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/trace/SyncConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt index 7a5ad33a75..e5464fd9d1 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/trace/SyncConfig.kt @@ -16,7 +16,6 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.zhjt.mogo_core_function_devatools.trace.network.StartUpTraceNetWorkModel import com.zhjt.service.chain.ChainLog -import com.zhjt.service.chain.TracingConstants object SyncConfig { @@ -24,12 +23,6 @@ object SyncConfig { private var traceId: String? = null fun update(context: Context) { - - // if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) { -// AppConfigInfo.widevineIDMd5 = -// DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp()) -// } - if (MoGoAiCloudClient.getInstance().aiCloudClientConfig != null) { AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token @@ -58,12 +51,10 @@ object SyncConfig { } @ChainLog( - linkChainLog = ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = ChainConstant.CHAIN_LINK_INIT, - endpoint = TracingConstants.Endpoint.PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_APP_INFO_CONFIG_UPDATE, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = ChainConstant.CHAIN_TYPE_INIT_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_INIT, + nodeAliasCode = ChainConstant.CHAIN_CODE_APP_INFO_CONFIG_UPDATE, + paramIndexes = [0] ) fun logOutConfig(appConfig: AppConfigInfo) { startUpTraceModel.report(traceId, { 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 c2fcbd8793..898f6e2e72 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 @@ -1,6 +1,8 @@ package com.zhjt.mogo_core_function_devatools.trace import android.content.Context +import android.os.Handler +import android.os.Looper import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.deva.chain.ChainLogParam @@ -11,11 +13,10 @@ import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA -import com.mogo.eagle.core.utilcode.util.DeviceUtils import com.mogo.eagle.core.utilcode.util.Utils +import com.zhidao.loglib.call.LogInfoManagerFactory import com.zhidao.loglib.fw.FileWriteManager import com.zhidao.loglib.fw.FwBuild -import com.zhjt.service.chain.core.ChainTraceStarter import mogo.telematics.pad.MessagePad class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { @@ -25,9 +26,18 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { private var init = false private var mContext: Context? = null + private val handler = Handler(Looper.getMainLooper()) { + if (it.what == 1) { + LogInfoManagerFactory.cacheTraceLogUpload() + delayUpload() + } + true + } + companion object { const val TAG = "TraceManager" + private const val DELAY_UPLOAD = 60 * 60 * 1000L val traceManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { TraceManager() @@ -42,68 +52,67 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { mContext = context // 初始化Trace抓取服务 val pkgName = Utils.getApp().packageName - ChainTraceStarter.start(pkgName, DeviceUtils.getMacAddress(), false) CallerCloudListenerManager.addListener(TAG, this) CallerAutopilotCarConfigListenerManager.addListener(TAG, this) // Trace过程中进行日志抓取,对日志进行配置 - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS] = - FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_INIT) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO] = + fwBuildMap[ChainConstant.CHAIN_TYPE_INIT_STATUS] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_INIT) + fwBuildMap[ChainConstant.CHAIN_TYPE_GNSS] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_GNSS) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT] = + fwBuildMap[ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_AUTO) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED] = + fwBuildMap[ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_DATA_TRACK) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY] = + fwBuildMap[ChainConstant.CHAIN_TYPE_SOCKET_TRAJECTORY] = FwBuild(false, 30, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_TRAJECTORY) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE] = + fwBuildMap[ChainConstant.CHAIN_TYPE_SOCKET_VEHICLE] = FwBuild(false, 30, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_VEHICLE) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] = - FwBuild(false, 30, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_TRAFFIC_LIGHT) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS] = - FwBuild(false, 30, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_PLANNING_OBJECTS) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS] = - FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_PLANNING_ACTIONS) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = - FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_NATIVE_LEAK) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_ANR] = + fwBuildMap[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_ADAS_TRAFFIC_LIGHT) + fwBuildMap[ChainConstant.CHAIN_TYPE_HMI] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_HMI_ACTIONS) + fwBuildMap[ChainConstant.CHAIN_TYPE_ANR_LEAK] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_ANR) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N] = - FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_CLOUD_WEB_SOCKET_V2N) - fwBuildMap[ChainConstant.CHAIN_LINK_LOG_HD_MAP] = + fwBuildMap[ChainConstant.CHAIN_TYPE_V2X] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_V2X) + fwBuildMap[ChainConstant.CHAIN_TYPE_HD_MAP] = FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_HD_MAP_BIZ) + fwBuildMap[ChainConstant.CHAIN_TYPE_WEAK_NETWORK] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_RECORD_WEAK_NETWORK) + fwBuildMap[ChainConstant.CHAIN_TYPE_OCH] = + FwBuild(true, -1, pkgName + ChainConstant.CHAIN_LINK_LOG_OCH) - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS] = + traceInfoCache[ChainConstant.CHAIN_TYPE_INIT_STATUS] = ChainLogParam(true, "ADAS连接状态") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_GNSSINFO] = + traceInfoCache[ChainConstant.CHAIN_TYPE_GNSS] = ChainLogParam(true, "ADAS自车定位") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT] = - ChainLogParam(true, "ADAS自动驾驶链路(包含: 自动驾驶状态交互,全局路径,到站提醒,节点状态,异常上报)") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED] = + traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT] = + ChainLogParam(true, "ADAS自动驾驶链路(包含: 自动驾驶状态交互,全局路径,到站提醒,节点状态,异常上报,PNC)") + traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED] = ChainLogParam(true, "ADAS感知物体") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY] = + traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_TRAJECTORY] = ChainLogParam(false, "ADAS车前引导线") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE] = + traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_VEHICLE] = ChainLogParam(false, "ADAS车辆底盘数据") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] = - ChainLogParam(false, "ADAS红绿灯数据") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS] = - ChainLogParam(false, "ADAS PLANNING 感知障碍物") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_ACTIONS] = - ChainLogParam(true, "ADAS PLANNING 决策行为") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_NATIVE_LEAK] = - ChainLogParam(true, "Native Leak Record") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_ANR] = + traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] = + ChainLogParam(true, "ADAS红绿灯数据") + traceInfoCache[ChainConstant.CHAIN_TYPE_HMI] = + ChainLogParam(true, "人机交互行为") + traceInfoCache[ChainConstant.CHAIN_TYPE_ANR_LEAK] = ChainLogParam(true, "ANR Record") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_CLOUD_V2N] = - ChainLogParam(true, "Cloud WebSocket V2N") - traceInfoCache[ChainConstant.CHAIN_LINK_LOG_HD_MAP] = + traceInfoCache[ChainConstant.CHAIN_TYPE_V2X] = + ChainLogParam(true, "V2X(V2N/V2I)") + traceInfoCache[ChainConstant.CHAIN_TYPE_HD_MAP] = ChainLogParam(true, "HD Map Caller") + traceInfoCache[ChainConstant.CHAIN_TYPE_WEAK_NETWORK] = + ChainLogParam(true, "WeakNetWork Record") + + MoGoAiCloudClientConfig.getInstance() FileWriteManager.getInstance() - .init(context, MoGoAiCloudClientConfig.getInstance().sn, pkgName, fwBuildMap) + .init(context, "", pkgName, fwBuildMap) FileWriteManager.getInstance().registerListener { type -> val param = traceInfoCache[type] param?.let { @@ -112,9 +121,14 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { } CallerDevaToolsListenerManager.invokeDevaToolsFwThreadClose() } + delayUpload() init = true } + private fun delayUpload() { + handler.sendEmptyMessageDelayed(1, DELAY_UPLOAD) + } + override fun tokenGot(token: String, sn: String) { FileWriteManager.getInstance().updateDeviceId(sn) syncConfig() @@ -134,7 +148,7 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { fun refreshTraceInfo(map: HashMap) { map.forEach { (type, param) -> - if (type != ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS) { + if (type != ChainConstant.CHAIN_TYPE_INIT_STATUS) { val fwBuild = this.fwBuildMap[type] fwBuild?.let { CallerLogger.d("$M_DEVA$TAG", "param : ${param.des} , record : ${param.record}") @@ -149,7 +163,7 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener { syncConfig() } - fun syncConfig(){ + fun syncConfig() { mContext?.let { SyncConfig.update(it) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeManager.kt index b83a1f0532..e42e314fa4 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeManager.kt @@ -4,7 +4,6 @@ import android.content.Context import com.mogo.aicloud.services.socket.IMogoOnMessageListener import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager import com.mogo.cloud.passport.MoGoAiCloudClient -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.deva.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager @@ -31,6 +30,7 @@ class IPCUpgradeManager: IMogoOnMessageListener , private var mContext: Context? = null private val ipcUpgradeNetWorkModel = IPCUpgradeNetWorkModel() + @Volatile private var autopilotStatus: Int? = null //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中 private var hasIPCUpgradeTask = false //是否有工控机升级任务,默认没有该任务 @@ -72,18 +72,15 @@ class IPCUpgradeManager: IMogoOnMessageListener , //更新下载or升级状态 CallerHmiManager.showAdUpgradeStatus(it) } - - } } /** * 自动驾驶状态信息 - * @param autoPilotStatusInfo 状态信息 */ - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - autopilotStatus = autoPilotStatusInfo.state + override fun onAutopilotStatusResponse(state: Int) { //有升级任务,且不处于自动驾驶状态,进行升级提示 + autopilotStatus = state if(hasIPCUpgradeTask && autopilotStatus!=2){ ipcUpgradeStateInfoTask?.let { var releaseId="" diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/ObuUpgradeAppNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/ObuUpgradeAppNetWorkManager.kt index 2a7a5c249b..cc97ca970d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/ObuUpgradeAppNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/ObuUpgradeAppNetWorkManager.kt @@ -1,10 +1,7 @@ package com.zhjt.mogo_core_function_devatools.upgrade -import android.content.* -import android.util.Log import com.mogo.cloud.passport.* import com.mogo.commons.constants.* -import com.mogo.eagle.core.data.deva.bindingcar.* import com.mogo.eagle.core.data.obu.MogoObuConst.TAG_UPGRADE_OBU import com.mogo.eagle.core.function.api.devatools.download.DownloadType.OBU import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager.downLoadPackage @@ -14,10 +11,6 @@ import com.mogo.eagle.core.network.utils.* import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.* -import io.reactivex.* -import io.reactivex.android.schedulers.* -import io.reactivex.disposables.* -import io.reactivex.schedulers.* import kotlinx.coroutines.* import okhttp3.* @@ -40,27 +33,28 @@ class ObuUpgradeAppNetWorkManager private constructor() { * mac :工控机mac地址, * screenType : 类型 */ - fun getObuUpgradeInfo(context: Context?, mac: String?, versionName: String) { // String sn = "X20202203105S688HZ"; + fun getObuUpgradeInfo(mac: String?, versionName: String) { + // String sn = "X20202203105S688HZ"; // String mac1 = "48:b0:2d:4d:33:40"; scope.launch { try { val sn = MoGoAiCloudClientConfig.getInstance().sn - d(SceneConstant.M_BINDING + TAG_UPGRADE_OBU, "getObuUpgradeInfo mac = $mac ---sn = $sn ---versionName = $versionName --host = ${HostConst.getHost()}") + d(SceneConstant.M_DEVA + TAG_UPGRADE_OBU, "getObuUpgradeInfo mac = $mac ---sn = $sn ---versionName = $versionName --host = ${HostConst.getHost()}") val request = UpgradeAppRequest(sn, mac, "7", null, "0") val requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)) val info = mUpgradeApiService.getUpgradeInfo(requestBody) if (info.result == null) { - d(SceneConstant.M_BINDING + TAG_UPGRADE_OBU, "getObuUpgradeInfo onNext info == null") + d(SceneConstant.M_DEVA + TAG_UPGRADE_OBU, "getObuUpgradeInfo onNext info == null") deleteObuFile() } else { - d(SceneConstant.M_BINDING + TAG_UPGRADE_OBU, "getObuUpgradeInfo appFileName = " + info.result.appFileName + " ----url = " + info.result.appUrl + " ----name = " + info.result.versionName + " --obuVersionName =" + versionName + " ---info.result = " + info.result) + d(SceneConstant.M_DEVA + TAG_UPGRADE_OBU, "getObuUpgradeInfo appFileName = " + info.result.appFileName + " ----url = " + info.result.appUrl + " ----name = " + info.result.versionName + " --obuVersionName =" + versionName + " ---info.result = " + info.result) if (info.result.versionName.toString() != versionName) { //判断是否下载,当文件名称不一致的时候,就下载 downLoadPackage(OBU, info.result.appFileName, info.result.appUrl) } } } catch (t: Throwable) { t.printStackTrace() - e(SceneConstant.M_BINDING + TAG_UPGRADE_OBU, "getObuUpgradeInfo e = $t") //请求出错,需要删除相关文件 + e(SceneConstant.M_DEVA + TAG_UPGRADE_OBU, "getObuUpgradeInfo e = $t") //请求出错,需要删除相关文件 deleteObuFile() } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt index 46a1b8d37e..5938237bd3 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeAppNetWorkManager.kt @@ -71,7 +71,7 @@ class UpgradeAppNetWorkManager private constructor() { Log.d(TAG, "getAppUpgradeInfo: -> records:" + records?.entries?.joinToString(",") { itx -> "key:${itx.key} -> value:[${itx.value.joinToString(",") { "${it.first},${it.second}" } }]"}) val versionCode = AppUtils.getAppVersionCode() val versionName = AppUtils.getAppVersionName() - Log.d(SceneConstant.M_BINDING + TAG, "getAppUpgradeInfo mac = $macAddress---type = $type---sn = $sn---versionCode =$versionCode---versionName =$versionName") + Log.d(SceneConstant.M_DEVA + TAG, "getAppUpgradeInfo mac = $macAddress---type = $type---sn = $sn---versionCode =$versionCode---versionName =$versionName") val request = UpgradeAppRequest(sn, macAddress, type, versionName, "1") val requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request)) provider?.recordUpgradeRecord(sn ?: "", macAddress, type, FunctionBuildConfig.isSupportPatchUpgrade) @@ -105,7 +105,7 @@ class UpgradeAppNetWorkManager private constructor() { private suspend fun doUpgrade(info: UpgradeAppInfo) { if (info.result != null) { val versionCode = AppUtils.getAppVersionCode() - Log.d(SceneConstant.M_BINDING + TAG, "UpgradeAppInfo url = " + info.result.appUrl + "----code = " + info.result.versionCode + "--versionCode =" + versionCode + "--info.result = " + info.result) + Log.d(SceneConstant.M_DEVA + TAG, "UpgradeAppInfo url = " + info.result.appUrl + "----code = " + info.result.versionCode + "--versionCode =" + versionCode + "--info.result = " + info.result) if (info.result.versionCode > versionCode) { val patchInfo = info.result.patchInfo var downloadUrl: String = info.result.appUrl @@ -172,7 +172,7 @@ class UpgradeAppNetWorkManager private constructor() { deleteApkFile() } } else { - Log.d(SceneConstant.M_BINDING + TAG, "UpgradeAppInfo onNext info == null") + Log.d(SceneConstant.M_DEVA + TAG, "UpgradeAppInfo onNext info == null") deleteApkFile() } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt index 038c36ce71..b0219909a7 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/UpgradeManager.kt @@ -2,7 +2,6 @@ package com.zhjt.mogo_core_function_devatools.upgrade import android.content.Context import android.content.pm.PackageInstaller -import android.util.Log import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.function.api.upgrade.IMoGoUpgradeProvider import com.mogo.eagle.core.function.call.base.CallerBase @@ -30,6 +29,7 @@ import kotlinx.coroutines.* import java.io.IOException import java.util.concurrent.ConcurrentHashMap +//todo emArrow trace class UpgradeManager : IDownloadListener { companion object { @@ -75,7 +75,7 @@ class UpgradeManager : IDownloadListener { } override fun onFinished(url: String, path: String) { - Log.d(TAG, "onFinished downloadUrl = $url") + CallerLogger.d("$M_DEVA$TAG", "onFinished downloadUrl = $url") doOnFinished(url, path) } @@ -196,7 +196,7 @@ class UpgradeManager : IDownloadListener { if (type == APK || type == PATCH) { scope.launch { upgradeProvider?.recordDownloadFailed(url, error ?: "下载失败") } } else if (type == OBU) { - CallerLogger.e("${SceneConstant.M_OBU}${MogoObuConst.TAG_UPGRADE_OBU}", "----updateObuUpgradeStatus errorMsg = $error ") + CallerLogger.e("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", "----updateObuUpgradeStatus errorMsg = $error ") //下载失败,删除文件夹 CallerObuApiManager.deleteObuFile() } @@ -216,7 +216,6 @@ class UpgradeManager : IDownloadListener { CallerLogger.d("$M_DEVA$TAG", "updateUpgradeProgress onPause ----> ") } override fun onProgress(url: String?, length: Int) { -// CallerLogger.d("$M_DEVA$TAG", "updateUpgradeProgress onPause ----> length = $length") val type = types[url] if (type == APK || type == PATCH) { if (length in 1..99) { @@ -235,8 +234,7 @@ class UpgradeManager : IDownloadListener { } override fun onError(url: String?, errorMsg: String?) { - CallerLogger.d("$M_DEVA$TAG", "updateUpgradeProgress errorMsg = $errorMsg") - Log.e(TAG, "updateUpgradeProgress errorMsg = $errorMsg") + CallerLogger.e(TAG, "updateUpgradeProgress errorMsg = $errorMsg") //出错后,去掉下载进度ui,提示检查网络 updateStatusBarDownloadView(false, "download", 0) } @@ -249,10 +247,10 @@ class UpgradeManager : IDownloadListener { private fun handleObuUpgrade(localPath: String) { //下载完成,解压文件 try { - CallerLogger.d("${SceneConstant.M_OBU}${MogoObuConst.TAG_UPGRADE_OBU}", " onFinished localPath = $localPath") + CallerLogger.d("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", " onFinished localPath = $localPath") val dest = File(localPath) val files = ZipUtils.unzipFile(localPath, Config.downLoadUnzipObuPath) - CallerLogger.d("${SceneConstant.M_OBU}${MogoObuConst.TAG_UPGRADE_OBU}", " onFinished file = ${Config.downLoadObuPath + dest.name} -----files = $files ") + CallerLogger.d("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", " onFinished file = ${Config.downLoadObuPath + dest.name} -----files = $files ") //1传给obu升级,升级成功,2需要删除相应文件夹 var md5Path = "" var tarPath = "" @@ -264,10 +262,10 @@ class UpgradeManager : IDownloadListener { tarPath = f.path } } - CallerLogger.d("${SceneConstant.M_OBU}${MogoObuConst.TAG_UPGRADE_OBU}", "updateObuUpgradeStatus ---md5Path = $md5Path -----tarPath = $tarPath ") + CallerLogger.d("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", "updateObuUpgradeStatus ---md5Path = $md5Path -----tarPath = $tarPath ") CallerObuApiManager.uploadObuPack(arrayOf(md5Path, tarPath)) } catch (e: IOException) { - CallerLogger.e("${SceneConstant.M_OBU}${MogoObuConst.TAG_UPGRADE_OBU}", "----updateObuUpgradeStatus e = $e ") + CallerLogger.e("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", "----updateObuUpgradeStatus e = $e ") //解压失败,删除文件夹 CallerObuApiManager.deleteObuFile() e.printStackTrace() diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt index d53d6a3948..483e2a083c 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/provider/MoGoUpgradeProviderImpl.kt @@ -16,7 +16,6 @@ import com.zhjt.mogo_core_function_devatools.upgrade.provider.db.vo.UpgradeRecor import com.zhjt.mogo_core_function_devatools.upgrade.provider.db.vo.UpgradeRecord.Type.FULL import com.zhjt.mogo_core_function_devatools.upgrade.provider.db.vo.UpgradeRecord.Type.PATCH import com.zhjt.service.chain.* -import com.zhjt.service.chain.TracingConstants.Endpoint import java.util.TreeMap import java.util.concurrent.TimeUnit @@ -297,12 +296,10 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider { @ChainLog( - linkChainLog = ChainConstant.CHAIN_LINK_LOG_CONNECT_STATUS, - linkCode = ChainConstant.CHAIN_LINK_CLOUD, - endpoint = Endpoint.PAD, - nodeAliasCode = ChainConstant.CHAIN_ALIAS_CODE_CLOUD_PASSPORT_TOKEN, - paramIndexes = [0], - clientPkFileName = "sn" + linkChainLog = ChainConstant.CHAIN_TYPE_INIT_STATUS, + linkCode = ChainConstant.CHAIN_SOURCE_CLOUD, + nodeAliasCode = ChainConstant.CHAIN_CODE_UPGRADE_APP, + paramIndexes = [0] ) private fun onUpgradeRecordLinkLog(extra: Map) {} } \ 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/weaknetwork/DetectResultImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/DetectResultImpl.kt new file mode 100644 index 0000000000..abe0ff0a72 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/DetectResultImpl.kt @@ -0,0 +1,27 @@ +package com.zhjt.mogo_core_function_devatools.weaknetwork + +import android.util.Log +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.weak.network.StubImpl +import com.zhjt.service.chain.ChainLog + +class DetectResultImpl: StubImpl.ReportDetectResultListener { + + companion object { + private const val TAG = "DetectResultImpl" + } + + override fun onDetectResult(resultsJson: String?) { + resultsJson?.let { invokeWeakResult(it) } + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_WEAK_NETWORK, + linkCode = ChainConstant.CHAIN_SOURCE_WEAK_NETWORK, + nodeAliasCode = ChainConstant.CHAIN_CODE_RECORD_WEAK_NETWORK, + paramIndexes = [0] + ) + private fun invokeWeakResult(jsonStr: String) { + Log.d(TAG, jsonStr) + } +} \ 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/weaknetwork/WeakNetworkStrategy.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/WeakNetworkStrategy.kt new file mode 100644 index 0000000000..e485217387 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/weaknetwork/WeakNetworkStrategy.kt @@ -0,0 +1,81 @@ +package com.zhjt.mogo_core_function_devatools.weaknetwork + +import android.util.Log +import com.mogo.cloud.network.WeakNetworkManager +import com.mogo.cloud.network.WeakNetworkManager.setListener +import com.mogo.eagle.core.data.deva.chain.ChainConstant +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.weak.network.SdtManager +import com.zhjt.service.chain.ChainLog +import java.util.concurrent.locks.ReentrantReadWriteLock + +object WeakNetworkStrategy { + + private const val TAG = "WeakNetworkStrategy" + + // 记录到链路日志中的时间间隔 + private const val OUTPUT_TIME_INTERVAL = 15000 + + private var lastOutputTime = 0L + + private val lock by lazy { + ReentrantReadWriteLock() + } + + private val writeLock by lazy { + lock.writeLock() + } + + private val readLock by lazy { + lock.readLock() + } + + fun startListen() { + setListener(object : WeakNetworkManager.OnWeakHttpListener { + override fun onHttpRttReceived(hashCode: Int, url: String, timeStamp: Long) { + outputLog(url, timeStamp) + } + + override fun onFailEvent(hashCode: Int, url: String, timeStamp: Long, currentFailCount: Long) { + outputLog(url, timeStamp, true) + } + + override fun onWeakNetworkEvent() { +// // 大而全接口干扰,需排除掉 +// Log.d(TAG, "收到弱网事件!") + } + }) + } + + fun stopListen() { + setListener(null) + } + + private fun outputLog(url: String, timeStamp: Long, isFail: Boolean = false) { + ThreadUtils.getIoPool().submit { + writeLock.lock() + try { + val currentTime = System.currentTimeMillis() + if (currentTime - lastOutputTime > OUTPUT_TIME_INTERVAL) { + invokeWeakResult("url为:$url, 耗时为:$timeStamp${if (isFail) " 连接失败!" else ""}") + SdtManager.startActiveCheck() + lastOutputTime = currentTime + } + } catch (e: Exception) { + Log.e(TAG, "out put exception:${e.message}") + } finally { + writeLock.unlock() + } + } + } + + @ChainLog( + linkChainLog = ChainConstant.CHAIN_TYPE_WEAK_NETWORK, + linkCode = ChainConstant.CHAIN_SOURCE_WEAK_NETWORK, + nodeAliasCode = ChainConstant.CHAIN_CODE_RECORD_WEAK_NETWORK, + paramIndexes = [0] + ) + private fun invokeWeakResult(jsonStr: String) { + Log.d(TAG, jsonStr) + } +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_grey_warning.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_grey_warning.png new file mode 100644 index 0000000000..3a94c8d5e4 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_grey_warning.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_red_warning.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_red_warning.png new file mode 100644 index 0000000000..ad91fee6fb Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_red_warning.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml index 2642df0efb..ec0776154c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/AndroidManifest.xml @@ -58,7 +58,7 @@ android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize" android:enabled="true" android:hardwareAccelerated="true" - android:launchMode="singleTop" + android:launchMode="singleTask" android:resizeableActivity="false" android:resumeWhilePausing="true" android:screenOrientation="${SCREEN_ORIENTATION}" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt index 32ba03dead..5f66e68f52 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloat.kt @@ -41,6 +41,7 @@ class WarningFloat { } + /** * 浮窗的属性构建类,支持链式调用 */ @@ -136,6 +137,10 @@ class WarningFloat { config.immersionStatusBar = immersionStatusBar } + fun slideDel(status: Boolean) = apply { + this.config.defaultSlideDel = status + } + /** * 设置浮窗的出入动画 * @param floatAnimator 浮窗的出入动画,为空时不执行动画 @@ -194,7 +199,10 @@ class WarningFloat { content?.let { config.layoutId = null config.layoutView = it - Reminder.enqueue(getLifecycleOwner(activity), WarningFloatReminder(activity, config, it)) + Reminder.enqueue( + getLifecycleOwner(activity), + WarningFloatReminder(activity, config, it) + ) } } else { WarningFloatWindowManager.create(activity, config) @@ -214,7 +222,11 @@ class WarningFloat { } - internal class WarningFloatReminder(private val activity: Context, private val config: WarningNotificationConfig, content: View): ViewReminder(content) { + internal class WarningFloatReminder( + private val activity: Context, + private val config: WarningNotificationConfig, + content: View + ) : ViewReminder(content) { private var hasShow = false @@ -235,7 +247,8 @@ class WarningFloat { } } - fun isShow(): Boolean = WarningFloatWindowManager.getHelper(config.floatTag)?.isShow() ?: false + fun isShow(): Boolean = + WarningFloatWindowManager.getHelper(config.floatTag)?.isShow() ?: false fun resetExpireTime(expireTime: Long) { if (!isShow()) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt index 3ef7faaee2..1648f35985 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningFloatWindowHelper.kt @@ -128,7 +128,9 @@ internal class WarningFloatWindowHelper( // 设置触摸监听,直接关掉弹窗 frameLayout?.setOnTouchListener { _, _ -> - exitAnim() + if(config.defaultSlideDel){ + exitAnim() + } false } @@ -170,9 +172,9 @@ internal class WarningFloatWindowHelper( WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS addListener(object : Animator.AnimatorListener { - override fun onAnimationRepeat(animation: Animator?) {} + override fun onAnimationRepeat(animation: Animator) {} - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { config.isAnim = false if (!config.immersionStatusBar) { // 不需要延伸到屏幕外了,防止屏幕旋转的时候,浮窗处于屏幕外 @@ -181,9 +183,9 @@ internal class WarningFloatWindowHelper( } } - override fun onAnimationCancel(animation: Animator?) {} + override fun onAnimationCancel(animation: Animator) {} - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { floatingView.visibility = View.VISIBLE config.isAnim = true } @@ -214,13 +216,13 @@ internal class WarningFloatWindowHelper( params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS animator.addListener(object : Animator.AnimatorListener { - override fun onAnimationRepeat(animation: Animator?) {} + override fun onAnimationRepeat(animation: Animator) {} - override fun onAnimationEnd(animation: Animator?) = remove() + override fun onAnimationEnd(animation: Animator) = remove() - override fun onAnimationCancel(animation: Animator?) {} + override fun onAnimationCancel(animation: Animator) {} - override fun onAnimationStart(animation: Animator?) {} + override fun onAnimationStart(animation: Animator) {} }) animator.start() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt index 79d025bdd4..e1beb19212 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/notification/WarningNotificationConfig.kt @@ -67,7 +67,10 @@ data class WarningNotificationConfig( var width: Int = WindowManager.LayoutParams.WRAP_CONTENT, // 窗口高度 - var height: Int = WindowManager.LayoutParams.WRAP_CONTENT + var height: Int = WindowManager.LayoutParams.WRAP_CONTENT, + + // 默认滑动删除 + var defaultSlideDel :Boolean = true ) { var isEnqueue: Boolean = false var isOverride: Boolean = true diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index 74b91eeb29..6d5877ef2c 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -3,7 +3,7 @@ package com.mogo.eagle.core.function.hmi.ui import android.content.Context import android.text.TextUtils import android.util.* -import android.view.ViewGroup +import android.view.* import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import com.alibaba.android.arouter.facade.annotation.Route @@ -22,25 +22,27 @@ import com.mogo.eagle.core.data.biz.notice.NoticeNormalData import com.mogo.eagle.core.data.biz.notice.NoticeTrafficStylePushData import com.mogo.eagle.core.function.api.hmi.warning.IMoGoHmiProvider import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener -import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.hmi.* import com.mogo.eagle.core.function.call.v2x.CallerV2XWarningListenerManager import com.mogo.eagle.core.function.hmi.ui.camera.RoadVideoDialog +import com.mogo.eagle.core.function.hmi.ui.lookaround.* import com.mogo.eagle.core.function.hmi.ui.notice.DispatchDialogManager import com.mogo.eagle.core.function.hmi.ui.notice.NoticeCheckDialog import com.mogo.eagle.core.function.hmi.ui.notice.traffic.NoticeTrafficDialog import com.mogo.eagle.core.function.hmi.ui.setting.CameraLiveView.Companion.cameraLiveView +import com.mogo.eagle.core.function.hmi.ui.setting.StatusView import com.mogo.eagle.core.function.hmi.ui.setting.ToolsView.Companion.toolsView import com.mogo.eagle.core.function.hmi.ui.tools.AdUpgradeDialog import com.mogo.eagle.core.function.hmi.ui.tools.ModifyBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.tools.ToBindingCarDialog import com.mogo.eagle.core.function.hmi.ui.tools.UpgradeAppDialog import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView +import com.mogo.eagle.core.utilcode.floating.* import com.mogo.eagle.core.utilcode.kotlin.safeCancel import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI -import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.* import com.zhjt.service_biz.BizConfig import kotlinx.coroutines.* import kotlinx.coroutines.selects.* @@ -62,6 +64,11 @@ class MoGoHmiProvider : IMoGoHmiProvider { private var lastShowV2XJob: Job? = null private var context: Context? = null + /** + * 360环视窗口引用 + */ + private val lookAround by lazy { AtomicReference() } + private val scope by lazy { CoroutineScope(Dispatchers.Default + SupervisorJob()) } override fun init(context: Context?) { @@ -112,7 +119,7 @@ class MoGoHmiProvider : IMoGoHmiProvider { ttsMap[v2xType] = System.currentTimeMillis() } } - CallerLogger.d("${SceneConstant.M_OBU}${TAG}", "warningV2X v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent ") + CallerLogger.d("${M_HMI}${TAG}", "warningV2X v2xType = $v2xType ---alertContent = $alertContent ---ttsContent = $ttsContent ") val playTTS = !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) context?.let { val warningContent = alertContent ?: EventTypeEnumNew.getWarningContent(v2xType) @@ -312,4 +319,41 @@ class MoGoHmiProvider : IMoGoHmiProvider { } } + override fun show360LookAround() { + val activity = AppStateManager.currentActivity() ?: return + val old = lookAround.get() + if (old != null && old.isShowing()) { + return + } + old?.hide() + MoGoPopWindow.Builder() + .attachToActivity(activity) + .contentView(M1LookAroundView(activity)) + .draggable(true) + .isDismissOnTouchOutside(false) + .gravityInActivity(Gravity.CENTER) + .width(700) + .height(1400) + .onDismissed { + lookAround.set(null) + } + .build().also { + lookAround.set(it) + }.show() + } + + override fun hide360LookAround() { + val old = lookAround.get() + if (old == null || !old.isShowing()) { + return + } + old.hide() + } + + override fun is360LookAroundShowing(): Boolean { + return lookAround.get()?.isShowing() ?: false + } + override fun showStatusSummaryDialog() { + context?.let { StatusView.statusView.toggle(it) } + } } \ 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/logcatch/AbsLogView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsLogView.kt index b83074ecb1..a0b5817e6d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsLogView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/logcatch/AbsLogView.kt @@ -133,7 +133,7 @@ abstract class AbsLogView : ILogView, TouchProxy.OnTouchEventListener { } systemLayoutParams?.apply { format = PixelFormat.TRANSPARENT - gravity = GravityCompat.START or Gravity.TOP + gravity = Gravity.START or Gravity.TOP } mLogViewLayoutParams.gravity = GravityCompat.START or Gravity.TOP //动态注册关闭系统弹窗的广播 @@ -352,7 +352,7 @@ abstract class AbsLogView : ILogView, TouchProxy.OnTouchEventListener { mWindowManager.updateViewLayout(mRootView, layoutAttrs) } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { endMoveAndRecord() } }) 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 new file mode 100644 index 0000000000..235049fa90 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt @@ -0,0 +1,347 @@ +package com.mogo.eagle.core.function.hmi.ui.lookaround + +import android.content.* +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 +import android.widget.Toast +import com.mogo.eagle.core.function.api.autopilot.* +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.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.Utils +import kotlinx.coroutines.* +import kotlinx.coroutines.Runnable +import kotlinx.coroutines.flow.* +import java.util.concurrent.atomic.AtomicReference +import kotlin.math.* + +class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChassisSteeringStateListener { + + constructor(context: Context?) : super(context) + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + + companion object { + private const val TAG = "M1LookAroundView" + + private const val BROKE_LINE_LENGTH = 40f + + private const val VEHICLE_STEERING_RATIO = 21 + } + + init { + holder.addCallback(this) + } + + private val handler by lazy { AtomicReference() } + + private val bitmapPaint by lazy { Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG).also { it.xfermode = null } } + + private val routerPaint = Paint().also { + it.color = Color.RED + it.isAntiAlias = true + it.style = STROKE + it.strokeWidth = 5f + } + + private val brokePaint = Paint().also { + it.color = Color.RED + it.isAntiAlias = true + it.style = STROKE + it.strokeJoin = Paint.Join.ROUND + it.strokeWidth = 5f + } + + private val brokePath by lazy { Path() } + + private val routerPath = Path() + + private val innerRect by lazy { RectF() } + + private val outerRect by lazy { RectF() } + + /** + * 方向盘转角 + */ + @Volatile + private var steering: Float = 0f + + @Volatile + private var surfaceWidth = 0 + + @Volatile + private var surfaceHeight = 0 + + @Volatile + private var isSurfaceValid = false + + @Volatile + private var data: LookAroundData? = null + + override fun surfaceCreated(holder: SurfaceHolder) { + val old = handler.get() + if (old == null) { + handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) }) + } else { + old.looper.quitSafely() + handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) }) + } + handler.get()?.removeCallbacks(this) + handler.get()?.post(this) + isSurfaceValid = true + } + + override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { + this.surfaceWidth = width + this.surfaceHeight = height + } + + override fun surfaceDestroyed(holder: SurfaceHolder) { + isSurfaceValid = false + } + + override fun run() { + var isTimedBlock = false + try { + Log.d(TAG, "--- 1 ---") + if (!isSurfaceValid) { + isTimedBlock = true + return + } + if (this.surfaceWidth <= 0 || this.surfaceHeight <= 0) { + Log.d(TAG, "--- 2 ---") + isTimedBlock = true + return + } + Log.d(TAG, "--- 3 ---") + val data = this.data ?: return + val targetX = data.targetX + val targetY = data.targetY + val targetWidth = data.targetWidth + val targetHeight = data.targetHeight + val bitmapWidth = data.bitmapWidth + val bitmapHeight = data.bitmapHeight + val scaleX = this.surfaceWidth * 1.0f / bitmapWidth + val scaleY = this.surfaceHeight * 1.0f / bitmapHeight + val bytes = data.data + if (bytes == null) { + isTimedBlock = true + Log.d(TAG, "--- 4 ---") + return + } + Log.d(TAG, "--- 5 ---") + val canvas = holder.lockCanvas() + try { + if (canvas == null) { + Log.d(TAG, "--- 6 ---") + isTimedBlock = true + return + } + //1. 绘制图片 + var startTime = SystemClock.elapsedRealtime() + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) + Log.d(TAG, "--- cost for decode bitmap: ${SystemClock.elapsedRealtime() - startTime}ms.") + if (bitmap == null) { + Log.d(TAG, "--- 7 ---") + isTimedBlock = true + return + } + try { + startTime = SystemClock.elapsedRealtime() + canvas.save() + canvas.scale(scaleX, scaleY) + canvas.drawBitmap(bitmap, 0f, 0f, bitmapPaint) + } finally { + canvas.restore() + if (!bitmap.isRecycled) { + bitmap.recycle() + } + Log.d(TAG, "--- draw decoded bitmap cost: ${SystemClock.elapsedRealtime() - startTime}ms.") + } + //2. 绘制车的信息 + Log.d(TAG, "--- 8 ---") + val newTargetX = targetX * scaleX + val newTargetY = targetY * scaleY + val newTargetWidth = targetWidth * scaleX + val newTargetHeight = targetHeight * scaleY + try { + //2.1 绘制车前的转向角 + canvas.save() + var steering = this.steering + if (abs(steering) < 1) { + steering = 0f + } + if (steering == 0f) { + canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY) + routerPath.reset() + val halfX = newTargetWidth * 0.5f + var startX = - halfX + val startY= 0f + routerPath.moveTo(startX, startY) + var endX = startX + val endY = - newTargetY + routerPath.lineTo(endX, endY) + canvas.drawPath(routerPath, routerPaint) + startX += newTargetWidth + endX += newTargetWidth + routerPath.reset() + routerPath.moveTo(startX, startY) + routerPath.lineTo(endX, endY) + canvas.drawPath(routerPath, routerPaint) + } else { + val outerAngle = abs(steering * 1.0 / VEHICLE_STEERING_RATIO) + val radians = Math.toRadians(outerAngle) + val d = (newTargetHeight / tan(radians)).toFloat() + if (steering < 0) { + // 左打轮 + // 将坐标原点平移到圆心 + canvas.translate(newTargetX - (d - newTargetWidth), newTargetY + newTargetHeight) + //外圆半径 + val outerR = (newTargetHeight / sin(radians)).toFloat() + //内圆半径 + val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat() + val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0) + outerRect.set(-outerR, -outerR, outerR, outerR) + innerRect.set(-innerR, -innerR, innerR, innerR) + canvas.drawArc(outerRect, -outerAngle.toFloat(), -60f, false, routerPaint) + canvas.drawArc(innerRect, -innerAngle.toFloat(), -60f, false, routerPaint) + } + + if (steering > 0) { + //右打轮 + // 将坐标原点平移到圆心 + canvas.translate(newTargetX + d, newTargetY + newTargetHeight) + //外圆半径 + val outerR = (newTargetHeight / sin(radians)).toFloat() + //内圆半径 + val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat() + val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0) + outerRect.set(-outerR, -outerR, outerR, outerR) + innerRect.set(-innerR, -innerR, innerR, innerR) + canvas.drawArc(outerRect, 180f + outerAngle.toFloat(), 60f, false, routerPaint) + canvas.drawArc(innerRect, 180f + innerAngle.toFloat(), 60f, false, routerPaint) + } + } + } finally { + canvas.restore() + } + + try { + //2.2 绘制车周围盲区标定 + canvas.save() + canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY) + Log.d(TAG, "--- 9 ---:[$targetX:$newTargetX, $targetY:$newTargetY, $targetWidth:$newTargetWidth, $targetHeight:$newTargetHeight]") + val halfTargetWidth = newTargetWidth * 0.5f + var startX = -halfTargetWidth + var startY = BROKE_LINE_LENGTH + var endX = startX + var endY = 0f + // 绘制左上角 + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endX += BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + + // 绘制右上角 + startX = halfTargetWidth - BROKE_LINE_LENGTH + startY = 0f + + endX = halfTargetWidth + endY = 0f + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endY += BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + + //绘制左下角 + startX = -halfTargetWidth + startY = newTargetHeight - BROKE_LINE_LENGTH + endX = startX + endY = newTargetHeight + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endX += BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + + //绘制右下角 + startX = halfTargetWidth - BROKE_LINE_LENGTH + startY = newTargetHeight + endX = halfTargetWidth + endY = startY + brokePath.reset() + brokePath.moveTo(startX, startY) + brokePath.lineTo(endX, endY) + endY -= BROKE_LINE_LENGTH + brokePath.lineTo(endX, endY) + canvas.drawPath(brokePath, brokePaint) + } finally { + canvas.restore() + } + } finally { + if (canvas != null) { + holder.unlockCanvasAndPost(canvas) + } + } + } finally { + if (isTimedBlock) { + try { + Thread.sleep(2000) + } catch (ignore: Exception) { } + } + handler.get().post(this) + } + } + + 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") + if (it.isValid()) { + data = it + } + }.collect() + } + } + + // 订阅后,5秒内未收到有效数据, 提示用户当前MAP版本不支持 + scope.launch { + delay(5000) + val d = data + if (d == null || !d.isValid()) { + Toast.makeText(Utils.getApp(), "当前MAP版本不支持360环视,请升级MAP版本", Toast.LENGTH_SHORT).show() + } + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerChassisSteeringStateListenerManager.removeListener(TAG) + Log.d(TAG, "--- 取消订阅 ---") + CallerAutoPilotControlManager.setIsSubscribeM1StitchedVideo(false) + handler.get()?.looper?.quitSafely() + } + + override fun onAutopilotSteeringData(steering: Float) { + Log.d(TAG, "--- onAutopilotSteeringData --: steering: $steering") + this.steering = steering + } +} \ 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/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 962bbe9474..d6701babf6 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 @@ -5,7 +5,9 @@ import android.app.Activity import android.content.ClipData import android.content.ClipboardManager import android.content.Context +import android.content.Intent import android.graphics.Color +import android.net.* import android.os.Build import android.os.Process import android.text.Html @@ -16,17 +18,16 @@ import androidx.annotation.RequiresApi import androidx.appcompat.widget.PopupMenu import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider import androidx.core.view.* import androidx.lifecycle.lifecycleScope import chassis.Chassis -import chassis.ChassisStatesOuterClass import com.mogo.cloud.passport.MoGoAiCloudClient import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.constants.SharedPrefsConstants import com.mogo.commons.debug.DebugConfig import com.mogo.commons.module.status.MogoStatusManager import com.mogo.eagle.core.data.app.AppConfigInfo -import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.constants.MoGoConfig @@ -54,7 +55,6 @@ import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager -import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.call.obu.CallerObuConnectListenerManager @@ -64,7 +64,6 @@ import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.logcatch.ILogViewListener import com.mogo.eagle.core.function.hmi.ui.logcatch.LogInfoView -import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView import com.mogo.eagle.core.utilcode.kotlin.* import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel @@ -79,11 +78,9 @@ import com.mogo.map.uicontroller.VisualAngleMode import com.mogo.map.uicontroller.VisualAngleMode.* import kotlinx.android.synthetic.main.view_debug_setting.view.* import kotlinx.android.synthetic.main.view_debug_setting.view.tbRouteDynamicEffect -import kotlinx.android.synthetic.main.view_sop_setting.view.* import kotlinx.coroutines.* import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg -import planning.RoboSweeperTaskIndexOuterClass import java.text.SimpleDateFormat import java.util.* import kotlin.collections.component1 @@ -127,8 +124,6 @@ internal class DebugSettingView @JvmOverloads constructor( private var logInfoView: LogInfoView? = null private var logViewAttach = false - @Volatile - private var mAutoPilotStatusInfo: AutopilotStatusInfo? = null private var mGnssInfo: MogoLocation? = null private var accelerationFloatWindow: AccelerationFloatWindow? = null @@ -242,7 +237,7 @@ internal class DebugSettingView @JvmOverloads constructor( } // 开启定时查询速度 isRunCheck = true - Timer().schedule(timerTaskRefresh, Date(), 300) + Timer().schedule(timerTaskRefresh, Date(), 500) if (AppConfigInfo.isConnectAutopilot && (AppConfigInfo.plateNumber.isNullOrEmpty() || AppConfigInfo.iPCMacAddress.isNullOrEmpty())) { //查询工控机基础配置信息 CallerAutoPilotControlManager.getCarConfig() @@ -330,15 +325,15 @@ internal class DebugSettingView @JvmOverloads constructor( /** * 蘑方点击事件 */ - tbMojie.setOnCheckedChangeListener { buttonView, isChecked -> - if (isChecked) { - buttonView.setCompoundDrawables(null, null, iconDown, null) - tbOpenMfView.visibility = View.VISIBLE - } else { - buttonView.setCompoundDrawables(null, null, iconRight, null) - tbOpenMfView.visibility = View.GONE - } - } +// tbMojie.setOnCheckedChangeListener { buttonView, isChecked -> +// if (isChecked) { +// buttonView.setCompoundDrawables(null, null, iconDown, null) +// tbOpenMfView.visibility = View.VISIBLE +// } else { +// buttonView.setCompoundDrawables(null, null, iconRight, null) +// tbOpenMfView.visibility = View.GONE +// } +// } /** * APP升级点击事件 @@ -355,13 +350,13 @@ internal class DebugSettingView @JvmOverloads constructor( } } - /** - * 蘑方控制 默认关闭 - */ - tbOpenMfView.isChecked = HmiBuildConfig.isShowMfToastView - tbOpenMfView.setOnCheckedChangeListener { _, isChecked -> - HmiBuildConfig.isShowMfToastView = isChecked - } +// /** +// * 蘑方控制 默认关闭 +// */ +// tbOpenMfView.isChecked = HmiBuildConfig.isShowMfToastView +// tbOpenMfView.setOnCheckedChangeListener { _, isChecked -> +// HmiBuildConfig.isShowMfToastView = isChecked +// } /** * 版本信息 @@ -693,11 +688,6 @@ internal class DebugSettingView @JvmOverloads constructor( // 演示模式 tbIsDemoMode.setOnCheckedChangeListener { _, _ -> FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode - CallerHmiManager.updateStatusBarLeftView( - FunctionBuildConfig.isDemoMode, - "demoMode", - DemoModeView(context) - ) CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 @@ -933,7 +923,7 @@ internal class DebugSettingView @JvmOverloads constructor( clipboardManager?.setPrimaryClip( ClipData.newPlainText( "DockVersion", - mAutoPilotStatusInfo?.dockVersion + CallerAutoPilotStatusListenerManager.getDockerVersion()?:"" ) ) ToastUtils.showLong("docker版本复制成功") @@ -1091,13 +1081,8 @@ internal class DebugSettingView @JvmOverloads constructor( /** * 设置域控制器点击监听 */ + @SuppressLint("SetTextI18n") private fun setDomainControllerCheckedChangeListener() { - - // 初始化工控机 IP信息 - val autoPilotIpAddress = - SharedPrefsMgr.getInstance(context) - .getString(MoGoConfig.AUTOPILOT_IP, FunctionBuildConfig.adasConnectIP) - etAutopilotIP.setText("192.168.1.") etAutopilotIP.text?.let { etAutopilotIP.setSelection(it.length) } //设置工控机IP @@ -1211,9 +1196,7 @@ internal class DebugSettingView @JvmOverloads constructor( val log = map.value.log when (name) { //ADAS日志标签 - SceneConstant.M_ADAS_IMPL -> cbAdasLog.isChecked = log - //CALLCHAT日志标签 - SceneConstant.M_CHAT -> cbCallChatLog.isChecked = log + SceneConstant.M_D_C -> cbAdasLog.isChecked = log //OBU日志标签 SceneConstant.M_OBU -> cbObuLog.isChecked = log //HMI日志标签 @@ -1226,8 +1209,6 @@ internal class DebugSettingView @JvmOverloads constructor( SceneConstant.M_DEVA -> cbDevaLog.isChecked = log //网络模块日志标签 SceneConstant.M_NETWORK -> cbNetworkLog.isChecked = log - //ROUTE日志标签 - SceneConstant.M_OLD_ROUTE -> cbOldRouteLog.isChecked = log //BUS日志标签 SceneConstant.M_BUS -> cbBusLog.isChecked = log //TAXI日志标签 @@ -1236,8 +1217,6 @@ internal class DebugSettingView @JvmOverloads constructor( SceneConstant.M_TAXI_P -> cbTaxiPLog.isChecked = log //清扫车日志 SceneConstant.M_SWEEPER -> cbSweeperPLog.isChecked = log - //其他模块日志(暂未区分具体模块) - SceneConstant.M_OTHER -> cbOtherLog.isChecked = log } } } @@ -1296,14 +1275,8 @@ internal class DebugSettingView @JvmOverloads constructor( } //ADAS日志标签 cbAdasLog.setOnCheckedChangeListener { _, isChecked -> - val adasModule = SceneModule(isChecked, SceneConstant.M_ADAS_IMPL) - sceneMap[SceneConstant.M_ADAS_IMPL] = adasModule - CallerDevaToolsManager.updateModuleTAG(sceneMap) - } - //CALLCHAT日志标签 - cbCallChatLog.setOnCheckedChangeListener { _, isChecked -> - val callChatModule = SceneModule(isChecked, SceneConstant.M_CHAT) - sceneMap[SceneConstant.M_CHAT] = callChatModule + val adasModule = SceneModule(isChecked, SceneConstant.M_D_C) + sceneMap[SceneConstant.M_D_C] = adasModule CallerDevaToolsManager.updateModuleTAG(sceneMap) } //OBU日志标签 @@ -1342,12 +1315,6 @@ internal class DebugSettingView @JvmOverloads constructor( sceneMap[SceneConstant.M_NETWORK] = networkModule CallerDevaToolsManager.updateModuleTAG(sceneMap) } - //ROUTE日志标签 - cbOldRouteLog.setOnCheckedChangeListener { _, isChecked -> - val oldRouteModule = SceneModule(isChecked, SceneConstant.M_OLD_ROUTE) - sceneMap[SceneConstant.M_OLD_ROUTE] = oldRouteModule - CallerDevaToolsManager.updateModuleTAG(sceneMap) - } //BUS日志标签 cbBusLog.setOnCheckedChangeListener { _, isChecked -> val busModule = SceneModule(isChecked, SceneConstant.M_BUS) @@ -1372,13 +1339,6 @@ internal class DebugSettingView @JvmOverloads constructor( sceneMap[SceneConstant.M_SWEEPER] = sweeperModule CallerDevaToolsManager.updateModuleTAG(sceneMap) } - //其他未分类模块日志 - cbOtherLog.setOnCheckedChangeListener { _, isChecked -> - val otherModule = SceneModule(isChecked, SceneConstant.M_OTHER) - sceneMap[SceneConstant.M_OTHER] = otherModule - CallerDevaToolsManager.updateModuleTAG(sceneMap) - } - //开始停止抓取全量日志 tbLogCatch.isChecked = SharedPrefsMgr.getInstance(context).getBoolean(MoGoConfig.CATCH_LOG, false) @@ -1406,6 +1366,38 @@ internal class DebugSettingView @JvmOverloads constructor( } } + //导出全量日志 + exportAllLogs?.onClick { v -> + v.visibility = View.INVISIBLE + logLoadingView?.visibility = View.VISIBLE + v.scope.launch(Dispatchers.IO) { + val file = CallerDevaToolsManager.logcat()?.export() + if (file != null && file.exists()) { + withContext(Dispatchers.Main) { + var activity = AppStateManager.currentActivity() + while (activity == null) { + delay(2000) + activity = AppStateManager.currentActivity() + if (activity != null) { + break + } + } + activity?.startActivity(Intent.createChooser(Intent().also { + it.action = Intent.ACTION_SEND + it.type = "application/zip" + it.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(activity, "${activity.packageName}.fileProvider", file)) + }, "分享全量日志压缩包到")) + } + } else { + ToastUtils.showShort("全量日志压缩文件生成失败") + } + withContext(Dispatchers.Main) { + logLoadingView?.visibility = View.INVISIBLE + exportAllLogs?.visibility = View.VISIBLE + } + } + } + /** * 展示、关闭日志过滤面板 */ @@ -1437,10 +1429,10 @@ internal class DebugSettingView @JvmOverloads constructor( */ cbAdasAutoPilot.setOnCheckedChangeListener { _, isChecked -> val map = CallerDevaToolsManager.getTraceInfo() - val param = map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT] + val param = map[ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT] param?.let { it.record = isChecked - map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT] = param + map[ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT] = param CallerDevaToolsManager.refreshTraceInfo(map) } } @@ -1450,10 +1442,10 @@ internal class DebugSettingView @JvmOverloads constructor( */ cbAdasDataTrack.setOnCheckedChangeListener { _, isChecked -> val map = CallerDevaToolsManager.getTraceInfo() - val param = map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED] + val param = map[ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED] param?.let { it.record = isChecked - map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED] = param + map[ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED] = param CallerDevaToolsManager.refreshTraceInfo(map) } } @@ -1463,10 +1455,10 @@ internal class DebugSettingView @JvmOverloads constructor( */ cbAdasTrajectory.setOnCheckedChangeListener { _, isChecked -> val map = CallerDevaToolsManager.getTraceInfo() - val param = map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY] + val param = map[ChainConstant.CHAIN_TYPE_SOCKET_TRAJECTORY] param?.let { it.record = isChecked - map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY] = param + map[ChainConstant.CHAIN_TYPE_SOCKET_TRAJECTORY] = param CallerDevaToolsManager.refreshTraceInfo(map) } } @@ -1476,10 +1468,10 @@ internal class DebugSettingView @JvmOverloads constructor( */ cbAdasVehicle.setOnCheckedChangeListener { _, isChecked -> val map = CallerDevaToolsManager.getTraceInfo() - val param = map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE] + val param = map[ChainConstant.CHAIN_TYPE_SOCKET_VEHICLE] param?.let { it.record = isChecked - map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE] = param + map[ChainConstant.CHAIN_TYPE_SOCKET_VEHICLE] = param CallerDevaToolsManager.refreshTraceInfo(map) } } @@ -1489,48 +1481,34 @@ internal class DebugSettingView @JvmOverloads constructor( */ cbAdasTrafficlight.setOnCheckedChangeListener { _, isChecked -> val map = CallerDevaToolsManager.getTraceInfo() - val param = map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] + val param = map[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] param?.let { it.record = isChecked - map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] = param + map[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] = param CallerDevaToolsManager.refreshTraceInfo(map) } } - - /** - * ADAS PLANNING OBJ 感知障碍物 - */ - cbAdasPlanningObj.setOnCheckedChangeListener { _, isChecked -> - val map = CallerDevaToolsManager.getTraceInfo() - val param = map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS] - param?.let { - it.record = isChecked - map[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_PLANNING_OBJECTS] = param - CallerDevaToolsManager.refreshTraceInfo(map) - } - } - } private fun refreshTraceInfo() { val traceInfoMap = CallerDevaToolsManager.getTraceInfo() - val autopilot = traceInfoMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT] + val autopilot = traceInfoMap[ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT] autopilot?.let { cbAdasAutoPilot.isChecked = it.record } - val dataTrack = traceInfoMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_DATA_TRACKED] + val dataTrack = traceInfoMap[ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED] dataTrack?.let { cbAdasDataTrack.isChecked = it.record } - val trajectory = traceInfoMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAJECTORY] + val trajectory = traceInfoMap[ChainConstant.CHAIN_TYPE_SOCKET_TRAJECTORY] trajectory?.let { cbAdasTrajectory.isChecked = it.record } - val vehicle = traceInfoMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_VEHICLE] + val vehicle = traceInfoMap[ChainConstant.CHAIN_TYPE_SOCKET_VEHICLE] vehicle?.let { cbAdasVehicle.isChecked = it.record } - val trafficlight = traceInfoMap[ChainConstant.CHAIN_LINK_LOG_WEB_SOCKET_TRAFFIC_LIGHT] + val trafficlight = traceInfoMap[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] trafficlight?.let { cbAdasTrafficlight.isChecked = it.record } @@ -1577,8 +1555,8 @@ internal class DebugSettingView @JvmOverloads constructor( /** * 版本信息 */ - tvAppVersionName.text = "鹰眼版本:${AppUtils.getAppVersionName()} Git Hash:${AppConfigInfo.workingBranchHash}" - tvAppVersionNameKey.text = "鹰眼版本:${AppUtils.getAppVersionName()} Git Hash:${AppConfigInfo.workingBranchHash}" + tvAppVersionName.text = "鹰眼版本:${AppUtils.getAppVersionName()} Git Hash:${AppConfigInfo.workingBranchHash} \n渠道信息:${AppConfigInfo.flavor}" + tvAppVersionNameKey.text = "鹰眼版本:${AppUtils.getAppVersionName()} Git Hash:${AppConfigInfo.workingBranchHash}\n渠道信息:${AppConfigInfo.flavor}" tvAutopilotProtocolVersionInfo.text = "Autopilot协议版本:${CallerAutoPilotControlManager.getProtocolVersion()}" @@ -1587,8 +1565,9 @@ internal class DebugSettingView @JvmOverloads constructor( } else { tvIpcProtocolVersionInfo.text = "工控机协议版本:${AppConfigInfo.protocolVersionNumber}" } - tvIpcVersionInfo.text = "MAP:${mAutoPilotStatusInfo?.dockVersion}" - tvIpcVersionInfoKey.text = "MAP:${mAutoPilotStatusInfo?.dockVersion}" + val dockerVersion = CallerAutoPilotStatusListenerManager.getDockerVersion() + tvIpcVersionInfo.text = "MAP:$dockerVersion" + tvIpcVersionInfoKey.text = "MAP:$dockerVersion" tvMoGoMapVersion.text = "HD-Map版本:${DebugConfig.getMapVersion()}" tvMoGoMapVersionKey.text = "HD-Map版本:${DebugConfig.getMapVersion()}" tvGitBranchInfo.text = "Git分支:${AppConfigInfo.workingBranchName}" @@ -1659,12 +1638,7 @@ internal class DebugSettingView @JvmOverloads constructor( "司机端Server启动" } else -> { - "乘客端${ - when { - !AppConfigInfo.serverSn.isNullOrEmpty() -> "(司机屏SN是:${AppConfigInfo.serverSn?:""})" - else -> "" - } - }连接" + "乘客端${"(司机屏SN是:${AppConfigInfo.serverSn})"}连接" } } }是否正常:${ @@ -1697,11 +1671,10 @@ internal class DebugSettingView @JvmOverloads constructor( }" ) - mAutoPilotStatusInfo?.let { - val autopilotJson = GsonUtils.toJson(it) - tvAutopilotInfo.text = autopilotJson - tvIpcInfo.text = autopilotJson - tvIpcInfoKey.text = autopilotJson + CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfoJsonString().let { + tvAutopilotInfo.text = it + tvIpcInfo.text = it + tvIpcInfoKey.text = it } tvCmdbCarInfoContent.text = SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.CAR_INFO)?:"" @@ -1745,6 +1718,12 @@ internal class DebugSettingView @JvmOverloads constructor( tbIsDemoMode?.text = "开启美化模式" } + if(FunctionBuildConfig.isRainMode){ + tbIsRainMode?.text = "关闭雨天模式" + } else { + tbIsRainMode?.text = "开启雨天模式" + } + obuConnectStatusTv.text = Html.fromHtml( "OBU连接状态:${ if (AppConfigInfo.isConnectObu) { @@ -1781,8 +1760,7 @@ internal class DebugSettingView @JvmOverloads constructor( /** * 自动驾驶状态回调 */ - override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) { - mAutoPilotStatusInfo = autoPilotStatusInfo + override fun onAutopilotStatusResponse(state: Int) { setAutopilotConnectStatus() } @@ -1910,7 +1888,7 @@ internal class DebugSettingView @JvmOverloads constructor( if (accelerationList.size > 9) { accelerationList.removeLast() } - gnssInfo?.acceleration?.let { + gnssInfo.acceleration.let { if (accelerationList.isEmpty()) { accelerationList.add( AccelerationEntity( @@ -2012,7 +1990,6 @@ internal class DebugSettingView @JvmOverloads constructor( } } - /** * 车辆方向盘转向角回调 * @param steering 方向盘转向角 @@ -2033,36 +2010,6 @@ internal class DebugSettingView @JvmOverloads constructor( } } - /** - * 车辆加速度 - */ - override fun onAutopilotAcc(carAcc: Float) { - - } - - /** - * 油门 - */ - override fun onAutopilotThrottle(throttle: Float) { - - } - - /** - * 刹车 - */ - override fun onAutopilotBrake(brake: Float) { - - } - - /** - * 清扫车(福田)清扫控制系统状态 - */ - override fun onSweeperFutianCleanSystemState(cleanSystemState: ChassisStatesOuterClass.SweeperFuTianTaskSystemStates) { - - } - override fun onSweeperFutianTaskIndexData(roboSweeperTaskIndex: RoboSweeperTaskIndexOuterClass.RoboSweeperTaskIndex) { - - } /** * 吐司提示 */ 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 e7447f1384..75691441b2 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 @@ -4,6 +4,7 @@ import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import android.view.View +import android.widget.* import androidx.constraintlayout.widget.ConstraintLayout import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig @@ -11,23 +12,24 @@ import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.data.obu.MogoObuConst import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener +import com.mogo.eagle.core.function.api.devatools.mofang.* import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO +import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager -import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager +import com.mogo.eagle.core.function.call.devatools.* import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.obu.CallerObuApiManager import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.utilcode.kotlin.currentPadding import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager +import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction import com.mogo.eagle.core.function.hmi.ui.widget.DemoModeView -import com.mogo.eagle.core.utilcode.util.UiThreadHandler import kotlinx.android.synthetic.main.view_sop_setting.view.* import kotlinx.android.synthetic.main.view_sop_setting.view.tbRouteDynamicEffect -import java.util.* /** * SOP设置窗口 @@ -36,7 +38,8 @@ internal class SOPSettingView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsFuncConfigListener { +) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoDevaToolsFuncConfigListener, + IViewControlListener, IMoGoMoFangProvider.OnMoFangStatusListener { companion object { const val TAG = "SOPSettingView" @@ -49,16 +52,16 @@ internal class SOPSettingView @JvmOverloads constructor( private fun initView() { sopLayout.setOnClickListener { } - //绕障类功能开关 tbObstacleAvoidance.isChecked = FunctionBuildConfig.isDetouring tbObstacleAvoidance.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 绕障类功能开关",isChecked) CallerAutoPilotControlManager.sendDetouring(isChecked) FunctionBuildConfig.isDetouring = isChecked } tbMarkingObstacles.isChecked = FunctionBuildConfig.isPNCWarning - //危险障碍物颜色标记开关 tbMarkingObstacles.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 危险障碍物颜色标记开关",isChecked) FunctionBuildConfig.isPNCWarning = isChecked } @@ -66,61 +69,62 @@ internal class SOPSettingView @JvmOverloads constructor( tbMarkingObstacles.visibility = View.GONE } - //引导线动态效果 tbRouteDynamicEffect.isChecked = HmiBuildConfig.isShowRouteStrategy tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 引导线动态效果",isChecked) HmiBuildConfig.isShowRouteStrategy = isChecked } - /** - * obu弱势交通控制, 默认开启 - */ + //默认开启 tbObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView tbObuWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP obu弱势交通控制, ",isChecked) HmiBuildConfig.isShowObuWeaknessTrafficView = isChecked } /** - * 云端弱势交通控制 默认关闭 + * 默认关闭 */ tbCloudWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowCloudWeaknessTrafficView tbCloudWeaknessTrafficSop.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 云端弱势交通控制, ",isChecked) HmiBuildConfig.isShowCloudWeaknessTrafficView = isChecked } - /** - * V2N场景进PNC - */ tbV2nPnc.isChecked = FunctionBuildConfig.isV2NPnc tbV2nPnc.setOnCheckedChangeListener{ compoundButton, isChecked -> if(!compoundButton.isPressed){ return@setOnCheckedChangeListener } + hmiAction("SOP V2N场景进PNC, ",isChecked) CallerAutoPilotControlManager.sendV2nToPncCmd(isChecked) FunctionBuildConfig.isV2NPnc = isChecked } /** - * obu V2V开关,默认打开 + * 默认打开 */ tbObuV2vView.isChecked = HmiBuildConfig.isShowObuV2vView tbObuV2vView.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP obuV2V开关, ",isChecked) HmiBuildConfig.isShowObuV2vView = isChecked } /** - * obu V2i开关,默认打开 + * 默认打开 */ tbObuV2iView.isChecked = HmiBuildConfig.isShowObuV2iView tbObuV2iView.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP obuV2i开关, ",isChecked) HmiBuildConfig.isShowObuV2iView = isChecked } /** - * obu 闯红灯预警,默认关闭 + * 默认关闭 */ tbRunRedLightSop.isChecked = HmiBuildConfig.isShowRunRedLightView tbRunRedLightSop.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP obu闯红灯预警, ",isChecked) HmiBuildConfig.isShowRunRedLightView = isChecked if (HmiBuildConfig.isShowRunRedLightView) { CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "1".toByteArray()) @@ -130,10 +134,11 @@ internal class SOPSettingView @JvmOverloads constructor( } /** - * obu 绿波通行,默认关闭 + * 默认关闭 */ tbGreenWaveSop.isChecked = HmiBuildConfig.isShowGreenWaveView tbGreenWaveSop.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP obu绿波通行, ",isChecked) HmiBuildConfig.isShowGreenWaveView = isChecked if (HmiBuildConfig.isShowGreenWaveView) { CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "1".toByteArray()) @@ -142,9 +147,9 @@ internal class SOPSettingView @JvmOverloads constructor( } } - //红绿灯标识 tbTrafficLight.isChecked = HmiBuildConfig.isShowTrafficLightView tbTrafficLight.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 红绿灯标识开关, ",isChecked) if (!isChecked) { HmiBuildConfig.isShowTrafficLightView = false } else { @@ -153,9 +158,9 @@ internal class SOPSettingView @JvmOverloads constructor( } } - //限速标识 tbSpeedLimit.isChecked = HmiBuildConfig.isShowLimitingVelocityView tbSpeedLimit.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 限速标识开关, ",isChecked) if (isChecked) { HmiBuildConfig.isShowLimitingVelocityView = true } else { @@ -166,14 +171,14 @@ internal class SOPSettingView @JvmOverloads constructor( // 演示模式,上一次勾选的数据 tbDemoMode.isChecked = FunctionBuildConfig.isDemoMode - // 演示模式 tbDemoMode.setOnCheckedChangeListener { compoundButton, _ -> if(!compoundButton.isPressed){ return@setOnCheckedChangeListener } + hmiAction("SOP 演示模式开关, ",!FunctionBuildConfig.isDemoMode) FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode - CallerHmiManager.updateStatusBarLeftView(FunctionBuildConfig.isDemoMode, "demoMode", DemoModeView(context)) CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode) + CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_DEMO, FunctionBuildConfig.isDemoMode) if (!FunctionBuildConfig.isDemoMode) { //关闭美化模式时,通知工控机 CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode) @@ -184,25 +189,25 @@ internal class SOPSettingView @JvmOverloads constructor( tbDemoMode.visibility = View.GONE } - // 雨天模式,上一次勾选的数据 tbRainMode.isChecked = FunctionBuildConfig.isRainMode - //雨天模式 tbRainMode.setOnCheckedChangeListener { compoundButton, isChecked -> if(!compoundButton.isPressed){ return@setOnCheckedChangeListener } - CallerAutoPilotControlManager.setRainMode(isChecked) + hmiAction("SOP 雨天模式开关, ",isChecked) FunctionBuildConfig.isRainMode = isChecked + CallerAutoPilotControlManager.setRainMode(isChecked) + CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked) } //雨天模式按钮只在司机屏生效,乘客屏不显示 if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { tbRainMode.visibility = View.GONE } - //OBU控制总开关 tbObu.isChecked = CallerObuApiManager.isConnected() tbObu.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP OBU控制总开关, ",isChecked) if (isChecked) { CallerObuApiManager.resetObuIpAddress(MogoObuConst.OBU_DEFAULT_IP) } else { @@ -212,17 +217,35 @@ internal class SOPSettingView @JvmOverloads constructor( } - //是否开启异常上报 tbIPCReport.isChecked = FunctionBuildConfig.isReportWarning tbIPCReport.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 是否开启异常上报, ",isChecked) FunctionBuildConfig.isReportWarning = isChecked } tbNewV2NData.isChecked = FunctionBuildConfig.isNewV2NData tbNewV2NData.setOnCheckedChangeListener { _, isChecked -> + hmiAction("SOP 是否是V2N新链路(云->工控机->App)",isChecked) FunctionBuildConfig.isNewV2NData = isChecked } + // M1 360度环视 + tbNew360LookAround?.also { + if (!AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)) { + it.isEnabled = false + } else { + it.isEnabled = true + it.setOnCheckedChangeListener { _, isChecked -> + if (isChecked) { + CallerHmiManager.showM1360LookAround() + } else { + CallerHmiManager.hidM1360LookAround() + } + } + it.isChecked = CallerHmiManager.isM1360LookAroundShowing() + } + } + //变道绕障的目标障碍物速度阈值 tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" ivSpeedReduce.setOnClickListener { @@ -232,6 +255,7 @@ internal class SOPSettingView @JvmOverloads constructor( FunctionBuildConfig.detouringSpeed-- tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" } + hmiAction("SOP 变道绕障的目标障碍物速度阈值",FunctionBuildConfig.detouringSpeed) } ivSpeedAdd.setOnClickListener { if (FunctionBuildConfig.detouringSpeed >= 7) { @@ -240,14 +264,17 @@ internal class SOPSettingView @JvmOverloads constructor( FunctionBuildConfig.detouringSpeed++ tvSpeed.text = "${FunctionBuildConfig.detouringSpeed} m/s" } + hmiAction("SOP 变道绕障的目标障碍物速度阈值",FunctionBuildConfig.detouringSpeed) } btnSpeedSet.setOnClickListener { val isSuccess = CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble()) if (isSuccess == true) { ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置成功") + hmiAction("SOP 变道绕障的目标障碍物速度阈值设置","成功") } else { ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置失败") + hmiAction("SOP 变道绕障的目标障碍物速度阈值设置","失败") } } @@ -259,6 +286,49 @@ internal class SOPSettingView @JvmOverloads constructor( btnSpeedSet.visibility = View.GONE } + /** + * 魔方sop运营相关配置 + */ + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + val mf = CallerDevaToolsManager.mofang() + if (mf != null) { + mfStatusLayout.setClickEnabled(true) + mfStatusLayout.setClickedTextAndTag(if (mf.isConnected()) "断开魔方连接" else "开始连接魔方", if (mf.isConnected()) 0 else 1) + mf.registerMoFangStatusListener(TAG, this) + mfStatusLayout.setOnClickCallback { + val tag = it.tag as? Int + if (tag == 0) { + //断开魔方连接 + if (!mf.isConnected()) { + Toast.makeText(context, "尚未建立连接", Toast.LENGTH_SHORT).show() + return@setOnClickCallback + } + mfStatusLayout.showLoadingView() + mfStatusLayout.setLoadingViewText("正在断开魔方连接, 请稍候...") + mf.disconnect() + } + if (tag == 1) { + //建立魔方连接 + if (mf.isConnected()) { + Toast.makeText(context, "已连接,不要重复连接", Toast.LENGTH_SHORT).show() + return@setOnClickCallback + } + mf.connect() + mfStatusLayout.showLoadingView() + mfStatusLayout.setLoadingViewText("正在连接魔方, 请稍候") + } + } + } + + mfTest.isEnabled = mf?.isConnected() ?: false + mfTest.isChecked = mf?.isEnableTest() ?: false + mfTest.setOnCheckedChangeListener { _, isChecked -> + mf?.enableTest(isChecked) + } + } else { + mfStatusLayout.setClickEnabled(false) + mfTest.isEnabled = false + } } override fun onAttachedToWindow() { @@ -267,19 +337,33 @@ internal class SOPSettingView @JvmOverloads constructor( CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener( FuncBizConfig.FOUNDATION, TAG, true, this ) + CallerHmiViewControlListenerManager.addListener(TAG,this) // 开启定时查询速度 // Timer().schedule(timerTaskRefresh, Date(), 500) } + override fun updateFuncMode(tag: String, boolean: Boolean) { + super.updateFuncMode(tag, boolean) + if(tag == FUNC_MODE_DEMO){ + tbDemoMode.isChecked = FunctionBuildConfig.isDemoMode + } + if(tag == FUNC_MODE_RAIN){ + tbRainMode.isChecked = FunctionBuildConfig.isRainMode + } + } + override fun onDetachedFromWindow() { super.onDetachedFromWindow() // 移除 业务配置监听 CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(FuncBizConfig.FOUNDATION, TAG) + CallerHmiViewControlListenerManager.removeListener(TAG) // try { // timerTaskRefresh.cancel() // } catch (e: Exception) { // e.printStackTrace() // } + + CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this) } // private val timerTaskRefresh = object : TimerTask(){ @@ -320,4 +404,33 @@ internal class SOPSettingView @JvmOverloads constructor( } } } + + + override fun onMoFangConnected() { + mfStatusLayout?.also { + it.hideLoadingView() + it.setClickedTextAndTag("断开魔方连接", 0) + mfTest?.isEnabled = true + mfTest?.isChecked = CallerDevaToolsManager.mofang()?.isEnableTest() ?: false + } + } + + override fun onMoFangDisconnected() { + mfStatusLayout?.also { + it.hideLoadingView() + it.setClickedTextAndTag("开始连接魔方", 1) + mfTest?.isEnabled = false + } + } + + override fun onMoFangBatteryChanged(battery: Int) { + } + + override fun onMoFangClicked(keyCode: Int) {} + + override fun onMoFangLongClicked(keyCode: Int) {} + + override fun onMoFangCombineClicked(vararg keyCodes: Int) {} + + override fun onMoFangStatusError(msg: String) {} } \ 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/StateViewLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StateViewLayout.kt new file mode 100644 index 0000000000..f79eeef174 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/StateViewLayout.kt @@ -0,0 +1,58 @@ +package com.mogo.eagle.core.function.hmi.ui.setting + +import android.content.* +import android.graphics.* +import android.graphics.drawable.ColorDrawable +import android.util.* +import android.view.* +import android.widget.* +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.function.hmi.* +import com.mogo.eagle.core.utilcode.kotlin.* + +class StateViewLayout: ConstraintLayout { + + constructor(context: Context) : this(context, null) + constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(context, attrs, defStyleAttr, 0) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { + LayoutInflater.from(context).inflate(R.layout.view_status_layout, this, true) + background = ColorDrawable(Color.GRAY) + } + + private val loadingView by lazy { findViewById(R.id.loading_view) } + + private val loadingTextView by lazy { findViewById(R.id.loading_text) } + + private val clicked by lazy { findViewById