[1.1.2]
[订单轮训、车态轮训、时间校准轮训]
This commit is contained in:
yangyakun
2023-02-25 16:41:33 +08:00
parent ebf9cd4220
commit 823fbcaf3d
6 changed files with 273 additions and 78 deletions

View File

@@ -1,13 +1,12 @@
package com.mogo.och.bus.passenger.bean.response
import com.mogo.eagle.core.data.BaseData
import java.util.*
/**
*
*/
data class LocusResponse(val data: Result?) : BaseData(){
data class Result(
data class LocusResponse(val data: LocusInfo?) : BaseData(){
data class LocusInfo(
val contrailSaveTime: Long?,//上传轨迹完成时间戳ms用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖
val csvFileUrl: String?,//轨迹文件下载的cos url默认“”
val csvFileMd5: String?,//轨迹文件md5默认“”

View File

@@ -5,8 +5,8 @@ import com.mogo.eagle.core.data.BaseData
/**
*
*/
data class OrderInfoResponse(val data: Result?) : BaseData() {
data class Result(
data class OrderInfoResponse(val data: OrderInfo?) : BaseData() {
data class OrderInfo(
val orderNo: String?,//订单id
val sn: String?,//司机sn
val productType: Int?,//车辆类型

View File

@@ -18,19 +18,15 @@ import com.mogo.eagle.core.network.utils.GsonUtil
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.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.LoopInfo
import com.mogo.och.bus.passenger.bean.response.M1DriverLoginStatusResponse
import com.mogo.och.bus.passenger.bean.response.*
import com.mogo.och.bus.passenger.callback.IBusPassengerADASStatusCallback
import com.mogo.och.bus.passenger.callback.IBusPassengerControllerStatusCallback
import com.mogo.och.bus.passenger.net.BusPassengerModelLoopManager
import com.mogo.och.bus.passenger.net.BusPassengerServiceManager
import com.mogo.och.bus.passenger.utils.RxUtils
import com.mogo.och.common.module.biz.constant.LoginStatusManager
import com.mogo.och.common.module.biz.constant.TaxiLoginStatusEnum
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import io.reactivex.disposables.Disposable
import mogo.telematics.pad.MessagePad
import mogo_msg.MogoReportMsg
import system_master.SystemStatusInfo
@@ -44,6 +40,11 @@ object BusPassengerModel {
private const val TAG = "BusPassengerModel"
private const val TAGLOGIN = "BusPassengerModelLogin"
private const val TAGORDER = "BusPassengerModelOrder"
private const val TAGCARSTATUS = "BusPassengerModelCarStatus"
private const val TAGCALIBRATION = "BusPassengerModelCalibration"
// 路距计算
private const val TAGDISTANCE = "BusPassengerModelDistance"
private lateinit var mContext: Context
@@ -56,6 +57,10 @@ object BusPassengerModel {
// 当前位置坐标
private var mLocation: MogoLocation? = null
// 订单信息 有订单有线路结束订单
private var orderInfo: OrderInfoResponse.OrderInfo? = null
// 轨迹信息 用来启动自动驾驶
private var locusInfo: LocusResponse.LocusInfo? = null
fun init() {
AbsMogoApplication.getApp().also { this.mContext = it }
@@ -63,43 +68,15 @@ object BusPassengerModel {
queryDriverOperationStatus()
}
/**
* 启动轮询查询司机登录状态
*/
private fun listenerLoginStatus() {
LoginStatusManager.setControllerStatusCallback(TAG,
object : LoginStatusManager.ILoginStatusChangeListener {
override fun onStatusChange(currentStatus: TaxiLoginStatusEnum) {
if (LoginStatusManager.isLogin()) {
BusPassengerModelLoopManager.setControllerStatusCallback(TAGLOGIN)
} else {
BusPassengerModelLoopManager.setControllerStatusCallback(TAGLOGIN, LoopInfo(3,::queryDriverOperationStatus))
}
}
})
fun release() {
releaseListeners()
startOrStopCalculateRouteInfo(false)
}
/**
* 查询车辆登录状态、车牌、司机手机号、司机sn
*/
fun queryDriverOperationStatus() {
BusPassengerServiceManager.queryDriverOperationStatus(
mContext, object : OchCommonServiceCallback<M1DriverLoginStatusResponse> {
override fun onSuccess(data: M1DriverLoginStatusResponse?) {
if (data?.data == null) return
LoginStatusManager.setLoginStatus(data.data.driverStatus)
}
override fun onFail(code: Int, msg: String) {}
})
}
fun setControllerStatusCallback(tag: String, callback: IBusPassengerControllerStatusCallback?) {
if (tag.isBlank()) return
if (callback == null) {
mControllerStatusCallbackMap.remove(tag)
return
}
mControllerStatusCallbackMap[tag] = callback
private fun releaseListeners() {
CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener)
CallerChassisLocationGCJ02ListenerManager.removeListener(TAG)
CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener)
}
private fun initListeners() {
@@ -116,27 +93,44 @@ object BusPassengerModel {
listenerLoginStatus()
}
fun release() {
releaseListeners()
startOrStopCalculateRouteInfo(false)
}
private fun releaseListeners() {
CallerAutoPilotStatusListenerManager.removeListener(mGoAutopilotStatusListener)
CallerChassisLocationGCJ02ListenerManager.removeListener(TAG)
CallerPlanningRottingListenerManager.removeListener(moGoAutopilotPlanningListener)
}
//监听网络变化,避免启动机器时无网导致无法更新订单信息
private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent ->
CallerLogger.d(M_BUS_P + TAG, "onIntentReceived = %s", intentStr)
if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) {
if (NetworkUtils.isConnected(mContext)) {
queryDriverOperationStatus()
}
// region 设置业务回调
fun setControllerStatusCallback(tag: String, callback: IBusPassengerControllerStatusCallback?) {
if (tag.isBlank()) return
if (callback == null) {
mControllerStatusCallbackMap.remove(tag)
return
}
mControllerStatusCallbackMap[tag] = callback
}
/**
* 启动轮询查询司机登录状态
*/
private fun listenerLoginStatus() {
LoginStatusManager.setControllerStatusCallback(TAG,
object : LoginStatusManager.ILoginStatusChangeListener {
override fun onStatusChange(currentStatus: TaxiLoginStatusEnum) {
if (LoginStatusManager.isLogin()) {
// todo 关闭轮训在特定时机进行登录状态查下
// 1、打开视频播放、
// 2 、打开空调暖风机灯设置页面
// 3、车控页面、
// 4、打开选择线路页面
BusPassengerModelLoopManager.removeLoopFunction(TAGLOGIN)
// 启动订单轮
startOrderLoop()
} else {
BusPassengerModelLoopManager.setLoopFunction(
TAGLOGIN,
LoopInfo(3, ::queryDriverOperationStatus)
)
}
}
})
}
// endregion
// region 设置外部回调
// 定位监听
private val mMapLocationListener: IMoGoChassisLocationGCJ02Listener =
object : IMoGoChassisLocationGCJ02Listener {
@@ -189,10 +183,214 @@ object BusPassengerModel {
"onAutopilotRotting = ${GsonUtil.jsonFromObject(globalPathResp)}"
)
globalPathResp?.wayPointsList?.let {
// todo 启动路距计算
startCalculateDistanceLoop()
}
}
}
// endregion
// region 登录状态逻辑
/**
* 查询车辆登录状态、车牌、司机手机号、司机sn
*/
fun queryDriverOperationStatus() {
BusPassengerServiceManager.queryDriverOperationStatus(
mContext, object : OchCommonServiceCallback<M1DriverLoginStatusResponse> {
override fun onSuccess(data: M1DriverLoginStatusResponse?) {
if (data?.data == null) return
LoginStatusManager.setLoginStatus(data.data.driverStatus)
}
override fun onFail(code: Int, msg: String) {}
})
}
//监听网络变化,避免启动机器时无网导致无法更新订单信息
private val mNetWorkIntentListener = IMogoIntentListener { intentStr, intent ->
CallerLogger.d(M_BUS_P + TAG, "onIntentReceived = %s", intentStr)
if (ConnectivityManager.CONNECTIVITY_ACTION == intentStr) {
if (NetworkUtils.isConnected(mContext)) {
queryDriverOperationStatus()
}
}
}
// endregion
// region 订单轮训
/**
* 启动订单轮训
*/
private fun startOrderLoop() {
BusPassengerModelLoopManager.setLoopFunction(
TAGORDER,
LoopInfo(3, ::queryOrder)
)
}
/**
* 启动订单轮训
*/
private fun endOrderLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGORDER)
}
/**
* 查询订单信息
*/
private fun queryOrder() {
BusPassengerServiceManager.queryOrderInfo(
mContext, object : OchCommonServiceCallback<OrderInfoResponse> {
override fun onSuccess(data: OrderInfoResponse?) {
if (data?.data == null) return
// 判断是否有订单
ordrLagic(data?.data)
}
override fun onFail(code: Int, msg: String) {}
})
}
/**
* 订单逻辑
*/
fun ordrLagic(orderData: OrderInfoResponse.OrderInfo) {
if (orderData.orderNo == null) {
return
}
// 有订单有线路后结束轮训
orderData.let { order->
if (order.lineId == null || order.lineId == 0L||order.siteId == null || order.siteId == 0L) {
// 去选线路和站点
}else{
this.orderInfo = orderData
// 有订单取消轮训
endOrderLoop()
// 已经选择线路和终点、恢复现场数据
// 启动车辆服务状态
startCarStatusLoop()
// 启动时间校准
startCalibrationLoop()
// 查询自动驾驶轨迹
queryLocusByLineId(order.lineId)
}
}
}
// endregion
// region车辆服务状态轮询
/**
* 启动订单轮训
*/
private fun startCarStatusLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGCARSTATUS, LoopInfo(3, ::queryCarStatus))
}
/**
* 启动订单轮训
*/
private fun endCarStatusLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGCARSTATUS)
}
/**
* 查询车辆状态 判断订单是否结束、是否显示结束业务
*/
private fun queryCarStatus() {
BusPassengerServiceManager.queryBusinessStatus(
mContext, object : OchCommonServiceCallback<BusinessStatusResponse> {
override fun onSuccess(data: BusinessStatusResponse?) {
if (data?.data == null) return
carStatusLogic(data.data)
}
override fun onFail(code: Int, msg: String) {}
})
}
private fun carStatusLogic(data: BusinessStatusResponse.Result) {
if(data.orderNo!=null){// 订单进行中
return
}
// 结束路距计算
endCalculateDistanceLoop()
// 停止时间校准
endCalibrationLoop()
if (data.businessStatus==2) {// 订单结束 没有还车
// todo 还车中 需要显示 @com.mogo.och.bus.passenger.ui.view.EndOrderView 页面
}else{
// 车辆空闲 订单结束已经还车
// 结束车态轮训
endCarStatusLoop()
}
}
// endregion
// region时间校准服务轮询
/**
* 启动时间校准轮训
*/
private fun startCalibrationLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGCALIBRATION, LoopInfo(120, ::queryBusinessTime))
}
/**
* 停止时间校准轮训
*/
private fun endCalibrationLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGCALIBRATION)
}
/**
* 查询车辆状态 判断订单是否结束、是否显示结束业务
*/
private fun queryBusinessTime() {
BusPassengerServiceManager.queryBusinessTime(
mContext, object : OchCommonServiceCallback<BusinessTimeResponse> {
override fun onSuccess(data: BusinessTimeResponse?) {
if (data?.data == null) return
// todo 轮训时间校准
}
override fun onFail(code: Int, msg: String) {}
})
}
// endregion
// region 查询自动驾驶轨迹信息
private fun queryLocusByLineId(lineId: Long) {
BusPassengerServiceManager.queryLocusByLineId(
mContext, lindId = lineId.toString(),object : OchCommonServiceCallback<LocusResponse> {
override fun onSuccess(data: LocusResponse?) {
if (data?.data == null) return
//设置全局轨迹信息
locusInfo = data.data
}
override fun onFail(code: Int, msg: String) {}
})
}
// endregion
// region 路距计算轮训
/**
* 启动路距计算
*/
private fun startCalculateDistanceLoop() {
BusPassengerModelLoopManager.setLoopFunction(TAGDISTANCE, LoopInfo(1, ::calculateDistance))
}
/**
* 结束时间校准轮训
*/
private fun endCalculateDistanceLoop() {
BusPassengerModelLoopManager.removeLoopFunction(TAGDISTANCE)
}
/**
* 查询车辆状态 判断订单是否结束、是否显示结束业务
*/
private fun calculateDistance() {
}
// endregion
/**
* 开始轮询计算剩余里程和时间

View File

@@ -23,7 +23,7 @@ object BusPassengerModelLoopManager {
private val mControllerStatusCallbackMap = ConcurrentHashMap<String, LoopInfo>()
fun setControllerStatusCallback(tag: String, function: LoopInfo) {
fun setLoopFunction(tag: String, function: LoopInfo) {
if (tag.isBlank()) return
mControllerStatusCallbackMap[tag] = function
if (mControllerStatusCallbackMap.size > 0) {
@@ -31,7 +31,7 @@ object BusPassengerModelLoopManager {
}
}
fun setControllerStatusCallback(tag: String) {
fun removeLoopFunction(tag: String) {
if (tag.isBlank()) return
mControllerStatusCallbackMap.remove(tag)
if (mControllerStatusCallbackMap.size == 0) {

View File

@@ -28,6 +28,15 @@ object BusPassengerServiceManager {
.subscribe(OchCommonSubscribeImpl(context, callback, "loginStatus"))
}
@JvmStatic
fun queryOrderInfo(
context: Context,
callback: OchCommonServiceCallback<OrderInfoResponse>?
) {
mBusPassengerServiceApi.queryOrderInfo().transformTry()
.subscribe(OchCommonSubscribeImpl(context, callback, "loginStatus"))
}
@JvmStatic
fun queryLineList(context: Context, callback: OchCommonServiceCallback<LineInfoResponse>?) {
mBusPassengerServiceApi.queryLineList().transformTry()

View File

@@ -16,18 +16,7 @@ class BusPassengerConst {
const val LOOP_LINE_1S = 1 * 1000L
const val LOOP_DELAY = 100L
// 无状态
const val STATION_STATUS_IDLE = 0
// 已过站(历史站)
const val STATION_STATUS_LEAVING = 1
// 到站(当前站)
const val STATION_STATUS_STOPPED = 2
// 未到站(未到站)
const val STATION_STATUS_ARRIVING = 3
//bus平均速度 bus的平均里程25km/h
const val BUS_AVERAGE_SPEED = 25
// 订单总里程
const val BUS_SP_KEY_ORDER_SUM_DIS = "BUS_SP_KEY_ORDER_SUM_DIS"