Merge branch 'dev_robotaxi-d_230809_6.0.0' into 6.0.0merge2master

# Conflicts:
#	OCH/sweeper/sweeper-cloud/src/main/java/com/mogo/och/sweepercloud/model/SweeperTaskModel.java
#	libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java
#	libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java
This commit is contained in:
yangyakun
2023-09-11 17:43:17 +08:00
3672 changed files with 38961 additions and 14144 deletions

View File

@@ -18,6 +18,7 @@ import com.mogo.eagle.core.data.deva.scene.SceneTAG
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider
import com.mogo.eagle.core.function.api.devatools.apm.*
import com.mogo.eagle.core.function.api.devatools.block.*
import com.mogo.eagle.core.function.api.devatools.strict.*
import com.mogo.eagle.core.function.api.devatools.download.*
import com.mogo.eagle.core.function.api.devatools.logcat.*
@@ -40,10 +41,10 @@ import com.mogo.weak.network.SdtManager
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.mogo_core_function_devatools.binding.*
import com.zhjt.mogo_core_function_devatools.block.*
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
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.koom.KoomInitTask
import com.zhjt.mogo_core_function_devatools.logcat.*
import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager
import com.zhjt.mogo_core_function_devatools.lookaround.*
@@ -83,6 +84,8 @@ class DevaToolsProvider : IDevaToolsProvider {
private val logRecordProvider by lazy { MoGoLogRecordProviderImpl() }
private val block by lazy { MoGoBlockProviderImpl() }
@Volatile
private var mDockerVersion: String? = null
@@ -94,7 +97,6 @@ class DevaToolsProvider : IDevaToolsProvider {
//链路相关
traceManager.init(mContext!!)
if (DebugConfig.isDebug()) {
KoomInitTask.init(AbsMogoApplication.getApp())
initMatrix()
}
ttsManager.initTts(mContext!!) //todo 扶风 优化
@@ -122,6 +124,11 @@ class DevaToolsProvider : IDevaToolsProvider {
logRecordProvider.init(it)
logRecordProvider.start()
}
mContext?.also {
block.init(it)
block.start()
}
}
override fun checkMonitorDb() {
@@ -285,6 +292,10 @@ class DevaToolsProvider : IDevaToolsProvider {
iPCReportManager.showReportListWindow(context, isShow)
}
override fun getReportWindowStatus(): Boolean {
return iPCReportManager.getReportWindowStatus()
}
override fun downLoadPackage(type: DownloadType, downloadKey: String, downloadUrl: String) {
upgradeManager.downLoadPackage(mContext!!,type, downloadKey, downloadUrl)
}
@@ -377,4 +388,6 @@ class DevaToolsProvider : IDevaToolsProvider {
override fun mofang(): IMoGoMoFangProvider = mofangProvider
override fun logRecord(): IMoGoLogRecordProvider = logRecordProvider
override fun block(): IMoGoBlockProvider? = null
}

View File

@@ -6,7 +6,6 @@ import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Handler
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
@@ -19,6 +18,8 @@ import com.mogo.eagle.core.data.deva.badcase.SubBagEntity
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.zhidao.loglib.download.DownloadManager
@@ -116,7 +117,7 @@ class BadCaseManagerView @JvmOverloads constructor(
if(bagManagerList.size>0){
bagManagerEntity.reqType = 3
bagManagerEntity.keyReq = bagManagerList[0].key
Log.i("sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq)
CallerLogger.i(M_DEVA+"sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq)
CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity)
bagUploadDialog = BagUploadDialog(context)
@@ -237,24 +238,24 @@ class BadCaseManagerView @JvmOverloads constructor(
override fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager) {
super.onBagManagerResult(bagManager)
UiThreadHandler.post {
Log.i(TAG,"onBagManagerResult Start")
Log.i(TAG,"keyReq="+bagManager.keyReq)
Log.i(TAG,"reqType="+bagManager.reqType)
Log.i(TAG,"uploadCosResp stat="+bagManager.uploadCosResp.stat)
Log.i(TAG,"descReq description="+bagManager.descReq.description
CallerLogger.i(M_DEVA + TAG,"onBagManagerResult Start")
CallerLogger.i(M_DEVA + TAG,"keyReq="+bagManager.keyReq)
CallerLogger.i(M_DEVA + TAG,"reqType="+bagManager.reqType)
CallerLogger.i(M_DEVA + TAG,"uploadCosResp stat="+bagManager.uploadCosResp.stat)
CallerLogger.i(M_DEVA + TAG,"descReq description="+bagManager.descReq.description
+" audioUrl="+bagManager.descReq.audioUrl
+" reportBI="+bagManager.descReq.reportBI
+" hasAudio="+bagManager.descReq.hasAudio)
for(logBag in bagManager.bagsInfoRespList){
Log.i(TAG,"bagPath="+logBag.bagPath)
Log.i(TAG,"timestamp="+logBag.timestamp)
Log.i(TAG,"description="+logBag.description)
Log.i(TAG,"key="+logBag.key)
Log.i(TAG,"mergeStat="+logBag.mergeStat)
Log.i(TAG,"totalSize="+logBag.totalSize)
Log.i(TAG,"uploadStat="+logBag.uploadStat)
CallerLogger.i(M_DEVA + TAG,"bagPath="+logBag.bagPath)
CallerLogger.i(M_DEVA + TAG,"timestamp="+logBag.timestamp)
CallerLogger.i(M_DEVA + TAG,"description="+logBag.description)
CallerLogger.i(M_DEVA + TAG,"key="+logBag.key)
CallerLogger.i(M_DEVA + TAG,"mergeStat="+logBag.mergeStat)
CallerLogger.i(M_DEVA + TAG,"totalSize="+logBag.totalSize)
CallerLogger.i(M_DEVA + TAG,"uploadStat="+logBag.uploadStat)
}
Log.i(TAG,"onBagManagerResult End")
CallerLogger.i(M_DEVA + TAG,"onBagManagerResult End")
//获取空间使用信息
if(bagManager.reqType == 1){
@@ -367,7 +368,7 @@ class BadCaseManagerView @JvmOverloads constructor(
//执行下一个上传Bag命令
bagManagerEntity.reqType = 3
bagManagerEntity.keyReq = bagManagerList[0].key
Log.i("sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq)
CallerLogger.i("sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq)
CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity)
}
}

View File

@@ -34,6 +34,7 @@ import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.zhidao.loglib.call.LogInfoManagerFactory
import com.zhidao.loglib.upload.OnUploadListener
import com.zhidao.loglib.upload.UploadManager
import com.zhidao.loglib.util.FileUtil
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
@@ -249,14 +250,18 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList
val singlePath = "/mnt/sdcard/mogo/DataCollection/${audioFileName}.wav"
val file = File(singlePath)
if(file.exists()){
LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext,"Audio",singlePath,
LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext,
TAG, MoGoAiCloudClientConfig.getInstance().sn,singlePath,
object : OnUploadListener {
override fun onUploadSuccess(filePath: String, downloadUrl: String) {
override fun onUploadSuccess(key: String, filePath: String, downloadUrl: String) {
CallerLogger.d("$M_DEVA$TAG", "语音文件上传成功downloadUrl=$downloadUrl")
//将语音文件上传Cos监听移除
removeUploadListener(singlePath)
//上传到服务器
upload(downloadUrl)
if(key == TAG){
FileUtil.deleteFile(File(filePath))
}
}
override fun onUploadFail(filePath: String) {

View File

@@ -40,6 +40,7 @@ import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import mogo.telematics.pad.MessagePad
import com.zhidao.loglib.upload.UploadManager
import com.zhidao.loglib.util.FileUtil
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager
import me.jessyan.autosize.utils.AutoSizeUtils
import org.greenrobot.eventbus.EventBus
@@ -211,14 +212,18 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene
val singlePath = "/mnt/sdcard/mogo/DataCollection/${audioFileName}.wav"
val file = File(singlePath)
if(file.exists()){
LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext,"Audio",singlePath,
LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext,
TAG, MoGoAiCloudClientConfig.getInstance().sn,singlePath,
object : OnUploadListener {
override fun onUploadSuccess(filePath: String, downloadUrl: String) {
override fun onUploadSuccess(key: String, filePath: String, downloadUrl: String) {
CallerLogger.d("$M_DEVA$TAG", "语音文件上传成功downloadUrl=$downloadUrl")
//将语音文件上传Cos监听移除
removeUploadListener(singlePath)
//上传到服务器
upload(downloadUrl)
if(key == TAG){
FileUtil.deleteFile(File(filePath))
}
}
override fun onUploadFail(filePath: String) {

View File

@@ -1,5 +1,7 @@
package com.zhjt.mogo_core_function_devatools.badcase.record;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_DEVA;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Environment;
@@ -164,8 +166,7 @@ public class RecordHelper {
mp3EncodeThread = new Mp3EncodeThread(resultFile, bufferSize, currentConfig);
mp3EncodeThread.start();
} catch (Exception e) {
// Log.e(e, TAG, e.getMessage());
CallerLogger.INSTANCE.d("$M_DEVA$TAG", e.getMessage());
CallerLogger.d(M_DEVA+TAG, e.getMessage());
}
}
@@ -176,14 +177,14 @@ public class RecordHelper {
AudioRecordThread() {
bufferSize = AudioRecord.getMinBufferSize(currentConfig.getSampleRate(),
currentConfig.getChannelConfig(), currentConfig.getEncodingConfig()) * RECORD_AUDIO_BUFFER_TIMES;
CallerLogger.INSTANCE.d("$M_DEVA$TAG", "record buffer size = %s", bufferSize);
CallerLogger.d("$M_DEVA$TAG", "record buffer size = %s", bufferSize);
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, currentConfig.getSampleRate(),
currentConfig.getChannelConfig(), currentConfig.getEncodingConfig(), bufferSize);
if (currentConfig.getFormat() == RecordConfig.RecordFormat.MP3) {
if (mp3EncodeThread == null) {
initMp3EncoderThread(bufferSize);
} else {
CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread != null, 请检查代码");
CallerLogger.e("$M_DEVA$TAG", "mp3EncodeThread != null, 请检查代码");
}
}
}
@@ -205,7 +206,7 @@ public class RecordHelper {
private void startPcmRecorder() {
state = RecordState.RECORDING;
notifyState();
CallerLogger.INSTANCE.d("$M_DEVA$TAG", "开始录制 Pcm");
CallerLogger.d("$M_DEVA$TAG", "开始录制 Pcm");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(tmpFile);
@@ -223,7 +224,7 @@ public class RecordHelper {
if (state == RecordState.STOP) {
makeFile();
} else {
CallerLogger.INSTANCE.i("$M_DEVA$TAG", "暂停!");
CallerLogger.i("$M_DEVA$TAG", "暂停!");
}
} catch (Exception e) {
notifyError("录音失败");
@@ -239,7 +240,7 @@ public class RecordHelper {
if (state != RecordState.PAUSE) {
state = RecordState.IDLE;
notifyState();
CallerLogger.INSTANCE.d("$M_DEVA$TAG", "录音结束");
CallerLogger.d("$M_DEVA$TAG", "录音结束");
}
}
@@ -267,7 +268,7 @@ public class RecordHelper {
notifyState();
stopMp3Encoded();
} else {
CallerLogger.INSTANCE.d("$M_DEVA$TAG", "暂停");
CallerLogger.d("$M_DEVA$TAG", "暂停");
}
}
}
@@ -282,7 +283,7 @@ public class RecordHelper {
}
});
} else {
CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread is null, 代码业务流程有误,请检查!! ");
CallerLogger.e("$M_DEVA$TAG", "mp3EncodeThread is null, 代码业务流程有误,请检查!! ");
}
}
@@ -301,7 +302,7 @@ public class RecordHelper {
break;
}
notifyFinish();
CallerLogger.INSTANCE.i("$M_DEVA$TAG", "录音完成! path: %s 大小:%s", resultFile.getAbsoluteFile(), resultFile.length());
CallerLogger.i("$M_DEVA$TAG", "录音完成! path: %s 大小:%s", resultFile.getAbsoluteFile(), resultFile.length());
}
/**
@@ -353,7 +354,7 @@ public class RecordHelper {
inputStream.close();
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
CallerLogger.e(M_DEVA + TAG, e.getMessage());
return false;
} finally {
try {
@@ -376,7 +377,7 @@ public class RecordHelper {
private String getFilePath(String fileName) {
if (!FileUtils.createOrExistsDir(ROOT_PATH)) {
CallerLogger.INSTANCE.w("$M_DEVA$TAG", "文件夹创建失败:%s", ROOT_PATH);
CallerLogger.w("$M_DEVA$TAG", "文件夹创建失败:%s", ROOT_PATH);
return null;
}
@@ -387,7 +388,7 @@ public class RecordHelper {
private String getTempFilePath() {
if (!FileUtils.createOrExistsDir(TEMP_PATH)) {
CallerLogger.INSTANCE.e("$M_DEVA$TAG", "文件夹创建失败:%s", TEMP_PATH);
CallerLogger.e("$M_DEVA$TAG", "文件夹创建失败:%s", TEMP_PATH);
}
String fileName = String.format(Locale.getDefault(), "tmp_%s", FileUtils.getNowString(new SimpleDateFormat("yyyyMMddHHmmssSSS", Locale.SIMPLIFIED_CHINESE)));
return String.format(Locale.getDefault(), "%s%s.pcm", TEMP_PATH, fileName);

View File

@@ -1,9 +1,11 @@
package com.zhjt.mogo_core_function_devatools.badcase.record.mp3;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_DEVA;
import android.media.MediaExtractor;
import android.media.MediaFormat;
import android.util.Log;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.FileUtils;
import com.zhjt.mogo_core_function_devatools.badcase.record.RecordConfig;
@@ -34,7 +36,7 @@ public class Mp3Utils {
long duration = mf.getLong(MediaFormat.KEY_DURATION) / 1000L;
return duration;
} catch (IOException e) {
Log.e(TAG, e.getMessage());
CallerLogger.e(M_DEVA +TAG, e.getMessage());
} finally {
if (mex != null) {
mex.release();

View File

@@ -3,7 +3,6 @@ package com.zhjt.mogo_core_function_devatools.binding
import android.annotation.*
import android.content.Context
import android.text.TextUtils
import android.util.*
import com.elegant.utils.UiThreadHandler
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.commons.constants.SharedPrefsConstants
@@ -18,7 +17,7 @@ import com.mogo.eagle.core.function.call.obu.CallerObuApiManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isDriver
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.zhjt.mogo_core_function_devatools.upgrade.IPCUpgradeManager.Companion.ipcUpgradeManager
import com.zhjt.mogo_core_function_devatools.upgrade.ObuUpgradeAppNetWorkManager
@@ -61,9 +60,9 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener {
}
override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) {
CallerLogger.d("${SceneConstant.M_DEVA}${TAG}", "onAutopilotCarConfig ----------> ")
CallerLogger.d("${M_DEVA}${TAG}", "onAutopilotCarConfig ----------> ")
if (!TextUtils.isEmpty(carConfigResp.macAddress)) {
CallerLogger.d("${SceneConstant.M_DEVA}${TAG}",
CallerLogger.d("${M_DEVA}${TAG}",
"onAutopilotCarConfig carConfigResp.macAddress = ${carConfigResp.macAddress} ")
getBindingCarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
}
@@ -89,7 +88,7 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener {
queryObuUpgrade(obuVersion)
}
}
CallerLogger.d("${SceneConstant.M_DEVA}${TAG}",
CallerLogger.d("${M_DEVA}${TAG}",
"getBindingcarInfo macAddress = $macAddress--widevineIDWithMd5 = $widevineIDWithMd5 ---screenType = $screenType"
)
SharedPrefsMgr.getInstance(mContext!!).putString(SharedPrefsConstants.APP_MAC, macAddress)
@@ -179,10 +178,10 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener {
* 查询app是否需要升级
*/
fun queryAppUpgrade() {
Log.d("UPGRADE", "---- 1 ----")
CallerLogger.d(M_DEVA+"UPGRADE", "---- 1 ----")
var macAddress = mAddress
if (TextUtils.isEmpty(macAddress)) {
Log.d("UPGRADE", "---- 2 ----")
CallerLogger.d(M_DEVA+"UPGRADE", "---- 2 ----")
macAddress = SharedPrefsMgr.getInstance(mContext!!)
.getString(SharedPrefsConstants.APP_MAC)
}
@@ -190,7 +189,7 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener {
if (!TextUtils.equals(macAddress, mAddress)) {
mAddress = macAddress
}
Log.d("UPGRADE", "---- 3 ----[mac: $macAddress]")
CallerLogger.d(M_DEVA+"UPGRADE", "---- 3 ----[mac: $macAddress]")
UpgradeAppNetWorkManager.instance
?.getAppUpgradeInfo(mContext, macAddress, role.toString() + "")
}
@@ -202,9 +201,9 @@ object BindingCarManager : IMoGoAutopilotCarConfigListener {
*/
fun queryObuUpgrade(obuVersionName: String) {
mObuVersion = obuVersionName
CallerLogger.d("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", "screenType = $screenType ----role = $role")
CallerLogger.d("${M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}", "screenType = $screenType ----role = $role")
if (screenType == 1) {
CallerLogger.d("${SceneConstant.M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}","queryObuUpgrade isConnected = ${CallerObuApiManager.isConnected()} --- mAddress = $mAddress")
CallerLogger.d("${M_DEVA}${MogoObuConst.TAG_UPGRADE_OBU}","queryObuUpgrade isConnected = ${CallerObuApiManager.isConnected()} --- mAddress = $mAddress")
ObuUpgradeAppNetWorkManager.instance?.getObuUpgradeInfo(if(!mAddress.isNullOrEmpty()) mAddress else SharedPrefsMgr.getInstance(mContext!!).getString(SharedPrefsConstants.APP_MAC), obuVersionName)
}
}

View File

@@ -0,0 +1,23 @@
package com.zhjt.mogo_core_function_devatools.block
import com.mogo.eagle.core.data.deva.chain.*
import com.zhjt.service.chain.*
internal class MainBlockLinkedLog {
fun record(extra: Map<String, List<String>>) {
try {
recordInternal(extra)
} catch (t: Throwable) {
t.printStackTrace()
}
}
@ChainLog(
linkChainLog = ChainConstant.CHAIN_TYPE_HMI,
linkCode = ChainConstant.CHAIN_SOURCE_HMI,
nodeAliasCode = ChainConstant.CHAIN_CODE_MAIN_BLOCK,
paramIndexes = [0]
)
private fun recordInternal(extra: Map<String, List<String>>) {}
}

View File

@@ -0,0 +1,87 @@
package com.zhjt.mogo_core_function_devatools.block
import android.content.*
import android.util.*
import android.view.*
import androidx.metrics.performance.*
import com.mogo.eagle.core.block.runtime.*
import com.mogo.eagle.core.block.runtime.config.*
import com.mogo.eagle.core.block.runtime.config.recorder.*
import com.mogo.eagle.core.block.runtime.config.recorder.IMessageRecorder.OnDumpListener
import com.mogo.eagle.core.block.runtime.listener.*
import com.mogo.eagle.core.block.runtime.report.*
import com.mogo.eagle.core.function.api.devatools.block.*
import java.util.concurrent.TimeUnit.SECONDS
internal class MoGoBlockProviderImpl: IMoGoBlockProvider, IBlockListener {
@Volatile
private var hasInit = false
private val linkedLog by lazy { MainBlockLinkedLog() }
override fun init(ctx: Context) {
BlockDetector.init(BlockMetrics.Builder()
.context(ctx)
.multiplier(2.0f)
.isDebug(false)
.period(5, SECONDS)
.junkRateThreshold(0.8f)
.recorder(null, 1000, 512)
.build())
hasInit = true
}
override fun hasInit(): Boolean {
return hasInit
}
override fun start() {
BlockDetector.start()
BlockDetector.addListener(this)
}
override fun onBlockReport(info: ReportInfo) {
Log.d("BLOCK", "--- onBlockReport ---: ${info.frames.size}")
val map = mutableMapOf<String, List<String>>()
map["frames"] = info.frames.map { "$it" }
BlockDetector.recorder().dump(object: OnDumpListener {
override fun OnDumped(data: Map<Int, List<String>>) {
map["history"] = data[0] ?: emptyList()
map["pending"] = data[1] ?: emptyList()
linkedLog.record(map)
}
})
}
override fun monitor(window: Window) {
BlockDetector.monitor(window)
}
override fun pause(window: Window) {
BlockDetector.pause(window)
}
override fun addState(window: Window, key: String, status: String) {
val holder = PerformanceMetricsState.getHolderForHierarchy(window.decorView)
holder.state?.putState(key, status)
}
override fun resume(window: Window) {
BlockDetector.resume(window)
}
override fun pop(window: Window) {
BlockDetector.pop(window)
}
override fun stop() {
BlockDetector.removeListener(this)
BlockDetector.stop()
}
override fun recorder(): IMessageRecorder {
return BlockDetector.recorder()
}
}

View File

@@ -1,24 +0,0 @@
package com.zhjt.mogo_core_function_devatools.koom
import android.app.Application
import android.os.Build
import com.kwai.koom.base.CommonConfig
import com.kwai.koom.base.InitTask
import com.kwai.koom.base.MonitorManager
object KoomInitTask : InitTask {
override fun init(application: Application) {
val config = CommonConfig.Builder()
.setApplication(application) // Set application
.setDebugMode(false)
.setVersionNameInvoker { "1.0.0" } // Set version name, java leak feature use it
.setSdkVersionMatch(
Build.VERSION.SDK_INT <= 31 && Build.VERSION.SDK_INT
>= Build.VERSION_CODES.LOLLIPOP
) // Set if current sdk version is supported
.build()
MonitorManager.initCommonConfig(config)
.apply { onApplicationCreate() }
}
}

View File

@@ -1,25 +1,44 @@
package com.zhjt.mogo_core_function_devatools.logcat
import android.content.*
import android.os.Build
import android.os.Process
import android.util.*
import android.os.SystemClock
import android.util.Log
import com.mogo.aicloud.services.socket.IMogoOnMessageListener
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.*
import com.mogo.core.log.record.config.state.IStateProvider
import com.mogo.core.log.record.model.UploadError
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.function.api.devatools.logcat.*
import com.mogo.eagle.core.utilcode.util.*
import com.zhidao.loglib.bean.RemoteLogPushContent
import com.zhjt.mogo_core_function_devatools.logcat.config.LogRecordConfig
import com.zhjt.mogo_core_function_devatools.logcat.uploader.*
import kotlinx.coroutines.*
import java.io.*
import java.util.concurrent.TimeUnit.MINUTES
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicLong
internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider {
internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider,
IMogoOnMessageListener<RemoteLogPushContent> {
companion object {
private const val TAG = "MoGoLogRecordProviderImpl"
}
private val flag by lazy { AtomicBoolean(false) }
private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) }
private val uploadThreshold by lazy { MINUTES.toMillis(1) } //全量日志的上传的安全时间,在此时间内,上传任务只会触发一次
private val lastUploadTime by lazy { AtomicLong(0) }
override fun init(context: Context) {
val zipDir = File(context.getExternalFilesDir(null), "logcat/zip")
LogcatManager.init(LogcatConfig.Builder().context(context)
@@ -28,32 +47,121 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider {
.recordDir(File(context.getExternalFilesDir(null), "logcat"))
.pid(Process.myPid())
.generateZipDir(zipDir.absolutePath)
.stateProvider(object : IStateProvider {
override fun provide(divider:String?): Map<String, Any?> {
return mutableMapOf<String, Any?>().also { itx ->
itx["build_sdk_version"] = Build.VERSION.SDK_INT
itx["build_device"] = Build.DEVICE
itx["build_host"] = Build.HOST
itx["build_id"] = Build.ID
itx["build_host"] = Build.HOST
itx["build_brand"] = Build.BRAND
itx["build_model"] = Build.MODEL
itx["build_product"] = Build.PRODUCT
itx["build_board"] = Build.BOARD
itx["build_bootloader"] = Build.BOOTLOADER
itx["${divider}-1"] = divider
itx["应用名称"] = AppConfigInfo.appName
itx["应用版本名称"] = AppConfigInfo.appVersionName
itx["应用版本号"] = AppConfigInfo.appVersionCode
itx["渠道"] = AppConfigInfo.flavor
itx["GIT分支"] = AppConfigInfo.workingBranchName
itx["GIT分支HASH"] = AppConfigInfo.workingBranchHash
itx["${divider}-2"] = divider
itx["MAP-SDK版本"] = AppConfigInfo.mapSdkVersion
itx["MAP-OPT-SDK版本"] = AppConfigInfo.mapSdkOptVersion
itx["ADAS-SDK版本"] = AppConfigInfo.adasSdkVersion
itx["${divider}-3"] = divider
itx["OBU-SDk版本"] = AppConfigInfo.obuSdkVersion
itx["OBU-INFO"] = AppConfigInfo.obuInfo
itx["${divider}-4"] = divider
itx["数字版权ID"] = AppConfigInfo.widevineIDMd5
itx["设备唯一标识"] = AppConfigInfo.uniqueDeviceId
itx["中台分配的SN"] = AppConfigInfo.mogoSN
itx["中台分配的令牌"] = AppConfigInfo.mogoToken
itx["当前网络连接模式"] = AppConfigInfo.netMode
itx["网络是否正常"] = AppConfigInfo.isConnectNet
itx["Socket是否正常"] = AppConfigInfo.isConnectSocket
itx["ADAS连接是否正常"] = AppConfigInfo.isConnectAutopilot
itx["OBU连接是否正常"] = AppConfigInfo.isConnectObu
itx["连接工控机状态描述"] = AppConfigInfo.connectStatusDescribe
itx["${divider}-5"] = divider
itx["是否司机端"] = AppConfigInfo.isDriver
itx["是否是乘客端"] = !AppConfigInfo.isDriver
if (!AppConfigInfo.isDriver) {
itx["当前车机是乘客屏对应的司机屏SN"] = AppConfigInfo.serverSn
}
itx["司乘屏连接状态"] = AppConfigInfo.isConnectedNetty
itx["${divider}-6"] = divider
itx["车牌号"] = AppConfigInfo.plateNumber
itx["mac"] = AppConfigInfo.iPCMacAddress
itx["docker版本"] = AppConfigInfo.dockerVersion
itx["协议版本号"] = AppConfigInfo.protocolVersionNumber
itx["${divider}-7"] = divider
itx["角色"] = AppConfigInfo.role
}
}
})
.crashConfig(CrashConfig.Builder()
.enabled(true)
.crashDir(File(context.getExternalFilesDir(null), "logcat/crash"))
.javaCrash(true)
.anr(true)
.nativeCrash(true)
.build())
.uploader(LogRecordUploader()))
scope.launch {
try {
if (zipDir.exists()) {
zipDir.listFiles()?.forEach {
it.delete()
}
}
zipDir.takeIf { it.exists() }?.deleteRecursively()
} catch (t: Throwable) {
t.printStackTrace()
}
}
}
override fun target(): Class<RemoteLogPushContent> {
return RemoteLogPushContent::class.java
}
override fun onMsgReceived(obj: RemoteLogPushContent?) {
Log.d(TAG, "--- onMsgReceived --: $obj")
if (obj == null) return
val endTime = System.currentTimeMillis()
val startTime = when(obj.type) {
LogRecordConfig.ALL_LOG_15_MINUTES -> endTime - MINUTES.toMillis(15)
LogRecordConfig.ALL_LOG_30_MINUTES -> endTime - MINUTES.toMillis(30)
LogRecordConfig.ALL_LOG_45_MINUTES -> endTime - MINUTES.toMillis(45)
LogRecordConfig.ALL_LOG_60_MINUTES -> endTime - MINUTES.toMillis(60)
LogRecordConfig.ALL_LOG_120_MINUTES -> endTime - MINUTES.toMillis(120)
LogRecordConfig.ALL_LOG_SAME_DAY -> endTime - (endTime % 86400000)
LogRecordConfig.ALL_LOG -> 0
else -> endTime
}
Log.d(TAG, "--- onMsgReceived -- 1: $startTime, $endTime")
if (startTime < endTime) {
val now = System.currentTimeMillis()
val last = lastUploadTime.get()
if (last <= 0) {
lastUploadTime.set(System.currentTimeMillis())
}
if (last > 0 && (now - last) <= uploadThreshold) {
return
}
lastUploadTime.set(System.currentTimeMillis())
scope.launch {
LogcatManager.upload(startTime, endTime)
}
}
}
override fun start() {
if (flag.get()) {
return
}
flag.set(true)
MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext)
.registerOnMessageListener(LogRecordConfig.LOG_RECORD_TYPE, this)
LogcatManager.start()
}
@@ -61,18 +169,32 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider {
if (!flag.get()) {
return
}
MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext)
.unregisterOnMessageListener(LogRecordConfig.LOG_RECORD_TYPE, this)
flag.set(false)
LogcatManager.stop()
}
override fun upload(startTime: Long, endTime: Long) {
scope.launch {
val result = LogcatManager.upload(startTime, endTime)
Log.d(TAG, "上传日志:[startTime:$startTime, endTime: $endTime], 结果: $result")
}
}
override fun export(): File? {
return LogcatManager.export()
}
override fun upload(): Unit = runBlocking {
val state = LogcatManager.upload(0, System.currentTimeMillis())
if (state is UploadError) {
throw AssertionError(state.toString())
}
}
override fun testJavaCrash(runOnNewThread: Boolean) {
LogcatManager.testJavaCrash(runOnNewThread)
}
override fun testNativeCrash(runOnNewThread: Boolean) {
LogcatManager.testNativeCrash(runOnNewThread)
}
override fun testAnrCrash() {
SystemClock.sleep(15000)
}
}

View File

@@ -0,0 +1,48 @@
package com.zhjt.mogo_core_function_devatools.logcat.config
internal class LogRecordConfig {
companion object{
/**
* 长链下行数据的消息类型
*/
const val LOG_RECORD_TYPE = 500002
/**
* 全量日志抓取: 上传从收到抓取指令往前15分钟的日志
*/
const val ALL_LOG_15_MINUTES = 1
/**
* 全量日志抓取: 上传从收到抓取指令往前30分钟的日志
*/
const val ALL_LOG_30_MINUTES = 2
/**
* 全量日志抓取: 上传从收到抓取指令往前45分钟的日志
*/
const val ALL_LOG_45_MINUTES = 3
/**
* 全量日志抓取: 上传从收到抓取指令往前60分钟的日志
*/
const val ALL_LOG_60_MINUTES = 4
/**
* 全量日志抓取: 上传从收到抓取指令往前120分钟的日志
*/
const val ALL_LOG_120_MINUTES = 5
/**
* 全量日志抓取: 上传从收到抓取指令往前当天的日志
*/
const val ALL_LOG_SAME_DAY = 6
/**
* 全量日志抓取: 上传从收到抓取指令之前所有的日志
*/
const val ALL_LOG = 7
}
}

View File

@@ -1,11 +1,71 @@
package com.zhjt.mogo_core_function_devatools.logcat.uploader
import android.util.Log
import com.mogo.core.log.record.config.uploader.*
import com.mogo.core.log.record.model.*
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.zhidao.cosupload.callback.CosStatusCallback
import com.zhidao.cosupload.callback.CosStatusCallbackManager
import com.zhidao.cosupload.model.CallbackData
import com.zhidao.loglib.upload.UploadManager
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
internal class LogRecordUploader: ILogcatUploader {
internal class LogRecordUploader : ILogcatUploader {
override suspend fun upload(startTime: Long, endTime: Long, generatedZipPath: String): UploadState {
throw AssertionError("Not Implementation")
companion object {
private const val TAG = "LogRecordUploader"
}
override suspend fun upload(startTime: Long, endTime: Long, generatedZipPath: String): UploadState =
flow {
Log.d(TAG, "---- 开始上传 --- 1 ---")
val channel = Channel<UploadState>()
CosStatusCallbackManager.getInstance().register(object : CosStatusCallback {
override fun onStartUpload(data: CallbackData?) {
if (data?.localPath == generatedZipPath) {
Log.d(TAG, "---- onStartUpload ---: $data")
}
}
override fun uploadCosCompleted(data: CallbackData?) {
if (data?.localPath == generatedZipPath) {
Log.d(TAG, "---- uploadCosCompleted ---: $data")
channel.trySend(UploadSuccess)
CosStatusCallbackManager.getInstance().unregister(this)
}
}
override fun uploadCosFailed(data: CallbackData?) {
if (data?.localPath == generatedZipPath) {
Log.d(TAG, "---- uploadCosFailed ---: $data")
channel.trySend(UploadError(Reason(data.exception)))
CosStatusCallbackManager.getInstance().unregister(this)
}
}
override fun onProgress(data: CallbackData?) {
if (data?.localPath == generatedZipPath) {
Log.d(TAG, "---- onProgress ---: $data")
}
}
})
try {
UploadManager.getInstance().uploadSingleFile(generatedZipPath)
} catch (t: Throwable) {
Log.d(TAG, "---- 上传失败 ---: ${t.message}")
channel.send(UploadError(Reason(t.message ?: "")))
}
val iterator = channel.iterator()
while (iterator.hasNext()) {
val next = iterator.next()
emit(next)
}
}.flowOn(ThreadUtils.getIoPool().asCoroutineDispatcher()).filter { it is UploadError || it == UploadSuccess }.first()
}

View File

@@ -18,6 +18,7 @@ import com.mogo.eagle.core.function.api.map.deva.IMoGoMapDevaProvider
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapDevaListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.LogLevel
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
@@ -223,6 +224,7 @@ object MogoLogCatchManager : IMogoOnMessageListener<RemoteLogPushContent>, Handl
config.isShowDebugLog = true
config.isShowNetDebugLog = true
}
CallerMapUIServiceManager.getMapUIController()?.setDebugMode(true)
CallerAutoPilotControlManager.setEnableLog(true)
}
@@ -236,6 +238,7 @@ object MogoLogCatchManager : IMogoOnMessageListener<RemoteLogPushContent>, Handl
config.isShowDebugLog = false
config.isShowNetDebugLog = false
}
CallerMapUIServiceManager.getMapUIController()?.setDebugMode(false)
CallerAutoPilotControlManager.setEnableLog(false)
}

View File

@@ -19,7 +19,6 @@ import kotlinx.coroutines.flow.*
import mogo.telematics.pad.MessagePad.Header
import mogo.telematics.pad.MessagePad.SetParamReq
import java.util.concurrent.atomic.AtomicInteger
import kotlin.concurrent.*
internal class MoGoLookAroundProviderImpl: IMoGoLookAroundProvider, IMoGoBackCameraVideoListener, IMoGoRoboBusJinlvM1StitchedVideoListener, IMoGoGetParamResponseListener {
@@ -69,7 +68,9 @@ internal class MoGoLookAroundProviderImpl: IMoGoLookAroundProvider, IMoGoBackCam
private fun sendReqForParamPeriod() {
scope.launch {
while (targetX.get() == 0 || targetY.get() == 0) {
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.M1_STITCHED_VIDEO_SELF_VEHICLE_PARAM)
if(CallerAutoPilotStatusListenerManager.isConnect()){
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.M1_STITCHED_VIDEO_SELF_VEHICLE_PARAM)
}
delay(2000)
}
}.also {

View File

@@ -15,6 +15,12 @@ internal class MoFangAnalyticUtils {
const val EVENT_SUB_CONNECT_SUCCESS = "event_sub_connect_success"
const val EVENT_SUB_START_DISCONNECT = "event_sub_start_disconnect"
const val EVENT_SUB_DISCONNECT_SUCCESS = "event_sub_disconnect_success"
const val EVENT_SUB_DISCONNECT_SLEEP = "event_sub_disconnect_sleep"
const val EVENT_SUB_BLUETOOTH_SETTING_REQ = "event_sub_ble_set_req"
const val EVENT_SUB_BLUETOOTH_OPEN_DENY = "event_sub_ble_open_deny"
const val EVENT_SUB_BLUETOOTH_OPEN_AGREE = "event_sub_ble_open_agree"
const val EVENT_SUB_IS_VALID = "event_sub_is_ipt_valid"
const val EVENT_SUB_IS_INVALID = "event_sub_is_ipt_invalid"
// 魔方电量
const val EVENT_BATTERY = "event_mofang_battery"

View File

@@ -200,7 +200,7 @@ internal class MoFangCommandExecutor {
handler.removeMessages(MSG_WHAT_KEY_CODE_AL)
handler.sendMessage(Message.obtain().also {
it.what = MSG_WHAT_KEY_CODE_A
it.obj = -1.0
it.obj = -1.2
})
linkedLog?.record(mapOf("发送[A]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_A)}"))
}

View File

@@ -19,6 +19,8 @@ import com.mogo.core.mofang.connect.listener.*
import com.mogo.eagle.core.function.api.devatools.mofang.*
import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider.OnMoFangStatusListener
import com.mogo.eagle.core.utilcode.floating.*
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.util.*
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_BATTERY_VALUE
@@ -26,16 +28,20 @@ import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companio
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_KEYCODE
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_INPUT_SUB_TYPE
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_MOFANG_CONNECT
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_BLUETOOTH_OPEN_AGREE
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_BLUETOOTH_OPEN_DENY
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_BLUETOOTH_SETTING_REQ
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_CONNECT_SUCCESS
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_DISCONNECT_SLEEP
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_DISCONNECT_SUCCESS
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_IS_INVALID
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_IS_VALID
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_CONNECT
import com.zhjt.mogo_core_function_devatools.mofang.MoFangAnalyticUtils.Companion.EVENT_SUB_START_DISCONNECT
import kotlinx.coroutines.*
import me.jessyan.autosize.utils.AutoSizeUtils
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicReference
internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListener {
@@ -177,7 +183,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen
override fun onBluetoothKeyBoardCombineClicked(vararg keyCodes: Int) {
val keycodesText = keyCodes.joinToString(",") { KeyEvent.keyCodeToString(it).replace("KEYCODE_", "", true) }
if (isTest.get()) {
showToast("组合键[$keycodesText]触发了")
showToast("[$keycodesText]")
}
try {
MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keycodesText, EVENT_INPUT_SUB_TYPE to "3"))
@@ -192,7 +198,8 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen
override fun onBluetoothKeyBoardLongClicked(keyCode: Int) {
if (isTest.get()) {
showToast("长按键[${KeyEvent.keyCodeToString(keyCode).replace("KEYCODE_", "", true)}]触发了")
val key = KeyEvent.keyCodeToString(keyCode).replace("KEYCODE_", "", true)
showToast("[$key$key]")
}
try {
MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "2"))
@@ -210,7 +217,7 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen
override fun onBluetoothKeyboardClicked(keyCode: Int) {
val keycodeText = KeyEvent.keyCodeToString(keyCode)
if (isTest.get()) {
showToast("单击键[${keycodeText.replace("KEYCODE_", "", true)}]触发了")
showToast("[${keycodeText.replace("KEYCODE_", "", true)}]")
}
try {
MoFangAnalyticUtils.track(EVENT_INPUT, mutableMapOf(EVENT_INPUT_SUB_KEYCODE to keyCode.toString(), EVENT_INPUT_SUB_TYPE to "1"))
@@ -261,7 +268,8 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen
override fun onBluetoothKeyboardEvent(event: KeyEvent) { }
override fun onBluetoothKeyboardInputInvalid() {
Log.d(TAG, "--- onBluetoothKeyboardInputInvalid ---")
CallerLogger.d(M_DEVA+TAG, "--- onBluetoothKeyboardInputInvalid ---")
MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_IS_INVALID to "${System.currentTimeMillis()}"))
linkedLog.record(mapOf("callback" to "onBluetoothKeyboardInputInvalid"))
UiThreadHandler.post {
listeners.values.forEach {
@@ -271,22 +279,26 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen
}
override fun onBluetoothKeyboardInputValid() {
Log.d(TAG, "--- onBluetoothKeyboardInputValid ---")
CallerLogger.d(M_DEVA+TAG, "--- onBluetoothKeyboardInputValid ---")
MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_IS_VALID to "${System.currentTimeMillis()}"))
linkedLog.record(mapOf("callback" to "onBluetoothKeyboardInputValid"))
}
override fun onBluetoothOpenAgreed() {
Log.d(TAG, "--- onBluetoothOpenAgreed ---")
CallerLogger.d(M_DEVA+TAG, "--- onBluetoothOpenAgreed ---")
MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_BLUETOOTH_OPEN_AGREE to "${System.currentTimeMillis()}"))
linkedLog.record(mapOf("callback" to "onBluetoothOpenAgreed"))
}
override fun onBluetoothOpenDenied() {
Log.d(TAG, "--- onBluetoothOpenDenied ---")
CallerLogger.d(M_DEVA+TAG, "--- onBluetoothOpenDenied ---")
MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_BLUETOOTH_OPEN_DENY to "${System.currentTimeMillis()}"))
linkedLog.record(mapOf("callback" to "onBluetoothOpenDenied"))
}
override fun onBluetoothSettingRequest() {
Log.d(TAG, "--- onBluetoothSettingRequest ---")
CallerLogger.d(M_DEVA+TAG, "--- onBluetoothSettingRequest ---")
MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_BLUETOOTH_SETTING_REQ to "${System.currentTimeMillis()}"))
linkedLog.record(mapOf("callback" to "onBluetoothSettingRequest"))
UiThreadHandler.post {
Toast.makeText(Utils.getApp(), "检测到魔方未正确连接,请在系统蓝牙设置页面,找到魔方并配对连接...", Toast.LENGTH_SHORT).show()
@@ -294,7 +306,8 @@ internal class MoGoMoFangProviderImpl: IMoGoMoFangProvider, OnMoFangDeviceListen
}
override fun onBluetoothKeyboardAbnormalDisconnected(status: Int) {
Log.d(TAG, "--- onBluetoothKeyboardAbnormalDisconnected(status: $status) ---")
CallerLogger.d(M_DEVA+TAG, "--- onBluetoothKeyboardAbnormalDisconnected(status: $status) ---")
MoFangAnalyticUtils.track(EVENT_MOFANG_CONNECT, mutableMapOf(EVENT_SUB_DISCONNECT_SLEEP to "${System.currentTimeMillis()}"))
linkedLog.record(mapOf("callback" to "onBluetoothKeyboardAbnormalDisconnected:$status"))
}
}

View File

@@ -23,6 +23,8 @@ class IPCReportManager : IMoGoAutopilotStatusListener {
private var ipcErrorReportList = arrayListOf<ReportEntity>() //错误上报列表
private var ipcWarningReportList = arrayListOf<ReportEntity>() //警告上报列表
private var ipcReportWindowIsShow = false //IPC上报窗口是否处于展示状态
companion object{
const val TAG ="IPCReportManager"
val iPCReportManager: IPCReportManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
@@ -55,16 +57,31 @@ class IPCReportManager : IMoGoAutopilotStatusListener {
fun showReportListWindow(context: Context, isShow: Boolean){
if(isShow){
//打开工控机上报列表
reportListFloatWindow =
ReportListFloatWindow(context as Activity)
reportListFloatWindow?.showFloatWindow()
reportListFloatWindow?.refreshData(reportList)
if(reportListFloatWindow == null){
reportListFloatWindow =
ReportListFloatWindow(context as Activity)
}
reportListFloatWindow?.let {
it.showFloatWindow()
it.refreshData(reportList)
ipcReportWindowIsShow = true
}
}else {
//关闭工控机上报列表
reportListFloatWindow?.hideFloatWindow()
reportListFloatWindow?.let {
it.hideFloatWindow()
ipcReportWindowIsShow = false
}
}
}
/**
* 获取窗口展示状态
*/
fun getReportWindowStatus(): Boolean{
return ipcReportWindowIsShow
}
/**
*工控机监控节点上报
*/

View File

@@ -69,22 +69,20 @@ class ReportListFloatWindow constructor(activity: Activity) : View.OnTouchListen
mInViewY = motionEvent.y
// 获取相对屏幕的坐标,即以屏幕左上角为原点
mDownInScreenX = motionEvent.rawX
mDownInScreenY = motionEvent.rawY - BarUtils.getStatusBarHeight()
mDownInScreenY = motionEvent.rawY
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY - BarUtils.getStatusBarHeight()
mInScreenY = motionEvent.rawY
}
MotionEvent.ACTION_MOVE -> {
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY - BarUtils.getStatusBarHeight()
mInScreenY = motionEvent.rawY
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置
mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams)
}
// MotionEvent.ACTION_UP -> // 如果手指离开屏幕时xDownInScreen和xInScreen相等且yDownInScreen和yInScreen相等则视为触发了单击事件。
// if (mDownInScreenX === mInScreenX && mDownInScreenY === mInScreenY) {
// }
}
return true
}

View File

@@ -48,7 +48,7 @@ class SceneManager {
init {
//过滤所需条件
sceneModuleTAG.map[ADAS] = SceneModule(true, M_D_C)
sceneModuleTAG.map[DEVA] = SceneModule(false, M_DEVA)
sceneModuleTAG.map[DEVA] = SceneModule(true, M_DEVA)
sceneModuleTAG.map[HMI] = SceneModule(false, M_HMI)
sceneModuleTAG.map[OBU] = SceneModule(true, M_OBU)
sceneModuleTAG.map[V2X] = SceneModule(true, M_V2X)

View File

@@ -128,13 +128,13 @@ internal class OverViewImpl(ctx: Context) : IFlow<OverViewStatus>(ctx),
override fun onGranted() {
Log.d(TAG,"权限: ${Manifest.permission.ACCESS_FINE_LOCATION} 被授予了....")
if (isLocationEnabled()) {
isGpsException = true
send(OverViewStatus(true))
CallerDevaToolsListenerManager.invokeGpsStatus(false)
} else {
isGpsException = false
checkIfNotException()
CallerDevaToolsListenerManager.invokeGpsStatus(true)
} else {
isGpsException = true
send(OverViewStatus(true))
CallerDevaToolsListenerManager.invokeGpsStatus(false)
}
}

View File

@@ -13,6 +13,7 @@ import com.zhjt.mogo_core_function_devatools.status.flow.IFlow
import kotlinx.coroutines.Job
import mogo_msg.MogoReportMsg.MogoReportMessage
import planning.RoboSweeperTaskIndexOuterClass
import system_master.SsmInfo
import system_master.SystemStatusInfo.StatusInfo
import java.util.concurrent.atomic.AtomicInteger
@@ -39,7 +40,7 @@ internal class CanImpl(ctx: Context) :
private val state: AtomicInteger by lazy { AtomicInteger(Int.MIN_VALUE) }
override fun onCreate() {
send(CanStatus(CallerAutoPilotControlManager.isConnected()))
send(CanStatus(CallerAutoPilotStatusListenerManager.isConnect()))
CallerChassisAccStateListenerManager.addListener(TAG, this)
CallerChassisBrakeStateListenerManager.addListener(TAG, this)
@@ -57,7 +58,7 @@ internal class CanImpl(ctx: Context) :
private fun isCanEnabled(): Boolean {
val code = CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageCode()
return CallerAutoPilotControlManager.isConnected() && code != "EHW_CAN" && (state.get() == Int.MIN_VALUE || state.get() == 0)
return CallerAutoPilotStatusListenerManager.isConnect() && code != "EHW_CAN" && (state.get() == Int.MIN_VALUE || state.get() == 0)
}
@@ -115,6 +116,14 @@ internal class CanImpl(ctx: Context) :
}
}
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {
val state = statusInf.healthInfoList?.find { "can_adapter".equals(it.name, true) }?.state?.ordinal
Log.d(TAG, "state: $state")
if (state != null) {
this.state.set(state)
}
}
override fun onDestroy() {
super.onDestroy()
job?.safeCancel()

View File

@@ -28,7 +28,7 @@ internal class IpcImpl(ctx: Context): IFlow<IpcStatus>(ctx), IMoGoAutopilotStatu
}
private fun checkAndSend() {
send(IpcStatus(CallerAutoPilotControlManager.isConnected()))
send(IpcStatus(CallerAutoPilotStatusListenerManager.isConnect()))
}
override fun onDestroy() {

View File

@@ -16,7 +16,8 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import system_master.SystemStatusInfo.HealthInfo
import system_master.SsmInfo
import system_master.SsmBase.HealthInfo
import system_master.SystemStatusInfo.StatusInfo
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference
@@ -42,7 +43,7 @@ internal class RTKImpl(ctx: Context): IFlow<RTKStatus>(ctx), IMoGoAutopilotStatu
CallerLogger.d("$M_DEVA$TAG", "-- onCreate --")
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerChassisLocationWGS84ListenerManager.addListener(TAG, this)
if (CallerAutoPilotControlManager.isConnected()) {
if (CallerAutoPilotStatusListenerManager.isConnect()) {
check()
}
}
@@ -52,7 +53,7 @@ internal class RTKImpl(ctx: Context): IFlow<RTKStatus>(ctx), IMoGoAutopilotStatu
return
}
check?.takeIf { it.isActive }?.cancel()
launch(Dispatchers.Unconfined) {
launch(Dispatchers.Default) {
CallerAutoPilotControlManager.sendStatusQueryReq()
delay(5000)
isOldVersion.set(true)
@@ -72,25 +73,35 @@ internal class RTKImpl(ctx: Context): IFlow<RTKStatus>(ctx), IMoGoAutopilotStatu
}
}
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {
check?.takeIf { it.isActive }?.cancel()
isOldVersion.set(false)
val info = statusInf.healthInfoList?.find { "localization".equals(it.name, true) }
Log.d(TAG, "info: $info")
if (info != null) {
healthInfo.set(info)
send(RTKStatus(getDesc(), getCode()))
}
}
override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) {
super.onAutopilotIpcConnectStatusChanged(status, reason)
if (!CallerAutoPilotControlManager.isConnected()) {
if (!CallerAutoPilotStatusListenerManager.isConnect()) {
CallerLogger.d("$M_DEVA$TAG", "工控机断开了....")
healthInfo.set(null)
send(RTKStatus("", -1))
}
if (CallerAutoPilotControlManager.isConnected() && check == null && !isOldVersion.get()) {
if (CallerAutoPilotStatusListenerManager.isConnect() && check == null && !isOldVersion.get()) {
check()
}
}
override fun onChassisLocationWGS84(gnssInfo: MogoLocation) {
if (isOldVersion.get()) {
if (isRTKEnabled()) {
if ((timeOutCheck == null || timeOutCheck?.isCompleted == true) && isRTKEnabled()) {
send(RTKStatus("RTK", 0))
timeOutCheck?.takeIf { it.isActive }?.cancel()
launch(Dispatchers.Unconfined) {
launch(Dispatchers.Default) {
delay(4000)
send(RTKStatus("", -1))
}.also {
@@ -103,7 +114,7 @@ internal class RTKImpl(ctx: Context): IFlow<RTKStatus>(ctx), IMoGoAutopilotStatu
private fun isRTKEnabled(): Boolean {
val code = CallerAutoPilotStatusListenerManager.getAutoPilotReportMessageCode()
val gnssInfo = CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84()
return CallerAutoPilotControlManager.isConnected() && (
return CallerAutoPilotStatusListenerManager.isConnect() && (
code != "EHW_RTK" &&
code != "EHW_GNSS" &&
code != "ESYS_RTK_STATUS_FAULT" &&

View File

@@ -58,7 +58,7 @@ internal class TracingImpl(ctx: Context): IFlow<TracingStatus>(ctx), IMoGoAutopi
super.onAutopilotIpcConnectStatusChanged(status, reason)
try {
if (ipcConnectStatus.get() != status) {
if (!CallerAutoPilotControlManager.isConnected()) {
if (!CallerAutoPilotStatusListenerManager.isConnect()) {
old = UNKNOWN
send(TracingStatus(UNKNOWN))
}

View File

@@ -15,7 +15,7 @@ internal class StatusModel : ViewModel() {
const val TAG = "StatusModel"
val DEFAULTS = Pair(null, ArrayList<Status>().also {
it += OverViewStatus()
it += IpcStatus(CallerAutoPilotControlManager.isConnected())
it += IpcStatus(CallerAutoPilotStatusListenerManager.isConnect())
it += CanStatus(false)
// it += TracingStatus(UNKNOWN)
it += RTKStatus("", -1)

View File

@@ -16,6 +16,7 @@ import com.zhjt.mogo_core_function_devatools.status.entity.IpcStatus
import com.zhjt.mogo_core_function_devatools.status.entity.Status
import com.zhjt.mogo_core_function_devatools.status.entity.TracingStatus.Tracing.*
import com.zhjt.mogo_core_function_devatools.status.ui.adapter.StatusAdapter.StatusViewHolder
import me.jessyan.autosize.AutoSizeCompat
internal class StatusAdapter(val ctx: Context, var data: ArrayList<Status>): RecyclerView.Adapter<StatusViewHolder>() {
@@ -27,6 +28,7 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList<Status>): Rec
StatusViewHolder(LayoutInflater.from(ctx).inflate(R.layout.layout_status_bar_item, parent, false))
override fun onBindViewHolder(holder: StatusViewHolder, position: Int) {
AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources)
holder.bind(data[position])
}
@@ -100,6 +102,10 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList<Status>): Rec
}
"SLAM" ->
iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_slam_good)
"VSLAM" ->
iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_vslam_good)
"VAL" ->
iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_val_good)
else ->
iv.background = ContextCompat.getDrawable(itemView.context, drawable.icon_dev_status_rtk_unknow)
}

View File

@@ -85,19 +85,19 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener {
traceInfoCache[ChainConstant.CHAIN_TYPE_INIT_STATUS] =
ChainLogParam(true, "ADAS连接状态")
ChainLogParam(true, "INIT状态")
traceInfoCache[ChainConstant.CHAIN_TYPE_GNSS] =
ChainLogParam(true, "ADAS自车定位")
traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_AUTOPILOT] =
ChainLogParam(true, "ADAS自动驾驶链路(包含: 自动驾驶状态交互,全局路径,到站提醒,节点状态,异常上报,PNC)")
traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_DATA_TRACKED] =
ChainLogParam(true, "ADAS感知物体")
ChainLogParam(true, "感知物体")
traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_TRAJECTORY] =
ChainLogParam(false, "ADAS车前引导线")
traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_VEHICLE] =
ChainLogParam(false, "ADAS车辆底盘数据")
traceInfoCache[ChainConstant.CHAIN_TYPE_SOCKET_TRAFFIC_LIGHT] =
ChainLogParam(true, "ADAS红绿灯数据")
ChainLogParam(true, "红绿灯Union数据")
traceInfoCache[ChainConstant.CHAIN_TYPE_HMI] =
ChainLogParam(true, "人机交互行为")
traceInfoCache[ChainConstant.CHAIN_TYPE_ANR_LEAK] =
@@ -109,8 +109,6 @@ class TraceManager : IMoGoCloudListener, IMoGoAutopilotCarConfigListener {
traceInfoCache[ChainConstant.CHAIN_TYPE_WEAK_NETWORK] =
ChainLogParam(true, "WeakNetWork Record")
MoGoAiCloudClientConfig.getInstance()
FileWriteManager.getInstance()
.init(context, "", pkgName, fwBuildMap)
FileWriteManager.getInstance().registerListener { type ->

View File

@@ -20,6 +20,7 @@ class StartUpTraceNetWorkModel {
private var retryTime = 0
private var success: ((String) -> Unit)? = null
private var error: ((String) -> Unit)? = null
@Volatile
private var traceId: String = ""
fun report(
@@ -39,14 +40,14 @@ class StartUpTraceNetWorkModel {
if (id != null) {
traceId = id
}
val configUpload = AppConfigInfo.toConfigUpload()
val data = GsonUtils.toJson(configUpload)
map =
GsonUtils.fromJson(data, object : TypeToken<MutableMap<String, Any>>() {}.type)
map["id"] = traceId
}
loader {
apiCall {
val configUpload = AppConfigInfo.toConfigUpload()
val data = GsonUtils.toJson(configUpload)
map =
GsonUtils.fromJson(data, object : TypeToken<MutableMap<String, Any>>() {}.type)
map["id"] = traceId
getNetWorkApi().report(map)
}
}

View File

@@ -28,7 +28,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = Record(AppUtils.getAppVersionName(), sn, mac, type, isSupportPatch, time = System.currentTimeMillis())
UpgradeDbHelper.insertRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_start" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_start" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -38,7 +38,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = CheckRecord(AppUtils.getAppVersionName(), START, time = System.currentTimeMillis())
UpgradeDbHelper.insertCheckRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_request_start" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_request_start" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -48,7 +48,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = CheckRecord(AppUtils.getAppVersionName(), SUCCESS, response, time = System.currentTimeMillis())
UpgradeDbHelper.insertCheckRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_request_success" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_request_success" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -67,7 +67,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = UpgradeRecord(fromVersionName = AppUtils.getAppVersionName(), toVersionName = newVersionName, fromMd5 = AppUtils.getAppApkMd5(), toMD5 = newMd5, type = getType(type), time = System.currentTimeMillis())
UpgradeDbHelper.insertUpgradeRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_record" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_record" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -77,7 +77,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadStart, downloadUrl = downloadUrl, time = System.currentTimeMillis())
UpgradeDbHelper.insertDownloadRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_download_start" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_download_start" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -87,7 +87,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadPause, downloadUrl = downloadUrl, time = System.currentTimeMillis())
UpgradeDbHelper.insertDownloadRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_download_pause" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_download_pause" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -97,7 +97,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadFailed, failReason = error, downloadUrl = downloadUrl, time = System.currentTimeMillis())
UpgradeDbHelper.insertDownloadRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_download_failed" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_download_failed" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -107,7 +107,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadComplete, downloadUrl = downloadUrl, time = System.currentTimeMillis())
UpgradeDbHelper.insertDownloadRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_download_success" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_download_success" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -117,7 +117,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = InstallStart, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_install_start" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_install_start" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -127,7 +127,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = SourceMd5CheckStart, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_start" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_start" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -137,7 +137,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = SourceMd5CheckFailed, failReason = error, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_failed" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_failed" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -147,7 +147,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = SourceMd5CheckSuccess, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_success" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_check_source_md5_success" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -157,7 +157,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = ApplyPatchStart, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_start" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_start" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -167,7 +167,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = ApplyPatchFailed, failReason = error, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_failed" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_failed" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -177,7 +177,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = ApplyPatchSuccess, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_success" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_apply_patch_success" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -187,7 +187,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = TargetMd5CheckStart, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_start" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_start" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -197,7 +197,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = TargetMd5CheckFailed, failReason = error, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_failed" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_failed" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -207,7 +207,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = TargetMd5CheckSuccess, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_success" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_check_target_md5_success" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -217,7 +217,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
val record = InstallRecord(version = AppUtils.getAppVersionName(), status = InstallFailed, code = code, failReason = error, time = System.currentTimeMillis())
UpgradeDbHelper.insertInstallRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_install_failed" to GsonUtils.toJson(record)))
onUpgradeRecordLinkLog(mapOf("upgrade_install_failed" to record))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -249,7 +249,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
itx["step_3"] = all.downloads?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList()
itx["step_4"] = all.installs?.let { ArrayList<InstallRecord>(it) + InstallRecord(success.versionName, InstallSuccess, 0) }?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList()
try {
onUpgradeRecordLinkLog(mapOf("upgrade_success" to GsonUtils.toJson(all)))
onUpgradeRecordLinkLog(mapOf("upgrade_success" to all))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -265,7 +265,7 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
itx["step_3"] = all.downloads?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList()
itx["step_4"] = all.installs?.sortedBy { it.status.ordinal }?.mapIndexed { index, r -> "$index" to GsonUtils.toJson(r) } ?: emptyList()
try {
onUpgradeRecordLinkLog(mapOf("upgrade_failed" to GsonUtils.toJson(all)))
onUpgradeRecordLinkLog(mapOf("upgrade_failed" to all))
} catch (t: Throwable) {
t.printStackTrace()
}
@@ -301,5 +301,5 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
nodeAliasCode = ChainConstant.CHAIN_CODE_UPGRADE_APP,
paramIndexes = [0]
)
private fun onUpgradeRecordLinkLog(extra: Map<String, String>) {}
private fun onUpgradeRecordLinkLog(extra: Map<String, Any>) {}
}

View File

@@ -0,0 +1,17 @@
package com.zhjt.mogo_core_function_devatools.weaknetwork
import androidx.annotation.Keep
@Keep
data class DetectResult(var details: List<PingResult>?) {
data class PingResult(
var detectType: Int,
var errorCode: Int,
var networkType: Int,
var detectIp: String?,
var port: Int,
var rttStr: String?,
var pingLossRate: String?
)
}

View File

@@ -2,6 +2,7 @@ package com.zhjt.mogo_core_function_devatools.weaknetwork
import android.util.Log
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.weak.network.StubImpl
import com.zhjt.service.chain.ChainLog
@@ -12,7 +13,22 @@ class DetectResultImpl: StubImpl.ReportDetectResultListener {
}
override fun onDetectResult(resultsJson: String?) {
resultsJson?.let { invokeWeakResult(it) }
resultsJson?.let { json ->
kotlin.runCatching {
val result = GsonUtils.fromJson(json, DetectResult::class.java)
val size = result.details?.size ?: 0
var rttSum = 0.0
result?.details?.forEach { pingResult ->
pingResult.rttStr?.let {
rttSum += it.toDouble()
}
}
if (rttSum > 0 && size > 0) {
Log.d(TAG, "avg of rtt is:${rttSum / size}ms")
}
}
invokeWeakResult(json)
}
}
@ChainLog(

View File

@@ -5,6 +5,7 @@ import com.mogo.cloud.network.WeakNetworkManager
import com.mogo.cloud.network.WeakNetworkManager.setListener
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.weak.network.SdtManager
import com.zhjt.service.chain.ChainLog
import java.util.concurrent.locks.ReentrantReadWriteLock
@@ -16,6 +17,10 @@ object WeakNetworkStrategy {
// 记录到链路日志中的时间间隔
private const val OUTPUT_TIME_INTERVAL = 15000
private const val WEAK_HTTP_RTT = 1300
private const val VERY_CONSUMING_TIME_URL = "/yycp-launcherSnapshot/launcherSnapshot/querySnapshotSync"
private var lastOutputTime = 0L
private val lock by lazy {
@@ -33,6 +38,7 @@ object WeakNetworkStrategy {
fun startListen() {
setListener(object : WeakNetworkManager.OnWeakHttpListener {
override fun onHttpRttReceived(hashCode: Int, url: String, timeStamp: Long) {
if (VERY_CONSUMING_TIME_URL in url) return
outputLog(url, timeStamp)
}
@@ -57,8 +63,12 @@ object WeakNetworkStrategy {
try {
val currentTime = System.currentTimeMillis()
if (currentTime - lastOutputTime > OUTPUT_TIME_INTERVAL) {
invokeWeakResult("url为:$url, 耗时为:$timeStamp${if (isFail) " 连接失败!" else ""}")
SdtManager.startActiveCheck()
if (timeStamp >= WEAK_HTTP_RTT) {
ToastUtils.showShort("当前网络质量差!")
} else if (timeStamp in 300 until WEAK_HTTP_RTT) {
invokeWeakResult("url为:$url, 耗时为:$timeStamp${if (isFail) " 连接失败!" else ""}")
SdtManager.startActiveCheck()
}
lastOutputTime = currentTime
}
} catch (e: Exception) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB