diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt index 9e597fea22..51af65b64a 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt @@ -15,6 +15,7 @@ import com.mogo.och.bridge.autopilot.autopilot.bean.SessionWithTime import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory import java.util.concurrent.atomic.AtomicReference object OchAutoPilotManager { @@ -104,10 +105,27 @@ object OchAutoPilotManager { val sessionId = CallerAutoPilotControlManager.startAutoPilot(controlParameters) globalSessionId.set(SessionWithTime(sessionId,System.currentTimeMillis(),-1L)) OchAutoPilotStatusListenerManager.fsmBackSessionId.set(-1L) - OchAutopilotAnalytics.triggerStartAutopilotParameters(controlParameters, sessionId) + OchAutopilotAnalytics.triggerStartAutopilotParameters(null, controlParameters, sessionId) + return sessionId + } + @JvmStatic + fun unmannedStartAutoPilot(taskId: Long, traj: Trajectory, parameters: AutopilotControlParameters): Long { + val sessionId = CallerAutoPilotControlManager.unmannedStartAutoPilot(taskId, traj, parameters) + globalSessionId.set(SessionWithTime(sessionId, System.currentTimeMillis(), -1L)) + OchAutoPilotStatusListenerManager.fsmBackSessionId.set(-1L) + OchAutopilotAnalytics.triggerStartAutopilotParameters(traj, parameters, sessionId) return sessionId } + //TODO 任务管理继续 +// @JvmStatic +// fun unmannedAutoPilotContinue(taskId: Long, traj: Trajectory, parameters: AutopilotControlParameters): Long { +// val sessionId = CallerAutoPilotControlManager.unmannedAutoPilotContinue(taskId, traj, parameters) +// globalSessionId.set(SessionWithTime(sessionId, System.currentTimeMillis(), -1L)) +// OchAutoPilotStatusListenerManager.fsmBackSessionId.set(-1L) +// OchAutopilotAnalytics.triggerStartAutopilotParameters(traj, parameters, sessionId) +// return sessionId +// } /** * 启动自驾失败切 FSM返回的Session和启动SessionId 不同 */ diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutopilotAnalytics.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutopilotAnalytics.kt index e539af9f57..41f1744cb8 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutopilotAnalytics.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutopilotAnalytics.kt @@ -18,6 +18,7 @@ import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.common.module.exception.InitException import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.RxUtils +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory import io.reactivex.disposables.Disposable object OchAutopilotAnalytics { @@ -44,9 +45,11 @@ object OchAutopilotAnalytics { private const val EVENT_PARAM_START_FAILURE_CODE = "start_autopilot_failure_code" // 启动自驾失败code private const val EVENT_PARAM_START_FAILURE_MSG = "start_autopilot_failure_msg" // 启动自驾失败原因 private const val EVENT_PARAM_START_AUTOPILOT_SESSION_ID = "start_autopilot_cmd_session_id" //启动自驾命令请求的sessionId + private const val EVENT_PARAM_START_AUTOPILOT_UNMANNED = "start_autopilot_cmd_unmanned" //启动自驾命令请求是否是无人化操作的 private const val EVENT_KEY_START_AUTOPILOT_PARAMETERS = "event_key_och_start_autopilot_parameters" private const val EVENT_PARAM_START_AUTOPILOT_PARAMETERS= "start_autopilot_parameters" // 启动自驾参数 + private const val EVENT_PARAM_START_AUTOPILOT_UNMANNED_PARAMETERS= "start_autopilot_unmanned_parameters" // 启动自驾参数 private const val EVENT_KEY_START_AUTOPILOT_ACK = "event_key_och_start_autopilot_ack" private const val EVENT_PARAM_START_AUTOPILOT_ACK= "start_autopilot_parameters_ack" // 启动自驾参数 @@ -72,15 +75,19 @@ object OchAutopilotAnalytics { /** * 正式启动自驾把参数传给底层 */ - fun triggerStartAutopilotParameters(controlParameters: AutopilotControlParameters?, sessionId: Long){ + fun triggerStartAutopilotParameters(traj: Trajectory?, controlParameters: AutopilotControlParameters?, sessionId: Long) { val params = HashMap() params[EVENT_PARAM_ENV_ONLINE] = DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE params[EVENT_PARAM_START_AUTOPILOT_SESSION_ID] = sessionId + params[EVENT_PARAM_START_AUTOPILOT_UNMANNED] = traj != null + if (traj != null) { + params[EVENT_PARAM_START_AUTOPILOT_UNMANNED_PARAMETERS] = traj.toString() + } params[EVENT_PARAM_START_AUTOPILOT_PARAMETERS] = "${controlParameters.toString()}_${controlParameters?.autoPilotLine}_routeID:${controlParameters?.routeID}_routeName:${controlParameters?.routeName}" params[EVENT_PARAM_AUTOPILOTANALYTICS_GROUP] = EVENT_PARAM_AUTOPILOTANALYTICS_GROUP OchChainLogManager.addCommonParams(params) MogoAnalyticUtils.track(EVENT_KEY_START_AUTOPILOT_PARAMETERS, params) - OchChainLogManager.writeChainLogAutopilot("正式启动自驾把参数传给底层",params.toString(),false) + OchChainLogManager.writeChainLogAutopilot("正式启动自驾把参数传给底层", params.toString(), false) } /** @@ -250,7 +257,7 @@ object OchAutopilotAnalytics { /** * 触发更新 启动自驾命令 发送的sessionId */ - fun triggerUpdateStartAutoPilotSessionId(sessionId: Long) { + fun triggerUpdateStartAutoPilotSessionId(sessionId: Long, isUnmanned: Boolean = false) { if (TextUtils.isEmpty(mStartAutopilotKey)) { CallerLogger.e(SceneConstant.M_OCHCOMMON + "triggerUpdateStartAutoPilotSessionId but mStartAutopilotKey is null [sessionId = $sessionId] ") return @@ -260,6 +267,7 @@ object OchAutopilotAnalytics { return } mStartAutopilotParams[EVENT_PARAM_START_AUTOPILOT_SESSION_ID] = sessionId + mStartAutopilotParams[EVENT_PARAM_START_AUTOPILOT_UNMANNED] = isUnmanned } /** diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/line/LineManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/line/LineManager.kt index 12a2084d1e..6649b02e1c 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/line/LineManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/line/LineManager.kt @@ -25,20 +25,26 @@ import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.bridge.R -import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.bridge.autopilot.OCHAdasAbilityManager import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotManager import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotManager.startAutoPilot +import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotManager.unmannedStartAutoPilot import com.mogo.och.bridge.autopilot.autopilot.OchAutopilotAnalytics import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.biz.media.VoiceNotice +import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.CallerBase -import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.data.bean.BusStationBean import com.mogo.och.data.bean.ContraiInfo import com.mogo.och.data.bean.LineInfo import com.zhjt.mogo.adas.data.bean.ReceivedAck +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.AutopilotPoint +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.VehicleSite +import com.zhjt.mogo.adas.unmanned.task.enums.AutopilotCoordinateTypeEnum +import com.zhjt.mogo.adas.unmanned.task.enums.StationEnum import kotlin.properties.Delegates /** @@ -126,13 +132,13 @@ object LineManager : CallerBase() { it.value.onAutopilotIdChange(oldValue, newValue) } if (!AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && - !AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) && - !AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) + !AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) && + !AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) ) { val (start, end) = getStations() if (start != null && end != null) { val ochInfo = - OchInfo(0, mutableListOf(start.toMogoLocation(), end.toMogoLocation())) + OchInfo(0, mutableListOf(start.toMogoLocation(), end.toMogoLocation())) CallerDataCenterBizListener.invokeOchInfo(ochInfo) OchChainLogManager.writeChainLogMap("向地图传参数", "参数信息:${ochInfo}") d(TAG, "向地图传参数_参数信息:${ochInfo}") @@ -169,8 +175,8 @@ object LineManager : CallerBase() { val startLon = end.gcjLon val startLat = end.gcjLat val distance = CoordinateUtils.calculateLineDistance( - startLon, startLat, - mogoLocation.longitude, mogoLocation.latitude + startLon, startLat, + mogoLocation.longitude, mogoLocation.latitude ) if (distance <= OchCommonConst.ARRIVE_AT_END_STATION_DISTANCE) { /** @@ -178,10 +184,10 @@ object LineManager : CallerBase() { * [com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager.onAutoPilotStation] */ val token = - CallerAutoPilotControlManager.sendSsmFuncQueryAutoPilotStation(teleOrderId) + CallerAutoPilotControlManager.sendSsmFuncQueryAutoPilotStation(teleOrderId) OchChainLogManager.writeChainLogAutopilot( - "到站逻辑", - "距离站点:$distance 请求token:$token" + "到站逻辑", + "距离站点:$distance 请求token:$token" ) d(TAG, "到站逻辑_距离站点:$distance 请求token:$token") } @@ -231,8 +237,8 @@ object LineManager : CallerBase() { setAutopilotControlParameters() } OchChainLogManager.writeChainLogAutopilot( - "自驾参数", - "站点信息:${startStation}---${endStation}" + "自驾参数", + "站点信息:${startStation}---${endStation}" ) d(TAG, "自驾参数 设置站点_站点信息:${startStation}---${endStation}") } @@ -352,9 +358,9 @@ object LineManager : CallerBase() { endStationLocation.latitude = end.gcjLat endStationLocation.longitude = end.gcjLon TrajectoryAndDistanceManager.setStationPoint( - startStationLocation, - endStationLocation, - lineInfo.lineId + startStationLocation, + endStationLocation, + lineInfo.lineId ) OchLocationManager.addGCJ02Listener(TAG, 1, mMapLocationListener) // 恢复启动自驾信息 @@ -405,7 +411,7 @@ object LineManager : CallerBase() { var parameters: AutopilotControlParameters? = null getStationsWithLine { start, end, lineInfo -> this.autopilotId = - "${lineInfo.lineId}_${start.siteId}_${end.siteId}_${lineInfo.orderId}" + "${lineInfo.lineId}_${start.siteId}_${end.siteId}_${lineInfo.orderId}" this.teleOrderId = lineInfo.genAutopilotId() } getStationsWithLineAndContrai { start, end, lineInfo, contrai -> @@ -414,8 +420,8 @@ object LineManager : CallerBase() { parameters?.routeName = lineInfo.lineName parameters?.startName = start.name ?: "" parameters?.endName = end.name ?: "" - parameters?.startLatLon = AutoPilotLonLat(start.lat, start.lon,true) - parameters?.endLatLon = AutoPilotLonLat(end.lat, end.lon,true) + parameters?.startLatLon = AutoPilotLonLat(start.lat, start.lon, true) + parameters?.endLatLon = AutoPilotLonLat(end.lat, end.lon, true) if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { parameters?.vehicleType = 9 } else { @@ -427,24 +433,24 @@ object LineManager : CallerBase() { if (parameters?.autoPilotLine == null) { parameters?.autoPilotLine = AutoPilotLine( - lineInfo.lineId, - lineInfo.lineName, - contrai.csvFileUrl, - contrai.csvFileMd5, - contrai.txtFileUrl, - contrai.txtFileMd5, - contrai.contrailSaveTime, - "", - "", - "", - "", - "", - 0L + lineInfo.lineId, + lineInfo.lineName, + contrai.csvFileUrl, + contrai.csvFileMd5, + contrai.txtFileUrl, + contrai.txtFileMd5, + contrai.contrailSaveTime, + "", + "", + "", + "", + "", + 0L ) } if (endStation?.passPoints?.isNotEmpty() == true || - endStation?.blackPoints?.isNotEmpty() == true + endStation?.blackPoints?.isNotEmpty() == true ) { val (wayLatLons, blackLatLons) = endStation!!.getWayBlackLatLons() parameters?.wayLatLons = wayLatLons @@ -474,12 +480,12 @@ object LineManager : CallerBase() { parameters = AutopilotControlParameters() - parameters.routeID = lineInfos?.lineId?.toInt()?:0 - parameters.routeName = lineInfos?.lineName?:"" + parameters.routeID = lineInfos?.lineId?.toInt() ?: 0 + parameters.routeName = lineInfos?.lineName ?: "" lineInfos?.siteInfos?.let { - if(it.size>=0){ - parameters.startLatLon = AutoPilotLonLat(it.first().lat, it.first().lon,true) - parameters.endLatLon = AutoPilotLonLat(it.last().lat, it.last().lon,true) + if (it.size >= 0) { + parameters.startLatLon = AutoPilotLonLat(it.first().lat, it.first().lon, true) + parameters.endLatLon = AutoPilotLonLat(it.last().lat, it.last().lon, true) parameters.startName = it.first().name ?: "" parameters.endName = it.last().name ?: "" } @@ -495,30 +501,30 @@ object LineManager : CallerBase() { if (parameters.autoPilotLine == null) { parameters.autoPilotLine = AutoPilotLine( - lineInfos?.lineId?:0L, - lineInfos?.lineName?:"", - contraiInfo?.csvFileUrl?:"", - contraiInfo?.csvFileMd5?:"", - contraiInfo?.txtFileUrl?:"", - contraiInfo?.txtFileMd5?:"", - contraiInfo?.contrailSaveTime?:System.currentTimeMillis(), - "", - "", - "", - "", - "", - 0L + lineInfos?.lineId ?: 0L, + lineInfos?.lineName ?: "", + contraiInfo?.csvFileUrl ?: "", + contraiInfo?.csvFileMd5 ?: "", + contraiInfo?.txtFileUrl ?: "", + contraiInfo?.txtFileMd5 ?: "", + contraiInfo?.contrailSaveTime ?: System.currentTimeMillis(), + "", + "", + "", + "", + "", + 0L ) } val wayLatLons = mutableListOf() val blackLatLons = mutableListOf() lineInfos?.siteInfos?.forEachIndexed { index, site -> - if(index>0){ + if (index > 0) { val (wayLatLonsSite, blackLatLonsSite) = site.getWayBlackLatLons() wayLatLons.addAll(wayLatLonsSite) blackLatLons.addAll(blackLatLonsSite) - if(index!=lineInfos!!.siteInfos.size-1) { + if (index != lineInfos!!.siteInfos.size - 1) { wayLatLons.add(AutoPilotLonLat(site.lat, site.lon, true)) } } @@ -568,15 +574,15 @@ object LineManager : CallerBase() { return } else { if (FunctionBuildConfig.isPassStartAutopilotCommand - && TextUtils.isEmpty(_contraiInfo!!.csvFileUrl) - && TextUtils.isEmpty(_contraiInfo!!.csvFileMd5) + && TextUtils.isEmpty(_contraiInfo!!.csvFileUrl) + && TextUtils.isEmpty(_contraiInfo!!.csvFileMd5) ) { // ToastUtils.showLong("无发布轨迹, 请发布后重试") // ToastUtils.showLong(R.string.module_taxi_no_publication_trajectory) e( - TAG, "isPassStartAutopilotCommand = " + - FunctionBuildConfig.isPassStartAutopilotCommand - + "busRoutesResult.csvFileUrl = " + _contraiInfo!!.csvFileUrl + TAG, "isPassStartAutopilotCommand = " + + FunctionBuildConfig.isPassStartAutopilotCommand + + "busRoutesResult.csvFileUrl = " + _contraiInfo!!.csvFileUrl ) return } @@ -600,7 +606,7 @@ object LineManager : CallerBase() { return } - triggerStartServiceEvent(false, 0, "" ,isSlideAutoStart) + triggerStartServiceEvent(false, 0, "", isSlideAutoStart) val parameters = initAutopilotControlParameters() if (null == parameters) { @@ -612,10 +618,10 @@ object LineManager : CallerBase() { OchAutopilotAnalytics.triggerUpdateStartAutoPilotSessionId(sessionId) d( - TAG, - "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) - + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + - "isRestart = " + isFirstStartAutopilot + TAG, + "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) + + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + + "isRestart = " + isFirstStartAutopilot ) M_LISTENERS.forEach { @@ -623,11 +629,183 @@ object LineManager : CallerBase() { } } + fun unmannedStartAutopilot(taskId: Long, isSlideAutoStart: Boolean = false) { + if (startStation == null || endStation == null) { +// ToastUtils.showShort("未设置起始或终点站点") + ToastUtils.showShort(R.string.module_och_not_stat_and_end_point) + return + } + startStation?.let { + if (!it.isLeaving) { +// ToastUtils.showShort("请滑动出发后再启动自驾") + ToastUtils.showShort(R.string.module_och_please_slide_hint) + return + } + } + /** + * 存在Session + */ + if (!OchAutoPilotManager.canStartAutopilotBySessionId()) { + return + } + OchAutopilotAnalytics.triggerClickStartAutopilotTime(System.currentTimeMillis()) + //1、判断轨迹url是否可用 + if (_contraiInfo == null) { +// ToastUtils.showLong("无发布轨迹, 请发布后重试") + ToastUtils.showLong(R.string.module_taxi_no_publication_trajectory) + return + } else { + if (FunctionBuildConfig.isPassStartAutopilotCommand + && TextUtils.isEmpty(_contraiInfo!!.csvFileUrl) + && TextUtils.isEmpty(_contraiInfo!!.csvFileMd5) + ) { +// ToastUtils.showLong("无发布轨迹, 请发布后重试") + ToastUtils.showLong(R.string.module_taxi_no_publication_trajectory) + e( + TAG, "isPassStartAutopilotCommand = " + + FunctionBuildConfig.isPassStartAutopilotCommand + + "busRoutesResult.csvFileUrl = " + _contraiInfo!!.csvFileUrl + ) + return + } + } + triggerStartServiceEvent(false, 0, "", isSlideAutoStart) + val parameters = initAutopilotControlParameters() + if (null == parameters) { + e(TAG, "无人化 行程日志-AutopilotControlParameters is empty.") + return + } + _lineInfos?.let { i -> + val wayPoints = ArrayList() + val blackPoints = ArrayList() + i.siteInfos.forEach { site -> + wayPoints.add(VehicleSite.builder() + .coordinateType(AutopilotCoordinateTypeEnum.WGS84.code) + .point(AutopilotPoint.builder().x(site.lon).y(site.lat).build()) + .station(StationEnum.SITE.code) + .stationId(site.siteId.toLong()) + .stationName(site.name) + .stationSeq(site.seq) + .tag(site.tag) + .build()) + site.passPoints?.forEach { p -> + wayPoints.add(VehicleSite.builder() + .coordinateType(AutopilotCoordinateTypeEnum.WGS84.code) + .point(AutopilotPoint.builder().x(p.lon).y(p.lat).build()) + .station(StationEnum.SITE.code) + .stationId(p.siteId.toLong()) + .stationName(p.name) + .stationSeq(p.seq) + .tag(p.tag) + .build()) + } + site.blackPoints?.forEach { b -> + blackPoints.add(VehicleSite.builder() + .coordinateType(AutopilotCoordinateTypeEnum.WGS84.code) + .point(AutopilotPoint.builder().x(b.lon).y(b.lat).build()) + .station(StationEnum.SITE.code) + .stationId(b.siteId.toLong()) + .stationName(b.name) + .stationSeq(b.seq) + .tag(b.tag) + .build()) + } + } + val traj = Trajectory.builder() + .id(i.lineId) + .name(i.lineName) + .trajUrl(_contraiInfo!!.csvFileUrl) + .trajMd5(_contraiInfo!!.csvFileMd5) + .stopUrl(_contraiInfo!!.txtFileUrl) + .stopMd5(_contraiInfo!!.txtFileMd5) + .timestamp(_contraiInfo!!.contrailSaveTime) + .wayPoints(wayPoints) + .blackPoints(blackPoints) + .build() + val sessionId = unmannedStartAutoPilot(taskId, traj, parameters) + OchAutopilotAnalytics.triggerUpdateStartAutoPilotSessionId(sessionId, true) + d( + TAG, + "无人化 行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) + + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + + "isRestart = " + isFirstStartAutopilot + ) + M_LISTENERS.forEach { + it.value.sendStartAutopilotSuccess() + } + } + } + + + //TODO 任务管理继续 + fun unmanneAutopilotContinue(taskId: Long, isSlideAutoStart: Boolean = false) { + if (startStation == null || endStation == null) { +// ToastUtils.showShort("未设置起始或终点站点") + ToastUtils.showShort(R.string.module_och_not_stat_and_end_point) + return + } + startStation?.let { + if (!it.isLeaving) { +// ToastUtils.showShort("请滑动出发后再启动自驾") + ToastUtils.showShort(R.string.module_och_please_slide_hint) + return + } + } + /** + * 存在Session + */ + if (!OchAutoPilotManager.canStartAutopilotBySessionId()) { + return + } + OchAutopilotAnalytics.triggerClickStartAutopilotTime(System.currentTimeMillis()) + //1、判断轨迹url是否可用 + if (_contraiInfo == null) { +// ToastUtils.showLong("无发布轨迹, 请发布后重试") + ToastUtils.showLong(R.string.module_taxi_no_publication_trajectory) + return + } else { + if (FunctionBuildConfig.isPassStartAutopilotCommand + && TextUtils.isEmpty(_contraiInfo!!.csvFileUrl) + && TextUtils.isEmpty(_contraiInfo!!.csvFileMd5) + ) { +// ToastUtils.showLong("无发布轨迹, 请发布后重试") + ToastUtils.showLong(R.string.module_taxi_no_publication_trajectory) + e( + TAG, "isPassStartAutopilotCommand = " + + FunctionBuildConfig.isPassStartAutopilotCommand + + "busRoutesResult.csvFileUrl = " + _contraiInfo!!.csvFileUrl + ) + return + } + } + triggerStartServiceEvent(false, 0, "", isSlideAutoStart) + val parameters = initAutopilotControlParameters() + if (null == parameters) { + e(TAG, "无人化 行程日志-AutopilotControlParameters is empty.") + return + } + _lineInfos?.let { i -> + + //TODO 任务管理继续 +// val sessionId = unmannedAutoPilotContinue(taskId, traj, parameters) +// OchAutopilotAnalytics.triggerUpdateStartAutoPilotSessionId(sessionId, true) + d( + TAG, + "无人化 行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) + + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + + "isRestart = " + isFirstStartAutopilot + ) + M_LISTENERS.forEach { + it.value.sendStartAutopilotSuccess() + } + } + } + private fun triggerUnableStartAPReasonEvent() { getStationsWithLine { start, end, line -> OchAutopilotAnalytics.triggerUnableStartAPReasonEvent( - start.name ?: "", end.name ?: "", line.lineId.toString(), "", - OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + start.name ?: "", end.name ?: "", line.lineId.toString(), "", + OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason ) } } @@ -640,16 +818,16 @@ object LineManager : CallerBase() { fun triggerStartServiceEvent(send: Boolean, source: Int, type: String, isSlideAutoStart: Boolean = false) { getStationsWithLine { start, end, lineInfo -> OchAutopilotAnalytics.triggerStartAutopilotEvent( - isFirstStartAutopilot, - send, - start.name ?: "", - end.name ?: "", - lineInfo.lineId.toInt(), - "", - System.currentTimeMillis(), - type, - source, - isSlideAutoStart + isFirstStartAutopilot, + send, + start.name ?: "", + end.name ?: "", + lineInfo.lineId.toInt(), + "", + System.currentTimeMillis(), + type, + source, + isSlideAutoStart ) if (send) {// 启动自驾成功回调 teleIsFirstStartAutopilot = false @@ -661,6 +839,7 @@ object LineManager : CallerBase() { } } } + fun triggerCompleteTask(isSlideStop: Boolean) { getStationsWithLine { start, end, lineInfo -> OchAutopilotAnalytics.triggerCompleteTask(System.currentTimeMillis(), isSlideStop, lineInfo.lineId.toInt()) @@ -677,9 +856,9 @@ object LineManager : CallerBase() { @JvmStatic fun invokeStartAutopilotFailure(startFailedCode: String, startFailedMessage: String) { OchAutopilotAnalytics.triggerStartAutopilotFailureEventByAdas( - startFailedCode, - startFailedMessage, - System.currentTimeMillis() + startFailedCode, + startFailedMessage, + System.currentTimeMillis() ) M_LISTENERS.forEach { it.value.startAutopilotFailure(startFailedCode, startFailedMessage) @@ -704,8 +883,8 @@ object LineManager : CallerBase() { // ToastUtils.showShort("${autopilotIdFromFsm}_${teleOrderId}_自动驾驶id不同请排查") // ToastUtils.showShort(R.string.module_och_autopilot_id_diff, autopilotIdFromFsm, teleOrderId) OchChainLogManager.writeChainLogAutopilot( - "自驾Id", - "${autopilotIdFromFsm}_${teleOrderId}_自动驾驶id不同请排查" + "自驾Id", + "${autopilotIdFromFsm}_${teleOrderId}_自动驾驶id不同请排查" ) // val initAutopilotControlParameters = initAutopilotControlParameters() // if (initAutopilotControlParameters!==null&&initAutopilotControlParameters.autoPilotLine!=null diff --git a/OCH/shuttle/driver_unmanned/build.gradle b/OCH/shuttle/driver_unmanned/build.gradle index a2a12958b8..44aecebeda 100644 --- a/OCH/shuttle/driver_unmanned/build.gradle +++ b/OCH/shuttle/driver_unmanned/build.gradle @@ -72,7 +72,6 @@ dependencies { implementation project(":OCH:common:common") implementation project(":OCH:common:data") - compileOnly project(":libraries:mogo-map") } diff --git a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ShuttleDriverUnmannedProvider.kt b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ShuttleDriverUnmannedProvider.kt index 18d17f4091..fe9af3579c 100644 --- a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ShuttleDriverUnmannedProvider.kt +++ b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ShuttleDriverUnmannedProvider.kt @@ -4,7 +4,6 @@ import android.content.Context import android.view.View import androidx.fragment.app.Fragment import com.alibaba.android.arouter.facade.annotation.Route -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS import com.mogo.eagle.core.utilcode.util.ThreadUtils @@ -21,7 +20,6 @@ import com.mogo.och.unmanned.repository.db.repository.TaskSiteDb import com.mogo.och.unmanned.repository.db.repository.WriteOffDb import com.mogo.och.unmanned.ui.fragment.ShuttleFragment import com.mogo.och.unmanned.util.BusAnalyticsManager -import com.mogo.och.unmanned.util.BusTrajectoryManager /** * 网约车小巴业务实现入口 @@ -53,7 +51,7 @@ class ShuttleDriverUnmannedProvider : CommonServiceImpl() { OchAutopilotAnalytics.ochEventKey = BusAnalyticsManager LineModel.init() // ScannerManager.load() - BusTrajectoryManager.load() +// BusTrajectoryManager.load() return busFragment!! } @@ -63,7 +61,7 @@ class ShuttleDriverUnmannedProvider : CommonServiceImpl() { OchAutopilotAnalytics.ochEventKey = null LineModel.release() // ScannerManager.release() - BusTrajectoryManager.release() +// BusTrajectoryManager.release() RepositoryManager.release() } diff --git a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/LineModel.kt b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/LineModel.kt index a6ab8a172f..3115812443 100644 --- a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/LineModel.kt +++ b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/LineModel.kt @@ -260,7 +260,7 @@ object LineModel { ThirdDeviceData.sendTaskDetailsToClients() ShuttleVoiceManager.endOrderBus() // 取消自驾 - CallerAutoPilotControlManager.cancelAutoPilot() + CallerAutoPilotControlManager.cancelAutoPilot(taskId) currentTask = null LineManager.setLineInfo(null) LineManager.setStartAndEndStation(null, null) @@ -299,7 +299,7 @@ object LineModel { ThirdDeviceData.sendTaskDetailsToClients() ShuttleVoiceManager.endOrderBus() // 取消自驾 - CallerAutoPilotControlManager.cancelAutoPilot() + CallerAutoPilotControlManager.cancelAutoPilot(taskId) currentTask = null LineManager.setLineInfo(null) LineManager.setStartAndEndStation(null, null) diff --git a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/OrderModel.kt b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/OrderModel.kt index 01d657adc7..c7b3618978 100644 --- a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/OrderModel.kt +++ b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/model/OrderModel.kt @@ -16,7 +16,6 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager @@ -44,7 +43,6 @@ import com.mogo.och.unmanned.constant.BusConst import com.mogo.och.unmanned.repository.RepositoryManager import com.mogo.och.unmanned.repository.db.bean.TaskSiteDataBean import com.mogo.och.unmanned.repository.exception.DataException -import com.mogo.och.unmanned.util.BusTrajectoryManager import com.mogo.och.unmanned.util.ShuttleVoiceManager import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers @@ -243,12 +241,12 @@ object OrderModel { } } - private fun onStartAutopilot() { + private fun onStartAutopilot(taskId: Long?) { //开启自动驾驶 2.10.0: 如果自动驾驶状态下开启, 非自动驾驶状态下不开启,需手动点击自动驾驶按钮开启 isGoingToNextStation = true - if (CallerAutoPilotStatusListenerManager.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING + if (CallerAutoPilotStatusListenerManager.getState() != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ) { - LineManager.startAutopilot(true) + LineManager.unmannedStartAutopilot(taskId ?: 0L, true) } } @@ -311,7 +309,7 @@ object OrderModel { } LineModel.leaveStationSuccess() isArrivedStation = false - onStartAutopilot() + onStartAutopilot(task.taskId) ThirdDeviceData.leaveStation() @@ -329,7 +327,7 @@ object OrderModel { if (data) { LineModel.leaveStationSuccess() isArrivedStation = false - onStartAutopilot() + onStartAutopilot(task.taskId) ThirdDeviceData.leaveStation() @@ -354,17 +352,17 @@ object OrderModel { * onArriveAt */ private fun updateBusStatus() { - val (startStation, endStation) = LineManager.getStations() - if (startStation != null && endStation != null) { - if (startStation.isLeaving) {// 出发需要移除 - MapMakerManager.removeMapMaker(BusConst.BUS_START_MAP_MAKER, startStation.lat, startStation.lon) - } else {// 为出发展示 - MapMakerManager.addMapMaker(TAG, BusConst.BUS_START_MAP_MAKER, startStation.lat, startStation.lon, R.raw.star_marker) - } - MapMakerManager.addMapMaker(TAG, BusConst.BUS_END_MAP_MAKER, endStation.lat, endStation.lon, R.raw.end_marker) - } else { - MapMakerManager.removeAllMapMarkerByOwner(TAG) - } +// val (startStation, endStation) = LineManager.getStations() +// if (startStation != null && endStation != null) { +// if (startStation.isLeaving) {// 出发需要移除 +// MapMakerManager.removeMapMaker(BusConst.BUS_START_MAP_MAKER, startStation.lat, startStation.lon) +// } else {// 为出发展示 +// MapMakerManager.addMapMaker(TAG, BusConst.BUS_START_MAP_MAKER, startStation.lat, startStation.lon, R.raw.star_marker) +// } +// MapMakerManager.addMapMaker(TAG, BusConst.BUS_END_MAP_MAKER, endStation.lat, endStation.lon, R.raw.end_marker) +// } else { +// MapMakerManager.removeAllMapMarkerByOwner(TAG) +// } LineModel.stationList?.let { if (LineModel.startTaskMessage()) { //默认是第一站到站查询 @@ -390,7 +388,7 @@ object OrderModel { ThirdDeviceData.sendTaskDetailsToClients() //需放在currentStationIndex赋值之后 - BusTrajectoryManager.syncTrajectoryInfo() +// BusTrajectoryManager.syncTrajectoryInfo() } } @@ -563,7 +561,7 @@ object OrderModel { CallerSopSettingManager.invokeRoutingListener(false) MapMakerManager.removeAllMapMarkerByOwner(TAG) LineManager.lastArrivedSiteId = -1 - BusTrajectoryManager.stopTrajReqLoop() +// BusTrajectoryManager.stopTrajReqLoop() LoginStatusManager.loginOut() } } diff --git a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/fragment/BusPresenter.kt b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/fragment/BusPresenter.kt index 30e5575a37..2ba6f15b00 100644 --- a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/fragment/BusPresenter.kt +++ b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/fragment/BusPresenter.kt @@ -11,7 +11,6 @@ import com.mogo.och.common.module.biz.login.ILoginCallback import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.login.LoginStatusManager.isLogin import com.mogo.och.unmanned.model.OrderModel -import com.mogo.och.unmanned.util.BusTrajectoryManager /** * 网约车小巴 @@ -46,7 +45,7 @@ class BusPresenter(view: ShuttleFragment?) : Presenter(view), override fun onLoginStatusChange(currentStatus: EnumLoginStatus) { d(TAG, " loginStatus =" + isLogin()) if (!isLogin()) { - BusTrajectoryManager.stopTrajReqLoop() +// BusTrajectoryManager.stopTrajReqLoop() OrderModel.closeBeautificationMode() } } diff --git a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/switchtask/SwitchTaskView.kt b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/switchtask/SwitchTaskView.kt index 267145466e..94defed1cb 100644 --- a/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/switchtask/SwitchTaskView.kt +++ b/OCH/shuttle/driver_unmanned/src/main/java/com/mogo/och/unmanned/ui/switchtask/SwitchTaskView.kt @@ -6,6 +6,8 @@ import android.view.LayoutInflater import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import androidx.recyclerview.widget.GridLayoutManager +import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.function.call.autopilot.CallerFsm2024ListenerManager import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS @@ -86,7 +88,15 @@ class SwitchTaskView : WindowRelativeLayout, SwtichTaskModel.SwtichLineViewCallb ToastUtils.showShort(R.string.module_och_this_task_not_use1, reason) } } else { - viewModel?.changeLineStart(tempCheckTask) + if (AppConfigInfo.isConnectAutopilot) { + if (CallerFsm2024ListenerManager.getPlaceOrderStandby()) { + viewModel?.changeLineStart(tempCheckTask) + } else { + ToastUtils.showShort(R.string.unmanned_place_order_standby_false) + } + } else { + ToastUtils.showShort(R.string.unmanned_not_connected_ipc) + } } } } diff --git a/OCH/shuttle/driver_unmanned/src/main/res/raw/end_marker.nt3d b/OCH/shuttle/driver_unmanned/src/main/res/raw/end_marker.nt3d deleted file mode 100644 index be6057c547..0000000000 Binary files a/OCH/shuttle/driver_unmanned/src/main/res/raw/end_marker.nt3d and /dev/null differ diff --git a/OCH/shuttle/driver_unmanned/src/main/res/raw/star_marker.nt3d b/OCH/shuttle/driver_unmanned/src/main/res/raw/star_marker.nt3d deleted file mode 100644 index c6e546fc31..0000000000 Binary files a/OCH/shuttle/driver_unmanned/src/main/res/raw/star_marker.nt3d and /dev/null differ diff --git a/OCH/shuttle/driver_unmanned/src/main/res/values-en/strings.xml b/OCH/shuttle/driver_unmanned/src/main/res/values-en/strings.xml index 06ec8d1920..fdda224718 100644 --- a/OCH/shuttle/driver_unmanned/src/main/res/values-en/strings.xml +++ b/OCH/shuttle/driver_unmanned/src/main/res/values-en/strings.xml @@ -1,6 +1,6 @@ Please select task - Arrived at Station + Skip a Stop Complete Confirm Schedule Return @@ -23,7 +23,6 @@ Vehicle encountered an emergency and is processing it safely - Please log out after completing task information synchronization in an area with good network Please end the task before logging out @@ -36,13 +35,14 @@ Uploading - The departure time is in %1$s minutes Local Cache Task → %s No notifications More + Vehicle temporarily unavailable. Please check the operation status of each node. + IPC not connected yet; autonomous driving unavailable temporarily. Arrived at %1$s. Please take your belongings and be aware of oncoming vehicles when getting off. diff --git a/OCH/shuttle/driver_unmanned/src/main/res/values/strings.xml b/OCH/shuttle/driver_unmanned/src/main/res/values/strings.xml index 66cb2ec066..193cab51b8 100644 --- a/OCH/shuttle/driver_unmanned/src/main/res/values/strings.xml +++ b/OCH/shuttle/driver_unmanned/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ 请选择任务 - 到站 + 跳站 结束 确认班次 返回 @@ -23,7 +23,6 @@ 车辆遇到紧急情况,正在安全处理 - 请在网络良好的区域完成任务信息同步后退出 请结束任务后再退出登录 @@ -36,13 +35,14 @@ 上传中 - 距离发车时间还有%1$s分钟 本地缓存任务 → %s 暂无通知 更多 + 车辆暂不可用,请检查各节点运行状态 + 尚未连接工控机,自动驾驶暂不可用 已到达%1$s,请带好随身物品,下车时注意后方来车。 diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 97c0c0218f..8a29eb7c60 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -83,6 +83,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendRes import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm import com.zhjt.mogo.adas.data.sweeper.task.s_r.SweeperTaskSuspendResume import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory import com.zhjt.service.chain.ChainLog import io.netty.channel.Channel import mogo.telematics.pad.MessagePad @@ -99,9 +100,9 @@ import java.util.concurrent.TimeUnit */ @Route(path = MogoServicePaths.PATH_AUTO_PILOT) class MoGoAutopilotControlProvider : - IMoGoAutopilotControlProvider, - IMoGoMapDataCollectProvider.OnMapCollectCmdListener, - IMoGoAutopilotCarConfigListener { + IMoGoAutopilotControlProvider, + IMoGoMapDataCollectProvider.OnMapCollectCmdListener, + IMoGoAutopilotCarConfigListener { private val TAG = "MoGoAutoPilotProvider" private var mContext: Context? = null private lateinit var msgHandler: IMsgHandler @@ -109,6 +110,7 @@ class MoGoAutopilotControlProvider : @Volatile private var isInit = false + @Volatile private var isRainModeInit = false @@ -137,22 +139,22 @@ class MoGoAutopilotControlProvider : // "192.168.1.102" val options = AdasOptions.newBuilder() - .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) - .setPingAddressList(AdasManager.getInstance().pingAddressList) - .setPassenger(false) - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) + .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) + .setPingAddressList(AdasManager.getInstance().pingAddressList) + .setPassenger(false) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) // .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) // .setSubscribeInterfaceOptions(subscribeInterfaceOptions)// - .build() + .build() AdasManager.getInstance().create(AbsMogoApplication.getApp(), options, MoGoAdasMsgConnectStatusListenerImpl()) //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// // 监听ADAS-SDK获取到的工控机数据 AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) NSDNettyManager.getInstance().startNSDNettyServerWithSN(context, object : - NettyServerListener { + NettyServerListener { override fun onMessageResponseServer(msg: MogoProtocolMsg?, channel: Channel?) { msgHandler.handleMsgFromClient(msg, channel) } @@ -205,26 +207,26 @@ class MoGoAutopilotControlProvider : }, SharedPrefsMgr.getInstance().sn) } else { NSDNettyManager.getInstance() - .searchAndConnectServer(context, SharedPrefsMgr.getInstance().sn, - DeviceUtils.isLeOrEb5Model(), - object : NettyClientListener { - override fun onMessageResponseClient( - msg: MogoProtocolMsg?, - sign: String?, - channel: Channel - ) { - // 乘客端收到adas数据直接解析,后续分发解析后的数据流程同司机端 - msgHandler.handleMsgFromServer(msg, channel) - } + .searchAndConnectServer(context, SharedPrefsMgr.getInstance().sn, + DeviceUtils.isLeOrEb5Model(), + object : NettyClientListener { + override fun onMessageResponseClient( + msg: MogoProtocolMsg?, + sign: String?, + channel: Channel + ) { + // 乘客端收到adas数据直接解析,后续分发解析后的数据流程同司机端 + msgHandler.handleMsgFromServer(msg, channel) + } - override fun onClientStatusConnectChanged( - statusCode: Int, - sign: String?, - channel: Channel - ) { - msgHandler.handleClientConnStatus(statusCode, sign, channel) - } - }) + override fun onClientStatusConnectChanged( + statusCode: Int, + sign: String?, + channel: Channel + ) { + msgHandler.handleClientConnStatus(statusCode, sign, channel) + } + }) } msgHandler.setListener(object : EventListener { override fun connectDevice(isSupportMulti: Boolean) { @@ -243,12 +245,12 @@ class MoGoAutopilotControlProvider : directConnect(context) } else { val options = AdasOptions - .newBuilder() - .setPassenger(true) + .newBuilder() + .setPassenger(true) // .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) - .build() + .build() AdasManager.getInstance() - .create(AbsMogoApplication.getApp(), options, MoGoAdasMsgConnectStatusListenerImpl()) + .create(AbsMogoApplication.getApp(), options, MoGoAdasMsgConnectStatusListenerImpl()) // 监听ADAS-SDK获取到的工控机数据 AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) // 接收司机屏发过来的感知、定位等数据 @@ -274,15 +276,15 @@ class MoGoAutopilotControlProvider : private fun directConnect(context: Context) { val options = AdasOptions - .newBuilder() - .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) - .setPingAddressList(AdasManager.getInstance().pingAddressList) - .setPassenger(false)// 乘客端直连工控机改为false - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) + .newBuilder() + .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.PING) + .setPingAddressList(AdasManager.getInstance().pingAddressList) + .setPassenger(false)// 乘客端直连工控机改为false + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) // .setLaunchAutopilotGear(FunctionBuildConfig.launchAutopilotGear) - .build() + .build() AdasManager.getInstance().create(AbsMogoApplication.getApp(), options, MoGoAdasMsgConnectStatusListenerImpl()) //////////////////////////////////注意先后顺序,AdasManager.getInstance().create后才可以设置监听///////////////////////////////////////////// // 监听ADAS-SDK获取到的工控机数据 @@ -301,7 +303,7 @@ class MoGoAutopilotControlProvider : if (NSDNettyManager.getInstance().isServerStart) { msgHandler.synWriteTime() NSDNettyManager.getInstance() - .sendMsgToAllClients(MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes)) + .sendMsgToAllClients(MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes)) } else { CallerLogger.d("$M_D_C$TAG", "司机端Server未启动!") } @@ -311,10 +313,10 @@ class MoGoAutopilotControlProvider : if (bytes == null) return NSDNettyManager.getInstance() - .sendMogoProtocolMsgToServer( - MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes), - null - ) + .sendMogoProtocolMsgToServer( + MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes), + null + ) } }) @@ -338,13 +340,13 @@ class MoGoAutopilotControlProvider : } // 设置IP地址 val options = AdasOptions.newBuilder() - .setPassenger(false) - .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) - .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) - .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) - .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.SPECIFIED) - .setSpecifiedAddress(autoPilotIp) - .build() + .setPassenger(false) + .setEnableCertification(SharedPrefsMgr.getInstance().getBoolean("${MoGoConfig.AUTOPILOT_CERTIFICATION}-${DebugConfig.getNetMode()}", MoGoConfig.AUTOPILOT_CERTIFICATION_DEFAULT_VALUE)) + .setRootCrt(CallerCloudCertManager.getRootCrtFDecode()) + .setDeviceCrt(CallerCloudCertManager.getDeviceCrtFDecode()) + .setConnectionMode(AdasOptions.IPC_CONNECTION_MODE.SPECIFIED) + .setSpecifiedAddress(autoPilotIp) + .build() AdasManager.getInstance().create(AbsMogoApplication.getApp(), options, MoGoAdasMsgConnectStatusListenerImpl()) AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) // AdasManager.getInstance().adasOptions.isClient = false @@ -381,10 +383,10 @@ class MoGoAutopilotControlProvider : @ChainLog( - linkChainLog = AdasChain.CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = AdasChain.CHAIN_SOURCE_ADAS, - nodeAliasCode = AdasChain.CHAIN_CODE_ADAS_START_AUTOPILOT, - paramIndexes = [0] + linkChainLog = AdasChain.CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = AdasChain.CHAIN_SOURCE_ADAS, + nodeAliasCode = AdasChain.CHAIN_CODE_ADAS_START_AUTOPILOT, + paramIndexes = [0] ) override fun startAutoPilot(controlParameters: AutopilotControlParameters): Long { return startAutoPilot(controlParameters, Constants.AUTOPILOT_SOURCE.PAD) @@ -392,9 +394,9 @@ class MoGoAutopilotControlProvider : //todo emArrow chainlog override fun startAutoPilotByMoFang(controlParameters: AutopilotControlParameters?) { - if (controlParameters==null){ + if (controlParameters == null) { startAutoPilotWithNoParameter(Constants.AUTOPILOT_SOURCE.MO_FANG) - }else{ + } else { startAutoPilot(controlParameters, Constants.AUTOPILOT_SOURCE.MO_FANG) } } @@ -406,12 +408,12 @@ class MoGoAutopilotControlProvider : private fun startAutoPilotWithNoParameter(source: Int) { if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, null, null, null) + .sendAutoPilotModeReq(1, source, null, null, null) invokeAutoPilotResult(if (invokeResult > -1) "无参自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, null, null, null) + .sendAutoPilotModeReq(1, source, null, null, null) invokeAutoPilotResult(if (invokeResult > -1) "无参自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶 无参") @@ -420,20 +422,20 @@ class MoGoAutopilotControlProvider : } private fun startAutoPilot(controlParameters: AutopilotControlParameters, source: Int): Long { - val startPosType = if(controlParameters.firstStationFlag==null){ + val startPosType = if (controlParameters.firstStationFlag == null) { null - }else{ + } else { MessagePad.StartPosType.forNumber(controlParameters.firstStationFlag!!) } if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.toAutoPilotCmdInfo(), startPosType) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.toAutoPilotCmdInfo(), startPosType) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") return invokeResult } else { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { val invokeResult = AdasManager.getInstance() - .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.toAutoPilotCmdInfo(), startPosType) + .sendAutoPilotModeReq(1, source, controlParameters.toRouteInfo(), controlParameters.toAutoPilotCmdInfo(), startPosType) invokeAutoPilotResult(if (invokeResult > -1) "自动驾驶调用成功:${invokeResult}" else "自动驾驶调用失败, socket 或者 rawPack 可能为空") return invokeResult } else { @@ -443,12 +445,35 @@ class MoGoAutopilotControlProvider : } } + + override fun sendTaskManagerAutopilotStart(taskId: Long, traj: Trajectory): Long { + return if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { + val invokeResult = AdasManager.getInstance().sendTaskManagerAutopilotStart(taskId, traj) + invokeAutoPilotResult(if (invokeResult > -1) "无人化 自动驾驶调用成功:${invokeResult}" else "无人化 自动驾驶调用失败, socket 或者 rawPack 可能为空") + invokeResult + } else { + invokeAutoPilotResult("无人化 车机与工控机链接失败,无法开启自动驾驶") + -1L + } + } + + override fun sendTaskManagerAutopilotContinue(trackId: Long, taskId: Long, stationId: Long, stationName: String, stationSeq: Int, lon: Double, lat: Double): Long { + return if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { + val invokeResult = AdasManager.getInstance().sendTaskManagerAutopilotContinue(trackId, taskId, stationId, stationName, stationSeq, lon, lat) + invokeAutoPilotResult(if (invokeResult > -1) "无人化 取消自动驾驶调用成功:${invokeResult}" else "无人化 取消自动驾驶调用失败, socket 或者 rawPack 可能为空") + invokeResult + } else { + invokeAutoPilotResult("无人化 车机与工控机链接失败,无法取消自动驾驶") + -1L + } + } + @ChainLog( - linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = CHAIN_SOURCE_ADAS, - parentNodeAliasCode = ChainConstant.CHAIN_CODE_EAGLE_START_AUTOPILOT, - nodeAliasCode = ChainConstant.CHAIN_CODE_EAGLE_START_AUTOPILOT_RESULT, - paramIndexes = [0] + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + parentNodeAliasCode = ChainConstant.CHAIN_CODE_EAGLE_START_AUTOPILOT, + nodeAliasCode = ChainConstant.CHAIN_CODE_EAGLE_START_AUTOPILOT_RESULT, + paramIndexes = [0] ) private fun invokeAutoPilotResult(status: String) { CallerLogger.e("$M_D_C$TAG", status) @@ -456,46 +481,50 @@ class MoGoAutopilotControlProvider : override fun sendTrafficLightData(trafficLightResult: TrafficLightResult) { AdasManager.getInstance().sendTrafficLightData( - trafficLightResult.crossId, - trafficLightResult.lat, - trafficLightResult.lon, - trafficLightResult.heading, - trafficLightResult.direction, - trafficLightResult.lightId, - trafficLightResult.laneNo, - trafficLightResult.arrowNo, - trafficLightResult.flashYellow, - trafficLightResult.toTrafficLightDetail(), - trafficLightResult.timeStamp + trafficLightResult.crossId, + trafficLightResult.lat, + trafficLightResult.lon, + trafficLightResult.heading, + trafficLightResult.direction, + trafficLightResult.lightId, + trafficLightResult.laneNo, + trafficLightResult.arrowNo, + trafficLightResult.flashYellow, + trafficLightResult.toTrafficLightDetail(), + trafficLightResult.timeStamp ) } override fun sendTrajectoryDownloadReq( - autoPilotLine: AutopilotControlParameters.AutoPilotLine, - routeInfo: MessagePad.RouteInfo?, - orderId: String? + autoPilotLine: AutopilotControlParameters.AutoPilotLine, + routeInfo: MessagePad.RouteInfo?, + orderId: String? ): Long { return AdasManager.getInstance() - .sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(), routeInfo, orderId) + .sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine(), routeInfo, orderId) } override fun sendTrajectoryDownloadReq( - autoPilotLine: AutopilotControlParameters.AutoPilotLine, - downloadType: Int, - routeInfo: MessagePad.RouteInfo?, - orderId: String? + autoPilotLine: AutopilotControlParameters.AutoPilotLine, + downloadType: Int, + routeInfo: MessagePad.RouteInfo?, + orderId: String? ): Long { return AdasManager.getInstance().sendTrajectoryDownloadReq( - autoPilotLine.toAutoPilotLine(), - downloadType, - routeInfo, - orderId + autoPilotLine.toAutoPilotLine(), + downloadType, + routeInfo, + orderId ) } - override fun cancelAutoPilot() { + override fun cancelAutoPilot(taskId: Long) { if (AdasManager.getInstance().ipcConnectionStatus == AdasConstants.IpcConnectionStatus.CONNECTED) { - val invokeResult = AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null, null, null) + val invokeResult = if (taskId == (-1).toLong()) { + AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null, null, null) + } else { + AdasManager.getInstance().sendTaskManagerAutopilotCancel(taskId) + } invokeAutoPilotResult(if (invokeResult > -1) "取消自动驾驶调用成功:${invokeResult}" else "取消自动驾驶调用失败, socket 或者 rawPack 可能为空") } else { invokeAutoPilotResult("车机与工控机链接失败,无法取消自动驾驶") @@ -504,7 +533,7 @@ class MoGoAutopilotControlProvider : override fun recordPackage(): Boolean { return AdasManager.getInstance() - .startRecordPackage((System.currentTimeMillis() / 1000).toInt(), 1) > -1 + .startRecordPackage((System.currentTimeMillis() / 1000).toInt(), 1) > -1 } override fun recordPackage(type: Int, id: Int): Boolean { @@ -520,11 +549,11 @@ class MoGoAutopilotControlProvider : } override fun recordPackage( - type: Int, - id: Int, - duration: Int, - bduration: Int, - topics: List + type: Int, + id: Int, + duration: Int, + bduration: Int, + topics: List ): Boolean { return AdasManager.getInstance().startRecordPackage(id, duration, type, bduration, topics) > -1 } @@ -555,7 +584,7 @@ class MoGoAutopilotControlProvider : override fun recordCause(key: String?, name: String?, id: String?, reason: String?) { key?.let { AdasManager.getInstance() - .sendRecordCause(it.toLong(), name ?: "", id ?: "", reason ?: "") + .sendRecordCause(it.toLong(), name ?: "", id ?: "", reason ?: "") } } @@ -576,13 +605,13 @@ class MoGoAutopilotControlProvider : // val byteArray = if (isEnable) byteArrayOf(1) else byteArrayOf(0) if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() - .sendMsgToAllClients( - MogoProtocolMsg( - SYNC_MODE_STATUS, - byteArray.size, - byteArray + .sendMsgToAllClients( + MogoProtocolMsg( + SYNC_MODE_STATUS, + byteArray.size, + byteArray + ) ) - ) } else { CallerLogger.d("$M_D_C$TAG", "同步美化模式状态时司机端Server未启动!") } @@ -602,13 +631,13 @@ class MoGoAutopilotControlProvider : } if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() - .sendMsgToAllClients( - MogoProtocolMsg( - SYNC_FUSION_COLOR_STATUS, - byteArray.size, - byteArray + .sendMsgToAllClients( + MogoProtocolMsg( + SYNC_FUSION_COLOR_STATUS, + byteArray.size, + byteArray + ) ) - ) } else { CallerLogger.d("$M_D_C$TAG", "同步感知颜色绘制时司机端Server未启动!") } @@ -625,13 +654,13 @@ class MoGoAutopilotControlProvider : } if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() - .sendMsgToAllClients( - MogoProtocolMsg( - 11, - byteArray.size, - byteArray + .sendMsgToAllClients( + MogoProtocolMsg( + 11, + byteArray.size, + byteArray + ) ) - ) } else { CallerLogger.d("$M_D_C$TAG", "同步美化模式状态时司机端Server未启动!") } @@ -644,10 +673,10 @@ class MoGoAutopilotControlProvider : * isEnable = false 关闭 */ @ChainLog( - linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = CHAIN_SOURCE_ADAS, - nodeAliasCode = CHAIN_CODE_ADAS_SEND, - paramIndexes = [0] + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_SEND, + paramIndexes = [0] ) override fun setIPCDemoMode(isEnable: Boolean) { if (isEnable) { @@ -658,10 +687,10 @@ class MoGoAutopilotControlProvider : } @ChainLog( - linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = CHAIN_SOURCE_ADAS, - nodeAliasCode = CHAIN_CODE_ADAS_SEND, - paramIndexes = [0] + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_SEND, + paramIndexes = [0] ) override fun setRainMode(isEnable: Boolean) { if (isEnable) { @@ -678,10 +707,10 @@ class MoGoAutopilotControlProvider : * @return boolean */ @ChainLog( - linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = CHAIN_SOURCE_ADAS, - nodeAliasCode = CHAIN_CODE_ADAS_SEND, - paramIndexes = [0] + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_SEND, + paramIndexes = [0] ) override fun sendDetouring(isEnable: Boolean): Boolean { return if (isEnable) { @@ -735,9 +764,9 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendAebCmd(isEnable: Boolean): Boolean { - return if(isEnable){ + return if (isEnable) { AdasManager.getInstance().sendAebCmd(1) > -1 - }else{ + } else { AdasManager.getInstance().sendAebCmd(0) > -1 } } @@ -749,9 +778,9 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendLaneChangeRestrainValid(isEnable: Boolean): Boolean { - return if(isEnable){ + return if (isEnable) { AdasManager.getInstance().sendLaneChangeRestrainValid(1) > -1 - }else{ + } else { AdasManager.getInstance().sendLaneChangeRestrainValid(0) > -1 } } @@ -763,9 +792,9 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendStopYieldValid(isEnable: Boolean): Boolean { - return if(isEnable){ + return if (isEnable) { AdasManager.getInstance().sendStopYieldValid(1) > -1 - }else{ + } else { AdasManager.getInstance().sendStopYieldValid(0) > -1 } } @@ -777,9 +806,9 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendHadmapSpeedLimitValid(isEnable: Boolean): Boolean { - return if(isEnable){ + return if (isEnable) { AdasManager.getInstance().sendHadmapSpeedLimitValid(1) > -1 - }else{ + } else { AdasManager.getInstance().sendHadmapSpeedLimitValid(0) > -1 } } @@ -791,9 +820,9 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendRampThetaValid(isEnable: Boolean): Boolean { - return if(isEnable){ + return if (isEnable) { AdasManager.getInstance().sendRampThetaValid(1) > -1 - }else{ + } else { AdasManager.getInstance().sendRampThetaValid(0) > -1 } } @@ -878,8 +907,8 @@ class MoGoAutopilotControlProvider : * @param topicsNeedToCache * @return boolean */ - override fun getBadCaseConfig(reqType: Int,recordType: Int,topicsNeedToCache: List): Boolean{ - return AdasManager.getInstance().sendRecordDataConfigReq(reqType, recordType, topicsNeedToCache) > -1 + override fun getBadCaseConfig(reqType: Int, recordType: Int, topicsNeedToCache: List): Boolean { + return AdasManager.getInstance().sendRecordDataConfigReq(reqType, recordType, topicsNeedToCache) > -1 } /** @@ -887,13 +916,13 @@ class MoGoAutopilotControlProvider : */ override fun sendBagManagerCmd(bagManagerEntity: BagManagerEntity): Boolean { val bagManager = BagManagerOuterClass.BagManager - .newBuilder() - .setReqType(bagManagerEntity.reqType) - .setKeyReq(bagManagerEntity.keyReq) + .newBuilder() + .setReqType(bagManagerEntity.reqType) + .setKeyReq(bagManagerEntity.keyReq) // 更新包附加信息,发送请求且reqType=5时有效 val descReq = BagManagerOuterClass.BagDescription - .newBuilder() + .newBuilder() bagManagerEntity.descReq?.let { descReq.description = it.description descReq.hasAudio = it.hasAudio @@ -905,24 +934,24 @@ class MoGoAutopilotControlProvider : // 空间使用信息,获取响应且reqType=1时有效 for (diskSpaceInfoEntity in bagManagerEntity.spaceInfoResp) { val spaceInfoResp = BagManagerOuterClass.BagSpaceInfo - .newBuilder() + .newBuilder() val diskSpaceInfo = BagManagerOuterClass.SpaceInfo - .newBuilder() - .setDirectory(diskSpaceInfoEntity.diskSpaceInfo.directory) - .setTotal(diskSpaceInfoEntity.diskSpaceInfo.total) - .setFree(diskSpaceInfoEntity.diskSpaceInfo.free) - .setUsed(diskSpaceInfoEntity.diskSpaceInfo.used) - .build() + .newBuilder() + .setDirectory(diskSpaceInfoEntity.diskSpaceInfo.directory) + .setTotal(diskSpaceInfoEntity.diskSpaceInfo.total) + .setFree(diskSpaceInfoEntity.diskSpaceInfo.free) + .setUsed(diskSpaceInfoEntity.diskSpaceInfo.used) + .build() spaceInfoResp - .setHost(diskSpaceInfoEntity.host).diskSpaceInfo = diskSpaceInfo + .setHost(diskSpaceInfoEntity.host).diskSpaceInfo = diskSpaceInfo for (entity in diskSpaceInfoEntity.BagDirsSpaceInfo) { val bagDirsSpaceInfo = BagManagerOuterClass.SpaceInfo - .newBuilder() - .setDirectory(entity.directory) - .setTotal(entity.total) - .setFree(entity.free) - .setUsed(entity.used) - .build() + .newBuilder() + .setDirectory(entity.directory) + .setTotal(entity.total) + .setFree(entity.free) + .setUsed(entity.used) + .build() spaceInfoResp.addBagDirsSpaceInfo(bagDirsSpaceInfo) } bagManager.addSpaceInfoResp(spaceInfoResp.build()) @@ -933,7 +962,7 @@ class MoGoAutopilotControlProvider : if (bagsInfoRespEntity.itemType == 0) { // 包描述信息 val bagDescription = BagManagerOuterClass.BagDescription - .newBuilder() + .newBuilder() bagsInfoRespEntity.description?.let { bagDescription.description = it.description bagDescription.hasAudio = it.hasAudio @@ -942,23 +971,23 @@ class MoGoAutopilotControlProvider : } val bagsInfoResp = BagManagerOuterClass.BagInfo - .newBuilder() - .setKey(bagsInfoRespEntity.key) - .setTotalSize(bagsInfoRespEntity.totalSize) - .setTimestamp(bagsInfoRespEntity.timestamp) - .setBagPath(bagsInfoRespEntity.bagPath) - .setMergeStat(bagsInfoRespEntity.mergeStat) - .setUploadStat(bagsInfoRespEntity.uploadStat) - .setDescription(bagDescription.build()) + .newBuilder() + .setKey(bagsInfoRespEntity.key) + .setTotalSize(bagsInfoRespEntity.totalSize) + .setTimestamp(bagsInfoRespEntity.timestamp) + .setBagPath(bagsInfoRespEntity.bagPath) + .setMergeStat(bagsInfoRespEntity.mergeStat) + .setUploadStat(bagsInfoRespEntity.uploadStat) + .setDescription(bagDescription.build()) // 子包信息 for (subBagEntity in bagsInfoRespEntity.subBags) { val subBag = BagManagerOuterClass.SubBag - .newBuilder() - .setKey(subBagEntity.key) - .setHost(subBagEntity.host) - .setSize(subBagEntity.size) - .build() + .newBuilder() + .setKey(subBagEntity.key) + .setHost(subBagEntity.host) + .setSize(subBagEntity.size) + .build() bagsInfoResp.addSubBags(subBag) } bagManager.addBagsInfoResp(bagsInfoResp) @@ -967,7 +996,7 @@ class MoGoAutopilotControlProvider : //反馈上传cos桶结果,获取响应且reqType=3时有效 val uploadCosResp = BagManagerOuterClass.UploadCosStat - .newBuilder() + .newBuilder() bagManagerEntity.uploadCosResp?.let { uploadCosResp.key = it.key @@ -1009,6 +1038,7 @@ class MoGoAutopilotControlProvider : override fun sendBlindAreaCmd(switchCmd: Boolean) { AdasManager.getInstance().sendBlindAreaCmd(switchCmd) } + /** * 向左变道 */ @@ -1050,14 +1080,14 @@ class MoGoAutopilotControlProvider : * @param isLastStop 是否最终站 * @return boolean */ - override fun sendTripInfo(type: Int, lineName: String, departureStopName: String,arrivalStopName: String, isLastStop: Boolean) { - AdasManager.getInstance().sendTripInfoReq(type, lineName, departureStopName,arrivalStopName, isLastStop) + override fun sendTripInfo(type: Int, lineName: String, departureStopName: String, arrivalStopName: String, isLastStop: Boolean) { + AdasManager.getInstance().sendTripInfoReq(type, lineName, departureStopName, arrivalStopName, isLastStop) LedSourceManager.updateTripInfoData( - type, - lineName, - departureStopName, - arrivalStopName, - isLastStop + type, + lineName, + departureStopName, + arrivalStopName, + isLastStop ) } @@ -1066,10 +1096,10 @@ class MoGoAutopilotControlProvider : * 命令下发存在回执 */ @ChainLog( - linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = CHAIN_SOURCE_ADAS, - nodeAliasCode = CHAIN_CODE_ADAS_IPC_REBOOT, - paramIndexes = [-1] + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_IPC_REBOOT, + paramIndexes = [-1] ) override fun sendIpcReboot() { //重启所有节点 @@ -1081,10 +1111,10 @@ class MoGoAutopilotControlProvider : * 命令下发存在回执 */ @ChainLog( - linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = CHAIN_SOURCE_ADAS, - nodeAliasCode = CHAIN_CODE_ADAS_POWER_OFF, - paramIndexes = [-1] + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_ADAS_POWER_OFF, + paramIndexes = [-1] ) override fun sendIpcPowerOff(): Long { val id = AdasManager.getInstance().sendIpcPowerOff() @@ -1138,9 +1168,9 @@ class MoGoAutopilotControlProvider : override fun getVIN(): String { val carConfig = AdasManager.getInstance().carConfig - return if(carConfig != null){ + return if (carConfig != null) { carConfig.vinCode - }else{ + } else { "" } } @@ -1148,26 +1178,26 @@ class MoGoAutopilotControlProvider : override fun connectSpecifiedServer(ip: String) { ThreadUtils.getIoPool().submit { NSDNettyManager.getInstance().connectSpecifiedServer( - ip, - NettyTcpServer.SERVER_PORT, - SharedPrefsMgr.getInstance().sn, - object : NettyClientListener { - override fun onMessageResponseClient( - msg: MogoProtocolMsg?, - sign: String?, - channel: Channel - ) { - msgHandler.handleMsgFromServer(msg, channel) - } + ip, + NettyTcpServer.SERVER_PORT, + SharedPrefsMgr.getInstance().sn, + object : NettyClientListener { + override fun onMessageResponseClient( + msg: MogoProtocolMsg?, + sign: String?, + channel: Channel + ) { + msgHandler.handleMsgFromServer(msg, channel) + } - override fun onClientStatusConnectChanged( - statusCode: Int, - sign: String?, - channel: Channel - ) { - msgHandler.handleClientConnStatus(statusCode, sign, channel) - } - }) + override fun onClientStatusConnectChanged( + statusCode: Int, + sign: String?, + channel: Channel + ) { + msgHandler.handleClientConnStatus(statusCode, sign, channel) + } + }) } } @@ -1199,8 +1229,8 @@ class MoGoAutopilotControlProvider : msgHandler.synMsgToAllClients() } else {// 乘客屏 CallerDevaToolsManager.getBindingCarInfo( - carConfigResp.macAddress, - SharedPrefsMgr.getInstance().sn + carConfigResp.macAddress, + SharedPrefsMgr.getInstance().sn ) // invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为:${carConfigResp.macAddress}") invokeNettyConnResult("${StringUtils.getString(R.string.module_core_passenger_plate)}${carConfigResp.plateNumber},${StringUtils.getString(R.string.module_core_mac_address)}${carConfigResp.macAddress}") @@ -1223,10 +1253,10 @@ class MoGoAutopilotControlProvider : } @ChainLog( - linkChainLog = CHAIN_TYPE_STATUS, - linkCode = CHAIN_SOURCE_ADAS, - nodeAliasCode = CHAIN_CODE_MULTI_CONNECT, - paramIndexes = [0] + linkChainLog = CHAIN_TYPE_STATUS, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = CHAIN_CODE_MULTI_CONNECT, + paramIndexes = [0] ) private fun invokeNettyConnResult(status: String) { CallerLogger.d("$M_D_C$TAG", status) @@ -1297,7 +1327,7 @@ class MoGoAutopilotControlProvider : * @return boolean */ override fun sendSweeperSuspendResumeTaskReq(isSuspend: Boolean, reqNo: String, suspendResumeTaskReq: SweeperTaskSuspendResume.SuspendResumeTaskReq): Boolean { - return AdasManager.getInstance().sendSweeperSuspendResumeTaskReq(isSuspend,reqNo, suspendResumeTaskReq) > -1 + return AdasManager.getInstance().sendSweeperSuspendResumeTaskReq(isSuspend, reqNo, suspendResumeTaskReq) > -1 } /** @@ -1359,7 +1389,7 @@ class MoGoAutopilotControlProvider : * * -1L:添加到WS发送消息队列失败 */ override fun sendPowerUnitSingleChannelControl(channel: PowerUnitChannel, cmd: Int): Long { - return AdasManager.getInstance().sendPowerUnitSingleChannelControl(channel,cmd) + return AdasManager.getInstance().sendPowerUnitSingleChannelControl(channel, cmd) } /** @@ -1413,8 +1443,8 @@ class MoGoAutopilotControlProvider : } override fun sendParallelDrivingReq( - reqNo: String, - parallelRequest: ParallelDrivingRequest.ParallelRequest + reqNo: String, + parallelRequest: ParallelDrivingRequest.ParallelRequest ): Boolean { return AdasManager.getInstance().sendParallelDrivingReq(reqNo, parallelRequest) > -1 } @@ -1422,38 +1452,38 @@ class MoGoAutopilotControlProvider : override fun setIsDrawPointCloud(isDrawPointCloud: Boolean) { if (isDrawPointCloud) { AdasManager.getInstance().subscribeInterface( - Constants.TERMINAL_ROLE.DRIVER, - Constants.SUBSCRIBE_TYPE.SUBSCRIBE, - MessageType.TYPE_RECEIVE_POINT_CLOUD) + Constants.TERMINAL_ROLE.DRIVER, + Constants.SUBSCRIBE_TYPE.SUBSCRIBE, + MessageType.TYPE_RECEIVE_POINT_CLOUD) } else { AdasManager.getInstance().subscribeInterface( - Constants.TERMINAL_ROLE.DRIVER, - Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE, - MessageType.TYPE_RECEIVE_POINT_CLOUD) + Constants.TERMINAL_ROLE.DRIVER, + Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE, + MessageType.TYPE_RECEIVE_POINT_CLOUD) } } override fun setIsSubscribeM1StitchedVideo(isSubscribe: Boolean) { if (isSubscribe) { AdasManager.getInstance().subscribeInterface( - Constants.TERMINAL_ROLE.DRIVER, - Constants.SUBSCRIBE_TYPE.SUBSCRIBE, - MessageType.TYPE_RECEIVE_M1_STITCHED_VIDEO + Constants.TERMINAL_ROLE.DRIVER, + Constants.SUBSCRIBE_TYPE.SUBSCRIBE, + MessageType.TYPE_RECEIVE_M1_STITCHED_VIDEO ) } else { AdasManager.getInstance().subscribeInterface( - Constants.TERMINAL_ROLE.DRIVER, - Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE, - MessageType.TYPE_RECEIVE_M1_STITCHED_VIDEO + Constants.TERMINAL_ROLE.DRIVER, + Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE, + MessageType.TYPE_RECEIVE_M1_STITCHED_VIDEO ) } } override fun setIsSubscribeBackCameraVideoVideo(role: Int, isSubscribe: Boolean) { val type = - if (isSubscribe) Constants.SUBSCRIBE_TYPE.SUBSCRIBE else Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE + if (isSubscribe) Constants.SUBSCRIBE_TYPE.SUBSCRIBE else Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE AdasManager.getInstance().subscribeInterface( - role, type, MessageType.TYPE_RECEIVE_BACK_CAMERA_VIDEO + role, type, MessageType.TYPE_RECEIVE_BACK_CAMERA_VIDEO ) } @@ -1462,10 +1492,10 @@ class MoGoAutopilotControlProvider : } override fun sendRoboBusJinlvM1AirConditionerCmd( - switchCmd: Int, - modeCmd: Int, - windSpeedCmd: Int, - temperatureCmd: Int + switchCmd: Int, + modeCmd: Int, + windSpeedCmd: Int, + temperatureCmd: Int ): Boolean { return AdasManager.getInstance().sendRoboBusJinlvM1AirConditionerCmd(switchCmd, modeCmd, windSpeedCmd, temperatureCmd) > -1 } @@ -1491,20 +1521,20 @@ class MoGoAutopilotControlProvider : } @ChainLog( - linkChainLog = AdasChain.CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = AdasChain.CHAIN_SOURCE_ADAS, - nodeAliasCode = AdasChain.CHAIN_CODE_ADAS_SEND_PLANNING_CMD, - paramIndexes = [0] + linkChainLog = AdasChain.CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = AdasChain.CHAIN_SOURCE_ADAS, + nodeAliasCode = AdasChain.CHAIN_CODE_ADAS_SEND_PLANNING_CMD, + paramIndexes = [0] ) override fun sendPlanningCmd(cmd: Int): Boolean { return AdasManager.getInstance().sendPlanningCmd(cmd) > -1 } @ChainLog( - linkChainLog = AdasChain.CHAIN_TYPE_SOCKET_AUTOPILOT, - linkCode = AdasChain.CHAIN_SOURCE_ADAS, - nodeAliasCode = AdasChain.CHAIN_CODE_ADAS_SEND_PLANNING_CMD, - paramIndexes = [0] + linkChainLog = AdasChain.CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = AdasChain.CHAIN_SOURCE_ADAS, + nodeAliasCode = AdasChain.CHAIN_CODE_ADAS_SEND_PLANNING_CMD, + paramIndexes = [0] ) override fun sendPlanningLineChangeCmd(cmd: Int): Boolean { return AdasManager.getInstance().sendPlanningLaneChangeCmd(cmd) > -1 @@ -1529,19 +1559,19 @@ class MoGoAutopilotControlProvider : } override fun sendFrontCamera30Cmd(isStart: Boolean): Boolean { - return AdasManager.getInstance().sendFrontCamera30Cmd(isStart)>-1 + return AdasManager.getInstance().sendFrontCamera30Cmd(isStart) > -1 } override fun sendLidarCmd(isStart: Boolean): Boolean { - return AdasManager.getInstance().sendLidarCmd(isStart)> -1 + return AdasManager.getInstance().sendLidarCmd(isStart) > -1 } override fun sendLeftFrontRadarCmd(isStart: Boolean): Boolean { - return AdasManager.getInstance().sendLeftFrontRadarCmd(isStart)>-1 + return AdasManager.getInstance().sendLeftFrontRadarCmd(isStart) > -1 } override fun sendSimulationWireFailure(isTrigger: Boolean): Boolean { - return AdasManager.getInstance().sendSimulationWireFailure(isTrigger)>-1 + return AdasManager.getInstance().sendSimulationWireFailure(isTrigger) > -1 } /** @@ -1551,10 +1581,10 @@ class MoGoAutopilotControlProvider : * {@link SsmInfo.IfUpgrade#DELAY}:推迟 */ override fun sendSsmFuncOtaDownloadResponse( - token: String, - ifUpgrade: SsmInfo.IfUpgrade + token: String, + ifUpgrade: SsmInfo.IfUpgrade ): Boolean { - return AdasManager.getInstance().sendSsmFuncOtaDownloadResponse(token, ifUpgrade)>-1 + return AdasManager.getInstance().sendSsmFuncOtaDownloadResponse(token, ifUpgrade) > -1 } /** @@ -1563,7 +1593,7 @@ class MoGoAutopilotControlProvider : * 如果没有可以传null或"" */ override fun sendSsmFuncOtaStatusQuery(token: String): Boolean { - return AdasManager.getInstance().sendSsmFuncOtaStatusQuery(token)>-1 + return AdasManager.getInstance().sendSsmFuncOtaStatusQuery(token) > -1 } /** @@ -1581,7 +1611,7 @@ class MoGoAutopilotControlProvider : * 域控响应接口{@link OnAdasListener#onCaptureImgOnTakeOver(MessagePad.Header, boolean, MessagePad.CaptureImgOnTakeOver)} */ override fun sendCaptureImgReqOnTakeOver(uuid: Long): Boolean { - return AdasManager.getInstance().sendCaptureImgReqOnTakeOver(uuid)>-1 + return AdasManager.getInstance().sendCaptureImgReqOnTakeOver(uuid) > -1 } /** diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index bd958f8055..d54d48f9fb 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -155,6 +155,8 @@ import system_master.SystemStatusInfo import vllm.Vlm import java.io.PrintWriter import java.io.StringWriter +import java.math.BigDecimal +import java.util.Date import kotlin.math.roundToInt /** @@ -1674,6 +1676,28 @@ class MoGoAdasListenerImpl : OnAdasListener { */ override fun onPlanningStopLine(header: MessagePad.Header, mapMsg: Hadmap.MapMsg) { + } + override fun onAdasTaskManagerOriginal(header: MessagePad.Header, data: ByteArray) { + taskManagerOriginal(header, ByteUtil.byteArrToHex(data, false)) + } + + @ChainLog( + linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, + linkCode = CHAIN_SOURCE_ADAS, + nodeAliasCode = ChainConstant.CHAIN_CODE_ADAS_TASK_MANAGER_ORIGINAL, + paramIndexes = [0, 1] + ) + private fun taskManagerOriginal(header: MessagePad.Header, data: String) { + CallerLogger.i("$M_D_C$TAG", "任务管理数据:$data") + } + + override fun onAdasTaskManagerDeparture(taskId: Long?, siteId: Long?, sequence: Int?, ack: Boolean, reason: String?, stationTimeLeft: Double) { + } + + override fun onAdasTaskManagerArrival(taskId: Long?, siteId: Long?, sequence: Int?, mileage: BigDecimal?) { + } + + override fun onAdasTaskManagerComplete(taskId: Long?, userId: Long?, status: Int?, reason: String?, completedTime: Date?, mileage: BigDecimal?) { } /** diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt index 4afab84a7d..2955f14f69 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/chain/ChainConstant.kt @@ -80,6 +80,7 @@ class ChainConstant { const val CHAIN_CODE_ADAS_COLD_START_STATE = "CHAIN_CODE_ADAS_COLD_START_STATE" const val CHAIN_CODE_ADAS_LOST_FRAME = "CHAIN_CODE_ADAS_LOST_FRAME" const val CHAIN_CODE_ADAS_ALL_ERROR = "CHAIN_CODE_ADAS_ALL_ERROR"//ADAS LIB中进行的异常捕获,包括解析异常和数据使用异常(UI层) + const val CHAIN_CODE_ADAS_TASK_MANAGER_ORIGINAL = "CHAIN_CODE_ADAS_TASK_MANAGER_ORIGINAL" const val CHAIN_CODE_RECORD_NATIVE_LEAK = "CHAIN_CODE_RECORD_NATIVE_LEAK" diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index 19b6c42b6d..7e20ffb5ab 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -15,6 +15,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendRes import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm.TaskConfirmResp import com.zhjt.mogo.adas.data.sweeper.task.s_r.SweeperTaskSuspendResume.SuspendResumeTaskReq import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop.StopTaskResp +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory import mogo.telematics.pad.MessagePad import mogo.yycp.paralleldriving.protocol.ParallelDrivingRequest import system_master.SsmInfo @@ -44,6 +45,10 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { */ fun startAutoPilot(controlParameters: AutopilotControlParameters): Long + fun sendTaskManagerAutopilotStart(taskId: Long, traj: Trajectory): Long + + fun sendTaskManagerAutopilotContinue(trackId: Long, taskId: Long, stationId: Long, stationName: String, stationSeq: Int, lon: Double, lat: Double): Long + /** * 开启自动驾驶(魔方) * @@ -75,7 +80,7 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { /** * 结束自动驾驶 */ - fun cancelAutoPilot() + fun cancelAutoPilot(taskId: Long) /** * 开启域控制器录制bag包 diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index bcf44a209f..38b8c5483e 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -35,6 +35,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop.StopTaskResp import com.zhjt.mogo.adas.data.AdasConstants import com.zhjt.mogo.adas.data.bean.NodeStateInfo import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendResume.BigTaskActionResp +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory import com.zhjt.service.chain.ChainLog import com.zhjt.service_biz.BizConfig import kotlinx.coroutines.launch @@ -90,6 +91,32 @@ object CallerAutoPilotControlManager { return sessionId } + /** + * 开启自动驾驶 + * + * @param controlParameters 开启自动驾驶的控制参数 + */ + fun unmannedStartAutoPilot(taskId: Long, traj: Trajectory?, controlParameters: AutopilotControlParameters): Long { + if (traj == null) { + //LogUtils.eTag(TAG, "自动驾驶控制参数异常,请检查参数信息") + return -1L + } + val sessionId = providerApi?.sendTaskManagerAutopilotStart(taskId, traj) ?: -1L + // 更新记录在全局的控制参数 + CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(controlParameters) + return sessionId + } + //TODO 任务管理继续 +// fun unmannedAutoPilotContinue(trackId: Long, taskId: Long, stationId: Long, stationName: String, stationSeq: Int, lon: Double, lat: Double): Long { +// if (traj == null) { +// //LogUtils.eTag(TAG, "自动驾驶控制参数异常,请检查参数信息") +// return -1L +// } +// val sessionId = providerApi?.sendTaskManagerAutopilotContinue(trackId, taskId, stationId, stationName, stationSeq, lon, lat) ?: -1L +// // 更新记录在全局的控制参数 +// CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(controlParameters) +// return sessionId +// } /** * 启自驾前,是否要拦截 * @param isShowTip true: 展示Toast+语音提示; false:不展示Toast+语音提示 @@ -253,6 +280,15 @@ object CallerAutoPilotControlManager { } return result } + /** + * 结束自动驾驶 + */ + fun cancelAutoPilot(taskId: Long) { + // 司机屏才能取消自动驾驶 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + cancelAutoPilotInner(taskId) + } + } /** * 结束自动驾驶 @@ -273,8 +309,8 @@ object CallerAutoPilotControlManager { } } - private fun cancelAutoPilotInner() { - providerApi?.cancelAutoPilot() + private fun cancelAutoPilotInner(taskId: Long = (-1).toLong()) { + providerApi?.cancelAutoPilot(taskId) // 更新记录在全局的控制参数 CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) } diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt index 686abb2225..52ec2aadb5 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerFsm2024ListenerManager.kt @@ -18,6 +18,7 @@ import java.util.Locale */ object CallerFsm2024ListenerManager : CallerBase() { var fsmLocaleLanguage = "chs" + private var placeOrderStandby = false //车端走任务管理时用于判断是否能下发订单 init { val locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { @@ -36,7 +37,12 @@ object CallerFsm2024ListenerManager : CallerBase() { } } + fun getPlaceOrderStandby(): Boolean { + return placeOrderStandby + } + fun invokeFSM2024State(fsmState: Fsm2024.FSMStateMsg) { + placeOrderStandby = fsmState.placeOrderStandbyFlag M_LISTENERS.forEach { val listener = it.value listener.onFSM2024State(fsmState) @@ -54,7 +60,7 @@ object CallerFsm2024ListenerManager : CallerBase() { if (fsmEvent.activeMode == Fsm2024.ActiveMode.PILOT_ACTIVE) { if (fsmEvent.event == Fsm2024.Event.FAIL_TO_ENTER_ACTIVE || fsmEvent.event == Fsm2024.Event.ABNORMAL_EXIT_ACTIVE) { val title = - StringUtils.getString(if (fsmEvent.event == Fsm2024.Event.FAIL_TO_ENTER_ACTIVE) R.string.module_mogo_core_fail_to_enter_active else R.string.module_mogo_core_abnormal_exit_active) + StringUtils.getString(if (fsmEvent.event == Fsm2024.Event.FAIL_TO_ENTER_ACTIVE) R.string.module_mogo_core_fail_to_enter_active else R.string.module_mogo_core_abnormal_exit_active) var content = StringUtils.getString(R.string.module_mogo_core_unknown_cause_fault) var summaryContent = "" if (fsmEvent.transitionReasonsMultiLangCount > 0) { @@ -89,10 +95,10 @@ object CallerFsm2024ListenerManager : CallerBase() { System.currentTimeMillis() } CallerMsgBoxManager.saveMsgBoxNoTrace( - MsgBoxBean( - MsgBoxType.FSM_EVENT, - FSMEventMsg(title, summaryContent, content, time) - ) + MsgBoxBean( + MsgBoxType.FSM_EVENT, + FSMEventMsg(title, summaryContent, content, time) + ) ) } } diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java index c85e1a9202..326c0c7a2a 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java @@ -119,6 +119,8 @@ public enum MessageType { TYPE_RECEIVE_OBU_UPLOAD_STATUS(MessagePad.MessageType.MsgTypeObuUploadStatus, R.string.adas_data_MsgTypeObuUploadStatus_RECEIVE), TYPE_RECEIVE_PLANNING_STOP_LINE(MessagePad.MessageType.MsgTypePlanningStopLine, R.string.adas_data_MsgTypePlanningStopLine), TYPE_RECEIVE_FSM_EVENT(MessagePad.MessageType.MsgTypeFsmEvent, R.string.adas_data_MsgTypeFsmEvent), + TYPE_SEND_TASK_MANAGER(MessagePad.MessageType.MsgTypeTaskMgrAndPad, R.string.adas_data_MsgTypeTaskMgrAndPad_SEND), + TYPE_RECEIVE_TASK_MANAGER(MessagePad.MessageType.MsgTypeTaskMgrAndPad, R.string.adas_data_MsgTypeTaskMgrAndPad_RECEIVE), //TODO 透传原始pb文件中不存在以下type。由于Java中无法强转,所以在mogo-adas-data/message_pad.proto中放开注释 TYPE_RECEIVE_PLANNING_DECISION_STATE(MessagePad.MessageType.MsgTypePlanningDecisionState, R.string.adas_data_MsgTypePlanningDecisionState), diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/AutopilotPoint.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/AutopilotPoint.java new file mode 100644 index 0000000000..4d2c83834a --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/AutopilotPoint.java @@ -0,0 +1,70 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 自动驾驶坐标点 + */ +public class AutopilotPoint { + /** + * X坐标 + */ + private double x; + /** + * Y坐标 + */ + private double y; + + public AutopilotPoint() { + } + + public AutopilotPoint(double x, double y) { + this.x = x; + this.y = y; + } + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + @Override + public String toString() { + return "AutopilotPoint{" + + "x=" + x + + ", y=" + y + + '}'; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private double x; + private double y; + + public Builder x(double x) { + this.x = x; + return this; + } + + public Builder y(double y) { + this.y = y; + return this; + } + + public AutopilotPoint build() { + return new AutopilotPoint(x, y); + } + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/AutopilotStartRequest.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/AutopilotStartRequest.java new file mode 100644 index 0000000000..61766e8453 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/AutopilotStartRequest.java @@ -0,0 +1,112 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * app发送给车端 + * 开启任务 + */ +public class AutopilotStartRequest { + /** + * 任务ID + */ + private Long taskId; + /** + * 来源 + */ + private Integer source; + /** + * 轨迹 + */ + private Trajectory traj; + /** + * 任务类型 + * 0: 多站点模式 1:固定路线 + */ + private Integer taskType; + + public AutopilotStartRequest() { + } + + public AutopilotStartRequest(Long taskId, Integer source, Trajectory traj, Integer taskType) { + this.taskId = taskId; + this.source = source; + this.traj = traj; + this.taskType = taskType; + } + + public Long getTaskId() { + return taskId; + } + + public void setTaskId(Long taskId) { + this.taskId = taskId; + } + + public Integer getSource() { + return source; + } + + public void setSource(Integer source) { + this.source = source; + } + + public Trajectory getTraj() { + return traj; + } + + public void setTraj(Trajectory traj) { + this.traj = traj; + } + + public Integer getTaskType() { + return taskType; + } + + public void setTaskType(Integer taskType) { + this.taskType = taskType; + } + + @Override + public String toString() { + return "AutopilotStartRequest{" + + "taskId=" + taskId + + ", source=" + source + + ", traj=" + traj + + ", taskType=" + taskType + + '}'; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private Long taskId; + private Integer source; + private Trajectory traj; + private Integer taskType; + + public Builder taskId(Long taskId) { + this.taskId = taskId; + return this; + } + + public Builder source(Integer source) { + this.source = source; + return this; + } + + public Builder traj(Trajectory traj) { + this.traj = traj; + return this; + } + + public Builder taskType(Integer taskType) { + this.taskType = taskType; + return this; + } + + public AutopilotStartRequest build() { + return new AutopilotStartRequest(taskId, source, traj, taskType); + } + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/CmdDto.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/CmdDto.java new file mode 100644 index 0000000000..405ca3f395 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/CmdDto.java @@ -0,0 +1,131 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 命令数据传输对象 + * @param 数据类型 + */ +public class CmdDto { + /** + * 命令类型 + */ + private String cmdType; + /** + * 任务ID + */ + private Long taskId; + /** + * 轨迹ID + */ + private Long lineId; + /** + * 时间戳 + */ + private Long timestamp; + /** + * 数据 + */ + private T data; + + public CmdDto() { + } + + public CmdDto(String cmdType, Long taskId, Long lineId, Long timestamp, T data) { + this.cmdType = cmdType; + this.taskId = taskId; + this.lineId = lineId; + this.timestamp = timestamp; + this.data = data; + } + + public String getCmdType() { + return cmdType; + } + + public void setCmdType(String cmdType) { + this.cmdType = cmdType; + } + + public Long getTaskId() { + return taskId; + } + + public void setTaskId(Long taskId) { + this.taskId = taskId; + } + + public Long getLineId() { + return lineId; + } + + public void setLineId(Long lineId) { + this.lineId = lineId; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "CmdDto{" + + "cmdType='" + cmdType + '\'' + + ", taskId=" + taskId + + ", lineId=" + lineId + + ", timestamp=" + timestamp + + ", data=" + data + + '}'; + } + + public static Builder builder() { + return new Builder<>(); + } + + public static class Builder { + private String cmdType; + private Long taskId; + private Long lineId; + private Long timestamp; + private T data; + + public Builder cmdType(String cmdType) { + this.cmdType = cmdType; + return this; + } + + public Builder taskId(Long taskId) { + this.taskId = taskId; + return this; + } + + public Builder lineId(Long lineId) { + this.lineId = lineId; + return this; + } + + public Builder timestamp(Long timestamp) { + this.timestamp = timestamp; + return this; + } + + public Builder data(T data) { + this.data = data; + return this; + } + + public CmdDto build() { + return new CmdDto<>(cmdType, taskId, lineId, timestamp, data); + } + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskAbortNotification.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskAbortNotification.java new file mode 100644 index 0000000000..3bde1605b9 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskAbortNotification.java @@ -0,0 +1,76 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 车端主动发送 + * 车端终止上报消息 + */ +public class TaskAbortNotification { + /** + * 当前位置 + */ + private VehicleSite curLocation; + /** + * 任务累计行驶距离 + */ + private double accumulatedTaskDis; + /** + * 解决方案 + */ + private String solution; + /** + * 错误消息 + */ + private String errMsg; + + public TaskAbortNotification() { + } + + public TaskAbortNotification(VehicleSite curLocation, double accumulatedTaskDis, String solution, String errMsg) { + this.curLocation = curLocation; + this.accumulatedTaskDis = accumulatedTaskDis; + this.solution = solution; + this.errMsg = errMsg; + } + + public VehicleSite getCurLocation() { + return curLocation; + } + + public void setCurLocation(VehicleSite curLocation) { + this.curLocation = curLocation; + } + + public double getAccumulatedTaskDis() { + return accumulatedTaskDis; + } + + public void setAccumulatedTaskDis(double accumulatedTaskDis) { + this.accumulatedTaskDis = accumulatedTaskDis; + } + + public String getSolution() { + return solution; + } + + public void setSolution(String solution) { + this.solution = solution; + } + + public String getErrMsg() { + return errMsg; + } + + public void setErrMsg(String errMsg) { + this.errMsg = errMsg; + } + + @Override + public String toString() { + return "TaskAbortNotification{" + + "curLocation=" + curLocation + + ", accumulatedTaskDis=" + accumulatedTaskDis + + ", solution='" + solution + '\'' + + ", errMsg='" + errMsg + '\'' + + '}'; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskArrivalNotification.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskArrivalNotification.java new file mode 100644 index 0000000000..87a990519f --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskArrivalNotification.java @@ -0,0 +1,62 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 车端主动发送 + * 车端到站消息 + */ +public class TaskArrivalNotification { + /** + * 当前位置 + */ + private VehicleSite curLocation; + /** + * 站点 + */ + private VehicleSite station; + /** + * 任务累计行驶距离 + */ + private double accumulatedTaskDis; + + public TaskArrivalNotification() { + } + + public TaskArrivalNotification(VehicleSite curLocation, VehicleSite station, double accumulatedTaskDis) { + this.curLocation = curLocation; + this.station = station; + this.accumulatedTaskDis = accumulatedTaskDis; + } + + public VehicleSite getCurLocation() { + return curLocation; + } + + public void setCurLocation(VehicleSite curLocation) { + this.curLocation = curLocation; + } + + public VehicleSite getStation() { + return station; + } + + public void setStation(VehicleSite station) { + this.station = station; + } + + public double getAccumulatedTaskDis() { + return accumulatedTaskDis; + } + + public void setAccumulatedTaskDis(double accumulatedTaskDis) { + this.accumulatedTaskDis = accumulatedTaskDis; + } + + @Override + public String toString() { + return "TaskArrivalNotification{" + + "curLocation=" + curLocation + + ", station=" + station + + ", accumulatedTaskDis=" + accumulatedTaskDis + + '}'; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskCancelResponse.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskCancelResponse.java new file mode 100644 index 0000000000..16d91a80bc --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskCancelResponse.java @@ -0,0 +1,61 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 任务取消响应 + */ +public class TaskCancelResponse { + /** + * 任务累计行驶距离 + */ + private double accumulatedTaskDis; + /** + * 任务取消结果,true:成功 false:失败 + */ + private boolean result; + /** + * 任务取消失败原因 (目前仅超时5秒未退出自驾) + */ + private String errMsg; + + public TaskCancelResponse() { + } + + public TaskCancelResponse(double accumulatedTaskDis, boolean result, String errMsg) { + this.accumulatedTaskDis = accumulatedTaskDis; + this.result = result; + this.errMsg = errMsg; + } + + public double getAccumulatedTaskDis() { + return accumulatedTaskDis; + } + + public void setAccumulatedTaskDis(double accumulatedTaskDis) { + this.accumulatedTaskDis = accumulatedTaskDis; + } + + public boolean isResult() { + return result; + } + + public void setResult(boolean result) { + this.result = result; + } + + public String getErrMsg() { + return errMsg; + } + + public void setErrMsg(String errMsg) { + this.errMsg = errMsg; + } + + @Override + public String toString() { + return "TaskCancelResponse{" + + "accumulatedTaskDis=" + accumulatedTaskDis + + ", result=" + result + + ", errMsg='" + errMsg + '\'' + + '}'; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskContinueNotification.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskContinueNotification.java new file mode 100644 index 0000000000..a2bfefef2f --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskContinueNotification.java @@ -0,0 +1,51 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * App发送给车端 + * 离开站点 + */ +public class TaskContinueNotification { + /** + * 当前站点 + */ + private VehicleSite curStation; + + public TaskContinueNotification() { + } + + public TaskContinueNotification(VehicleSite curStation) { + this.curStation = curStation; + } + + public VehicleSite getCurStation() { + return curStation; + } + + public void setCurStation(VehicleSite curStation) { + this.curStation = curStation; + } + + @Override + public String toString() { + return "TaskContinueNotification{" + + "curStation=" + curStation + + '}'; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private VehicleSite curStation; + + public Builder curStation(VehicleSite curStation) { + this.curStation = curStation; + return this; + } + + public TaskContinueNotification build() { + return new TaskContinueNotification(curStation); + } + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskFinishNotification.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskFinishNotification.java new file mode 100644 index 0000000000..e0413cee2e --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskFinishNotification.java @@ -0,0 +1,14 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 任务完成通知 + */ +public class TaskFinishNotification { + public TaskFinishNotification() { + } + + @Override + public String toString() { + return "TaskFinishNotification{}"; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskLocationQueryRequest.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskLocationQueryRequest.java new file mode 100644 index 0000000000..01eac75038 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskLocationQueryRequest.java @@ -0,0 +1,14 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 剩余里程查询参数-暂时未使用 + */ +public class TaskLocationQueryRequest { + public TaskLocationQueryRequest() { + } + + @Override + public String toString() { + return "TaskLocationQueryRequest{}"; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskLocationQueryResponse.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskLocationQueryResponse.java new file mode 100644 index 0000000000..ac64b301be --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskLocationQueryResponse.java @@ -0,0 +1,203 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 车端响应 + * 车辆预估全程剩余里程、剩余时间 + * 预估到下站预估里程、预估时间 + */ +public class TaskLocationQueryResponse { + /** + * 当前位置 + */ + private VehicleSite curLocation; + /** + * 上一个站点 + */ + private VehicleSite preStation; + /** + * 下一个站点 + */ + private VehicleSite nextStation; + /** + * 从前一站点到目前的总距离(单位m) + */ + private double accumulatedStationDis; + /** + * 从当前到下一站点的距离(单位m) + */ + private double reversedAccumulatedStationDis; + /** + * 到达下一站需要的时间(单位s) + */ + private double stationTimeLeft; + /** + * 速度 + */ + private double velocity; + /** + * 加速度 + */ + private double acceleration; + /** + * 航向角 + */ + private double theta; + /** + * 曲率 + */ + private double kappa; + /** + * 任务全程的行进里程(单位米) + */ + private double accumulatedTaskDis; + /** + * 任务全程的剩余里程(单位米) + */ + private double reversedAccumulatedTaskDis; + /** + * 到达终点需要的时间(单位s) + */ + private double taskTimeLeft; + + public TaskLocationQueryResponse() { + } + + public TaskLocationQueryResponse(VehicleSite curLocation, VehicleSite preStation, VehicleSite nextStation, double accumulatedStationDis, double reversedAccumulatedStationDis, double stationTimeLeft, double velocity, double acceleration, double theta, double kappa, double accumulatedTaskDis, double reversedAccumulatedTaskDis, double taskTimeLeft) { + this.curLocation = curLocation; + this.preStation = preStation; + this.nextStation = nextStation; + this.accumulatedStationDis = accumulatedStationDis; + this.reversedAccumulatedStationDis = reversedAccumulatedStationDis; + this.stationTimeLeft = stationTimeLeft; + this.velocity = velocity; + this.acceleration = acceleration; + this.theta = theta; + this.kappa = kappa; + this.accumulatedTaskDis = accumulatedTaskDis; + this.reversedAccumulatedTaskDis = reversedAccumulatedTaskDis; + this.taskTimeLeft = taskTimeLeft; + } + + public VehicleSite getCurLocation() { + return curLocation; + } + + public void setCurLocation(VehicleSite curLocation) { + this.curLocation = curLocation; + } + + public VehicleSite getPreStation() { + return preStation; + } + + public void setPreStation(VehicleSite preStation) { + this.preStation = preStation; + } + + public VehicleSite getNextStation() { + return nextStation; + } + + public void setNextStation(VehicleSite nextStation) { + this.nextStation = nextStation; + } + + public double getAccumulatedStationDis() { + return accumulatedStationDis; + } + + public void setAccumulatedStationDis(double accumulatedStationDis) { + this.accumulatedStationDis = accumulatedStationDis; + } + + public double getReversedAccumulatedStationDis() { + return reversedAccumulatedStationDis; + } + + public void setReversedAccumulatedStationDis(double reversedAccumulatedStationDis) { + this.reversedAccumulatedStationDis = reversedAccumulatedStationDis; + } + + public double getStationTimeLeft() { + return stationTimeLeft; + } + + public void setStationTimeLeft(double stationTimeLeft) { + this.stationTimeLeft = stationTimeLeft; + } + + public double getVelocity() { + return velocity; + } + + public void setVelocity(double velocity) { + this.velocity = velocity; + } + + public double getAcceleration() { + return acceleration; + } + + public void setAcceleration(double acceleration) { + this.acceleration = acceleration; + } + + public double getTheta() { + return theta; + } + + public void setTheta(double theta) { + this.theta = theta; + } + + public double getKappa() { + return kappa; + } + + public void setKappa(double kappa) { + this.kappa = kappa; + } + + public double getAccumulatedTaskDis() { + return accumulatedTaskDis; + } + + public void setAccumulatedTaskDis(double accumulatedTaskDis) { + this.accumulatedTaskDis = accumulatedTaskDis; + } + + public double getReversedAccumulatedTaskDis() { + return reversedAccumulatedTaskDis; + } + + public void setReversedAccumulatedTaskDis(double reversedAccumulatedTaskDis) { + this.reversedAccumulatedTaskDis = reversedAccumulatedTaskDis; + } + + public double getTaskTimeLeft() { + return taskTimeLeft; + } + + public void setTaskTimeLeft(double taskTimeLeft) { + this.taskTimeLeft = taskTimeLeft; + } + + @Override + public String toString() { + return "TaskLocationQueryResponse{" + + "curLocation=" + curLocation + + ", preStation=" + preStation + + ", nextStation=" + nextStation + + ", accumulatedStationDis=" + accumulatedStationDis + + ", reversedAccumulatedStationDis=" + reversedAccumulatedStationDis + + ", stationTimeLeft=" + stationTimeLeft + + ", velocity=" + velocity + + ", acceleration=" + acceleration + + ", theta=" + theta + + ", kappa=" + kappa + + ", accumulatedTaskDis=" + accumulatedTaskDis + + ", reversedAccumulatedTaskDis=" + reversedAccumulatedTaskDis + + ", taskTimeLeft=" + taskTimeLeft + + '}'; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskStartNotification.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskStartNotification.java new file mode 100644 index 0000000000..27e697b35d --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/TaskStartNotification.java @@ -0,0 +1,91 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +import java.util.List; + +/** + * 车端发送车辆启动结果 + */ +public class TaskStartNotification { + /** + * 当前位置 + */ + private VehicleSite curLocation; + /** + * 自动驾驶结果 + */ + private boolean autopilotResult; + /** + * 站点剩余时间 + */ + private double stationTimeLeft; + /** + * 错误消息 + */ + private String errMsg; + /** + * 错误码 + */ + private List errCodes; + + public TaskStartNotification() { + } + + public TaskStartNotification(VehicleSite curLocation, boolean autopilotResult, double stationTimeLeft, String errMsg, List errCodes) { + this.curLocation = curLocation; + this.autopilotResult = autopilotResult; + this.stationTimeLeft = stationTimeLeft; + this.errMsg = errMsg; + this.errCodes = errCodes; + } + + public VehicleSite getCurLocation() { + return curLocation; + } + + public void setCurLocation(VehicleSite curLocation) { + this.curLocation = curLocation; + } + + public boolean isAutopilotResult() { + return autopilotResult; + } + + public void setAutopilotResult(boolean autopilotResult) { + this.autopilotResult = autopilotResult; + } + + public double getStationTimeLeft() { + return stationTimeLeft; + } + + public void setStationTimeLeft(double stationTimeLeft) { + this.stationTimeLeft = stationTimeLeft; + } + + public String getErrMsg() { + return errMsg; + } + + public void setErrMsg(String errMsg) { + this.errMsg = errMsg; + } + + public List getErrCodes() { + return errCodes; + } + + public void setErrCodes(List errCodes) { + this.errCodes = errCodes; + } + + @Override + public String toString() { + return "TaskStartNotification{" + + "curLocation=" + curLocation + + ", autopilotResult=" + autopilotResult + + ", stationTimeLeft=" + stationTimeLeft + + ", errMsg='" + errMsg + '\'' + + ", errCodes=" + errCodes + + '}'; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/Trajectory.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/Trajectory.java new file mode 100644 index 0000000000..dd8c7fa2ae --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/Trajectory.java @@ -0,0 +1,252 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +import java.util.List; + +/** + * 轨迹 + */ +public class Trajectory { + /** + * 路线ID + */ + private Long id; + /** + * 名称 + */ + private String name; + /** + * 轨迹URL + */ + private String trajUrl; + /** + * 轨迹MD5 + */ + private String trajMd5; + /** + * 轨迹版本 + */ + private String trajVer; + /** + * 停止点URL + */ + private String stopUrl; + /** + * 停止点MD5 + */ + private String stopMd5; + /** + * 停止点版本 + */ + private String stopVer; + /** + * 时间戳 + */ + private Long timestamp; + /** + * 途经点 + */ + private List wayPoints; + /** + * 黑名单点 + */ + private List blackPoints; + + public Trajectory() { + } + + public Trajectory(Long id, String name, String trajUrl, String trajMd5, String trajVer, String stopUrl, String stopMd5, String stopVer, Long timestamp, List wayPoints, List blackPoints) { + this.id = id; + this.name = name; + this.trajUrl = trajUrl; + this.trajMd5 = trajMd5; + this.trajVer = trajVer; + this.stopUrl = stopUrl; + this.stopMd5 = stopMd5; + this.stopVer = stopVer; + this.timestamp = timestamp; + this.wayPoints = wayPoints; + this.blackPoints = blackPoints; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTrajUrl() { + return trajUrl; + } + + public void setTrajUrl(String trajUrl) { + this.trajUrl = trajUrl; + } + + public String getTrajMd5() { + return trajMd5; + } + + public void setTrajMd5(String trajMd5) { + this.trajMd5 = trajMd5; + } + + public String getTrajVer() { + return trajVer; + } + + public void setTrajVer(String trajVer) { + this.trajVer = trajVer; + } + + public String getStopUrl() { + return stopUrl; + } + + public void setStopUrl(String stopUrl) { + this.stopUrl = stopUrl; + } + + public String getStopMd5() { + return stopMd5; + } + + public void setStopMd5(String stopMd5) { + this.stopMd5 = stopMd5; + } + + public String getStopVer() { + return stopVer; + } + + public void setStopVer(String stopVer) { + this.stopVer = stopVer; + } + + public Long getTimestamp() { + return timestamp; + } + + public void setTimestamp(Long timestamp) { + this.timestamp = timestamp; + } + + public List getWayPoints() { + return wayPoints; + } + + public void setWayPoints(List wayPoints) { + this.wayPoints = wayPoints; + } + + public List getBlackPoints() { + return blackPoints; + } + + public void setBlackPoints(List blackPoints) { + this.blackPoints = blackPoints; + } + + @Override + public String toString() { + return "Trajectory{" + + "id=" + id + + ", name='" + name + '\'' + + ", trajUrl='" + trajUrl + '\'' + + ", trajMd5='" + trajMd5 + '\'' + + ", trajVer='" + trajVer + '\'' + + ", stopUrl='" + stopUrl + '\'' + + ", stopMd5='" + stopMd5 + '\'' + + ", stopVer='" + stopVer + '\'' + + ", timestamp=" + timestamp + + ", wayPoints=" + wayPoints + + ", blackPoints=" + blackPoints + + '}'; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private Long id; + private String name; + private String trajUrl; + private String trajMd5; + private String trajVer; + private String stopUrl; + private String stopMd5; + private String stopVer; + private Long timestamp; + private List wayPoints; + private List blackPoints; + + public Builder id(Long id) { + this.id = id; + return this; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder trajUrl(String trajUrl) { + this.trajUrl = trajUrl; + return this; + } + + public Builder trajMd5(String trajMd5) { + this.trajMd5 = trajMd5; + return this; + } + + public Builder trajVer(String trajVer) { + this.trajVer = trajVer; + return this; + } + + public Builder stopUrl(String stopUrl) { + this.stopUrl = stopUrl; + return this; + } + + public Builder stopMd5(String stopMd5) { + this.stopMd5 = stopMd5; + return this; + } + + public Builder stopVer(String stopVer) { + this.stopVer = stopVer; + return this; + } + + public Builder timestamp(Long timestamp) { + this.timestamp = timestamp; + return this; + } + + public Builder wayPoints(List wayPoints) { + this.wayPoints = wayPoints; + return this; + } + + public Builder blackPoints(List blackPoints) { + this.blackPoints = blackPoints; + return this; + } + + public Trajectory build() { + return new Trajectory(id, name, trajUrl, trajMd5, trajVer, stopUrl, stopMd5, stopVer, timestamp, wayPoints, blackPoints); + } + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/VehicleSite.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/VehicleSite.java new file mode 100644 index 0000000000..3e447e1885 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/dto/cmd/VehicleSite.java @@ -0,0 +1,173 @@ +package com.zhjt.mogo.adas.unmanned.task.dto.cmd; + +/** + * 车辆站点 + */ +public class VehicleSite { + /** + * 坐标类型 + */ + private Integer coordinateType; + /** + * 坐标点 + */ + private AutopilotPoint point; + /** + * 站点类型 + */ + private Integer station; + /** + * 站点ID + */ + private Long stationId; + /** + * 站点名称 + */ + private String stationName; + /** + * 站点序号 + */ + private Integer stationSeq; + + /** + * 是否临时不停靠 + * 1:正常停靠 2:临时不停靠 + */ + private Integer tag = 1; + + + public VehicleSite() { + } + + public VehicleSite(Integer coordinateType, AutopilotPoint point, Integer station, Long stationId, String stationName, Integer stationSeq, Integer tag) { + this.coordinateType = coordinateType; + this.point = point; + this.station = station; + this.stationId = stationId; + this.stationName = stationName; + this.stationSeq = stationSeq; + this.tag = tag; + } + + public Integer getCoordinateType() { + return coordinateType; + } + + public void setCoordinateType(Integer coordinateType) { + this.coordinateType = coordinateType; + } + + public AutopilotPoint getPoint() { + return point; + } + + public void setPoint(AutopilotPoint point) { + this.point = point; + } + + public Integer getStation() { + return station; + } + + public void setStation(Integer station) { + this.station = station; + } + + public Long getStationId() { + return stationId; + } + + public void setStationId(Long stationId) { + this.stationId = stationId; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public Integer getStationSeq() { + return stationSeq; + } + + public void setStationSeq(Integer stationSeq) { + this.stationSeq = stationSeq; + } + + public Integer getTag() { + return tag; + } + + public void setTag(Integer tag) { + this.tag = tag; + } + + @Override + public String toString() { + return "VehicleSite{" + + "coordinateType=" + coordinateType + + ", point=" + point + + ", station=" + station + + ", stationId=" + stationId + + ", stationName='" + stationName + '\'' + + ", stationSeq=" + stationSeq + + ", tag=" + tag + + '}'; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private Integer coordinateType; + private AutopilotPoint point; + private Integer station; + private Long stationId; + private String stationName; + private Integer stationSeq; + private Integer tag = 1; + + public Builder coordinateType(Integer coordinateType) { + this.coordinateType = coordinateType; + return this; + } + + public Builder point(AutopilotPoint point) { + this.point = point; + return this; + } + + public Builder station(Integer station) { + this.station = station; + return this; + } + + public Builder stationId(Long stationId) { + this.stationId = stationId; + return this; + } + + public Builder stationName(String stationName) { + this.stationName = stationName; + return this; + } + + public Builder stationSeq(Integer stationSeq) { + this.stationSeq = stationSeq; + return this; + } + + public Builder tag(Integer tag) { + this.tag = tag; + return this; + } + + public VehicleSite build() { + return new VehicleSite(coordinateType, point, station, stationId, stationName, stationSeq, tag); + } + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/AutopilotCoordinateTypeEnum.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/AutopilotCoordinateTypeEnum.java new file mode 100644 index 0000000000..e94c10b376 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/AutopilotCoordinateTypeEnum.java @@ -0,0 +1,25 @@ +package com.zhjt.mogo.adas.unmanned.task.enums; + +public enum AutopilotCoordinateTypeEnum { + WGS84(0,"WGS84"),GCJ02(1,"GCJ02"),UTM(2,"UTM"); + private int code; + private String desc; + + private AutopilotCoordinateTypeEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public int getCode() { + return code; + } + + public static AutopilotCoordinateTypeEnum codeOf(Integer code) { + for(AutopilotCoordinateTypeEnum typeEnum : AutopilotCoordinateTypeEnum.values()) { + if (code == typeEnum.code){ + return typeEnum; + } + } + return null; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/MessageCmdEnum.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/MessageCmdEnum.java new file mode 100644 index 0000000000..1a30ed2576 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/MessageCmdEnum.java @@ -0,0 +1,49 @@ +package com.zhjt.mogo.adas.unmanned.task.enums; + +import android.text.TextUtils; + +import androidx.annotation.Nullable; + +public enum MessageCmdEnum { + + AutopilotStartRequest("AutopilotStartRequest", "APP开始任务"), + + TaskContinueNotification("TaskContinueNotification", "站点出发"), + TaskFinishNotification("TaskFinishNotification", "任务完成"), + TaskLocationQueryRequest("TaskLocationQueryRequest", "任务查询"), + TaskStartNotification("TaskStartNotification", "自驾/离站结果回执"), + TaskArrivalNotification("TaskArrivalNotification", "到站通知"), + TaskAbortNotification("TaskAbortNotification", "任务终止"), + TaskLocationQueryResponse("TaskLocationQueryResponse", "任务查询结果"), + TaskCancelRequest("TaskCancelRequest", "任务取消请求"), + TaskCancelResponse("TaskCancelResponse", "任务取消请求"), + TaskQueryStateRequest("TaskQueryStateRequest", "任务状态查询"), + TaskQueryStateResponse("TaskQueryStateResponse", "任务状态查询响应"), + ; + private final String code; + private final String desc; + + private MessageCmdEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + public String getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + + public static MessageCmdEnum codeOf(@Nullable String code) { + if (TextUtils.isEmpty(code)) return null; + for (MessageCmdEnum typeEnum : MessageCmdEnum.values()) { + if (code.equals(typeEnum.code)) { + return typeEnum; + } + } + return null; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/RouteTypeEnum.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/RouteTypeEnum.java new file mode 100644 index 0000000000..fc753ec559 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/RouteTypeEnum.java @@ -0,0 +1,33 @@ +package com.zhjt.mogo.adas.unmanned.task.enums; + +public enum RouteTypeEnum { + SiteRoute(0, "多站点模式"), + LineRoute(1, "路线模式"); + + private int code; + private String desc; + + private RouteTypeEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public int getCode() { + return code; + } + + + public String getDesc() { + return desc; + } + + public static RouteTypeEnum codeOf(Integer code) { + for (RouteTypeEnum typeEnum : RouteTypeEnum.values()) { + if (code == typeEnum.code) { + return typeEnum; + } + } + return null; + } + +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/StationEnum.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/StationEnum.java new file mode 100644 index 0000000000..622ad2c749 --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/StationEnum.java @@ -0,0 +1,25 @@ +package com.zhjt.mogo.adas.unmanned.task.enums; + +public enum StationEnum { + SITE(0,"业务站点"),WAY(1,"途径点"); + private int code; + private String desc; + + private StationEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public int getCode() { + return code; + } + + public static StationEnum codeOf(Integer code) { + for(StationEnum typeEnum : StationEnum.values()) { + if (code == typeEnum.code){ + return typeEnum; + } + } + return null; + } +} diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/TaskStatusEnum.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/TaskStatusEnum.java new file mode 100644 index 0000000000..d77a174bab --- /dev/null +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/unmanned/task/enums/TaskStatusEnum.java @@ -0,0 +1,26 @@ +package com.zhjt.mogo.adas.unmanned.task.enums; + + +public enum TaskStatusEnum { + + INIT(0), START(10), CANCEL_ING(90), COMPLETE(100), FAIL(110), CANCEL(120); + + private int code; + + private TaskStatusEnum(int code) { + this.code = code; + } + + public int getCode() { + return code; + } + + public static TaskStatusEnum codeOf(Integer code) { + for (TaskStatusEnum typeEnum : TaskStatusEnum.values()) { + if (code == typeEnum.code) { + return typeEnum; + } + } + return null; + } +} diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index 0647a5f0b7..fdc6caf58a 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package mogo.telematics.pad; import "geometry.proto"; +import "header.proto"; enum ProtocolVersion { @@ -114,6 +115,7 @@ enum MessageType MsgTypeObuUploadStatus = 0x1013A;//obu上报状态查询以结果(上下行) MsgTypePlanningStopLine = 0x1013B;//决策停止线(自动驾驶决策呈现使用) 定频,理论是10hz,实际会有不同 MsgTypeFsmEvent = 0x1013C;//fsm event msg + MsgTypeTaskMgrAndPad = 0x10142; //鹰眼和任务管理之间的消息透传 } message Header @@ -1068,3 +1070,6 @@ message SetEnableReq { uint32 enable = 1; //1: enable, 0: disable } + +// message definition for MessageType: MsgTypeTaskMgrAndPad +//bytes diff --git a/libraries/mogo-adas-data/src/main/res/values-en/strings.xml b/libraries/mogo-adas-data/src/main/res/values-en/strings.xml index ff8c670118..e5253f8ba7 100644 --- a/libraries/mogo-adas-data/src/main/res/values-en/strings.xml +++ b/libraries/mogo-adas-data/src/main/res/values-en/strings.xml @@ -94,6 +94,8 @@ Domain control OBU upload status response Planning Stop Line FSM Event + Send Task Management Message + Receive Task Management Message Planning decision state Sweeper index data OBU warning event diff --git a/libraries/mogo-adas-data/src/main/res/values/strings.xml b/libraries/mogo-adas-data/src/main/res/values/strings.xml index 22900a9408..b7ce5d7f2a 100644 --- a/libraries/mogo-adas-data/src/main/res/values/strings.xml +++ b/libraries/mogo-adas-data/src/main/res/values/strings.xml @@ -94,6 +94,8 @@ 域控上报OBU开关状态响应 决策停止线 FSM事件 + 发送任任务管理消息 + 接收任务管理消息 Planning决策状态 清扫车指标数据 OBU预警事件 diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 927b7b4b3a..437b89b939 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -24,6 +24,7 @@ import com.zhidao.support.adas.high.common.CertificateUtils; import com.zhidao.support.adas.high.common.Constants; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.common.Define; +import com.zhidao.support.adas.high.common.JsonUtil; import com.zhidao.support.adas.high.common.ParallelDrivingManager; import com.zhidao.support.adas.high.common.PingAddressHelper; import com.zhidao.support.adas.high.common.ProtocolStatus; @@ -60,9 +61,22 @@ import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendRes import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm; import com.zhjt.mogo.adas.data.sweeper.task.s_r.SweeperTaskSuspendResume; import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.AutopilotPoint; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.AutopilotStartRequest; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.CmdDto; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.TaskContinueNotification; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.VehicleSite; +import com.zhjt.mogo.adas.unmanned.task.enums.AutopilotCoordinateTypeEnum; +import com.zhjt.mogo.adas.unmanned.task.enums.MessageCmdEnum; +import com.zhjt.mogo.adas.unmanned.task.enums.RouteTypeEnum; +import com.zhjt.mogo.adas.unmanned.task.enums.StationEnum; import com.zhjt.mogo.adas.utils.ByteUtil; import com.zhjt.service.chain.ChainLog; +import org.json.JSONObject; + +import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -3143,6 +3157,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec /** * 查询OTA2.0状态 + * * @param queryStr 域控发送OTA升级请求中的 {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} * @return 消息是否添加到WS消息发送队列,返回值为非0的正整数时表示下发消息的消息ID * * >=0:表示添加到WS发送消息队列 @@ -3375,5 +3390,65 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec public long sendImgUploadCloudStatusQuery() { return sendPBMessage(MessageType.TYPE_SEND_IMG_UPLOAD_CLOUD_STATUS_QUERY, null); } + + private long sendTaskManager(T data) { +// MessagePad.TaskManager.Builder builder = MessagePad.TaskManager +// .newBuilder() +// .setTaskData(com.google.protobuf.ByteString.copyFrom(JsonUtil.toJsonBase64(data).getBytes(StandardCharsets.UTF_8))); +// return sendPBMessage(MessageType.TYPE_SEND_TASK_MANAGER, builder.build().toByteArray()); + return sendPBMessage(MessageType.TYPE_SEND_TASK_MANAGER, JsonUtil.toJsonBase64(data).getBytes(StandardCharsets.UTF_8)); + } + + /** + * 向任务管理发送启动自驾命令 + * + * @param taskId 任务ID, 同原接口的orderid, 首次和头部校验 + * @param traj 轨迹信息 + * @return + */ + @Override + public long sendTaskManagerAutopilotStart(Long taskId, Trajectory traj) { + AutopilotStartRequest autopilotStartRequest = AutopilotStartRequest.builder() + .taskId(taskId).source(1).traj(traj).taskType(RouteTypeEnum.LineRoute.getCode()).build(); + + CmdDto cmdDto = CmdDto.builder().cmdType(MessageCmdEnum.AutopilotStartRequest.getCode()).taskId(taskId) + .lineId(traj.getId()).timestamp(System.currentTimeMillis()).data(autopilotStartRequest).build(); + return sendTaskManager(cmdDto); + } + + /** + * 向任务管理发送继续自驾命令 + * + * @param trackId + * @param taskId + * @param stationId + * @param stationName + * @param stationSeq + * @param lon + * @param lat + * @return + */ + @Override + public long sendTaskManagerAutopilotContinue(Long trackId, Long taskId, Long stationId, String stationName, Integer stationSeq, double lon, double lat) { + VehicleSite vehicleSite = VehicleSite.builder().stationId(stationId).stationName(stationName) + .station(StationEnum.SITE.getCode()).stationSeq(stationSeq) + .point(AutopilotPoint.builder().x(lon).y(lat).build()).coordinateType(AutopilotCoordinateTypeEnum.WGS84.getCode()).build(); + TaskContinueNotification taskContinueNotification = TaskContinueNotification.builder().curStation(vehicleSite).build(); + CmdDto cmdDto = CmdDto.builder().cmdType(MessageCmdEnum.TaskContinueNotification.getCode()).taskId(taskId).lineId(trackId).timestamp(System.currentTimeMillis()).data(taskContinueNotification).build(); + return sendTaskManager(cmdDto); + } + + /** + * 向任务管理发送取消自驾命令 + * + * @param taskId + * @return + */ + @Override + public long sendTaskManagerAutopilotCancel(Long taskId) { + CmdDto cmdDto = CmdDto.builder().cmdType(MessageCmdEnum.TaskCancelRequest.getCode()).taskId(taskId) + .lineId(0L).timestamp(System.currentTimeMillis()).data(new JSONObject()).build(); + return sendTaskManager(cmdDto); + } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java index 794777554f..49875a4ef3 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java @@ -28,6 +28,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendRes import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm; import com.zhjt.mogo.adas.data.sweeper.task.s_r.SweeperTaskSuspendResume; import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory; import java.util.HashSet; import java.util.List; @@ -1883,6 +1884,7 @@ public class AdasManager implements IAdasNetCommApi { /** * OTA2.0 请求命令下发 + * * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON * @return */ @@ -2085,6 +2087,21 @@ public class AdasManager implements IAdasNetCommApi { return mChannel == null ? -1L : mChannel.sendImgUploadCloudStatusQuery(); } + @Override + public long sendTaskManagerAutopilotStart(Long taskId, Trajectory traj) { + return mChannel == null ? -1L : mChannel.sendTaskManagerAutopilotStart(taskId, traj); + } + + @Override + public long sendTaskManagerAutopilotContinue(Long trackId, Long taskId, Long stationId, String stationName, Integer stationSeq, double lon, double lat) { + return mChannel == null ? -1L : mChannel.sendTaskManagerAutopilotContinue(trackId, taskId, stationId, stationName, stationSeq, lon, lat); + } + + @Override + public long sendTaskManagerAutopilotCancel(Long taskId) { + return mChannel == null ? -1L : mChannel.sendTaskManagerAutopilotCancel(taskId); + } + /** * 查询节点状态 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java index be3ce0a37b..a85c571e6e 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java @@ -16,6 +16,7 @@ import com.zhjt.mogo.adas.data.sweeper.task.cloud.s_r.SweeperTaskCloudSuspendRes import com.zhjt.mogo.adas.data.sweeper.task.confirm.SweeperTaskConfirm; import com.zhjt.mogo.adas.data.sweeper.task.s_r.SweeperTaskSuspendResume; import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.Trajectory; import java.util.List; import java.util.Map; @@ -1375,6 +1376,7 @@ public interface IAdasNetCommApi { /** * OTA2.0查询 + * * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON */ long sendOtaPadMsgQuery(@Nullable String queryStr); @@ -1534,6 +1536,12 @@ public interface IAdasNetCommApi { */ long sendImgUploadCloudStatusQuery(); + long sendTaskManagerAutopilotStart(Long taskId, Trajectory traj); + + long sendTaskManagerAutopilotContinue(Long trackId, Long taskId, Long stationId, String stationName, Integer stationSeq, double lon, double lat); + + long sendTaskManagerAutopilotCancel(Long taskId); + /** * 向工控机发送数据 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java index 48d0baa23a..63ad51b306 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java @@ -34,7 +34,9 @@ import com.zhjt.mogo.adas.data.sweeper.task.s_r.SweeperTaskSuspendResume; import com.zhjt.mogo.adas.data.sweeper.task.status.SweeperTaskStatus; import com.zhjt.mogo.adas.data.sweeper.task.stop.SweeperTaskStop; +import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Date; import bag_manager.BagManagerOuterClass; import chassis.Chassis; @@ -795,6 +797,48 @@ public interface OnAdasListener { */ void onPlanningStopLine(@NonNull MessagePad.Header header, @NonNull Hadmap.MapMsg mapMsg); + /** + * 域控任务管理原始数据 + * + * @param header 头 + * @param data 数据 + */ + void onAdasTaskManagerOriginal(@NonNull MessagePad.Header header, @NonNull byte[] data); + + /** + * 域控任务管理离站通知 + * + * @param taskId + * @param siteId + * @param sequence + * @param ack + * @param reason + * @param stationTimeLeft + */ + void onAdasTaskManagerDeparture(Long taskId, Long siteId, Integer sequence, boolean ack, String reason, double stationTimeLeft); + + /** + * 域控任务管理到站通知 + * + * @param taskId 任务ID, 同原接口的orderid, 首次和头部校验 + * @param siteId 站点编号,对应云平台固定值 + * @param sequence 站点序号,对应顺序列表里站点流程,从1开始,1为起始点,最大值为终点。 途径点填写0 + * @param mileage 任务全程的已经行进的里程 + */ + void onAdasTaskManagerArrival(Long taskId, Long siteId, Integer sequence, BigDecimal mileage); + + /** + * 域控任务管理终止任务 + * + * @param taskId + * @param userId + * @param status + * @param reason + * @param completedTime + * @param mileage + */ + void onAdasTaskManagerComplete(Long taskId, Long userId, Integer status, String reason, Date completedTime, BigDecimal mileage); + /** * 是否有能力启动自动驾驶 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ByteArrayToBase64TypeAdapter.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ByteArrayToBase64TypeAdapter.java new file mode 100644 index 0000000000..0a96bf9324 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ByteArrayToBase64TypeAdapter.java @@ -0,0 +1,35 @@ +package com.zhidao.support.adas.high.common; + +import android.util.Base64; + +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + +import java.io.IOException; + +public class ByteArrayToBase64TypeAdapter extends TypeAdapter { + + @Override + public void write(JsonWriter writer, byte[] value) throws IOException { + if (value == null) { + writer.nullValue(); + return; + } + // 将 byte[] 编码为 Base64 字符串并写入JSON + String base64 = Base64.encodeToString(value, Base64.NO_WRAP); + writer.value(base64); + } + + @Override + public byte[] read(JsonReader reader) throws IOException { + if (reader.peek() == JsonToken.NULL) { + reader.nextNull(); + return null; + } + // 从JSON中读取字符串,并将其从 Base64 解码回 byte[] + String base64 = reader.nextString(); + return Base64.decode(base64, Base64.NO_WRAP); + } +} \ No newline at end of file diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/JsonUtil.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/JsonUtil.java index f9ca0e6566..bfcbe73d98 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/JsonUtil.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/JsonUtil.java @@ -1,66 +1,62 @@ package com.zhidao.support.adas.high.common; +import android.util.Base64; + import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; -/** - * Java对象和JSON字符串相互转化工具类 - * 格式化 - * - * @author xfk - */ public final class JsonUtil { + // 1. 预先创建单例,避免重复 new 对象带来的开销 + private static final Gson COMMON_GSON = new GsonBuilder() + .setDateFormat("yyyy-MM-dd HH:mm:ss") + .create(); + + private static final Gson NULL_SERIALIZE_GSON = new GsonBuilder() + .setDateFormat("yyyy-MM-dd HH:mm:ss") + .serializeNulls() + .create(); + + private JsonUtil() { + // 私有构造函数,防止被实例化 + } - /** - * 对象转换成json字符串 - * - * @param obj - * @return - */ public static String toJson(Object obj) { - return toJson(false, obj); } + public static String toJsonBase64(Object obj) { + String value = toJson(false, obj); + return Base64.encodeToString(value.getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP); + } + public static String toJson(boolean isSerializeNulls, Object obj) { - Gson gson; - if (isSerializeNulls) { - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.serializeNulls(); //重点 - gson = gsonBuilder.create(); - } else { - gson = new Gson(); - } - return gson.toJson(obj); + if (obj == null) return null; + return isSerializeNulls ? NULL_SERIALIZE_GSON.toJson(obj) : COMMON_GSON.toJson(obj); } - - /** - * json字符串转成对象 - * - * @param str - * @param type - * @return - */ public static T fromJson(String str, Type type) { - Gson gson = new Gson(); - return gson.fromJson(str, type); + if (isEmpty(str)) return null; + return COMMON_GSON.fromJson(str, type); } - /** - * json字符串转成对象 - * - * @param str - * @param type - * @return - */ public static T fromJson(String str, Class type) { - Gson gson = new Gson(); - return gson.fromJson(str, type); + if (isEmpty(str)) return null; + return COMMON_GSON.fromJson(str, type); + } + + public static T fromJson(JsonElement object, Class type) { + if (object == null) return null; + return COMMON_GSON.fromJson(object, type); } -} + private static boolean isEmpty(String str) { + return str == null || str.trim().isEmpty(); + } +} \ No newline at end of file diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java index c3f3a91024..9816fc518a 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java @@ -65,6 +65,7 @@ public class MyMessageFactory implements IMyMessageFactory { private IMsg obuUploadStatusMessage;//域控上报OBU开关状态响应 private IMsg planningStopLineMessage;//决策停止线 private IMsg fSMEventMessage;//FSM事件 + private IMsg taskMgrAndPadMessage;//任务管理消息 private final AutopilotReview autopilotReview; private final TurnLightState lightLeft = new TurnLightState(); @@ -382,11 +383,17 @@ public class MyMessageFactory implements IMyMessageFactory { } return planningStopLineMessage; } else if (messageType == MessageType.TYPE_RECEIVE_FSM_EVENT.typeCode) { - //决策停止线 + //FSM事件 if (fSMEventMessage == null) { fSMEventMessage = new FSMEventMessage(); } return fSMEventMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_TASK_MANAGER.typeCode) { + //任务管理消息 + if (taskMgrAndPadMessage == null) { + taskMgrAndPadMessage = new TaskManagerMessage(); + } + return taskMgrAndPadMessage; } else { //MessageType.TYPE_DEFAULT.typeCode return null; diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TaskManagerMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TaskManagerMessage.java new file mode 100644 index 0000000000..a0d0697e1c --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TaskManagerMessage.java @@ -0,0 +1,105 @@ +package com.zhidao.support.adas.high.msg; + +import android.os.SystemClock; +import android.util.Log; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.AdasChannel; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.common.JsonUtil; +import com.zhidao.support.adas.high.protocol.RawData; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.CmdDto; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.TaskAbortNotification; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.TaskArrivalNotification; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.TaskLocationQueryResponse; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.TaskStartNotification; +import com.zhjt.mogo.adas.unmanned.task.dto.cmd.VehicleSite; +import com.zhjt.mogo.adas.unmanned.task.enums.MessageCmdEnum; +import com.zhjt.mogo.adas.unmanned.task.enums.TaskStatusEnum; + +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.util.Date; + +/** + * 任务管理消息 + */ +public class TaskManagerMessage extends MyAbstractMessageHandler { + private static final String TAG = TaskManagerMessage.class.getSimpleName(); + + public TaskManagerMessage() { + } + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + int len = raw.getPackageLengthValue() - raw.getOffsetValue(); + byte[] data = new byte[len]; + System.arraycopy(raw.originalData.toByteArray(), raw.getOffsetValue(), data, 0, len); + + AdasChannel.calculateTimeConsumingOnDispatchRaw("任务管理消息", raw.receiveTime); + long nowTime = 0; + if (CupidLogUtils.isEnableLog()) + nowTime = SystemClock.elapsedRealtime(); + if (adasListener != null) { + adasListener.onAdasTaskManagerOriginal(raw.getHeader(), data); + parse(adasListener, new String(data, StandardCharsets.UTF_8)); + } + AdasChannel.calculateTimeConsumingBusiness("任务管理消息", nowTime); + } + + private void parse(OnAdasListener adasListener, String data) { + Log.i(TAG, "任务管理接收原始数据=" + data); + + JsonObject jsonObject = JsonParser.parseString(data).getAsJsonObject(); + String cmdType = jsonObject.get("cmdType").getAsString(); + MessageCmdEnum messageCmdEnum = MessageCmdEnum.codeOf(cmdType); + if (messageCmdEnum == MessageCmdEnum.TaskStartNotification) {//自驾/离站结果回执 + CmdDto cmdDto = JsonUtil.fromJson(data, new TypeToken>() { + }.getType()); + if (cmdDto != null) { + Log.i(TAG, "onAdasTaskManagerDeparture=" + cmdDto); + TaskStartNotification taskStartNotification = cmdDto.getData(); + + VehicleSite vehicleSite = taskStartNotification.getCurLocation(); + adasListener.onAdasTaskManagerDeparture(cmdDto.getTaskId(), vehicleSite.getStationId(), vehicleSite.getStationSeq(), taskStartNotification.isAutopilotResult(), taskStartNotification.getErrMsg(), taskStartNotification.getStationTimeLeft()); + } + + } else if (messageCmdEnum == MessageCmdEnum.TaskArrivalNotification) {//到站通知 + CmdDto cmdDto = JsonUtil.fromJson(data, new TypeToken>() { + }.getType()); + if (cmdDto != null) { + Log.i(TAG, "onAdasTaskManagerArrival=" + cmdDto); + TaskArrivalNotification taskArrivalNotification = cmdDto.getData(); + VehicleSite vehicleSite = taskArrivalNotification.getCurLocation(); + adasListener.onAdasTaskManagerArrival(cmdDto.getTaskId(), vehicleSite.getStationId(), vehicleSite.getStationSeq(), BigDecimal.valueOf(taskArrivalNotification.getAccumulatedTaskDis())); + } + + } else if (messageCmdEnum == MessageCmdEnum.TaskAbortNotification) {//终止任务 + CmdDto cmdDto = JsonUtil.fromJson(data, new TypeToken>() { + }.getType()); + if (cmdDto != null) { + Log.i(TAG, "onAdasTaskManagerComplete=" + cmdDto); + TaskAbortNotification taskAbortNotification = cmdDto.getData(); + Log.i(TAG, "onAdasTaskManagerComplete=" + taskAbortNotification); + VehicleSite vehicleSite = taskAbortNotification.getCurLocation(); + adasListener.onAdasTaskManagerComplete(cmdDto.getTaskId(), null, TaskStatusEnum.CANCEL.getCode(), taskAbortNotification.getErrMsg(), new Date(), BigDecimal.valueOf(taskAbortNotification.getAccumulatedTaskDis())); + } + + } else if (messageCmdEnum == MessageCmdEnum.TaskLocationQueryResponse) {//任务查询结果 + CmdDto cmdDto = JsonUtil.fromJson(data, new TypeToken>() { + }.getType()); + if (cmdDto != null) { + Log.i(TAG, "onAdasTaskLocationQueryResponse=" + cmdDto); + TaskLocationQueryResponse taskLocationQueryResponse = cmdDto.getData(); + } + + } + + } + + +}