diff --git a/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java b/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java index 84d8af86be..3a89eaa247 100644 --- a/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/bus/driver/src/jinlvvan/java/com/mogo/och/bus/model/OrderModel.java @@ -548,6 +548,9 @@ public class OrderModel { clearBusStationDatas(); queryBusRoutes(); removeTipRunnables(); + CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot(); + // 取消自驾 + setTrajectoryStation(null,null,-1L); // startOrStopQueryPassengerWriteOff(false); } } diff --git a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java index e6a847f71b..6ecc30ac08 100644 --- a/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java +++ b/OCH/shuttle/driver/src/main/java/com/mogo/och/bus/model/OrderModel.java @@ -605,6 +605,8 @@ public class OrderModel { clearBusStationDatas(); queryBusRoutes(); removeTipRunnables(); + // 取消自驾 + CallerAutoPilotControlManager.INSTANCE.cancelAutoPilot(); // startOrStopQueryPassengerWriteOff(false); } } diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt index 0a783ad174..fb2f439f69 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/view/SweeperCloudTrafficDataView.kt @@ -8,7 +8,6 @@ import android.widget.ImageView import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import chassis.Chassis.GearPosition -import chassis.Chassis.LightSwitch import chassis.ChassisStatesOuterClass.BMSSystemStates import chassis.ChassisStatesOuterClass.SweeperFuTianTaskSystemStates import com.elegant.utils.UiThreadHandler @@ -27,7 +26,6 @@ import kotlin.math.roundToInt */ class SweeperCloudTrafficDataView : ConstraintLayout, IMoGoBatteryManagementSystemListener, - IMoGoChassisLamplightListener, IMoGoChassisGearStateListener, IMoGoSweeperFutianCleanSystemListener { private var tapPositionView //方向盘下方的档位 @@ -78,8 +76,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, super.onAttachedToWindow() //电量 CallerBatteryManagementSystemListenerManager.addListener(TAG, this) - //转向灯 - CallerChassisLamplightListenerManager.addListener(TAG, this) //档位 CallerChassisGearStateListenerManager.addListener(TAG, this) //清扫车相关数据接口 @@ -89,7 +85,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, override fun onDetachedFromWindow() { super.onDetachedFromWindow() CallerBatteryManagementSystemListenerManager.removeListener(TAG) - CallerChassisLamplightListenerManager.removeListener(TAG) CallerChassisGearStateListenerManager.removeListener(TAG) CallerSweeperFutianCleanSystemListenerManager.removeListener(TAG) } @@ -127,14 +122,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, } } - /** - * 车辆转向灯 - * @param directionLight - */ - override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { - //转向灯状态 0是正常 1是左转 2是右转 - } - /** * 设置自动驾驶状态 */ @@ -163,14 +150,6 @@ class SweeperCloudTrafficDataView : ConstraintLayout, } } - /** - * 刹车灯 - * @param brakeLight - */ - override fun onAutopilotBrakeLightData(brakeLight: Boolean) { - d(TAG, "刹车灯:$brakeLight") - } - /** * 方向盘下方的档位 * @param gear diff --git a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt index c11778b7ce..7c686d8bfa 100644 --- a/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt +++ b/OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/view/SweeperOperateTrafficDataView.kt @@ -131,9 +131,10 @@ class SweeperOperateTrafficDataView : ConstraintLayout, tvBattery?.text = "${states.bmsSoc.roundToInt()}%" } } + /** * 车辆转向灯 - * @param directionLight + * @param lightSwitch */ override fun onAutopilotLightSwitchData(lightSwitch: LightSwitch?) { //转向灯状态 0是正常 1是左转 2是右转 @@ -142,13 +143,6 @@ class SweeperOperateTrafficDataView : ConstraintLayout, } } - /** - * 刹车灯 - * @param brakeLight - */ - override fun onAutopilotBrakeLightData(brakeLight: Boolean) { - d(TAG, "刹车灯:$brakeLight") - } /** * 方向盘下方的档位 * @param gear diff --git a/core/function-impl/mogo-core-function-devatools/build.gradle b/core/function-impl/mogo-core-function-devatools/build.gradle index dd29601f0e..704be88b02 100644 --- a/core/function-impl/mogo-core-function-devatools/build.gradle +++ b/core/function-impl/mogo-core-function-devatools/build.gradle @@ -80,6 +80,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxroomruntime kapt rootProject.ext.dependencies.androidxroomcompiler implementation rootProject.ext.dependencies.rxandroid + implementation rootProject.ext.dependencies.androidxcardview implementation rootProject.ext.dependencies.androidxroomktx implementation rootProject.ext.dependencies.protobuf_java implementation rootProject.ext.dependencies.androidxappcompat diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 000169af02..6926e45bec 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -288,6 +288,13 @@ class DevaToolsProvider : IDevaToolsProvider { BadCaseManager.onReceiveBadCaseRecord(msgBoxBean, activity, countdown) } + /** + * 魔方开启主动录包 + */ + override fun startRecordByMoFang() { + BadCaseManager.startRecordByMoFang() + } + override fun showFeedbackWindow(ctx: Context) { BadCaseManager.showBadCaseConfigWindow(ctx) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt index d9e3bc01e4..d391927509 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/apm/ApmEnvProviderImpl.kt @@ -69,8 +69,10 @@ class ApmEnvProviderImpl: IApmEnvProvider, CoroutineScope { var dockerVersionChanged = false val version = ApmEnvConfig.getDockerVersion() if (!TextUtils.isEmpty(version) && !TextUtils.isEmpty(dockerVersion) && version != dockerVersion) { - dockerVersionChanged = true - ApmEnvConfig.setDockerVersion(dockerVersion) + dockerVersionChanged = version?.endsWith("release", true) == true || dockerVersion.endsWith("release", true) + if (dockerVersionChanged) { + ApmEnvConfig.setDockerVersion(dockerVersion) + } } var isFirstDockerVersionSet = false if (TextUtils.isEmpty(version) && !TextUtils.isEmpty(dockerVersion)) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index efa0e4a5f8..0651537b66 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -5,19 +5,33 @@ import android.app.Activity import android.content.Context import android.view.View import android.view.WindowManager +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentActivity import androidx.lifecycle.Lifecycle.Event import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleOwner import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.module.status.IMogoStatusChangedListener +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType +import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener +import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager +import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -31,8 +45,11 @@ import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPi import com.zhjt.mogo_core_function_devatools.ext.enqueuePop import me.jessyan.autosize.utils.AutoSizeUtils import record_cache.RecordPanelOuterClass +import kotlin.math.abs -internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener { +internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordListener, + IMoGoChassisLocationGCJ02Listener, IMsgBoxListener, IMoGoDevaToolsListener, + IMogoStatusChangedListener { const val TAG = "BadCase" @@ -44,6 +61,44 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis fun init(context: Context) { CallerAutopilotRecordListenerManager.addListener(TAG, this) SpeechUtils.init(context) + //定位监听, 传false是高德坐标系 + CallerChassisLocationGCJ02ListenerManager.addListener(TAG, 1, this) + //消息盒子监听,获取FM和Report信息 + CallerMsgBoxListenerManager.addListener(TAG,this) + CallerDevaToolsListenerManager.addListener(TAG, this) + // 云socket连接状态 + MogoStatusManager.getInstance() + .registerStatusChangedListener(TAG, StatusDescriptor.CLOUD_SOCKET, this) + } + + /** + * 魔方开启主动录包 + */ + fun startRecordByMoFang(){ + if (NetworkUtils.isConnected()){ + if (BadCaseConfig.dockerVersion != null){ + val activity = AppStateManager.currentActivity() + if (activity !is AppCompatActivity) { + return + } + ThreadUtils.runOnUiThread { + val initiativeBadCaseWindow = InitiativeBadCaseWindow(activity) + initiativeBadCaseWindow.setClickListener(object : + InitiativeBadCaseWindow.ClickListener { + override fun closeWindow() { + initiativeBadCaseWindow.hideFloatWindow() + } + + }) + initiativeBadCaseWindow.showFloatWindow(null) + + } + }else { + ToastUtils.showShort("工控机连接状态异常") + } + }else { + ToastUtils.showShort("网络异常,请检查网络") + } } /** @@ -217,6 +272,8 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis ) } bag录制失败" ) + //录包失败时,保存录包失败状态 + BadCaseConfig.bagRecordFailList.add(recordPanel.key) } return } @@ -269,4 +326,36 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis } + override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { + mogoLocation?.let { + BadCaseConfig.currentSpeed = (abs(it.gnssSpeed) * 3.6f).toInt() + } + } + + override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) { + if(category == MsgCategory.SYS_INFO){ + //上报 + BadCaseConfig.newReportEntity = msgBoxList.bean as ReportEntity + }else if(category == MsgCategory.FM_INFO){ + //FM + BadCaseConfig.newFMInfoMsg = msgBoxList.bean as FMInfoMsg + } + + } + + override fun gpsStatus(status: Boolean) { + super.gpsStatus(status) + BadCaseConfig.gpsStatus = "GPS${if (status) "正常" else "异常"}" + } + + override fun tracingStatus(status: Boolean) { + super.tracingStatus(status) + BadCaseConfig.tracingStatus = "寻迹算路${if (status) "正常" else "异常"}" + } + + override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) { + BadCaseConfig.socketStatus = "云Socket连接${if (isTrue) "正常" else "异常"}" + } + + } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseManagerView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseManagerView.kt index 75100b5784..71cb1c78dc 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseManagerView.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseManagerView.kt @@ -8,6 +8,8 @@ import android.os.Handler import android.util.AttributeSet import android.view.LayoutInflater import android.view.View +import android.view.inputmethod.InputMethodManager +import android.widget.EditText import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import bag_manager.BagManagerOuterClass @@ -50,6 +52,7 @@ class BadCaseManagerView @JvmOverloads constructor( private var bagManagerEntity: BagManagerEntity = BagManagerEntity() private var clickListener: ClickListener? = null private var bagUploadDialog: BagUploadDialog ?= null + private var recordScreenDialog: RecordScreenDialog ?= null private var spaceTotal: Long = 0 //总空间 private var spaceUsed: Long = 0 //已用空间 @@ -212,6 +215,20 @@ class BadCaseManagerView @JvmOverloads constructor( }, 1500) } + override fun lookMapScreen(key: Long) { + //打开高精地图截图对话框 + if(recordScreenDialog == null){ + recordScreenDialog = RecordScreenDialog(context) + } + recordScreenDialog?.show() + recordScreenDialog?.showScreenImage(key) + } + + override fun startEdit(editText: EditText) { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager? + imm?.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT) + } + }) val linearLayoutManager = LinearLayoutManager(context) rvBagList.layoutManager = linearLayoutManager diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java index a8fdeab7f5..7cadeb932d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java @@ -9,6 +9,7 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.google.protobuf.ProtocolStringList; import com.mogo.eagle.core.data.deva.badcase.RecordCaseEntity; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager; @@ -99,19 +100,14 @@ public class CaseListDialog extends Dialog implements IMoGoAutopilotRecordListen if(config.getRecordTypesCount()>0){ for(int index=0;index topicList = new ArrayList<>(); -// TODO java.lang.IndexOutOfBoundsException: Index: 38, Size: 38 -// for(int position=0;index0){ - recordTypeEntityArrayList.add(new RecordCaseEntity(0,"自定义A",BadCaseConfig.customTopicList)); + recordTypeEntityArrayList.add(new RecordCaseEntity(0,"自定义A", (ProtocolStringList) BadCaseConfig.customTopicList)); } caseListAdapter.setData(recordTypeEntityArrayList); caseListAdapter.notifyDataSetChanged(); diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt index 3606bd8045..9c9681fc45 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt @@ -2,9 +2,10 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz import android.annotation.SuppressLint import android.app.Activity +import android.graphics.Bitmap import android.graphics.PixelFormat import android.os.Bundle -import android.os.CountDownTimer +import android.os.Environment import android.os.Handler import android.os.SystemClock import android.util.DisplayMetrics @@ -32,10 +33,14 @@ import com.mogo.eagle.core.data.deva.badcase.RecordCaseEntity import com.mogo.eagle.core.data.deva.badcase.RecordOptionEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.api.devatools.badcase.BadCaseNetListener +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84 import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsNetManager +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager +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.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.toast.TipToast @@ -58,6 +63,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseNetManager import com.zhjt.mogo_core_function_devatools.badcase.repository.store.BadCaseReasonStore +import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import org.json.JSONArray @@ -74,7 +80,7 @@ import java.util.* * @since: 2022/7/13 */ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchListener, - IMoGoAutopilotRecordListener, BadCaseNetListener { + IMoGoAutopilotRecordListener, BadCaseNetListener, IMoGoMapScreenListener { companion object { const val TAG = "InitiativeBadCaseWindow" @@ -92,7 +98,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private lateinit var viewAudioBg: ImageView private lateinit var viewAudioButton: ImageView - private lateinit var tvAudioCountDown: TextView + private lateinit var viewAudioStart: ImageView + private lateinit var tvAudioResult: TextView private lateinit var tvInitiativeReport: TextView private lateinit var tvInitiativeCancel: TextView @@ -104,7 +111,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var audioFileName:String?=null //录音文件名称 private var uploadReason: StringBuilder = StringBuilder() //上报原因,标签 - private var reasonDetail: String ?= null //语音转写 + private var reasonDetail: String = "" //语音转写 private var uploadReasonTotal: String = "" @Volatile private var recordKey: Long = 0 //录制bag包key @@ -158,7 +165,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList viewAudioBg = mFloatLayout.findViewById(R.id.viewAudioBg) viewAudioButton = mFloatLayout.findViewById(R.id.viewAudioButton) - tvAudioCountDown = mFloatLayout.findViewById(R.id.tvAudioCountDown) + viewAudioStart = mFloatLayout.findViewById(R.id.viewAudioStart) + tvAudioResult = mFloatLayout.findViewById(R.id.tvAudioResult) tvInitiativeReport = mFloatLayout.findViewById(R.id.tvInitiativeReport) tvInitiativeCancel = mFloatLayout.findViewById(R.id.tvInitiativeCancel) @@ -192,7 +200,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList */ BadCaseNetManager.badCaseNetManager.getRecordOption(1,AppConfigInfo.iPCMacAddress) // BadCaseNetManager.badCaseNetManager.getRecordOption(1,"48:b0:2d:3a:9c:8f") - + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(this.hashCode().toString(),this) //采集结果回调监听 CallerAutopilotRecordListenerManager.addListener(this.hashCode().toString(),this) //主动录包采集原因回调监听 @@ -218,11 +227,10 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() uploadAudio() } } @@ -313,10 +321,11 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } Log.i(TAG, "语音内容=$resultBuffer") reasonDetail = resultBuffer.toString() + if(reasonDetail.isNotEmpty()){ + tvAudioResult.text = reasonDetail + } } - var countDownTimer: CountDownTimer?=null - private fun setAudio(status: Boolean){ if(status){ //开始录音 @@ -339,35 +348,17 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList ) scaleAnimation.duration = 1000 scaleAnimation.repeatCount = -1 - viewAudioButton.startAnimation(scaleAnimation) - - tvAudioCountDown.visibility = View.VISIBLE - //开始倒计时 - if(countDownTimer==null){ - countDownTimer = object : CountDownTimer(60000, 1000) { - - override fun onTick(millisUntilFinished: Long) { - tvAudioCountDown.text = "${millisUntilFinished/1000}S" - } - - override fun onFinish() { - tvAudioCountDown.visibility = View.GONE - //结束录音 - RecordManager.getInstance().stop() - //结束动画 - viewAudioButton.clearAnimation() - } - } - countDownTimer?.start() - } + viewAudioButton.visibility = View.GONE + viewAudioStart.visibility = View.VISIBLE + viewAudioStart.startAnimation(scaleAnimation) + tvAudioResult.text = "..." }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() } } @@ -430,11 +421,13 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList */ private fun upload(downloadUrl: String?){ GlobalScope.launch{ - uploadReasonTotal = if(reasonDetail.isNullOrEmpty()){ + uploadReasonTotal = if(reasonDetail.isEmpty()){ uploadReason.toString() }else{ "$uploadReason 语音内容:$reasonDetail" } + //上报到工控机 + CallerAutoPilotControlManager.recordCause(recordKey.toString(),recordFileName,"",uploadReason.toString()+reasonDetail) val uploadResult = presenter.upload(mutableMapOf().also { itx -> itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号 itx["filename"] = recordFileName?:"" //bag包文件地址 @@ -561,6 +554,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList CallerAutopilotRecordListenerManager.removeListener(this.hashCode().toString()) //注销采集原因回调监听 CallerDevaToolsNetManager.removeListener(this.hashCode().toString()) + //注销高精地图截图监听回调 + CallerMapScreenListenerManager.removeListener(this.hashCode().toString()) if (mFloatLayout.parent != null){ mWindowManager!!.removeView(mFloatLayout) @@ -570,10 +565,15 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel") ThreadUtils.runOnUiThread { - if(recordKey==null){ - recordKey = recordPanel.key + recordKey = recordPanel.key + //开始录制 + if(recordPanel.stat == 300){ + BadCaseConfig.recordKeyList.add(recordPanel.key) + //保存录包状态 + BadCaseConfig.bagResourceList.add(recordPanel.key) + //开启高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() } - BadCaseConfig.recordKeyList.add(recordPanel.key) if(recordFileName==null){ recordFileName = recordPanel.filename } @@ -642,4 +642,44 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } } + /** + * 高精地图截图回调 + */ + override fun onMapScreen(bitmap: Bitmap) { + //在截图上保存即时信息 + val time = "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}" + val lineId = "路线ID:${CallerAutoPilotStatusListenerManager.getLineId()}" + val state = when(CallerAutoPilotStatusListenerManager.getState()){ + 0->"自驾状态:不可自驾" + 1->"自驾状态:可自驾" + 2->"自驾状态:自驾中" + 7->"自驾状态:平行驾驶中" + else->"自驾状态:未知" + } + val speed = "当前车速:${BadCaseConfig.currentSpeed}" + + + val outBitmap = RecordBitmapUtils.drawTextOnBitmap(bitmap,time,lineId,state,speed, + BadCaseConfig.gpsStatus,BadCaseConfig.tracingStatus,BadCaseConfig.socketStatus + ,BadCaseConfig.newFMInfoMsg,BadCaseConfig.newReportEntity) + + //图片保存本地 + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) + val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+ + "MapScreen" + File.separator+ currentDay + File.separator + val fileName = "$recordKey.png" + val path = fileDir + fileName + if (!File(fileDir).exists()) { + File(fileDir).mkdirs() + } + if(outBitmap != null){ + RecordBitmapUtils.bitmap2Path(outBitmap,path) + }else{ + RecordBitmapUtils.bitmap2Path(bitmap,path) + } + + //遍历是否有非当日的文件并删除 + RecordBitmapUtils.deleteExpiredFile(currentDay) + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index 8b982a16a1..818fcd9f12 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -2,23 +2,20 @@ package com.zhjt.mogo_core_function_devatools.badcase.biz import android.annotation.SuppressLint import android.app.Activity -import android.graphics.Color +import android.graphics.Bitmap import android.graphics.PixelFormat import android.os.Bundle -import android.os.CountDownTimer +import android.os.Environment import android.os.Handler import android.util.DisplayMetrics import android.util.Log import android.view.* import android.view.animation.Animation import android.view.animation.ScaleAnimation -import android.widget.CheckBox -import android.widget.CompoundButton import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.google.android.flexbox.FlexboxLayout import com.iflytek.cloud.ErrorCode import com.iflytek.cloud.InitListener import com.iflytek.cloud.RecognizerListener @@ -34,9 +31,12 @@ import com.mogo.eagle.core.data.deva.badcase.RecordOptionEntity import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.devatools.badcase.BadCaseNetListener +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsNetManager +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA @@ -57,13 +57,12 @@ import com.zhjt.mogo_core_function_devatools.badcase.BadCaseAnalyticsManager import com.zhjt.mogo_core_function_devatools.badcase.biz.adapter.BadReasonListAdapter import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseNetManager import com.zhjt.mogo_core_function_devatools.badcase.repository.store.BadCaseReasonStore -import me.jessyan.autosize.utils.AutoSizeUtils +import com.zhjt.mogo_core_function_devatools.badcase.util.RecordBitmapUtils import org.greenrobot.eventbus.EventBus import org.json.JSONArray import org.json.JSONException import org.json.JSONObject import java.io.File -import java.lang.Exception import java.lang.StringBuilder /** @@ -72,7 +71,7 @@ import java.lang.StringBuilder * @since: 2022/7/17 */ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListener, - BadCaseNetListener { + BadCaseNetListener , IMoGoMapScreenListener { companion object { const val TAG = "PassiveBadCaseWindow" @@ -108,7 +107,6 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var mInScreenY = 0f private var clickListener: ClickListener? = null - var countDownTimer: CountDownTimer?=null private lateinit var tvPassiveNum: TextView private lateinit var tvPassiveTime: TextView @@ -116,7 +114,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private lateinit var viewAudioBg: ImageView private lateinit var viewAudioButton: ImageView - private lateinit var tvAudioCountDown: TextView + private lateinit var viewAudioStart: ImageView + private lateinit var tvAudioResult: TextView private lateinit var tvPassiveReport: TextView private lateinit var tvPassiveCancel: TextView @@ -129,7 +128,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene // 用HashMap存储听写结果 private val mIatResults: HashMap = LinkedHashMap() - private var reasonDetail: String ?= null //语音转写 + private var reasonDetail: String = "" //语音转写 private var uploadReasonTotal: String = "" private var isUploadCos = false //是否在上传Cos操作 @@ -156,8 +155,9 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene tvPassiveTime = mFloatLayout.findViewById(R.id.tvPassiveTime) tvPassiveIdentity = mFloatLayout.findViewById(R.id.tvPassiveIdentity) viewAudioBg = mFloatLayout.findViewById(R.id.viewAudioBg) + tvAudioResult = mFloatLayout.findViewById(R.id.tvAudioResult) viewAudioButton = mFloatLayout.findViewById(R.id.viewAudioButton) - tvAudioCountDown = mFloatLayout.findViewById(R.id.tvAudioCountDown) + viewAudioStart = mFloatLayout.findViewById(R.id.viewAudioStart) tvPassiveReport = mFloatLayout.findViewById(R.id.tvPassiveReport) tvPassiveCancel = mFloatLayout.findViewById(R.id.tvPassiveCancel) rvPassiveList = mFloatLayout.findViewById(R.id.rvPassiveList) @@ -183,6 +183,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene */ BadCaseNetManager.badCaseNetManager.getRecordOption(2,AppConfigInfo.iPCMacAddress) // BadCaseNetManager.badCaseNetManager.getRecordOption(2,"48:b0:2d:3a:9c:8f") + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(this.hashCode().toString(),this) CallerDevaToolsNetManager.addListener(this.hashCode().toString(),this) if(BadCaseConfig.windowNum<1){ BadCaseConfig.windowNum = 1 @@ -213,11 +215,10 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() uploadAudio() } //删除记录 @@ -314,6 +315,9 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } Log.i(TAG, "语音内容=$resultBuffer") reasonDetail = resultBuffer.toString() + if(reasonDetail.isNotEmpty()){ + tvAudioResult.text = reasonDetail + } } @@ -339,35 +343,17 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene ) scaleAnimation.duration = 1000 scaleAnimation.repeatCount = -1 - viewAudioButton.startAnimation(scaleAnimation) - - tvAudioCountDown.visibility = View.VISIBLE - //开始倒计时 - if(countDownTimer==null){ - countDownTimer = object : CountDownTimer(60000, 1000) { - - override fun onTick(millisUntilFinished: Long) { - tvAudioCountDown.text = "${millisUntilFinished/1000}S" - } - - override fun onFinish() { - tvAudioCountDown.visibility = View.GONE - //结束录音 - RecordManager.getInstance().stop() - //结束动画 - viewAudioButton.clearAnimation() - } - } - countDownTimer?.start() - } + viewAudioButton.visibility = View.GONE + viewAudioStart.visibility = View.VISIBLE + viewAudioStart.startAnimation(scaleAnimation) + tvAudioResult.text = "..." }else{ //停止语音听写 mIat?.stopListening() - //结束倒计时 - countDownTimer?.cancel() - countDownTimer?.onFinish() - //将倒计时置空 - countDownTimer = null + //结束录音 + RecordManager.getInstance().stop() + //结束动画 + viewAudioStart.clearAnimation() } } @@ -430,11 +416,13 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene */ private fun upload(downloadUrl: String?){ GlobalScope.launch{ - uploadReasonTotal = if(reasonDetail.isNullOrEmpty()){ + uploadReasonTotal = if(reasonDetail.isEmpty()){ uploadReason.toString() }else{ "$uploadReason 语音内容:$reasonDetail" } + //上报到工控机 + CallerAutoPilotControlManager.recordCause(recordKey,recordFileName,"",uploadReason.toString()+reasonDetail) val uploadResult = presenter.upload(mutableMapOf().also { itx -> itx["carLicense"] = AppConfigInfo.plateNumber //车牌号 itx["filename"] = recordFileName?:"" //bag包文件地址 @@ -535,6 +523,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene fun hideFloatWindow() { + //注销高精地图截图监听回调 + CallerMapScreenListenerManager.removeListener(this.hashCode().toString()) //注销采集原因回调监听 CallerDevaToolsNetManager.removeListener(this.hashCode().toString()) // 移除 ADAS车辆状态&定位 监听 @@ -555,6 +545,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene recordFileName = recordBagMsg.fileName receiveTime = msgBoxBean.timestamp.toString() stat = recordBagMsg.stat.toString() + //获取高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() } fun setClickListener(clickListener: ClickListener) { @@ -617,4 +609,22 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } } + /** + * 高精地图截图回调 + */ + override fun onMapScreen(bitmap: Bitmap) { + //图片保存本地 + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormat()) + val fileDir: String = Environment.getExternalStorageDirectory().absolutePath + File.separator+ + "MapScreen" + File.separator+ currentDay + File.separator + val fileName = "$recordKey.png" + val path = fileDir + fileName + if (!File(fileDir).exists()) { + File(fileDir).mkdirs() + } + RecordBitmapUtils.bitmap2Path(bitmap,path) + //遍历是否有非当日的文件并删除 + RecordBitmapUtils.deleteExpiredFile(currentDay) + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/RecordScreenDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/RecordScreenDialog.java new file mode 100644 index 0000000000..2998bb7142 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/RecordScreenDialog.java @@ -0,0 +1,66 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz; + +import static com.mogo.eagle.core.utilcode.util.FileUtils.millis2String; +import static com.mogo.eagle.core.utilcode.util.TimeUtils.getMdFormat; + +import android.app.Dialog; +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.os.Environment; +import android.view.WindowManager; +import android.widget.ImageView; + +import androidx.annotation.NonNull; + +import com.zhjt.mogo_core_function_devatools.R; + +import java.io.File; + +/** + * 录包时鹰眼截图查看对话框 + */ +public class RecordScreenDialog extends Dialog { + + private ImageView ivScreen; //截图展示 + private ImageView ivScreenClose; //关闭按钮 + + private Context mContext; + + public RecordScreenDialog(@NonNull Context context) { + super(context, R.style.bad_case_dialog); + mContext = context; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_record_screen); + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.height = 1013; + params.width = 1708; + getWindow().setAttributes(params);//向WindowManager设置属性 + setCanceledOnTouchOutside(false); + init(); + initEvent(); + } + + private void init(){ + ivScreen = findViewById(R.id.ivScreen); + ivScreenClose = findViewById(R.id.ivScreenClose); + } + + private void initEvent(){ + //关闭当前弹窗 + ivScreenClose.setOnClickListener(view -> dismiss()); + } + + public void showScreenImage(Long recordKey){ + String imagePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator+ + "MapScreen" + File.separator+ millis2String(System.currentTimeMillis(),getMdFormat()) + File.separator+recordKey+".png"; + Uri imageUri = Uri.parse(imagePath); + + ivScreen.setImageURI(imageUri); + } + +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt index e8b1f34210..67d912e1e8 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt @@ -12,9 +12,13 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.data.deva.badcase.BagDescriptionEntity import com.mogo.eagle.core.data.deva.badcase.BagInfoEntity +import com.mogo.eagle.core.utilcode.util.FileUtils.millis2String +import com.mogo.eagle.core.utilcode.util.TimeUtils import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import java.text.DecimalFormat + /** * @author XuXinChao * @description Bag包管理列表适配器 @@ -32,14 +36,14 @@ class BagManagerListAdapter: RecyclerView.Adapter() { } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - if(viewType == 1){ + return if(viewType == 1){ val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_bag_time_title,parent,false) - return BagTimeTitleHolder(view) + BagTimeTitleHolder(view) }else{ val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_bag_manager, parent, false) - return BagManagerListHolder(view) + BagManagerListHolder(view) } } @@ -92,18 +96,25 @@ class BagManagerListAdapter: RecyclerView.Adapter() { bagInfoEntity.description?.let { des-> - if(des.reportBI){ - //已上报 - holder.tvBagReportStatus.text = "已上报" + if(BadCaseConfig.bagRecordFailList.contains(bagInfoEntity.key)){ + //如果在录包失败列表中找到该Bag包,则该包为录包失败状态 + holder.tvBagReportStatus.text = "录包失败" holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_reported_button_bg) holder.tvBagReportStatus.isClickable = false }else{ - //未上报 - holder.tvBagReportStatus.text = "上报" - holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_report_button_bg) - holder.tvBagReportStatus.isClickable = true - holder.tvBagReportStatus.setOnClickListener { - bagClickListener?.uploadBI(bagInfoEntity) + if(des.reportBI){ + //已上报 + holder.tvBagReportStatus.text = "已上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_reported_button_bg) + holder.tvBagReportStatus.isClickable = false + }else{ + //未上报 + holder.tvBagReportStatus.text = "上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_report_button_bg) + holder.tvBagReportStatus.isClickable = true + holder.tvBagReportStatus.setOnClickListener { + bagClickListener?.uploadBI(bagInfoEntity) + } } } if(des.description.isEmpty()){ @@ -113,6 +124,30 @@ class BagManagerListAdapter: RecyclerView.Adapter() { } } + holder.ivMapScreen.setOnClickListener { + bagInfoEntity.description?.let { + bagClickListener?.lookMapScreen(bagInfoEntity.key) + } + } + + //录包来源:自动 or 人工 + if(BadCaseConfig.bagResourceList.contains(bagInfoEntity.key)){ + //在该列表中找到Bag包的Key则代表该Bag为人工录包 + holder.tvBagResource.text = "人工" + holder.tvBagResource.setBackgroundResource(R.drawable.bag_artificial_button_bg) + }else{ + //自动录包 + holder.tvBagResource.text = "自动" + holder.tvBagResource.setBackgroundResource(R.drawable.bag_auto_button_bg) + } + + //编辑文字按钮 + holder.ivEditReason.setOnClickListener { + holder.etBagNameEdit.requestFocus() + holder.etBagNameEdit.performClick() + //调起软键盘 + bagClickListener?.startEdit(holder.etBagNameEdit) + } if(bagInfoEntity.description?.hasAudio == true){ holder.ivBagAudio.visibility = View.VISIBLE @@ -139,6 +174,15 @@ class BagManagerListAdapter: RecyclerView.Adapter() { e.printStackTrace() } } + + //只有当天的Bag才显示查看截图按钮 + bagInfoEntity.timestamp.let {day -> + val currentDay = millis2String(System.currentTimeMillis(), TimeUtils.getMdFormatTwo()) + if(day.contains(currentDay)){ + holder.ivMapScreen.visibility = View.VISIBLE + } + } + } } } @@ -161,6 +205,9 @@ class BagManagerListAdapter: RecyclerView.Adapter() { var ivBagAudio: ImageView = itemView.findViewById(R.id.ivBagAudio) var tvBagTime: TextView = itemView.findViewById(R.id.tvBagTime) var tvBagSize: TextView = itemView.findViewById(R.id.tvBagSize) + var ivMapScreen: ImageView = itemView.findViewById(R.id.ivMapScreen) + var tvBagResource: TextView = itemView.findViewById(R.id.tvBagResource) + var ivEditReason: ImageView = itemView.findViewById(R.id.ivEditReason) } fun setListener(listener: BagClickListener){ @@ -176,6 +223,10 @@ class BagManagerListAdapter: RecyclerView.Adapter() { fun editDescription(key: Long,description: BagDescriptionEntity) //听录音 fun bagAudio(key: Long,audioUrl: String) + //查看高精地图截图 + fun lookMapScreen(key: Long) + //点击按钮调起编辑Bag包信息 + fun startEdit(editText: EditText) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt index 29b7741383..26f9fc5f96 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt @@ -1,6 +1,8 @@ package com.zhjt.mogo_core_function_devatools.badcase.consts import com.mogo.eagle.core.data.deva.badcase.BagInfoEntity +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.msgbox.FMInfoMsg /** * @author XuXinChao @@ -29,6 +31,23 @@ object BadCaseConfig { //工控机版本 @JvmField var dockerVersion:String ?= null + //当前车速 + @JvmField + var currentSpeed: Int = 0 + //最新的上报消息 + @JvmField + var newReportEntity: ReportEntity ?= null + //最新的FM消息 + @JvmField + var newFMInfoMsg: FMInfoMsg ?= null + //GPS状态 + @JvmField + var gpsStatus: String ?= null + //寻迹算路 + @JvmField + var tracingStatus: String ?= null + //云Socket连接状态 + var socketStatus: String ?= null @JvmField var recordKeyList:ArrayList = ArrayList() //自定义Topic清单列表 @@ -37,5 +56,11 @@ object BadCaseConfig { //Bag包管理列表 @JvmField var bagManagerList: ArrayList = ArrayList() + //Bag包来源,将主动录包的Key保存在该列表中,不在该列表中的在录包管理页面的Bag包视为被动录包 + @JvmField + var bagResourceList: ArrayList = ArrayList() + //Bag包录包失败状态列表,当Bag录制失败时保存在该列表,当Bag包在该列表中不存在时即视为录包成功 + @JvmField + var bagRecordFailList: ArrayList = ArrayList() } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt new file mode 100644 index 0000000000..5ee8056017 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/util/RecordBitmapUtils.kt @@ -0,0 +1,117 @@ +package com.zhjt.mogo_core_function_devatools.badcase.util + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.os.Environment +import android.util.Log +import com.mogo.eagle.core.data.deva.report.ReportEntity +import com.mogo.eagle.core.data.msgbox.FMInfoMsg +import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.zhjt.mogo_core_function_devatools.badcase.biz.InitiativeBadCaseWindow +import java.io.File +import java.io.FileOutputStream +import java.io.OutputStream + +object RecordBitmapUtils { + + /** + * 将Bitmap保存到本地 + */ + fun bitmap2Path(bitmap: Bitmap, path: String?): String? { + try { + val os: OutputStream = FileOutputStream(path) + bitmap.compress(Bitmap.CompressFormat.PNG, 80, os) + os.flush() + os.close() + } catch (e: java.lang.Exception) { + Log.e(InitiativeBadCaseWindow.TAG, "bitmap2Path Exception", e) + } + return path + } + + /** + * 删除过期文件 + */ + fun deleteExpiredFile(currentDay: String){ + val checkFileName = Environment.getExternalStorageDirectory().absolutePath + File.separator+ "MapScreen" + val checkFileFolder = File(checkFileName) + if(checkFileFolder.exists()){ + checkFileFolder.listFiles()?.forEach {dir-> + if(dir.name != currentDay && dir.isDirectory){ + dir.listFiles()?.forEach { file-> + file.delete() + } + dir.delete() + } + } + } + } + + /** + * 在指定Bitmap中绘制文字 + */ + fun drawTextOnBitmap(bitmap: Bitmap, time: String,lineId: String,state: String,currentSpeed: String + ,gpsStatus: String?,tracingStatus: String?,socketStatus: String? + ,fm: FMInfoMsg?,report: ReportEntity? + ): Bitmap? { + val mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true) + val canvas = Canvas(mutableBitmap) + val paint = Paint() + paint.color = Color.RED + paint.textSize = 50f + paint.isAntiAlias = true + canvas.drawText(time, 100f, 100f, paint) + canvas.drawText(lineId,100f,200f,paint) + canvas.drawText(state,100f,300f,paint) + canvas.drawText(currentSpeed,100f,400f,paint) + + gpsStatus?.let { + canvas.drawText(it,1000f,100f,paint) + } + tracingStatus?.let { + canvas.drawText(it,1000f,200f,paint) + } + socketStatus?.let { + canvas.drawText(it,1000f,300f,paint) + } + + fm?.let { + canvas.drawText("FM:${MsgFmData.getFmPolicyName(it.policyCode)}",100f,600f,paint) + canvas.drawText("故障策略:${MsgFmData.getFmPolicyName(it.policyCode)}(${it.policyCode})",100f,700f,paint) + //故障原因 + if(it.fmInfoList.isNullOrEmpty()){ + canvas.drawText("故障原因:暂无",100f,800f,paint) + }else{ + val fmFaultReason = StringBuilder() + fmFaultReason.append("故障原因:") + for((index,info) in it.fmInfoList!!.withIndex()){ + fmFaultReason.append(info.faultName) + if(info.faultId.isNotBlank()){ + fmFaultReason.append("(") + fmFaultReason.append(info.faultId) + fmFaultReason.append(")") + } + if(index!=(it.fmInfoList!!.size-1)){ + fmFaultReason.append("/") + } + } + canvas.drawText(fmFaultReason.toString(),100f,800f,paint) + } + } + report?.let { + var resultStr = "上报类型:" + for (result in it.resultList) { + resultStr = + "${resultStr}${CallerAutoPilotControlManager.getReportResultDesc(result)}" + } + canvas.drawText(resultStr,100f,1000f,paint) + canvas.drawText("原因:${it.msg}",100f,1100f,paint) + canvas.drawText("消息来源:${it.src}",100f,1200f,paint) + } + return mutableBitmap + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt index b2e9732364..50a6404f54 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/funcconfig/network/FuncConfigNetWorkModel.kt @@ -38,12 +38,12 @@ class FuncConfigNetWorkModel { if (error == null) { error = onError } - map["sn"] = MoGoAiCloudClientConfig.getInstance().sn - map["mac"] = DeviceUtils.getMacAddress() - map["channelVersion"] = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) } loader { apiCall { + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["mac"] = DeviceUtils.getMacAddress() + map["channelVersion"] = AppIdentityModeUtils.getMisChannelCode(FunctionBuildConfig.appIdentityMode) getNetWorkApi().funcConfig(map) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt index fd9b3442a6..de503482f7 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/mofang/MoFangCommandExecutor.kt @@ -7,6 +7,7 @@ import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.data.config.* import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.* +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.* import com.zhjt.mogo.adas.data.bean.MogoReport.Code.Info.IMF @@ -57,6 +58,7 @@ internal class MoFangCommandExecutor { private const val MSG_WHAT_KEY_CODE_D = 0x06 private const val MSG_WHAT_KEY_CODE_E = 0x07 private const val MSG_WHAT_KEY_CODE_EL = 0x08 + private const val MSG_WHAT_KEY_CODE_BL = 0x09 } @Volatile @@ -232,6 +234,27 @@ internal class MoFangCommandExecutor { } } } + MSG_WHAT_KEY_CODE_BL -> { + try { + Log.d(TAG, "--- 长按录包 ---") + MoFangAnalyticUtils.track(EVENT_EXECUTE, mutableMapOf( + EVENT_EXECUTE_PARAMS_KEYCODE to (getKeycodeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_TYPE to (getInputTypeByWhat(msg.what) ?: ""), + EVENT_EXECUTE_PARAMS_LON to location.longitude, + EVENT_EXECUTE_PARAMS_LAT to location.latitude, + EVENT_EXECUTE_PARAMS_SPEED to location.gnssSpeed, + EVENT_EXECUTE_PARAMS_ACC to location.acceleration, + EVENT_EXECUTE_PARAMS_HEADING to location.heading, + EVENT_EXECUTE_PARAMS_LINE_ID to CallerAutoPilotStatusListenerManager.getLineId(), + EVENT_EXECUTE_PARAMS_DOCKER_VERSION to (CallerAutoPilotStatusListenerManager.getDockerVersion() ?: "") + )) + linkedLog?.record(mapOf("执行:${System.currentTimeMillis()}" to "$message, $msg")) + CallerDevaToolsManager.startRecordByMoFang() + } catch (t: Throwable) { + t.printStackTrace() + Log.e(TAG, "error: ${t.message}, msg-> $msg") + } + } } true } @@ -266,6 +289,9 @@ internal class MoFangCommandExecutor { MSG_WHAT_KEY_CODE_E -> { "单击键E->开启自驾$extra" } + MSG_WHAT_KEY_CODE_BL -> { + "长按键B->录包$extra" + } MSG_WHAT_KEY_CODE_EL -> { "长按键E->鸣笛$extra" } @@ -276,7 +302,7 @@ internal class MoFangCommandExecutor { private fun getKeycodeByWhat(what: Int): String? { return when(what) { MSG_WHAT_KEY_CODE_A, MSG_WHAT_KEY_CODE_AL -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A) - MSG_WHAT_KEY_CODE_B -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B) + MSG_WHAT_KEY_CODE_B, MSG_WHAT_KEY_CODE_BL -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B) MSG_WHAT_KEY_CODE_AB -> "${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_A)},${KeyEvent.keyCodeToString(KeyEvent.KEYCODE_B)}" MSG_WHAT_KEY_CODE_C -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_C) MSG_WHAT_KEY_CODE_D -> KeyEvent.keyCodeToString(KeyEvent.KEYCODE_D) @@ -294,7 +320,7 @@ internal class MoFangCommandExecutor { MSG_WHAT_KEY_CODE_E -> { "1" } - MSG_WHAT_KEY_CODE_AL,MSG_WHAT_KEY_CODE_EL -> { + MSG_WHAT_KEY_CODE_AL, MSG_WHAT_KEY_CODE_BL, MSG_WHAT_KEY_CODE_EL -> { "2" } MSG_WHAT_KEY_CODE_AB -> { @@ -387,6 +413,15 @@ internal class MoFangCommandExecutor { }) linkedLog?.record(mapOf("发送[EL]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_EL)}")) } + + if (keyCode == KeyEvent.KEYCODE_B) { + Log.d(TAG, "--- 长按键B --- 触发录包 ----") + handler.removeMessages(MSG_WHAT_KEY_CODE_BL) + handler.sendMessage(Message.obtain().also { + it.what = MSG_WHAT_KEY_CODE_BL + }) + linkedLog?.record(mapOf("发送[BL]:${System.currentTimeMillis()}" to "${whatToString(MSG_WHAT_KEY_CODE_BL)}")) + } } fun handleCombineClick(vararg keyCodes: Int) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt index 712307239a..7b69cb6213 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/upgrade/IPCUpgradeNetWorkModel.kt @@ -34,20 +34,20 @@ class IPCUpgradeNetWorkModel { fun upgradeConfirm(images: List,padSn: String,releaseId: String, onSuccess: ((String) -> Unit),onError: ((String) -> Unit)){ request> { - val requestJson = JSONObject() - val imagesJsonArray = JSONArray() - images.iterator().forEach { - imagesJsonArray.put(it) - } - requestJson.put("images",imagesJsonArray) - requestJson.put("padSn",padSn) - requestJson.put("releaseId",releaseId) - val requestBody:RequestBody= RequestBody.create( - MediaType.parse("application/json; charset=utf-8"), - requestJson.toString() - ) loader{ apiCall{ + val requestJson = JSONObject() + val imagesJsonArray = JSONArray() + images.iterator().forEach { + imagesJsonArray.put(it) + } + requestJson.put("images",imagesJsonArray) + requestJson.put("padSn",padSn) + requestJson.put("releaseId",releaseId) + val requestBody:RequestBody= RequestBody.create( + MediaType.parse("application/json; charset=utf-8"), + requestJson.toString() + ) getNetWorkApi(getBaseUrl()).upgradeConfirm(requestBody) } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_screen_close.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_screen_close.png new file mode 100644 index 0000000000..1899acac7e Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_screen_close.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_artificial_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_artificial_button_bg.xml new file mode 100644 index 0000000000..03f1407ad1 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_artificial_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_auto_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_auto_button_bg.xml new file mode 100644 index 0000000000..fdc5ea6d1e --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_auto_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_record_screen.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_record_screen.xml new file mode 100644 index 0000000000..a2f20a926d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_record_screen.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml index 8cd8a75b48..3d02585ffa 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml @@ -17,25 +17,56 @@ app:layout_constraintStart_toStartOf="parent" /> - + + + + + + + - + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml index 96a89f7004..3424a3f421 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml @@ -104,6 +104,23 @@ android:layout_marginBottom="@dimen/dp_40" /> + + - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml index 4178a3b155..72e93d6b9d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_passive_bad_case.xml @@ -104,6 +104,23 @@ android:layout_marginBottom="@dimen/dp_40" /> + + - - \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt index c1bde36d11..b990722143 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/lookaround/M1LookAroundView.kt @@ -5,7 +5,6 @@ import android.graphics.* import android.graphics.Paint.Style.STROKE import android.os.Handler import android.os.HandlerThread -import android.os.SystemClock import android.util.* import android.view.SurfaceHolder import android.view.SurfaceView @@ -15,6 +14,8 @@ import com.mogo.eagle.core.function.api.lookaround.data.* import com.mogo.eagle.core.function.call.autopilot.* import com.mogo.eagle.core.function.call.devatools.* import com.mogo.eagle.core.utilcode.kotlin.* +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.Utils import kotlinx.coroutines.* @@ -279,12 +280,11 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas override fun onAttachedToWindow() { super.onAttachedToWindow() CallerChassisSteeringStateListenerManager.addListener(TAG, this) - Log.d(TAG, "--- 发起订阅 ---") CallerAutoPilotControlManager.setIsSubscribeM1StitchedVideo(true) scope.launch(ThreadUtils.getCpuPool().asCoroutineDispatcher()) { CallerDevaToolsManager.lookAroundProvider()?.flow()?.also { flow -> flow.onEach { - Log.d(TAG, "-- onEach ---:$it") + CallerLogger.d("$M_HMI$TAG", "-- onEach ---:$it") if (it.isValid()) { data = it handler.get()?.removeCallbacks(this@M1LookAroundView) @@ -307,7 +307,6 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas override fun onDetachedFromWindow() { super.onDetachedFromWindow() CallerChassisSteeringStateListenerManager.removeListener(TAG) - Log.d(TAG, "--- 取消订阅 ---") CallerAutoPilotControlManager.setIsSubscribeM1StitchedVideo(false) handler.get()?.looper?.quitSafely() } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt index 1c4e6a7a75..905b83cff0 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxBubbleAdapter.kt @@ -19,8 +19,6 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.function.msgbox.MsgBoxConfig -import com.mogo.eagle.core.function.msgbox.MsgFmData import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.util.TimeUtils diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt index 9abf8fd4d3..b35f490ca8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/DriverMsgBoxListAdapter.kt @@ -18,7 +18,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.hmi.R -import com.mogo.eagle.core.function.msgbox.MsgFmData import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java index 5245de3bd6..16d9dd686b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/TrafficDataView.java @@ -18,13 +18,11 @@ import androidx.constraintlayout.widget.ConstraintLayout; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisBrakeStateListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisGearStateListener; -import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisSteeringStateListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisThrottleStateListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisBrakeStateListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisGearStateListenerManager; -import com.mogo.eagle.core.function.call.autopilot.CallerChassisSteeringStateListenerManager; import com.mogo.eagle.core.function.call.autopilot.CallerChassisThrottleStateListenerManager; import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.utilcode.util.ThreadUtils; @@ -33,8 +31,6 @@ import org.jetbrains.annotations.NotNull; import chassis.Chassis; import mogo.telematics.pad.MessagePad; -import chassis.ChassisStatesOuterClass; -import planning.RoboSweeperTaskIndexOuterClass; /** * @author Jing @@ -42,7 +38,6 @@ import planning.RoboSweeperTaskIndexOuterClass; * @since: 6/24/22 */ public class TrafficDataView extends ConstraintLayout implements - IMoGoChassisSteeringStateListener, IMoGoChassisGearStateListener , IMoGoChassisBrakeStateListener, IMoGoChassisThrottleStateListener, @@ -54,9 +49,6 @@ public class TrafficDataView extends ConstraintLayout implements private ImageView speedImage; private ImageView brakeStatus; - //圆弧颜色 - private int mArcColor; - private static final int MSG_SEND_UPDATE = 1; private volatile double acceleration; private volatile float mBrake; @@ -114,7 +106,6 @@ public class TrafficDataView extends ConstraintLayout implements protected void onAttachedToWindow() { super.onAttachedToWindow(); handler.sendEmptyMessageDelayed(MSG_SEND_UPDATE, 1000L); - CallerChassisSteeringStateListenerManager.INSTANCE.addListener(TAG, this); CallerChassisGearStateListenerManager.INSTANCE.addListener(TAG, this); CallerChassisBrakeStateListenerManager.INSTANCE.addListener(TAG, this); CallerChassisThrottleStateListenerManager.INSTANCE.addListener(TAG, this); @@ -133,7 +124,6 @@ public class TrafficDataView extends ConstraintLayout implements @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - CallerChassisSteeringStateListenerManager.INSTANCE.removeListener(TAG); CallerChassisGearStateListenerManager.INSTANCE.removeListener(TAG); CallerChassisBrakeStateListenerManager.INSTANCE.removeListener(TAG); CallerChassisThrottleStateListenerManager.INSTANCE.removeListener(TAG); @@ -145,20 +135,8 @@ public class TrafficDataView extends ConstraintLayout implements acceleration = planningActionMsg.getDestinationAcc(); } - /** - * 方向盘转向角 左+右- - * @param steering - */ - @Override - public void onAutopilotSteeringData(float steering) { - if (Math.abs(steering) < 1) { - steering = 0; - } - } - /** * 档位 - * @param gear */ @Override public void onAutopilotGearData(@NotNull Chassis.GearPosition gear) { @@ -178,23 +156,6 @@ public class TrafficDataView extends ConstraintLayout implements public void onAutopilotThrottle(float throttle) { mThrottle = throttle; } - /** - * 设置弧形颜色 - * - * @param value 颜色值 - */ - public void setArcColor(int value) { - mArcColor = value; - } - - /** - * 设置数据 - * - * @param value 当前绘制的值 - */ - public void setValues(int value) { - - } /** * value呈现 diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt index 61a48f2c0b..fad2bd1230 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/business/ai/net/AiCloudIdentifyNetWorkModel.kt @@ -29,22 +29,20 @@ class AiCloudIdentifyNetWorkModel private constructor() { onError: ((String) -> Unit) ) { request> { - val map = mutableMapOf() - start { - map["sn"] = MoGoAiCloudClientConfig.getInstance().sn - map["status"] = dataReceive - map["startMetre"] = START_METRE - map["endMetre"] = END_METRE - map["type"] = 1 - if (lon != 0.0) { - map["lon"] = lon - } - if (lat != 0.0) { - map["lat"] = lat - } - } loader { apiCall { + val map = mutableMapOf() + map["sn"] = MoGoAiCloudClientConfig.getInstance().sn + map["status"] = dataReceive + map["startMetre"] = START_METRE + map["endMetre"] = END_METRE + map["type"] = 1 + if (lon != 0.0) { + map["lon"] = lon + } + if (lat != 0.0) { + map["lat"] = lat + } getNetWorkApi().identifyRange(map) } } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt index dc4146fbbc..3fabcc1373 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/deva/badcase/RecordCaseEntity.kt @@ -1,3 +1,9 @@ package com.mogo.eagle.core.data.deva.badcase -data class RecordCaseEntity(var caseId: Int,var caseName: String,var topicList: ArrayList) \ No newline at end of file +import com.google.protobuf.ProtocolStringList + +data class RecordCaseEntity( + var caseId: Int, + var caseName: String, + var topicList: ProtocolStringList +) \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt similarity index 99% rename from core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt rename to core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt index 064484cc27..32297c55cc 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/msgbox/MsgFmData.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/msgbox/MsgFmData.kt @@ -1,6 +1,4 @@ -package com.mogo.eagle.core.function.msgbox - -import com.zhjt.mogo.adas.data.bean.MogoReport +package com.mogo.eagle.core.data.msgbox /** * FM信息对照表 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index 750ae690c2..8a4a6c716b 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -113,6 +113,11 @@ interface IDevaToolsProvider : IProvider { */ fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) + /** + * 魔方开启主动录包 + */ + fun startRecordByMoFang() + /** * 展示录包配置 */ diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/deva/IMoGoMapScreenListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/deva/IMoGoMapScreenListener.kt new file mode 100644 index 0000000000..8c4d1a83b8 --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/map/deva/IMoGoMapScreenListener.kt @@ -0,0 +1,10 @@ +package com.mogo.eagle.core.function.api.map.deva + +import android.graphics.Bitmap + +interface IMoGoMapScreenListener { + /** + * 高精地图监听回调 + */ + fun onMapScreen(bitmap: Bitmap){} +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt index 9f614cc914..5ede15519a 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotStatusListenerManager.kt @@ -26,6 +26,9 @@ object CallerAutoPilotStatusListenerManager : CallerBase if (oldValue != newValue) { - fixAtStationState(newValue) + //todo emArrow chainLog M_LISTENERS.forEach { val listener = it.value listener.onAutopilotStatusResponse(newValue) @@ -42,19 +45,6 @@ object CallerAutoPilotStatusListenerManager : CallerBase if (!oldValue.contentEquals(newValue)) { M_LISTENERS.forEach { diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index f8accbd915..faab951939 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -149,6 +149,13 @@ object CallerDevaToolsManager { devaToolsProviderApi?.onReceiveBadCaseRecord(msgBoxBean, activity,countdown) } + /** + * 魔方开启主动录包 + */ + fun startRecordByMoFang(){ + devaToolsProviderApi?.startRecordByMoFang() + } + /** * 展示录包配置页面 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapScreenListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapScreenListenerManager.kt new file mode 100644 index 0000000000..7b6068a0ff --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/map/CallerMapScreenListenerManager.kt @@ -0,0 +1,22 @@ +package com.mogo.eagle.core.function.call.map + +import android.graphics.Bitmap +import com.mogo.eagle.core.function.api.map.deva.IMoGoMapScreenListener +import com.mogo.eagle.core.function.call.base.CallerBase + +/** + * 高精地图屏幕截图回调监听管理 + */ +object CallerMapScreenListenerManager: CallerBase() { + + /** + * 高精地图屏幕截图回调 + */ + fun invokeMapScreen(bitmap: Bitmap){ + M_LISTENERS.forEach{ + val listener = it.value + listener.onMapScreen(bitmap) + } + } + +} \ No newline at end of file diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java index 2ad587de61..3edf2d84c8 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/TimeUtils.java @@ -47,6 +47,14 @@ public final class TimeUtils { return getSafeDateFormat("yyyy-MM-dd HH:mm:ss"); } + public static SimpleDateFormat getMdFormat(){ + return getSafeDateFormat("yyyy-MM-dd"); + } + + public static SimpleDateFormat getMdFormatTwo(){ + return getSafeDateFormat("yyyyMMdd"); + } + public static SimpleDateFormat getHourMinSecondFormat(){ return getSafeDateFormat("HH:mm:ss"); } diff --git a/foudations/mogo-commons/build.gradle b/foudations/mogo-commons/build.gradle index f39dbedbe7..f182270d1b 100644 --- a/foudations/mogo-commons/build.gradle +++ b/foudations/mogo-commons/build.gradle @@ -51,8 +51,6 @@ dependencies { implementation rootProject.ext.dependencies.arouter annotationProcessor rootProject.ext.dependencies.aroutercompiler implementation rootProject.ext.dependencies.rxjava - - implementation rootProject.ext.dependencies.amapnavi3dmap implementation rootProject.ext.dependencies.analytics api 'org.greenrobot:eventbus:3.1.1' diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/module/ServiceConst.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/module/ServiceConst.java deleted file mode 100644 index 9a3ce9b413..0000000000 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/module/ServiceConst.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.mogo.commons.module; - -/** - * @author congtaowang - * @since 2020-01-03 - *

- * 描述 - */ -public class ServiceConst { - - /** - * 类型 - */ - public static final String TYPE = "STRATEGY_REFRESH"; - - - /** - * 卡片 用户数据 - */ - public static final String CARD_TYPE_USER_DATA = "CARD_TYPE_USER_DATA"; - - /** - * 卡片 探路数据 - */ - public static final String CARD_TYPE_ROAD_CONDITION = "CARD_TYPE_ROAD_CONDITION"; - - /** - * 卡片 新鲜事 - */ - public static final String CARD_TYPE_NOVELTY = "CARD_TYPE_NOVELTY"; - -} diff --git a/gradle.properties b/gradle.properties index fa2ca24e8e..c911518c2c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -61,7 +61,7 @@ bytex.ASM_API=ASM7 ################ 外部依赖引用 ################ # loglib -LOGLIB_VERSION=1.10.6 +LOGLIB_VERSION=1.10.7 ######## MogoAiCloudSDK Version ######## # 网络请求LOGLIB_VERSION MOGO_NETWORK_VERSION=1.4.7.19 diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt index f924bf6193..2e08c74471 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.kt @@ -330,4 +330,9 @@ interface IMogoMapUIController { * 设置地图默认视角 */ fun setVrAngleDefaultMode(mode: VisualAngleMode) + + /** + * 获取高精地图截图 + */ + fun getMapScreenShot() } \ No newline at end of file diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt index 16342b6969..b44e5bd196 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.kt @@ -1,5 +1,6 @@ package com.mogo.map +import android.graphics.Bitmap import android.graphics.Point import android.graphics.Rect import android.os.Bundle @@ -8,6 +9,7 @@ import android.os.HandlerThread import android.text.TextUtils import android.view.MotionEvent import android.view.View +import com.autonavi.nge.map.OnMapScreenShotListener import com.mogo.eagle.core.data.deva.chain.ChainConstant import com.mogo.eagle.core.data.enums.TrafficTypeEnum import com.mogo.eagle.core.data.map.MogoLatLng @@ -19,6 +21,7 @@ import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.invoke import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager.invokeRoadChange import com.mogo.eagle.core.function.call.map.CallerMapRomaListener.invokeMapRomaRange import com.mogo.eagle.core.function.call.map.CallerMapRomaListener.invokeMapRomaStatus +import com.mogo.eagle.core.function.call.map.CallerMapScreenListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i @@ -61,7 +64,7 @@ import kotlin.properties.Delegates class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIController, OnMapLoadedListener, OnMapClickListener, OnMapTouchListener, OnMarkClickListener, OnMapStyleListener, OnMapViewVisualAngleChangeListener, OnRoadInfoListener, - ILog, OnRoamStatusListener, OnRoadSideFenceRegionListener { + ILog, OnRoamStatusListener, OnRoadSideFenceRegionListener,OnMapScreenShotListener { companion object { private const val TAG = "AMapViewWrapper" @@ -124,6 +127,7 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle mMapView.setOnMapViewVisualAngleChangeListener(this) mMapView.setOnRoadInfoListener(this, 1) mMapView.setOnRoadSideFenceRegionListener(this,5000) + mMapView.registerScreenListener(this) registerLogListener(this, mMapView.getEventController()) d(M_MAP + TAG, "initListeners - setOnMapStyleListener - view $mMapView") } @@ -888,6 +892,12 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle } } + override fun getMapScreenShot() { + if(checkAMapView()){ + mMapView.getMapAutoViewHelper()?.toScreen() + } + } + override fun getVrAngleDefaultMode(): VisualAngleMode { if (checkAMapView()) { val code = mMapView.getMapStyleParams()?.getVrAngleDefaultMode() @@ -895,4 +905,12 @@ class AMapViewWrapper(mMapView: MapAutoView) : IMogoMapView, IMogoMapUIControlle } return MODE_MEDIUM_SIGHT } + /** + * 高精地图屏幕截图 + */ + override fun onMapScreenShot(bitmap: Bitmap?) { + bitmap?.let { + CallerMapScreenListenerManager.invokeMapScreen(it) + } + } } \ No newline at end of file