[改写kotlin]
This commit is contained in:
yangyakun
2023-06-27 15:42:16 +08:00
parent 99354342c3
commit 47d900dd78
5 changed files with 615 additions and 641 deletions

View File

@@ -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<MogoLocation> 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<String, IBusPassengerControllerStatusCallback> mControllerStatusCallbackMap = new ConcurrentHashMap<>();
private IBusPassegerDriverStatusCallback mDriverStatusCallback; //出车收车状态
private IBusPassengerRouteLineInfoCallback mRouteLineInfoCallback; // bus路线信息更新
private MogoLocation mLocation = null;
private BusPassengerRoutesResult routesResult = null;
List<BusPassengerStation> mStations = new ArrayList<>();
private int mNextStationIndex = 0;// 要到达站的index
private final List<MogoLocation> 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<BusPassengerOperationStatusResponse>() {
@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<BusPassengerRoutesResponse>() {
@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<BusPassengerStation> 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<BusPassengerStation> 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<LatLng> routeArriviedTemp = new ArrayList<>();
List<LatLng> 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<MessagePad.Location> routePoints = routeList.getWayPointsList();
if (null != routePoints && routePoints.size() > 0) {
updateRoutePoints(routePoints);
//startToRouteAndWipe();
}
};
public void updateRoutePoints(List<MessagePad.Location> routePoints) {
mRoutePoints.clear();
List<MogoLocation> 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);
}
}

View File

@@ -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<MogoLocation> = ArrayList()
private var mContext: Context? = null
private var mADASStatusCallback //Model->Presenter自动驾驶状态相关
: IBusPassengerADASStatusCallback? = null
private var mAutopilotPlanningCallback //Model->Presenter自动驾驶线路规划
: IBusPassengerAutopilotPlanningCallback? = null
private val mControllerStatusCallbackMap: MutableMap<String, IBusPassengerControllerStatusCallback> =
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<BusPassengerStation> = ArrayList()
private var mNextStationIndex = 0 // 要到达站的index
private val mTwoStationsRouts: MutableList<MogoLocation> = 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<BusPassengerOperationStatusResponse> {
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<BusPassengerRoutesResponse> {
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<MogoLocation>,
routeArriving: MutableList<MogoLocation>,
location: MogoLocation
) {
if (mAutopilotPlanningCallback != null) {
val routeArriviedTemp: MutableList<LatLng> = ArrayList()
val routeArrivingTemp: MutableList<LatLng> = 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<MessagePad.Location>) {
mRoutePoints.clear()
val latLngModels: List<MogoLocation> = 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)
}
}

View File

@@ -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() {

View File

@@ -35,7 +35,7 @@ public class BaseBusPassengerPresenter extends Presenter<BusPassengerRouteFragme
public BaseBusPassengerPresenter(BusPassengerRouteFragment view) {
super(view);
BusPassengerModel.getInstance().init(AbsMogoApplication.getApp());
BusPassengerModel.INSTANCE.init(AbsMogoApplication.getApp());
initListeners();
}
@@ -50,23 +50,23 @@ public class BaseBusPassengerPresenter extends Presenter<BusPassengerRouteFragme
super.onDestroy( owner );
releaseListeners();
BusPassengerModel.getInstance().release();
BusPassengerModel.INSTANCE.release();
}
private void initListeners() {
BusPassengerModel.getInstance().setADASStatusCallback(this);
BusPassengerModel.getInstance().setControllerStatusCallback(TAG, this);
BusPassengerModel.getInstance().setDriverStatusCallback(this);
BusPassengerModel.getInstance().setRouteLineInfoCallback(this);
BusPassengerModel.getInstance().setMoGoAutopilotPlanningListener(this);
BusPassengerModel.INSTANCE.setADASStatusCallback(this);
BusPassengerModel.INSTANCE.setControllerStatusCallback(TAG, this);
BusPassengerModel.INSTANCE.setDriverStatusCallback(this);
BusPassengerModel.INSTANCE.setRouteLineInfoCallback(this);
BusPassengerModel.INSTANCE.setMoGoAutopilotPlanningListener(this);
}
private void releaseListeners() {
BusPassengerModel.getInstance().setADASStatusCallback(null);
BusPassengerModel.getInstance().setControllerStatusCallback(TAG, null);
BusPassengerModel.getInstance().setDriverStatusCallback(null);
BusPassengerModel.getInstance().setRouteLineInfoCallback(null);
BusPassengerModel.getInstance().setMoGoAutopilotPlanningListener(null);
BusPassengerModel.INSTANCE.setADASStatusCallback(null);
BusPassengerModel.INSTANCE.setControllerStatusCallback(TAG, null);
BusPassengerModel.INSTANCE.setDriverStatusCallback(null);
BusPassengerModel.INSTANCE.setRouteLineInfoCallback(null);
BusPassengerModel.INSTANCE.setMoGoAutopilotPlanningListener(null);
}
private void runOnUIThread( Runnable executor ) {

View File

@@ -48,8 +48,7 @@ public class BPRouteDataTestUtils {
builder.setLongitude(s.getDouble("longitude_"));
list.add(builder.build());
}
BusPassengerModel.getInstance().updateRoutePoints(list);
//BusPassengerModel.getInstance().startToRouteAndWipe();
BusPassengerModel.INSTANCE.updateRoutePoints(list);
} catch (JSONException e) {
e.printStackTrace();
}