From 47d900dd78ef2f1149069174fd2cc343403b052c Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 27 Jun 2023 15:42:16 +0800 Subject: [PATCH] =?UTF-8?q?[bugfix]=20[=E6=94=B9=E5=86=99kotlin]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../passenger/model/BusPassengerModel.java | 626 ------------------ .../bus/passenger/model/BusPassengerModel.kt | 601 +++++++++++++++++ .../network/BusPassengerModelLoopManager.java | 2 +- .../presenter/BaseBusPassengerPresenter.java | 24 +- .../passenger/utils/BPRouteDataTestUtils.java | 3 +- 5 files changed, 615 insertions(+), 641 deletions(-) delete mode 100644 OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java create mode 100644 OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt 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 9209ae8f8e..0000000000 --- a/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.java +++ /dev/null @@ -1,626 +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.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.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.manager.trajectorymamager.IDistanceListener; -import com.mogo.och.common.module.manager.trajectorymamager.ITrajectoryListener; -import com.mogo.och.common.module.manager.trajectorymamager.TrajectoryAndDistanceManager; -import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; -import com.mogo.och.common.module.utils.DateTimeUtil; -import com.mogo.och.common.module.utils.PinYinUtil; - -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 final 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 final 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; - } - - cleanStation(); - - 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; - cleanStation(); - 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(); - BusPassengerStation startStation = mStations.get(i); - BusPassengerStation endStation = mStations.get(i+1); - setTrajectoryStation(startStation,endStation,result.getLineId()); - } - mNextStationIndex = i + 1; - updateAutopilotControlParameters(result, i); - return; - } else if (station.getDrivingStatus() == STATION_STATUS_STOPPED && !station.isLeaving()) { //到站 - if(i==stations.size()-1){ - cleanStation(); - } - TrajectoryAndDistanceManager.INSTANCE.suspendCalculate(); - 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(); - cleanStation(); - 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, 10,mMapLocationListener); - - //2021.11.1 自动驾驶路线规划接口 - CallerPlanningRottingListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); - - //监听司机端消息 - CallerTelematicListenerManager.INSTANCE.addListener(TAG, mReceivedMsgListener); - - AbnormalFactorsLoopManager.INSTANCE.startLoopAbnormalFactors(mContext); - - TrajectoryAndDistanceManager.INSTANCE.addDistanceListener(TAG,distanceListener); - - TrajectoryAndDistanceManager.INSTANCE.addTrajectoryListener(TAG,trajectoryListener); - } - - 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 IDistanceListener distanceListener = distance -> { - double lastTime = distance / getAverageSpeed() * 3.6; //秒 - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "轨迹排查==lastSumLength = " + distance); - - for (BusPassengerStation site : routesResult.getSites()) { - if (site.getDrivingStatus() == STATION_STATUS_STOPPED && !site.isLeaving()){ - return; - } - } - - if (mAutopilotPlanningCallback != null) { - mAutopilotPlanningCallback.routePlanningToNextStationChanged((long) distance, (long) lastTime); - } - }; - 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); - } - }; - 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 = gnssInfo -> { - if (null == gnssInfo) return; - mLocation = gnssInfo; - for (IBusPassengerControllerStatusCallback callback : mControllerStatusCallbackMap.values()) { - callback.onCarLocationChanged(gnssInfo); - } - }; - - private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { - - @Override - public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { - } - - @Override - public void onAutopilotDockerInfo(@NonNull String dockerVersion) { - } - - @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(int state) { - 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 - 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 = 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 int getAverageSpeed() { - return BusPassengerConst.BUS_AVERAGE_SPEED; - } - - private void startOrStopOrderLoop(boolean start) { - CallerLogger.INSTANCE.d(M_BUS_P + TAG, "startOrStopOrderLoop() " + start); - if (start) { - BusPassengerModelLoopManager.getInstance().startQueryDriverLineLoop(); - } else { - BusPassengerModelLoopManager.getInstance().stopQueryDriverLineLoop(); - } - } - - - public void setTrajectoryStation(BusPassengerStation startStationInfo, BusPassengerStation endStationInfo, int lineId){ - MogoLocation startStation = new MogoLocation(); - startStation.setLongitude(startStationInfo.getGcjLon()); - startStation.setLatitude(startStationInfo.getGcjLat()); - MogoLocation endStation = new MogoLocation(); - endStation.setLongitude(endStationInfo.getGcjLon()); - endStation.setLatitude(endStationInfo.getGcjLat()); - TrajectoryAndDistanceManager.INSTANCE.setStationPoint(startStation,endStation, (long) lineId); - } - - public void cleanStation(){ - TrajectoryAndDistanceManager.INSTANCE.setStationPoint(null,null,-1L); - } - -} 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..b08d83a15e --- /dev/null +++ b/OCH/mogo-och-bus-passenger/src/jinlvvan/java/com/mogo/och/bus/passenger/model/BusPassengerModel.kt @@ -0,0 +1,601 @@ +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.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.trajectorymamager.IDistanceListener +import com.mogo.och.common.module.manager.trajectorymamager.ITrajectoryListener +import com.mogo.och.common.module.manager.trajectorymamager.TrajectoryAndDistanceManager.addDistanceListener +import com.mogo.och.common.module.manager.trajectorymamager.TrajectoryAndDistanceManager.addTrajectoryListener +import com.mogo.och.common.module.manager.trajectorymamager.TrajectoryAndDistanceManager.setStationPoint +import com.mogo.och.common.module.manager.trajectorymamager.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, "queryDriverSiteByCoordinate = null") + if (routesResult != null) { + routesResult = null + mNextStationIndex = 0 + } + cleanStation() + if (mRouteLineInfoCallback != null) { + mRouteLineInfoCallback!!.showNoTaskView() + } + mRoutePoints.clear() + return + } + if (routesResult != null && data.result == routesResult) { + d(M_BUS_P + TAG, "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() + return + } + } + }) + } + + private fun updatePassengerRouteInfo(result: BusPassengerRoutesResult) { + if (mRouteLineInfoCallback != null) { + 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) { //离站 + mRouteLineInfoCallback!!.updateStationsInfo(stations, i + 1, false) + if (mNextStationIndex != i + 1) { + mTwoStationsRouts.clear() + val startStation = mStations[i] + val endStation = mStations[i + 1] + setTrajectoryStation(startStation, endStation, result.lineId) + } + mNextStationIndex = i + 1 + updateAutopilotControlParameters(result, i) + return + } else if (station.drivingStatus == BusPassengerConst.STATION_STATUS_STOPPED && !station.isLeaving) { //到站 + if (i == stations.size - 1) { + cleanStation() + } + suspendCalculate() + 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() + 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() { + 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 f6151fb8f6..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 @@ -48,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() { 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 c41a9daa46..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