Merge branch 'dev_robotaxi-d_240807_6.6.0' into tmp_6.7.0_arrow

This commit is contained in:
EmArrow
2024-09-05 09:43:13 +08:00
88 changed files with 1261 additions and 533 deletions

View File

@@ -140,52 +140,6 @@ internal object V2NIdentifyDrawer: IEventDismissListener {
car.longitude,
car.latitude
)
// if (polygon.isNotEmpty()) {
// val decision = V2NUtils.computeOccupyLanesInfo(Triple(car.longitude, car.latitude, car.heading.toFloat()), Triple(itx.longitude, itx.latitude, itx.heading.toFloat()), polygon.map { kotlin.Pair(it.first, it.second) })
// if (decision != null) {
// val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
// val total = decision.total
// val occupy = decision.occupy
// val laneId = decision.laneId
// val sb = StringBuilder()
// V2XBizTrace.onAck(decision, "计算出道路事件占道决策数据1")
// if (laneId != null) {
// val isOccupy = occupy.find { it.id == laneId } != null
// if (isOccupy) {
// if (isDriver) {
// val bestLane = V2NUtils.computeBestLane(laneId, occupy, total)
// V2XBizTrace.onAck(bestLane, "计算出最优车道")
// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇建议您尽快${bestLane.second}")
// } else {
// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇时刻为您守护")
// }
// } else {
// if (isDriver) {
// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇提醒您小心${ if (computeDirection(laneId, occupy) > 0) "右侧" else "左侧" }行人及来车")
// } else {
// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇时刻为您守护")
// }
// }
// } else {
// sb.append("发现前方${distance.toInt()}米${ if (poiType == EventTypeEnumNew.TYPE_SOCKET_ROAD_SHIGONG.poiType) "车道施工" else "车道事故" }@@, 蘑菇时刻为您守护")
// }
// if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
// runCatching {
// CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), START)
// }
// scope.launch {
// delay(5000)
// runCatching {
// CallerHmiManager.notifyXiaoZhiStatusChanged(V2N(EventTypeEnumNew.getEnumType(poiType)), STOP)
// }
// }
// }
// val ss = sb.toString()
// val content = ss.substring(0, ss.indexOf("@@"))
// val tts = ss.replace("@@", "")
// CallerRoadV2NEventWindowListenerManager.showLiveVideo(id, itx.detectStartTime.takeIf { it > 0 } ?: System.currentTimeMillis(), EventTypeEnumNew.getUpdateIconRes(poiType), content, isDriver, tts, itx.cameraIp, itx.longitude, itx.latitude)
// }
// }
val isDriver = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
if (!isDriver) {
runCatching {

View File

@@ -46,7 +46,7 @@ class AiRoadMarker {
val aiMakers = ConcurrentHashMap<String, AiRoadMarker>()
private const val TAG = "AiRoadMarker"
private val COLOR_START = Color.parseColor("#002ABAD9")
private val COLOR_START = Color.parseColor("#0030A3FF")
private val COLOR_END = Color.parseColor("#66FF7A30")
private val builders by lazy { ConcurrentHashMap<String, Point.Options.Builder>() }

View File

@@ -38,12 +38,12 @@ class V2XAiRoadEventMarker {
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
val colors = ArrayList<Int>()
colors.add(Color.argb(204, 237, 172, 21))
colors.add(Color.argb(0, 255, 255, 255))
colors.add(Color.argb(0, 48, 163, 255))
builder.colors(colors)
} else {
val colors = ArrayList<Int>()
colors.add(Color.parseColor("#99FF8F2A"))
colors.add(Color.argb(0, 255, 255, 255))
colors.add(Color.argb(0, 48, 163, 255))
builder.colors(colors)
}
val dispersedPoints = getDispersedPoints(polygon.map { Pair<Double, Double>(it.first, it.second) }, 3)

View File

@@ -117,6 +117,7 @@ import mogo.v2x.RoadOverviewEvents
import mogo.yycp.paralleldriving.protocol.ParallelTaskProcessNoticeOuterClass
import mogo_msg.MogoReportMsg
import perception.FusionTrafficLightOuterClass
import perception.LaneMarkOuterClass
import planning.RoboSweeperTaskIndexOuterClass
import prediction.Prediction
import record_cache.RecordPanelOuterClass
@@ -1030,6 +1031,19 @@ class MoGoAdasListenerImpl : OnAdasListener {
CallerV2nNioEventListenerManager.invokeV2nNioCongestionEvent(congestion)
}
/**
* 车道线
*
* @param header 头
* @param laneMarks 数据
*/
override fun onLaneMarksTran(
header: MessagePad.Header,
laneMarks: LaneMarkOuterClass.LaneMarks
) {
}
/**
* 所连接的域控的节点状态信息
* 目前包含状态 节点是否存在;节点是否超时;

View File

@@ -5,7 +5,6 @@ package com.zhjt.mogo_core_function_devatools
import android.app.Activity
import android.app.Application
import android.content.Context
import android.util.Log
import android.view.View
import android.view.ViewGroup
import com.alibaba.android.arouter.facade.annotation.Route
@@ -13,7 +12,6 @@ import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.debug.DebugConfig
import com.mogo.eagle.core.data.EnvConfig
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig.isShowRouteStrategy
import com.mogo.eagle.core.data.constants.MogoServicePaths
@@ -60,10 +58,8 @@ import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager
import com.zhjt.mogo_core_function_devatools.block.MoGoBlockProviderImpl
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
import com.zhjt.mogo_core_function_devatools.exam.ExamControlManager
import com.zhjt.mogo_core_function_devatools.exam.ExamControlWindow
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl
import com.zhjt.mogo_core_function_devatools.logcat.CrashLogAnalyticsManager
import com.zhjt.mogo_core_function_devatools.logcat.MoGoLogRecordProviderImpl
import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager
import com.zhjt.mogo_core_function_devatools.lookaround.MoGoLookAroundProviderImpl
@@ -91,11 +87,7 @@ import com.zhjt.service.chain.ChainLog
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.BufferedReader
import java.io.File
import java.io.FileReader
import java.io.IOException
import java.lang.StringBuilder
import java.lang.ref.WeakReference
import java.util.concurrent.ConcurrentHashMap
@@ -250,26 +242,6 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener {
val crashDir = File(it.getExternalFilesDir(null), "crash")
if(crashDir.exists() && crashDir.canExecute() && crashDir.listFiles()?.isNotEmpty() == true){
it.lifeCycleScope.launch(Dispatchers.IO){
crashDir.listFiles()?.forEach {crash->
val file = File(crash.absolutePath)
try {
BufferedReader(FileReader(file)).use { reader ->
var line: String?
//读取读取文件内容并打印
while (reader.readLine().also { line = it } != null) {
line?.let { content->
if(content.contains("Crash type")){
CrashLogAnalyticsManager.crashLogAnalytics(content)
return@use
}
}
}
}
} catch (e: IOException) {
e.printStackTrace()
}
}
val startTime = crashDir.lastModified() - 60*1000
val endTime = if(System.currentTimeMillis() - crashDir.lastModified()>60*1000){
crashDir.lastModified() + 60*1000

View File

@@ -246,32 +246,21 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
if (ClickUtils.isFastClick()){
if (NetworkUtils.isConnected()){
if (BadCaseConfig.dockerVersion != null){
if(ProjectUtils.isSaas()){
//660版本数据闭环增加统一上报问题入口仅限于saas渠道
if(reportTypeWindow == null){
reportTypeWindow = ReportTypeWindow(activity)
reportTypeWindow?.setClickListener(object: ReportTypeWindow.ClickListener{
override fun closeWindow() {
reportTypeWindow?.hideFloatWindow()
reportTypeWindow = null
}
})
}
if(reportTypeWindow?.getWindowShowStatus() == true){
reportTypeWindow?.hideFloatWindow()
reportTypeWindow = null
}else{
reportTypeWindow?.showFloatWindow(xPosition,yPosition)
}
}else{
//展示工单上报弹窗
val workOrderWindow = WorkOrderWindow(activity)
workOrderWindow.setClickListener(object: WorkOrderWindow.ClickListener{
//660版本数据闭环增加统一上报问题入口仅限于saas渠道
if(reportTypeWindow == null){
reportTypeWindow = ReportTypeWindow(activity)
reportTypeWindow?.setClickListener(object: ReportTypeWindow.ClickListener{
override fun closeWindow() {
workOrderWindow.hideFloatWindow()
reportTypeWindow?.hideFloatWindow()
reportTypeWindow = null
}
})
workOrderWindow.showFloatWindow()
}
if(reportTypeWindow?.getWindowShowStatus() == true){
reportTypeWindow?.hideFloatWindow()
reportTypeWindow = null
}else{
reportTypeWindow?.showFloatWindow(xPosition,yPosition)
}
}else{
ToastUtils.showShort("工控机连接状态异常")
@@ -373,29 +362,31 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean, activity: Activity, countdown: Boolean) {
CallerLogger.d("$M_DEVA$TAG", "收到录包结果回调${record}")
CallerLogger.d("$M_DEVA$TAG", "开始创建被动录包弹窗,window num=${BadCaseConfig.windowNum}")
ThreadUtils.runOnUiThread {
val passiveBadCaseWindow = PassiveBadCaseWindow(activity)
passiveBadCaseWindow.setRecord(msgBoxBean)
passiveBadCaseWindow.setClickListener(object : PassiveBadCaseWindow.ClickListener {
override fun closeWindow() {
passiveBadCaseWindow.hideFloatWindow()
}
})
passiveBadCaseWindow.showFloatWindow()
if (countdown) {
val countDownTimer = object : CountDownTimer(10000, 10000) {
override fun onTick(p0: Long) {
if(!ProjectUtils.isSaas()){
ThreadUtils.runOnUiThread {
val passiveBadCaseWindow = PassiveBadCaseWindow(activity)
passiveBadCaseWindow.setRecord(msgBoxBean)
passiveBadCaseWindow.setClickListener(object : PassiveBadCaseWindow.ClickListener {
override fun closeWindow() {
passiveBadCaseWindow.hideFloatWindow()
}
})
passiveBadCaseWindow.showFloatWindow()
if (countdown) {
val countDownTimer = object : CountDownTimer(10000, 10000) {
override fun onTick(p0: Long) {
}
override fun onFinish() {
//如果有页面操作,则不自动关闭窗口
if(!passiveBadCaseWindow.isOperated()){
passiveBadCaseWindow.hideFloatWindow()
BadCaseConfig.windowNum--
override fun onFinish() {
//如果有页面操作,则不自动关闭窗口
if(!passiveBadCaseWindow.isOperated()){
passiveBadCaseWindow.hideFloatWindow()
BadCaseConfig.windowNum--
}
}
}
countDownTimer.start()
}
countDownTimer.start()
}
}
}
@@ -579,26 +570,35 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
*/
override fun onFSM2024State(fsmState: Fsm2024.FSMStateMsg) {
Log.i(TAG,"onFSM2024State fsmState.pilotStandbyFlag="+fsmState.pilotStandbyFlag+" pilotNotStandbyReason="+ fsmState.pilotNotStandbyReason)
if(!fsmState.pilotStandbyFlag){
//pilotStandbyFlag == false代表自动驾驶无法启动
if(!BadCaseConfig.alreadyShowOneReport){
//触发一键上报
ThreadUtils.runOnUiThread {
if(reportTypeWindow == null){
reportTypeWindow = ReportTypeWindow(activity)
reportTypeWindow?.setClickListener(object: ReportTypeWindow.ClickListener{
override fun closeWindow() {
reportTypeWindow?.hideFloatWindow()
reportTypeWindow = null
}
})
if(fsmState.pilotStandbyFlag){
BadCaseConfig.fsmAlreadyStandby = true
}
if(BadCaseConfig.fsmAlreadyStandby){
if(!fsmState.pilotStandbyFlag){
//pilotStandbyFlag == false代表自动驾驶无法启动
if(!BadCaseConfig.alreadyShowOneReport){
//触发一键上报
ThreadUtils.runOnUiThread {
val activity = AppStateManager.currentActivity()
if (activity !is AppCompatActivity) {
return@runOnUiThread
}
if(reportTypeWindow == null){
reportTypeWindow = ReportTypeWindow(activity)
reportTypeWindow?.setClickListener(object: ReportTypeWindow.ClickListener{
override fun closeWindow() {
reportTypeWindow?.hideFloatWindow()
reportTypeWindow = null
}
})
}
reportTypeWindow?.showOneClickReportWindow(xPosition,yPosition)
BadCaseConfig.alreadyShowOneReport = true
}
reportTypeWindow?.showOneClickReportWindow(xPosition,yPosition)
BadCaseConfig.alreadyShowOneReport = true
}
}else{
BadCaseConfig.alreadyShowOneReport = false
}
}else{
BadCaseConfig.alreadyShowOneReport = false
}
}
@@ -614,6 +614,10 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
if(it.status == AutopilotStatistics.AUTOPILOT_START_STATUS.FAILED){
//触发一键上报
ThreadUtils.runOnUiThread{
val activity = AppStateManager.currentActivity()
if (activity !is AppCompatActivity) {
return@runOnUiThread
}
if(reportTypeWindow == null){
reportTypeWindow = ReportTypeWindow(activity)
reportTypeWindow?.setClickListener(object: ReportTypeWindow.ClickListener{
@@ -655,6 +659,10 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis
}else if(state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE ||
state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE){
if(shouldRecord){
val activity = AppStateManager.currentActivity()
if (activity !is AppCompatActivity) {
return
}
val geocodeSearch = GeocodeSearch(activity)
geocodeSearch.setOnGeocodeSearchListener(object: GeocodeSearch.OnGeocodeSearchListener {
override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult?, p1: Int) {

View File

@@ -130,7 +130,7 @@ fun Context.enqueuePop(content: View, width: Int, height: Int, key: String = "",
}
override fun show() {
pop.showAtLocation(activity.window.decorView, gravity, startX, if (isImmersiveMode) 0 else BarUtils.getStatusBarHeight() + startY)
pop.showAtLocation(activity.window.decorView, gravity, startX, startY)
}
override fun isOverride(): Boolean = isOverride
}

View File

@@ -507,9 +507,6 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY
if(((mInScreenX - mInViewX)-mWindowParams!!.x).absoluteValue>150 || ((mInScreenY - mInViewY)-mWindowParams!!.y).absoluteValue>150){
return true
}
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置

View File

@@ -505,9 +505,6 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY
if(((mInScreenX - mInViewX)-mWindowParams!!.x).absoluteValue>150 || ((mInScreenY - mInViewY)-mWindowParams!!.y).absoluteValue>150){
return true
}
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置

View File

@@ -62,6 +62,9 @@ object BadCaseConfig {
//本次问题是否已经触发一键上报
@JvmField
var alreadyShowOneReport: Boolean = false
//FSM是否已经变为可以启自驾
@JvmField
var fsmAlreadyStandby: Boolean = false
//租户ID
@JvmField
var tenantId: Long = 0

View File

@@ -240,9 +240,6 @@ class ExamControlWindow constructor(activity: Activity): View.OnTouchListener{
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY
if(((mInScreenX - mInViewX)-mWindowParams!!.x).absoluteValue>150 || ((mInScreenY - mInViewY)-mWindowParams!!.y).absoluteValue>150){
return true
}
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置

View File

@@ -24,6 +24,8 @@ object CrashLogAnalyticsManager {
private const val crashEyeVersion = "eyeVersion" //鹰眼版本
private const val crashAppFlavor = "appFlavor" //渠道信息
private const val crashBranchHash = "branchHash" //Git Hash
private const val crashKeyMessage = "keyMessage" //崩溃核心信息
private const val crashIsDriver = "isDriver" //是否是司机屏
/**
* 崩溃统计
@@ -37,7 +39,7 @@ object CrashLogAnalyticsManager {
* @param branchHash Git Hash
*/
private fun realCrashLogAnalytics(cosPath: String,type: String,plateNumber: String,carSn: String,mapVersion: String,eyeVersion: String,
appFlavor: String,branchHash: String){
appFlavor: String,branchHash: String,keyMessage: String,isDriver: Boolean){
val crashLogParams = HashMap<String,Any>()
crashLogParams[crashCosPath] = cosPath
crashLogParams[crashType] = type
@@ -47,14 +49,17 @@ object CrashLogAnalyticsManager {
crashLogParams[crashEyeVersion] = eyeVersion
crashLogParams[crashAppFlavor] = appFlavor
crashLogParams[crashBranchHash] = branchHash
crashLogParams[crashKeyMessage] = keyMessage
crashLogParams[crashIsDriver] = isDriver
MogoAnalyticUtils.track(crashLogRecord,crashLogParams)
}
/**
* 崩溃统计
* @param crashType 崩溃类型
* @param keyMessage 崩溃关键信息
*/
fun crashLogAnalytics(crashType: String){
fun crashLogAnalytics(crashType: String,keyMessage: String){
val crashCosPath = StringBuilder()
crashCosPath.append("CarPad/")
if(DebugConfig.isDebug()){
@@ -66,10 +71,10 @@ object CrashLogAnalyticsManager {
crashCosPath.append("/")
crashCosPath.append(millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()))
crashCosPath.append("/")
realCrashLogAnalytics(crashCosPath.toString(),crashType.replace("Crash type:","").trim(), AppConfigInfo.plateNumber,
realCrashLogAnalytics(crashCosPath.toString(),crashType, AppConfigInfo.plateNumber,
SharedPrefsMgr.getInstance().sn,
CallerAutoPilotStatusListenerManager.getDockerVersion() ?: "",
AppUtils.getAppVersionName(),AppConfigInfo.flavor,AppConfigInfo.workingBranchHash)
AppUtils.getAppVersionName(),AppConfigInfo.flavor,AppConfigInfo.workingBranchHash,keyMessage,AppConfigInfo.isDriver)
}
}

View File

@@ -14,7 +14,12 @@ import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.commons.AbsMogoApplication
import com.mogo.core.log.record.*
import com.mogo.core.log.record.config.*
import com.mogo.core.log.record.config.crash.ANRCrash
import com.mogo.core.log.record.config.crash.CrashConfig
import com.mogo.core.log.record.config.crash.CrashType
import com.mogo.core.log.record.config.crash.JavaCrash
import com.mogo.core.log.record.config.crash.NativeCrash
import com.mogo.core.log.record.config.crash.upload.ICrashFileUploader
import com.mogo.core.log.record.config.extra.IExtraFileToUpload
import com.mogo.core.log.record.config.extra.ToUploadFile
import com.mogo.core.log.record.config.state.IStateProvider
@@ -137,6 +142,7 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider,
builder.crashConfig(
CrashConfig.Builder()
.enabled(true)
.uploader(CrashLogUploader(context))
.crashDir(File(context.getExternalFilesDir(null), "crash"))
.expireDuration(TimeUnit.DAYS.toMillis(3))
.javaCrash(true)
@@ -156,6 +162,7 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider,
}
})
LogcatManager.init(builder)
LogcatManager.uploadForCrashIfNeed()
}
override fun target(): Class<RemoteLogPushContent> {
@@ -235,4 +242,33 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider,
override fun testAnrCrash() {
SystemClock.sleep(15000)
}
private class CrashLogUploader(private val mContext: Context): ICrashFileUploader {
override suspend fun upload(
type: CrashType,
crashTime: String,
file: File,
extra: Map<String, String>?
): Boolean {
try {
val keyMessage = when(type) {
JavaCrash -> extra?.get("java stacktrace") ?: extra?.get("backtrace") ?: "#"
NativeCrash -> extra?.get("backtrace") ?: "#"
ANRCrash -> extra?.get("backtrace") ?: "#"
}
val typeStr = when(type){
JavaCrash -> "JavaCrash"
NativeCrash -> "NativeCrash"
ANRCrash -> "ANRCrash"
}
CrashLogAnalyticsManager.crashLogAnalytics(typeStr,keyMessage)
return true
} catch (t: Throwable) {
return false
}
}
}
}

View File

@@ -94,7 +94,6 @@ object StatusManager {
is GpsStatus -> GpsImpl(ctx)
is TracingStatus -> TracingImpl(ctx)
is RTKStatus -> RTKImpl(ctx)
is FSMStatus -> FSMImpl(ctx)
is OverViewStatus -> OverViewImpl(ctx)
is SteerStatus -> SteerImpl(ctx)
is AcceleratorStatus -> AcceleratorImpl(ctx)
@@ -102,6 +101,7 @@ object StatusManager {
is DoubleFlashStatus -> DoubleFlashImpl(ctx)
is GearStatus -> GearImpl(ctx)
is SpeedStatus -> SpeedImpl(ctx)
is FSMStatus -> FSMImpl(ctx)
is RouteDownloadStatus -> RouteDownloadImpl(ctx)
}
}.also { flows += it }
@@ -214,6 +214,7 @@ object StatusManager {
is DoubleFlashStatus -> "双闪"
is GearStatus -> "档位"
is RouteDownloadStatus -> if (item.state == RouteStart) "轨迹下载中" else "轨迹下载失败"
is FSMStatus -> "FSM"
else -> "其它"
}
}
@@ -239,7 +240,6 @@ object StatusManager {
} else {
ret or shl
}
}
}
return ret

View File

@@ -141,7 +141,7 @@ enum class FSMStateCode {
/**
* FSM模块状态
*/
class FSMStatus(var state: FSMStateCode, var desc: String = ""): Status() {
class FSMStatus(var state: FSMStateCode, var desc: String = ""): Status(), IAutopilotPreLaunchStatus {
override fun equals(other: Any?): Boolean {
if (javaClass != other?.javaClass) return false

View File

@@ -9,6 +9,7 @@ import androidx.recyclerview.widget.*
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.rv.divider.*
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.status.entity.FSMStatus
import com.zhjt.mogo_core_function_devatools.status.entity.IAutopilotPreLaunchStatus
import com.zhjt.mogo_core_function_devatools.status.entity.Status
import com.zhjt.mogo_core_function_devatools.status.model.StatusModel
@@ -48,11 +49,11 @@ internal class StatusView(private val model: StatusModel, ctx: Context): Constra
.horizontalInnerSpace(10.PX)
.build()
)
val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second.filter { it !is IAutopilotPreLaunchStatus }) }?.also { adapter -> itx.adapter = adapter }
val adapter = model.status.value?.let { data -> StatusAdapter(context, data.second.filter { (it !is IAutopilotPreLaunchStatus) || (it is FSMStatus)}) }?.also { adapter -> itx.adapter = adapter }
adapter?.let { _ ->
model.status.observeForever(Observer<Pair<Status?, ArrayList<Status>>> { data ->
val old = adapter.data
val update = data.second.filter { it !is IAutopilotPreLaunchStatus }
val update = data.second.filter { (it !is IAutopilotPreLaunchStatus) || (it is FSMStatus) }
val result = DiffUtil.calculateDiff(StatusDiffCallback(old, update))
adapter.data = update
result.dispatchUpdatesTo(adapter)

View File

@@ -22,7 +22,6 @@ import android.view.animation.ScaleAnimation
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import android.widget.ToggleButton
import androidx.appcompat.widget.AppCompatEditText
import androidx.appcompat.widget.AppCompatTextView
import androidx.constraintlayout.widget.ConstraintLayout
@@ -62,7 +61,6 @@ import com.mogo.tts.base.SpeechUtils
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.workorder.adapter.OrderReasonAdapter
import kotlin.math.absoluteValue
/**
* 故障原因编辑窗口
@@ -192,12 +190,15 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
//故障类型选择没有变化
reasonList?.let { orderReasonAdapter.setData(it,2) }
}else{
//故障类型发生了变化
level2Id = reason.id
level2Name = reason.name
source = 2
//获取故障三级分类即故障原因
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,3,level2Id,type,0)
tvFaultReason.text = ""
level3Id = 0
level3Name = ""
}
}else{
//原因
@@ -347,6 +348,7 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
ToastUtils.showShort("请完整填写再上报")
return@setOnClickListener
}
reportNote = etNoteInput.text.toString()
//故障码列表赋值
BadCaseConfig.newFMInfoMsg?.fmInfoList?.forEach {
faultCodeList.add(it.faultId)
@@ -507,9 +509,6 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY
if(((mInScreenX - mInViewX)-mWindowParams!!.x).absoluteValue>150 || ((mInScreenY - mInViewY)-mWindowParams!!.y).absoluteValue>150){
return true
}
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置
@@ -533,6 +532,7 @@ class FaultReasonWindow constructor(activity: Activity) : View.OnTouchListener,
}
fun hideFloatWindow() {
etNoteInput.clearFocus()
CallerDevaToolsListenerManager.removeListener(TAG)
CallerOrderListenerManager.removeListener(TAG)
if (mFloatLayout.parent != null){

View File

@@ -21,6 +21,7 @@ import com.amap.api.services.geocoder.GeocodeResult
import com.amap.api.services.geocoder.GeocodeSearch
import com.amap.api.services.geocoder.RegeocodeQuery
import com.amap.api.services.geocoder.RegeocodeResult
import com.mogo.commons.env.ProjectUtils
import com.mogo.commons.storage.SharedPrefsMgr
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.deva.report.CategoryInfo
@@ -77,8 +78,6 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
private var level1Name: String = ""
private var level2Name: String = ""
private var level3Name: String = ""
private var lineName: String = "" //行驶路线
private var reportNote: String = "" //上报描述
private val reportType: Int = 1 //上报方式0小程序 1司机屏 2云端上报
private var level: Int = 1
@@ -143,7 +142,7 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
}
val padProblemList= ArrayList<PadProblemInfo>()
val padProblemInfo = PadProblemInfo(address,faultCodeList,millis2String(System.currentTimeMillis()),level1Id,
level2Id,level3Id,lineName,reportNote,reportType,
level2Id,level3Id,BadCaseConfig.lineName,"${level1Name}-${level2Name}-${level3Name}",reportType,
SharedPrefsMgr.getInstance().getString("och_account",""))
padProblemList.add(padProblemInfo)
val padAddProblemReq = PadAddProblemReq(padProblemList, AppConfigInfo.plateNumber)
@@ -160,8 +159,14 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
}
//故障类
tvReportTypeFault.setOnClickListener {
val faultReasonWindow = FaultReasonWindow(mActivity)
faultReasonWindow.showFloatWindow()
if(ProjectUtils.isSaas()){
val faultReasonWindow = FaultReasonWindow(mActivity)
faultReasonWindow.showFloatWindow()
}else{
//展示工单上报弹窗
val workOrderWindow = WorkOrderWindow(mActivity)
workOrderWindow.showFloatWindow()
}
clickListener?.closeWindow()
}
//主动录包
@@ -287,7 +292,7 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
/**
* 设置弹窗展示状态
*/
fun setWindowShowStatus(isShow: Boolean){
private fun setWindowShowStatus(isShow: Boolean){
isShowing = isShow
}
@@ -312,6 +317,7 @@ class ReportTypeWindow constructor(activity: Activity): IMoGoDevaToolsListener {
override fun problemPadAddError(msg: String) {
super.problemPadAddError(msg)
ToastUtils.showShort("故障原因上报失败$msg")
clickListener?.closeWindow()
}
override fun getCategoriesSuccess(list: List<CategoryInfo>) {

View File

@@ -109,6 +109,8 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
private var level2Name: String = ""
private var level3Name: String = ""
private var isShowing: Boolean = false //弹窗是否是展示状态
init {
initFloatWindow()
}
@@ -156,14 +158,19 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
//选择了接管类型
tvTakeOverType.performClick()
if(level2Id != 0 && level2Id == reason.id){
//故障类型选择没有变化
//接管类型选择没有变化
reasonList?.let { orderReasonAdapter.setData(it,2) }
}else{
//接管类型发生变化
level2Id = reason.id
level2Name = reason.name
source = 2
//获取故障三级分类即故障原因
//获取接管三级分类即接管原因
CallerDevaToolsManager.getCategories(BadCaseConfig.tenantId,3,level2Id,type,0)
//将接管原因置空
tvTakeOverReason.text = ""
level3Name = ""
level3Id = 0
}
}else{
//原因
@@ -299,10 +306,12 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
mTakeOverRecordInfo.level3Name = level3Name
CallerTakeOverManager.updateRecord(mActivity,mTakeOverRecordInfo)
clickListener?.onSaveReason(mTakeOverRecordInfo)
clickListener?.closeWindow()
hideFloatWindow()
}
//取消
tvTakeOverCancel.setOnClickListener {
clickListener?.closeWindow()
hideFloatWindow()
}
}
@@ -421,9 +430,6 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY
if(((mInScreenX - mInViewX)-mWindowParams!!.x).absoluteValue>150 || ((mInScreenY - mInViewY)-mWindowParams!!.y).absoluteValue>150){
return true
}
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置
@@ -451,21 +457,40 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene
tvTakeOverTime.text = mActivity.resources.getString(R.string.take_over_time) +
millis2String(mTakeOverRecordInfo.faultStartTime, TimeUtils.getHourMinSecondFormat())
}
setWindowShowStatus(true)
}
fun hideFloatWindow() {
etNoteInput.clearFocus()
if (mFloatLayout.parent != null){
mWindowManager!!.removeView(mFloatLayout)
}
setWindowShowStatus(false)
CallerDevaToolsListenerManager.removeListener(TAG)
}
/**
* 获取弹窗展示状态
*/
fun getWindowShowStatus(): Boolean{
return isShowing
}
/**
* 设置弹窗展示状态
*/
private fun setWindowShowStatus(isShow: Boolean){
isShowing = isShow
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
interface ClickListener {
fun onSaveReason(info: TakeOverRecordInfo)
fun closeWindow()
}
override fun getCategoriesSuccess(list: List<CategoryInfo>) {

View File

@@ -58,6 +58,7 @@ class TakeOverRecordView @JvmOverloads constructor(
private var clickListener: ClickListener? = null
private val selectedUploadRecord = ArrayList<TakeOverRecordInfo>()
private var recordList: MutableList<TakeOverRecordInfo> ?= null
private var takeOverReasonWindow: TakeOverReasonWindow ?= null
init {
LayoutInflater.from(context).inflate(R.layout.view_take_over_record, this, true)
@@ -80,13 +81,23 @@ class TakeOverRecordView @JvmOverloads constructor(
//展示接管原因窗口
val activity = context as? FragmentActivity
?: throw IllegalStateException("please ensure context is FragmentActivity.")
val takeOverReasonWindow = TakeOverReasonWindow(activity)
takeOverReasonWindow.setClickListener(object: TakeOverReasonWindow.ClickListener{
override fun onSaveReason(info: TakeOverRecordInfo) {
takeOverListAdapter?.notifyRecordItemChanged(info)
}
})
takeOverReasonWindow.showFloatWindow(takeOverRecordInfo)
if(takeOverReasonWindow == null){
takeOverReasonWindow = TakeOverReasonWindow(activity)
takeOverReasonWindow?.setClickListener(object: TakeOverReasonWindow.ClickListener{
override fun onSaveReason(info: TakeOverRecordInfo) {
takeOverListAdapter?.notifyRecordItemChanged(info)
}
override fun closeWindow() {
takeOverReasonWindow = null
}
})
}
if(takeOverReasonWindow?.getWindowShowStatus() == true){
ToastUtils.showShort("接管原因弹窗已存在,请先编辑现有接管原因")
}else{
takeOverReasonWindow?.showFloatWindow(takeOverRecordInfo)
}
}
override fun onSelectRecord(
@@ -143,14 +154,28 @@ class TakeOverRecordView @JvmOverloads constructor(
if(selectedUploadRecord.isEmpty()){
ToastUtils.showShort("请选择需要删除的接管记录")
}else{
val iterator = selectedUploadRecord.iterator()
while (iterator.hasNext()){
val removeRecord = iterator.next()
CallerTakeOverManager.deleteRecord(context,removeRecord)
scope.launch(Dispatchers.IO){
val iterator = selectedUploadRecord.iterator()
while (iterator.hasNext()){
val removeRecord = iterator.next()
CallerTakeOverManager.deleteRecord(context,removeRecord)
// takeOverListAdapter?.notifyRecordItemRemoved(removeRecord)
iterator.remove()
iterator.remove()
}
recordList = CallerTakeOverManager.getAllRecord(context)
ThreadUtils.runOnUiThread {
if(recordList.isNullOrEmpty()){
tvRecordNoData.visibility = View.VISIBLE
recordGroup.visibility = View.GONE
}else{
tvRecordNoData.visibility = View.GONE
recordGroup.visibility = View.VISIBLE
//更新列表
takeOverListAdapter?.setData(recordList!!)
}
}
}
refreshList()
}
}
//获取接管记录列表
@@ -198,6 +223,7 @@ class TakeOverRecordView @JvmOverloads constructor(
CallerTakeOverManager.updateRecord(context,it)
takeOverListAdapter?.notifyRecordItemChanged(it)
}
selectedUploadRecord.clear()
}
}

View File

@@ -239,7 +239,7 @@ class WorkOrderWindow constructor(activity: Activity) : View.OnTouchListener,
}
//取消
tvWorkOrderCancel.setOnClickListener {
clickListener?.closeWindow()
hideFloatWindow()
}
}
@@ -356,9 +356,6 @@ class WorkOrderWindow constructor(activity: Activity) : View.OnTouchListener,
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY
if(((mInScreenX - mInViewX)-mWindowParams!!.x).absoluteValue>150 || ((mInScreenY - mInViewY)-mWindowParams!!.y).absoluteValue>150){
return true
}
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置

View File

@@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dp_960"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/dp_72"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@drawable/bg_take_over_record">

View File

@@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.hmi.ui.setting
import android.content.Context
import android.graphics.Color
import android.text.method.ScrollingMovementMethod
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
@@ -35,6 +36,7 @@ class FSMStatusDetailView @JvmOverloads constructor(
private fun initView() {
tvTitle = findViewById(R.id.tvTitle)
tvContent = findViewById(R.id.tvContent)
tvContent?.movementMethod = ScrollingMovementMethod.getInstance()
}
fun setFsmMsg(title: String, titleColor: String , content: String) {

View File

@@ -6,7 +6,6 @@ import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
@@ -26,19 +25,16 @@ import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.commons.mvp.MvpActivity
import com.mogo.commons.utils.MogoAnalyticUtils
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.setting.IMoGoRequestActivityHandler
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiFloatViewManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.setting.CallerRequestActivityHandleManager
import com.mogo.eagle.core.function.call.startup.CallerStartUpManager.initStageTwo
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView
import com.mogo.eagle.core.function.main.modules.MogoModulesManager
import com.mogo.eagle.core.function.main.windowview.FloatingViewHandler
import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils
@@ -49,9 +45,6 @@ import com.mogo.eagle.core.utilcode.mogo.permissions.PermissionsDialogUtils
import com.mogo.eagle.core.utilcode.util.NetworkUtils
import com.mogo.eagle.core.utilcode.util.ProcessUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.map.listener.IMogoMapListener
import com.mogo.map.listener.MogoMapListenerHandler.Companion.mogoMapListenerHandler
import com.mogo.map.uicontroller.EnumMapUI
import com.zhjt.mogo.adas.data.AdasConstants
import com.zhjt.service.chain.ChainLog
import kotlinx.android.synthetic.main.module_main_activity_main.module_main_id_cover_up
@@ -73,7 +66,8 @@ open class MainActivity : MvpActivity<MainView?, MainPresenter?>(), MainView,
private var isFirst = false
private var mConnAdapter: ConnInfoAdapter? = null
private val dataList: List<AutopilotStatusInfo> = ArrayList()
// private var mLastStatus = AdasConstants.IpcConnectionStatus.CONNECTED
// private var mLastStatus = AdasConstants.IpcConnectionStatus.CONNECTED
private var mLastStatus = AdasConstants.IpcConnectionStatus.DISCONNECTED
private var isFloatingLayerHidden = false
@@ -326,6 +320,10 @@ open class MainActivity : MvpActivity<MainView?, MainPresenter?>(), MainView,
override fun onDestroy() {
super.onDestroy()
val properties = java.util.HashMap<String, Any>()
properties["app_destroy_time"] = System.currentTimeMillis()
MogoAnalyticUtils.track("app_lifecycle_destroy", properties)
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerRequestActivityHandleManager.removeListener(TAG)
//mogoMapListenerHandler.unregisterHostMapListener(TAG)

View File

@@ -20,6 +20,8 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import java.util.HashMap;
/**
* 默认初始化一些基础服务配置
*/
@@ -45,6 +47,15 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
initModules();
}
@Override
public void onTerminate() {
super.onTerminate();
HashMap<String, Object> properties = new HashMap<>();
properties.put("app_destroy_time", System.currentTimeMillis());
MogoAnalyticUtils.INSTANCE.track("app_lifecycle_destroy", properties);
}
/**
* 初始化异常采集配置
*/
@@ -56,6 +67,11 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
protected void initLogConfig() {
// 初始化埋点
MogoAnalyticUtils.INSTANCE.init(this, DebugConfig.isDebug());
HashMap<String, Object> properties = new HashMap<>();
properties.put("app_start_time", System.currentTimeMillis());
MogoAnalyticUtils.INSTANCE.track("app_lifecycle_start", properties);
// 初始化DevaTools,开始链路记录
CallerDevaToolsManager.INSTANCE.init();
}

View File

@@ -33,6 +33,8 @@
android:ellipsize="end"
android:gravity="left|center_vertical"
android:text=""
android:maxLines="5"
android:scrollbars="vertical"
android:textColor="#D5D5D5"
android:textSize="@dimen/dp_28"
app:layout_constraintLeft_toLeftOf="parent"

View File

@@ -73,7 +73,7 @@ public class RouteOverlayDrawer {
List<Integer> alphas = MapTools.INSTANCE.getColorAlpha(temps);
if (alphas != null && !alphas.isEmpty()) {
for (int i : alphas) {
greenWaveColors.add(Color.argb(i, 109,254,208));
greenWaveColors.add(Color.argb(i, 48, 163, 255));
}
}
}
@@ -151,7 +151,7 @@ public class RouteOverlayDrawer {
if (alphas != null && !alphas.isEmpty()) {
colors = new CopyOnWriteArrayList<>();
for (int i : alphas) {
colors.add(Color.argb(i, 48,203,251));
colors.add(Color.argb(i, 48,163,255));
}
}
}