Merge branch 'dev_robotaxi-d-app-module_2110_220915_2.11.0' of gitlab.zhidaoauto.com:zhjt/AndroidApp/MoGoEagleEye into dev_robotaxi-d-app-module_2110_220915_2.11.0

This commit is contained in:
wangmingjun
2022-09-20 19:49:29 +08:00
71 changed files with 1955 additions and 785 deletions

View File

@@ -405,7 +405,7 @@ public class BusOrderModel {
startLon, startLat,
location.getLongitude(), location.getLatitude() );
Logger.i(TAG, "judgeStartStation() distance = " + distance);
CallerLogger.INSTANCE.d(M_BUS + TAG,"judgeStartStation() distance = " + distance);
if ( distance > BusConst.ARRIVE_AT_END_STATION_DISTANCE ) {
distance = CoordinateUtils.calculateLineDistance(startLon, startLat,

View File

@@ -28,7 +28,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager;
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
import com.mogo.eagle.core.utilcode.util.NetworkUtils;
import com.mogo.eagle.core.utilcode.util.ToastUtils;
@@ -1312,7 +1311,7 @@ public class TaxiModel {
public void updateOrderRouteInfo(List<MessagePad.Location> models) {
if (null == models || models.size() == 0) return;
if (mCurrentOCHOrder == null) return;
Logger.d(M_TAXI + TAG, "--------计算出sumLength开始---------- ");
CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------计算出sumLength开始---------- ");
//转换成高德坐标系
if (mRoutePoints.size() > 0){
@@ -1323,12 +1322,12 @@ public class TaxiModel {
}
public void startDynamicCalculateRouteInfo() {
Logger.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder);
CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mCurrentOCHOrder---------- " + mCurrentOCHOrder);
if (mCurrentOCHOrder != null && mRoutePoints.size() == 0) {//根据orderNo去查询
queryOrderRouteList(mCurrentOCHOrder.orderNo);
}
Logger.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size());
CallerLogger.INSTANCE.d(M_TAXI + TAG, "--------mRoutePoints.size---------- " + mRoutePoints.size());
if (mRoutePoints.size() > 0){
reportTotalDisAndTime();
@@ -1368,7 +1367,7 @@ public class TaxiModel {
}
double lastTime = lastSumLength / TaxiConst.TAXI_AVERAGE_SPEED * 3.6; //秒
Logger.d(M_TAXI + "dynamicCalculateRouteInfo"
CallerLogger.INSTANCE.d(M_TAXI + "dynamicCalculateRouteInfo"
, "---lastSumLength: " + lastSumLength + "----lastTime : " + lastTime
+ " thread = "+ Thread.currentThread().getName());

View File

@@ -21,6 +21,7 @@ import com.mogo.commons.debug.DebugConfig;
import com.mogo.eagle.core.data.temp.EventLogout;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.AppStateManager;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.och.taxi.R;
import com.mogo.och.taxi.constant.TaxiOrderStatusEnum;
@@ -386,6 +387,12 @@ public class TaxiFragment extends BaseTaxiTabFragment<TaxiFragment, TaxiPresente
if(dialogFragment.getDialog()!=null&&dialogFragment.getDialog().isShowing()){
return;
}
if(dialogFragment.getDialog()!=null&&dialogFragment.isAdded()){
if (AppStateManager.INSTANCE.currentActivity()==null) {// 没有在当前应用内 在启动页面关闭应用
CallerLogger.INSTANCE.d(M_TAXI + TAG,"showLoginDialogFragment 权限验证");
return;
}
}
}
if(taxiLoginDialogFragment==null||taxiLoginDialogFragment.get()==null) {

View File

@@ -65,7 +65,7 @@ public class TaxiPersonalDialogFragment extends DialogFragment implements View.O
private List<OrderQueryRespBean.Result> orders = new ArrayList<>();
private String[] mTabTitles = {"在线时长","订单完成数"};
private List<TaxiOperationDatasFragment> fragments = new ArrayList<>();
private int mNextPage = 0;
private int mNextPage = 1;//订单列表分页从1开始
private int mPerPageSize = 10;
private static TaxiFragment mTaxiFragment;
private static boolean serverHadNoData = false;

View File

@@ -84,6 +84,7 @@ import com.zhidao.support.adas.high.AdasOptions;
import com.zhidao.support.adas.high.OnAdasConnectStatusListener;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.OnMultiDeviceListener;
import com.zhidao.support.adas.high.bean.AutopilotAbility;
import com.zhidao.support.adas.high.bean.VersionCompatibility;
import com.zhidao.support.adas.high.common.ByteUtil;
import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS;
@@ -110,6 +111,7 @@ import java.util.Locale;
import java.util.Set;
import java.util.concurrent.ScheduledExecutorService;
import chassis.Chassis;
import chassis.VehicleStateOuterClass;
import io.netty.channel.Channel;
import mogo.telematics.pad.MessagePad;
@@ -164,6 +166,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
private ListPopupWindow listPopupWindow;
private FloatWindow floatWindow;
private View include_title;
private boolean isAutopilotAbility = true;
private String autopilotAbilityReason;
// @Override
// protected void onStart() {
// super.onStart();
@@ -796,6 +800,50 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
DataDistribution.getInstance().addData(base);
}
@Override
public void onAutopilotAbility(AutopilotAbility ability) {
isAutopilotAbility = true;
autopilotAbilityReason = null;
if (ability.gear == null || ability.gear == Chassis.GearPosition.GEAR_P || ability.gear == Chassis.GearPosition.GEAR_R) {
isAutopilotAbility = false;
autopilotAbilityReason = "挡位不正常";
}
if (isAutopilotAbility)
if (ability.brake > 0) {
isAutopilotAbility = false;
autopilotAbilityReason = "制动踏板被踩下";
}
if (isAutopilotAbility)
if (ability.statusInfo == null) {
isAutopilotAbility = false;
autopilotAbilityReason = "系统Topic不正常";
}
if (isAutopilotAbility)
if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_STARTING) {
isAutopilotAbility = false;
autopilotAbilityReason = "系统正在启动";
}
if (isAutopilotAbility)
if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_EXITING) {
isAutopilotAbility = false;
autopilotAbilityReason = "系统正在关闭";
}
if (isAutopilotAbility)
if (ability.statusInfo.getSysState() == SystemStatusInfo.SystemState.SYS_FAULT) {
isAutopilotAbility = false;
autopilotAbilityReason = "系统异常";
}
if (isAutopilotAbility)
for (SystemStatusInfo.HealthInfo healthInfo : ability.statusInfo.getHealthInfoList()) {
if (healthInfo.getState() == SystemStatusInfo.HealthState.FAULT) {
isAutopilotAbility = false;
autopilotAbilityReason = healthInfo.getName() + " Topic异常";
break;
}
}
Log.i(TAG, "是否可以启动自动驾驶=" + isAutopilotAbility + " 原因=" + autopilotAbilityReason);
}
@Override
public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) {
Trajectory base = new Trajectory(header, trajectory, sdf);

View File

@@ -32,6 +32,7 @@ buildscript {
classpath 'com.tencent.bugly:symtabfileuploader:2.2.1'
classpath "com.bytedance.android.byteX:base-plugin:0.3.0"
classpath "com.mogo.cloud:hook:${HOOK_LOG_VERSION}"
classpath "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}"
classpath 'com.volcengine:apm_insight_plugin:1.4.1'
classpath 'com.mogo.thread.opt:plg:2.2.12'
classpath 'com.mogo.cloud:systrace:1.0.1'

View File

@@ -1,22 +1,6 @@
ext {
time = ""
kotlin_version = "1.4.31"
android = [
launcherApplicationId : "com.mogo.launcher",
independentApplicationId : "com.mogo.launcher.app",
fLauncherApplicationId : "com.mogo.launcher.f",
bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto",
fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125",
bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a",
commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3",
commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f",
compileSdkVersion : 29,
buildToolsVersion : "29.0.2",
minSdkVersion : 21,
targetSdkVersion : 21,
minSdkVersionPadLenovo : 23,
targetSdkVersionPadLenovo : 23,
]
dependencies = [
// androidx
androidxappcompat : "androidx.appcompat:appcompat:1.3.1",
@@ -134,6 +118,8 @@ ext {
//plugin
mogochainbase : "com.mogo.cloud:service-chain:${SERVICE_CHAIN_VERSION}",
mogochainplugin : "com.mogo.cloud:hook:${HOOK_LOG_VERSION}",
mogoservicebiz : "com.mogo.cloud:service-biz:${SERVICE_BIZ_VERSION}",
mogobizconfig : "com.mogo.cloud:bizconfig:${BIZCONFIG_VERSION}",
//========================= 旧版本架构 Maven 版本管理 =========================
// modules
@@ -250,6 +236,22 @@ ext {
koomnative : "com.kuaishou.koom:koom-native-leak-static:2.2.0",
koomxhook : "com.kuaishou.koom:xhook-static:2.2.0"
]
android = [
launcherApplicationId : "com.mogo.launcher",
independentApplicationId : "com.mogo.launcher.app",
fLauncherApplicationId : "com.mogo.launcher.f",
bydautoIndependentApplicationId: "com.mogo.launcher.app.bydauto",
fLauncherAmapApiValue : "ace34d685cc04836c03905e4d1536125",
bydautoIndependentApiValue : "b1e1d527b02a493913c50985827c943a",
commonLauncherAmapApiValue : "a36b9f7b086fa3951bb35338a5a06dd3",
commonIndependentAmapApiValue : "1c3fbc5f5e183619ffb1e7bc01e6751f",
compileSdkVersion : 29,
buildToolsVersion : "29.0.2",
minSdkVersion : 21,
targetSdkVersion : 21,
minSdkVersionPadLenovo : 23,
targetSdkVersionPadLenovo : 23,
]
}
boolean isM1Chip() {

View File

@@ -570,7 +570,6 @@ class MoGoAutopilotProvider :
override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) {
// 乘客屏才监听
AppConfigInfo.plateNumber = carConfigResp.plateNumber
CallerBindingcarManager.getBindingcarProvider()
.getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为${carConfigResp.macAddress}")

View File

@@ -50,6 +50,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateLi
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.zhidao.support.adas.high.AdasManager
import com.zhidao.support.adas.high.OnAdasListener
import com.zhidao.support.adas.high.bean.AutopilotAbility
import com.zhidao.support.adas.high.common.ProtocolStatus
import com.zhjt.service.chain.ChainLog
import com.zhjt.service.chain.TracingConstants.Endpoint.Companion.PAD
@@ -206,6 +207,8 @@ class MoGoAdasListenerImpl : OnAdasListener {
autopilotStatusInfo.dockVersion = it.dockVersion
AppConfigInfo.dockerVersion = it.dockVersion
}
AppConfigInfo.isConnectAutopilot = autopilotStatusInfo.connectStatus
AppConfigInfo.connectStatusDescribe = autopilotStatusInfo.connectStatusDescribe
invokeAutoPilotStatus()
}
}
@@ -306,6 +309,9 @@ class MoGoAdasListenerImpl : OnAdasListener {
carConfigResp: MessagePad.CarConfigResp?
) {
if (HdMapBuildConfig.isMapLoaded && carConfigResp != null) {
AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号
AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址
AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本
invokeAutopilotCarConfigData(carConfigResp)
}
}
@@ -427,4 +433,11 @@ class MoGoAdasListenerImpl : OnAdasListener {
override fun onError(status: ProtocolStatus, bytes: ByteArray) {
}
/**
* 是否可以启动自动驾驶
* 使用方法查看app_ipc_monitoring/uiMainActivity/onAutopilotAbility
*/
override fun onAutopilotAbility(ability: AutopilotAbility?) {
}
}

View File

@@ -11,6 +11,8 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule
import com.mogo.eagle.core.data.deva.scene.SceneTAG
import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
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.logcatch.MogoLogCatchManager
import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager
import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager
@@ -30,8 +32,13 @@ class DevaToolsProvider : IDevaToolsProvider {
override fun init(context: Context) {
mContext = context
traceManager.init(context)
MogoLogCatchManager.init(context)
}
override fun initBiz() {
bizConfigCenter.init(mContext!!)
FuncConfigImpl.init()
traceManager.init(mContext!!)
MogoLogCatchManager.init(mContext!!)
}
override fun startLogCatch() {

View File

@@ -6,7 +6,6 @@ import android.os.Environment;
import android.util.Log;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
import com.mogo.eagle.core.utilcode.util.FileUtils;
import com.zhjt.mogo_core_function_devatools.badcase.record.fft.FftFactory;
import com.zhjt.mogo_core_function_devatools.badcase.record.listener.RecordListener;
@@ -177,14 +176,14 @@ public class RecordHelper {
AudioRecordThread() {
bufferSize = AudioRecord.getMinBufferSize(currentConfig.getSampleRate(),
currentConfig.getChannelConfig(), currentConfig.getEncodingConfig()) * RECORD_AUDIO_BUFFER_TIMES;
Logger.d(TAG, "record buffer size = %s", bufferSize);
CallerLogger.INSTANCE.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 {
Logger.e(TAG, "mp3EncodeThread != null, 请检查代码");
CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread != null, 请检查代码");
}
}
}
@@ -206,7 +205,7 @@ public class RecordHelper {
private void startPcmRecorder() {
state = RecordState.RECORDING;
notifyState();
Logger.d(TAG, "开始录制 Pcm");
CallerLogger.INSTANCE.d("$M_DEVA$TAG", "开始录制 Pcm");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(tmpFile);
@@ -224,7 +223,7 @@ public class RecordHelper {
if (state == RecordState.STOP) {
makeFile();
} else {
Logger.i(TAG, "暂停!");
CallerLogger.INSTANCE.i("$M_DEVA$TAG", "暂停!");
}
} catch (Exception e) {
notifyError("录音失败");
@@ -240,7 +239,7 @@ public class RecordHelper {
if (state != RecordState.PAUSE) {
state = RecordState.IDLE;
notifyState();
Logger.d(TAG, "录音结束");
CallerLogger.INSTANCE.d("$M_DEVA$TAG", "录音结束");
}
}
@@ -268,7 +267,7 @@ public class RecordHelper {
notifyState();
stopMp3Encoded();
} else {
Logger.d(TAG, "暂停");
CallerLogger.INSTANCE.d("$M_DEVA$TAG", "暂停");
}
}
}
@@ -283,7 +282,7 @@ public class RecordHelper {
}
});
} else {
Logger.e(TAG, "mp3EncodeThread is null, 代码业务流程有误,请检查!! ");
CallerLogger.INSTANCE.e("$M_DEVA$TAG", "mp3EncodeThread is null, 代码业务流程有误,请检查!! ");
}
}
@@ -302,7 +301,7 @@ public class RecordHelper {
break;
}
notifyFinish();
Logger.i(TAG, "录音完成! path: %s 大小:%s", resultFile.getAbsoluteFile(), resultFile.length());
CallerLogger.INSTANCE.i("$M_DEVA$TAG", "录音完成! path: %s 大小:%s", resultFile.getAbsoluteFile(), resultFile.length());
}
/**
@@ -377,7 +376,7 @@ public class RecordHelper {
private String getFilePath(String fileName) {
if (!FileUtils.createOrExistsDir(ROOT_PATH)) {
Logger.w(TAG, "文件夹创建失败:%s", ROOT_PATH);
CallerLogger.INSTANCE.w("$M_DEVA$TAG", "文件夹创建失败:%s", ROOT_PATH);
return null;
}
@@ -388,7 +387,7 @@ public class RecordHelper {
private String getTempFilePath() {
if (!FileUtils.createOrExistsDir(TEMP_PATH)) {
Logger.e(TAG, "文件夹创建失败:%s", TEMP_PATH);
CallerLogger.INSTANCE.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

@@ -0,0 +1,84 @@
package com.zhjt.mogo_core_function_devatools.funcconfig
import android.content.Context
import com.mogo.aicloud.services.socket.IMogoOnMessageListener
import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.commons.AbsMogoApplication
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_CLOUD_SHOW
import com.mogo.eagle.core.data.deva.chain.ChainConstant.Companion.CHAIN_LINK_LOG_CONNECT_STATUS
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.mogo.eagle.core.utilcode.util.SPUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.FUNC_CONFIG_TYPE
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst.Companion.defaultFuncConfig
import com.zhjt.mogo_core_function_devatools.funcconfig.network.FuncConfigNetWorkModel
import com.zhjt.service.chain.ChainLog
import com.zhjt.service.chain.TracingConstants
import com.zhjt.service_biz.BizManager
import com.zhjt.service_biz.FuncConfig
class FuncConfigCenter : IMogoOnMessageListener<FuncConfig> {
companion object {
val bizConfigCenter by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
FuncConfigCenter()
}
}
private var mContext: Context? = null
private val funcConfigNetWorkModel = FuncConfigNetWorkModel()
fun init(context: Context) {
mContext = context
MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext)
.registerOnMessageListener(FUNC_CONFIG_TYPE, this)
UiThreadHandler.postDelayed({
funcConfigNetWorkModel.requestFuncConfig({
SPUtils.getInstance("biz_config").put("config", GsonUtils.toJson(it))
refreshConfig(it)
}, {
val bizJson = SPUtils.getInstance("biz_config")
.getString("config", GsonUtils.toJson(defaultFuncConfig()))
refreshConfig(GsonUtils.fromJson(bizJson, FuncConfig::class.java))
})
}, 1000L * 5)
}
override fun target(): Class<FuncConfig> {
return FuncConfig::class.java
}
override fun onMsgReceived(obj: FuncConfig?) {
obj?.let {
refreshConfig(it)
}
}
@ChainLog(
linkChainLog = CHAIN_LINK_LOG_CONNECT_STATUS,
linkCode = CHAIN_LINK_CLOUD_SHOW,
endpoint = TracingConstants.Endpoint.PAD,
nodeAliasCode = CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED,
paramIndexes = [0],
clientPkFileName = "sn"
)
private fun refreshConfig(funcConfig: FuncConfig) {
BizManager.updateBizConfigData(funcConfig)
funcConfig.business.forEach { business ->
CallerDevaToolsFuncConfigListenerManager.invokeDevaToolsFuncConfigBizUpdate(
business.biz,
business.data
)
}
}
fun onDestroy() {
MogoAiCloudSocketManager.getInstance(AbsMogoApplication.getApp().applicationContext)
.unregisterLifecycleListener(FUNC_CONFIG_TYPE)
mContext = null
}
}

View File

@@ -0,0 +1,119 @@
package com.zhjt.mogo_core_function_devatools.funcconfig
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AUTOPILOT_LANE_SELECTION
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AVW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BAG_RECORD
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BSW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BYPASS
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_CLW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_DNPW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_EBW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FCW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FULL_LOG
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_HLW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP_GREEN
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVS
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LCW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LIMIT_SPEED_SET
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LTA
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_OPT_LINE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RTS
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_SLW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_TJW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_TRACE_LOG
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VIP
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU_RI
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2V
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.AppUtils
import com.zhjt.mogo_core_function_devatools.BuildConfig
import com.zhjt.mogo_core_function_devatools.env.EnvChangeManager
import com.zhjt.service_biz.Business
import com.zhjt.service_biz.FuncConfig
import com.zhjt.service_biz.SubBiz
class FuncConfigConst {
companion object{
const val FUNC_CONFIG_TYPE = 500001
fun defaultFuncConfig(): FuncConfig {
val businessList = mutableListOf<Business>()
val v2nSubList = mutableListOf<SubBiz>()
v2nSubList.add(SubBiz(BIZ_VIP, lock = false, state = true, dependNode = "", data = ""))
v2nSubList.add(SubBiz(BIZ_OPT_LINE, lock = false, state = false, dependNode = "", data = ""))
v2nSubList.add(SubBiz(BIZ_VRU, lock = false, state = true, dependNode = "", data = ""))
v2nSubList.add(SubBiz(BIZ_VRU_RI, lock = false, state = true, dependNode = "", data = ""))
v2nSubList.add(SubBiz(BIZ_HLW, lock = false, state = true, dependNode = "", data = ""))
businessList.add(Business(V2N, v2nSubList))
val v2iSubList = mutableListOf<SubBiz>()
v2iSubList.add(SubBiz(BIZ_IVP_GREEN, lock = false, state = true, dependNode = "", data = ""))
v2iSubList.add(SubBiz(BIZ_IVP, lock = false, state = true, dependNode = "", data = ""))
v2iSubList.add(SubBiz(BIZ_RTS, lock = false, state = true, dependNode = "", data = ""))
v2iSubList.add(SubBiz(BIZ_SLW, lock = false, state = true, dependNode = "", data = ""))
v2iSubList.add(SubBiz(BIZ_IVS, lock = false, state = true, dependNode = "", data = ""))
v2iSubList.add(SubBiz(BIZ_TJW, lock = false, state = true, dependNode = "", data = ""))
businessList.add(Business(V2I,v2iSubList))
val v2vSubList = mutableListOf<SubBiz>()
v2vSubList.add(SubBiz(BIZ_AVW, lock = false, state = true, dependNode = "", data = ""))
v2vSubList.add(SubBiz(BIZ_LCW, lock = false, state = true, dependNode = "", data = ""))
v2vSubList.add(SubBiz(BIZ_BSW, lock = false, state = true, dependNode = "", data = ""))
v2vSubList.add(SubBiz(BIZ_EBW, lock = false, state = true, dependNode = "", data = ""))
v2vSubList.add(SubBiz(BIZ_FCW, lock = false, state = true, dependNode = "", data = ""))
v2vSubList.add(SubBiz(BIZ_LTA, lock = false, state = true, dependNode = "", data = ""))
v2vSubList.add(SubBiz(BIZ_CLW, lock = false, state = true, dependNode = "", data = ""))
v2vSubList.add(SubBiz(BIZ_DNPW, lock = false, state = true, dependNode = "", data = ""))
businessList.add(Business(V2V,v2vSubList))
val foundationSubList = mutableListOf<SubBiz>()
foundationSubList.add(SubBiz(BIZ_BEAUTY_MODE, lock = true, state = false, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_RAIN_MODE, lock = true, state = false, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_FULL_LOG, lock = false, state = false, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_TRACE_LOG, lock = false, state = true, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_BAG_RECORD, lock = true, state = true, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_WARNING_UPLOAD, lock = true, state = true, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_LIMIT_SPEED_SET, lock = false, state = true, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_BYPASS, lock = false, state = true, dependNode = "", data = ""))
foundationSubList.add(SubBiz(BIZ_AUTOPILOT_LANE_SELECTION, lock = false, state = true, dependNode = "", data = ""))
businessList.add(Business(FOUNDATION,foundationSubList))
return FuncConfig(0, AppUtils.getAppVersionCode(), getChannelCode(), getEnv(), businessList)
}
private fun getEnv():Int{
return if(EnvChangeManager.getEnvConfig()!= null){
EnvChangeManager.getEnvConfig()!!.netMode
}else {
0
}
}
// todo 新增车型需要更新(清扫车)
fun getChannelCode(): Int{
return when{
AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> 1
AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> 2
AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> 3
AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
&& AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> 4
else -> 0
}
}
}
}

View File

@@ -0,0 +1,30 @@
package com.zhjt.mogo_core_function_devatools.funcconfig
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.FOUNDATION
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager
object FuncConfigImpl : IMoGoDevaToolsFuncConfigListener {
private const val TAG = "FuncConfigImpl"
fun init() {
CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(
FOUNDATION,
TAG,
this
)
}
override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) {
when (type) {
BIZ_BEAUTY_MODE -> FunctionBuildConfig.isDemoMode = state
BIZ_RAIN_MODE -> FunctionBuildConfig.isRainMode = state
BIZ_WARNING_UPLOAD -> FunctionBuildConfig.isReportWarning = state
}
}
}

View File

@@ -0,0 +1,16 @@
package com.zhjt.mogo_core_function_devatools.funcconfig.network
import com.mogo.eagle.core.data.BaseResponse
import com.zhjt.service_biz.FuncConfig
import retrofit2.http.Body
import retrofit2.http.Headers
import retrofit2.http.POST
interface FuncConfigApiService {
//FuncConfig
@Headers("Content-Type:application/json;charset=UTF-8")
@POST("eagleEye-mis/config/abilityInfo")
suspend fun funcConfig(@Body map: MutableMap<String, Any>): BaseResponse<FuncConfig>
}

View File

@@ -0,0 +1,22 @@
package com.zhjt.mogo_core_function_devatools.funcconfig.network
import com.mogo.commons.debug.DebugConfig
class FuncConfigHost {
companion object{
private const val HOST_DEV = "https://eagle-qa.zhidaozhixing.com"
private const val HOST_RELEASE = "https://eagle.zhidaozhixing.com"
fun get(): String{
return when (DebugConfig.getNetMode()) {
DebugConfig.NET_MODE_DEV -> HOST_DEV
DebugConfig.NET_MODE_QA -> HOST_DEV
DebugConfig.NET_MODE_DEMO -> HOST_RELEASE
DebugConfig.NET_MODE_RELEASE -> HOST_RELEASE
else -> HOST_RELEASE
}
}
}
}

View File

@@ -0,0 +1,75 @@
package com.zhjt.mogo_core_function_devatools.funcconfig.network
import android.util.Log
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.apiCall
import com.mogo.eagle.core.network.request
import com.mogo.eagle.core.utilcode.util.DeviceUtils
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigConst
import com.zhjt.service_biz.FuncConfig
class FuncConfigNetWorkModel {
private fun getNetWorkApi(baseUrl: String = FuncConfigHost.get()): FuncConfigApiService {
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl)
.create(FuncConfigApiService::class.java)
}
private var retryTime = 0
private var success: ((FuncConfig) -> Unit)? = null
private var error: ((String) -> Unit)? = null
fun requestFuncConfig(
onSuccess: ((FuncConfig) -> Unit)? = null,
onError: ((String) -> Unit)? = null
) {
request<BaseResponse<FuncConfig>> {
val map = mutableMapOf<String, Any>()
start {
if (success == null) {
success = onSuccess
}
if (error == null) {
error = onError
}
//todo test
// map["sn"] = MoGoAiCloudClientConfig.getInstance().sn
map["sn"] = "X20202203105S688HZ"
// map["mac"] = DeviceUtils.getMacAddress()
map["mac"] = "48:b0:2d:3a:bc:78"
// map["channelVersion"] = FuncConfigConst.getChannelCode()
map["channelVersion"] = 1
}
loader {
apiCall {
getNetWorkApi().funcConfig(map)
}
}
onSuccess {
if (it.result != null) {
success?.invoke(it.result)
} else {
if (retryTime < 3) {
retryTime += 1
requestFuncConfig()
} else {
error?.invoke("FuncConfig error msg is null")
}
}
}
onError {
if (retryTime < 3) {
retryTime += 1
requestFuncConfig()
} else if (it.message != null) {
error?.invoke(it.message ?: "FuncConfig error msg is null")
}
}
}
}
}

View File

@@ -5,7 +5,6 @@ import com.mogo.eagle.core.data.deva.scene.SceneModule
import com.mogo.eagle.core.data.deva.scene.SceneModuleTAG
import com.mogo.eagle.core.data.deva.scene.SceneTAG
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.Scene.Companion.scene
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ADAS_IMPL
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
@@ -71,7 +70,6 @@ class SceneManager {
//默认未创建的符合scene tag首次初始化logger=true
scene.addChangeListener { change ->
Logger.i("emArrow","scene change : $change")
sceneModuleTAG.map.iterator().forEach { map ->
val sceneModule = map.value
sceneModule.name?.let {

View File

@@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.mogo.logger.*
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.status.entity.CanStatus
import com.zhjt.mogo_core_function_devatools.status.entity.GpsStatus
@@ -50,10 +51,10 @@ object StatusManager {
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
super.onAutopilotGuardian(guardianInfo)
guardianInfo?.code?.takeIf {
Logger.d(TAG, "-- onAutopilotGuardian ---: code: $it")
CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian ---: code: $it")
it.contains("RTK_STATUS", true) || it.contains("CAN", true) || it == "ILCT_RTK_OR_SLAM_CHANGE"
}?.run {
Logger.d(TAG, "-- onAutopilotGuardian trigger req ---: code: $this")
CallerLogger.d("$M_DEVA$TAG", "-- onAutopilotGuardian trigger req ---: code: $this")
req()
}
}

View File

@@ -4,7 +4,8 @@ import android.content.*
import android.util.*
import com.mogo.eagle.core.function.api.autopilot.*
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.utilcode.mogo.logger.*
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.zhjt.mogo_core_function_devatools.status.entity.RTKStatus
import com.zhjt.mogo_core_function_devatools.status.flow.IFlow
import kotlinx.coroutines.*
@@ -31,7 +32,7 @@ internal class RTKImpl(ctx: Context): IFlow<RTKStatus>(ctx), IMoGoAutopilotStatu
override fun onCreate() {
send(RTKStatus(getDesc(), getCode()))
Logger.d(TAG, "-- onCreate --")
CallerLogger.d("$M_DEVA$TAG", "-- onCreate --")
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerAutopilotCarStatusListenerManager.addListener(TAG, this)
if (CallerAutoPilotManager.isConnected()) {
@@ -67,7 +68,7 @@ internal class RTKImpl(ctx: Context): IFlow<RTKStatus>(ctx), IMoGoAutopilotStatu
override fun onAutopilotIpcConnectStatusChanged(status: Int, reason: String?) {
super.onAutopilotIpcConnectStatusChanged(status, reason)
if (!CallerAutoPilotManager.isConnected()) {
Logger.d(TAG, "工控机断开了....")
CallerLogger.d("$M_DEVA$TAG", "工控机断开了....")
healthInfo.set(null)
send(RTKStatus("", -1))
}
@@ -114,7 +115,7 @@ internal class RTKImpl(ctx: Context): IFlow<RTKStatus>(ctx), IMoGoAutopilotStatu
override fun onDestroy() {
super.onDestroy()
isOldVersion.set(false)
Logger.d(TAG, "-- onDestroy --")
CallerLogger.d("$M_DEVA$TAG", "-- onDestroy --")
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerAutopilotCarStatusListenerManager.removeListener(TAG)
}

View File

@@ -7,8 +7,8 @@ import androidx.core.content.*
import androidx.recyclerview.widget.*
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.mogo.logger.*
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.*
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.R.drawable
import com.zhjt.mogo_core_function_devatools.status.entity.*
@@ -16,7 +16,6 @@ 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 kotlinx.coroutines.*
internal class StatusAdapter(val ctx: Context, var data: ArrayList<Status>): RecyclerView.Adapter<StatusViewHolder>() {
@@ -124,7 +123,7 @@ internal class StatusAdapter(val ctx: Context, var data: ArrayList<Status>): Rec
is TracingStatus -> {
val extra = status.state.extra
val extraDesc = if (extra != null && extra.isNotEmpty()) extra.values.joinToString(",") else ""
Logger.d(TAG, "traceing_state: $status -> extra: $extraDesc :: extra: $extra")
CallerLogger.d("$M_DEVA$TAG", "traceing_state: $status -> extra: $extraDesc :: extra: $extra")
when(status.state) {
//"轨迹类型:${ if (status.state == TRACK_LOADED) "循迹" else if (status.state == ROUTE_LOADED) "自主算路" else "暂无轨迹" }"
MAP_TRA_TYPE -> {

View File

@@ -139,6 +139,7 @@ dependencies {
api project(':core:mogo-core-function-call')
api project(':core:mogo-core-function-api')
api project(':libraries:mogo-adas')
api project(':libraries:map-usbcamera')
api project(':libraries:mogo-adas-other')
}

View File

@@ -20,15 +20,22 @@ import androidx.core.view.*
import androidx.lifecycle.lifecycleScope
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter
import com.kwai.koom.base.postOnMainThread
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.commons.AbsMogoApplication
import com.mogo.commons.debug.DebugConfig
import com.mogo.commons.mvp.BaseFragment
import com.mogo.commons.mvp.MvpFragment
import com.mogo.commons.voice.*
import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.data.camera.CameraEntity
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.data.constants.MoGoFragmentPaths
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RTS
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I
import com.mogo.eagle.core.data.enums.SidePattern
import com.mogo.eagle.core.data.enums.SidePattern.*
import com.mogo.eagle.core.data.enums.WarningDirectionEnum
@@ -46,6 +53,7 @@ import com.mogo.eagle.core.function.api.hmi.view.IViewNotification
import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
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.bindingcar.CallerBindingcarManager
@@ -54,6 +62,7 @@ import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.map.CallerMapDataCollectorManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.monitor.CallerMonitorManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.WaringConst
import com.mogo.eagle.core.function.hmi.notification.WarningFloat
@@ -81,13 +90,13 @@ import com.mogo.eagle.core.utilcode.reminder.*
import com.mogo.eagle.core.utilcode.reminder.api.*
import com.mogo.eagle.core.utilcode.reminder.api.IReminder.IStateChangeListener
import com.mogo.eagle.core.utilcode.reminder.api.impl.*
import com.mogo.eagle.core.utilcode.util.SoundUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.*
import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.map.MogoMap
import com.mogo.module.common.enums.*
import com.zhidao.support.adas.high.common.MogoReport.Code.Error.EMAP.*
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import com.zhjt.service_biz.BizConfig
import kotlinx.android.synthetic.main.fragment_hmi.*
import kotlinx.android.synthetic.main.view_auto_pilot_check.view.*
import kotlinx.android.synthetic.main.view_och_bus_operation.view.*
@@ -104,12 +113,12 @@ import java.util.*
* 预警图层
*/
@Route(path = MoGoFragmentPaths.PATH_FRAGMENT_HMI)
class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
IMoGoWaringProvider,
IMoGoHmiViewProxy,
MoGoHmiContract.View,
IMoGoAutopilotRecordListener,
IMoGoAutopilotStatusListener, IViewNotificationProvider {
class MoGoHmiFragment : MvpFragment<MoGoHmiContract.View?, HmiPresenter?>(),
IMoGoWaringProvider,
IMoGoHmiViewProxy,
MoGoHmiContract.View,
IMoGoAutopilotRecordListener,
IMoGoAutopilotStatusListener, IViewNotificationProvider {
private val TAG = "MoGoHmiFragment"
// DebugSettingView
@@ -145,11 +154,12 @@ import java.util.*
//工控机节点上报列表
private var reportList = arrayListOf<ReportEntity>()
//工控机上报列表悬浮窗
private var reportListFloatWindow: ReportListFloatWindow?=null
private var ipcReportWindow: IPCReportWindow?=null
private var adUpgradeDialog: AdUpgradeDialog?=null
//工控机上报列表悬浮窗
private var reportListFloatWindow: ReportListFloatWindow? = null
private var ipcReportWindow: IPCReportWindow? = null
private var adUpgradeDialog: AdUpgradeDialog? = null
private var lastSpeakJob: Job? = null
@@ -183,8 +193,8 @@ import java.util.*
}
/**ivCameraIcon?.setOnLongClickListener {
activity?.let { it1 -> CarcorderPreviewView.show(it1) }
true
activity?.let { it1 -> CarcorderPreviewView.show(it1) }
true
}*/
ivToolsIcon?.setOnClickListener {
@@ -198,7 +208,50 @@ import java.util.*
true
}
// init appConfigInfo
AppConfigInfo.appName = AppUtils.getAppName()
if (AppConfigInfo.appVersionCode == 0) {
AppConfigInfo.appVersionCode = AppUtils.getAppVersionCode()
}
if (AppConfigInfo.appVersionName.isNullOrEmpty()) {
AppConfigInfo.appVersionName = AppUtils.getAppVersionName()
}
if (AppConfigInfo.appPackageName.isNullOrEmpty()) {
AppConfigInfo.appPackageName = AppUtils.getAppPackageName()
}
if (AppConfigInfo.uniqueDeviceId.isNullOrEmpty()) {
AppConfigInfo.uniqueDeviceId = DeviceIdUtils.getDeviceId(AbsMogoApplication.getApp())
}
if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) {
AppConfigInfo.widevineIDMd5 =
DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp())
}
if (MoGoAiCloudClient.getInstance().aiCloudClientConfig != null) {
AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn
AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token
}
AppConfigInfo.netMode = DebugConfig.getNetMode()
if (MogoMap.getInstance().mogoMap != null) {
AppConfigInfo.mapSdkVersion = MogoMap.getInstance().mogoMap.mapVersion
}
AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context)
AppConfigInfo.isConnectSocket = DebugConfig.isDownloadSnapshot()
when {
AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端
AppConfigInfo.isDriver = true
AppConfigInfo.isConnectedNetty = CallerTelematicManager.getServerStarted()
}
AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> {
AppConfigInfo.isDriver = false
AppConfigInfo.isConnectedNetty = CallerTelematicManager.getClientConnStatus()
AppConfigInfo.serverSn = CallerTelematicManager.getServerToken()
}
else -> {
}
}
AppConfigInfo.teleTimeStamp = CallerAutoPilotManager.getTeleTimeStamp()
}
@OptIn(ExperimentalCoroutinesApi::class)
@@ -221,45 +274,62 @@ import java.util.*
}
}
override fun getNotificationView(): IViewNotification? = context?.let { V2XNotificationView(it) }
override fun getNotificationView(): IViewNotification? =
context?.let { V2XNotificationView(it) }
override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {
CallerLogger.d("$M_HMI$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat}")
if(BadCaseConfig.recordKeyList.contains(recordPanel.key)){
if(recordPanel.stat == 100 || recordPanel.stat == 101){
if (BadCaseConfig.recordKeyList.contains(recordPanel.key)) {
if (recordPanel.stat == 100 || recordPanel.stat == 101) {
//成功结束录制
TipToast.shortTip("${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())} bag录制成功")
TipToast.shortTip(
"${
millis2String(
System.currentTimeMillis(),
TimeUtils.getHourMinSecondFormat()
)
} bag录制成功"
)
}
if(recordPanel.stat == 200){
if (recordPanel.stat == 200) {
//录制失败
TipToast.shortTip("${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())} bag录制失败")
TipToast.shortTip(
"${
millis2String(
System.currentTimeMillis(),
TimeUtils.getHourMinSecondFormat()
)
} bag录制失败"
)
}
return
}
//在工控机taxi2.3.0版本和Bus2.4.0版本上不支持被动录包,不进行被动录包的弹窗
BadCaseConfig.dockerVersion?.let {
if(it.contains("taxi") && it.contains("2.3.0")){
if (it.contains("taxi") && it.contains("2.3.0")) {
return
}
if(it.contains("bus") && it.contains("2.4.0")){
if (it.contains("bus") && it.contains("2.4.0")) {
return
}
}
//处于非美化模式下弹窗是地图数据采集任务时即type=2时不弹窗
if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type!=2) {
if (!FunctionBuildConfig.isDemoMode && (recordPanel.stat == 100 || recordPanel.stat == 101) && recordPanel.type != 2) {
//只在司机屏生效,乘客屏不生效
if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
activity?.let { CallerDevaToolsManager.onReceiveBadCaseRecord(recordPanel, it) }
}
}
if (!FunctionBuildConfig.isDemoMode && recordPanel.type == 2 && (
recordPanel.stat == 101 || //工控机采集完成-被动完成
recordPanel.stat == 100 || //工控机采集完成-主动完成
recordPanel.stat == 102 || //工控机达到最大采集时长
recordPanel.stat == 103) //工控机磁盘满了
recordPanel.stat == 101 || //工控机采集完成-被动完成
recordPanel.stat == 100 || //工控机采集完成-主动完成
recordPanel.stat == 102 || //工控机达到最大采集时长
recordPanel.stat == 103) //工控机磁盘满了
) {
CallerMapDataCollectorManager.finish(recordPanel.id, recordPanel.stat, "", recordPanel.filename
?: "", recordPanel.note ?: "")
CallerMapDataCollectorManager.finish(
recordPanel.id, recordPanel.stat, "", recordPanel.filename
?: "", recordPanel.note ?: ""
)
}
}
@@ -303,15 +373,19 @@ import java.util.*
* @param warningReportList 提醒级别上报数据列表
* @param reportLevel 1:error级别 2:warning级别
*/
override fun showIPCReportWindow(errorReportList: ArrayList<ReportEntity>,warningReportList: ArrayList<ReportEntity>,reportLevel: Int) {
ThreadUtils.runOnUiThread{
if(reportLevel == 1){
if(ipcReportWindow==null){
ipcReportWindow= activity?.let { IPCReportWindow(it) }
ipcReportWindow?.setClickListener(object: IPCReportWindow.ClickListener{
override fun showIPCReportWindow(
errorReportList: ArrayList<ReportEntity>,
warningReportList: ArrayList<ReportEntity>,
reportLevel: Int
) {
ThreadUtils.runOnUiThread {
if (reportLevel == 1) {
if (ipcReportWindow == null) {
ipcReportWindow = activity?.let { IPCReportWindow(it) }
ipcReportWindow?.setClickListener(object : IPCReportWindow.ClickListener {
override fun closeWindow() {
ipcReportWindow?.hideFloatWindow()
ipcReportWindow =null
ipcReportWindow = null
}
})
ipcReportWindow?.let {
@@ -320,7 +394,7 @@ import java.util.*
}
ipcReportWindow?.showFloatWindow()
}
ipcReportWindow?.refreshData(errorReportList,warningReportList,reportLevel)
ipcReportWindow?.refreshData(errorReportList, warningReportList, reportLevel)
}
}
@@ -328,14 +402,6 @@ import java.util.*
mViewNotificationProvider = provider
}
override fun showVideoDialog(infList: List<Infrastructure>) {
context?.let {
if (roadVideoDialog == null) {
roadVideoDialog = RoadVideoDialog(it)
}
roadVideoDialog?.show(infList)
}
}
override fun changeBusOperationStatus(isOut: Boolean) {
busOperationStatus?.changerOperationStatus(isOut)
@@ -387,41 +453,41 @@ import java.util.*
})
}
toolsViewFloat = WarningFloat.with(it)
.setTag("ToolsViewFloat")
.setLayout(toolsView!!)
.setSidePattern(SidePattern.LEFT)
.setGravity(Gravity.LEFT)
.setImmersionStatusBar(true)
.setWindowHeight(LayoutParams.MATCH_PARENT)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
.setTag("ToolsViewFloat")
.setLayout(toolsView!!)
.setSidePattern(SidePattern.LEFT)
.setGravity(Gravity.LEFT)
.setImmersionStatusBar(true)
.setWindowHeight(LayoutParams.MATCH_PARENT)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onDismiss() {
toolsViewFloat = null
toolsView = null
// TODO:("")
}
})
.show()
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onDismiss() {
toolsViewFloat = null
toolsView = null
// TODO:("")
}
})
.show()
} else {
toolsViewFloat?.show()
}
@@ -466,7 +532,7 @@ import java.util.*
ivAiCollectTools.visibility = View.VISIBLE
CallerDevaToolsManager.initBadCase(ivBadCaseTools)
CallerDevaToolsManager.initAiCollect(ivAiCollectTools)
}else{
} else {
ivBadCaseTools.visibility = View.GONE
ivAiCollectTools.visibility = View.GONE
}
@@ -543,20 +609,20 @@ import java.util.*
mDebugSettingView = DebugSettingView(it)
Log.i("DebugViewSwitchLog", "new DebugSettingView")
mDebugSettingView?.reportInit(reportList)
mDebugSettingView?.setClickListener(object: DebugSettingView.ClickListener{
mDebugSettingView?.setClickListener(object : DebugSettingView.ClickListener {
override fun showReportListWindow(show: Boolean) {
if(show){
if (show) {
//打开工控机上报列表
reportListFloatWindow = ReportListFloatWindow(it)
reportListFloatWindow?.showFloatWindow()
reportListFloatWindow?.refreshData(reportList)
}else{
} else {
//关闭工控机上报列表
reportListFloatWindow?.hideFloatWindow()
}
}
})
if(mDebugSettingView!=null){
if (mDebugSettingView != null) {
Log.i("DebugViewSwitchLog", "new DebugSettingView success")
}
}
@@ -564,38 +630,39 @@ import java.util.*
var gravity = Gravity.RIGHT
//调试窗默认靠右显示Bus的乘客端右端有视图覆盖调试窗靠左显示
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) &&
AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
) {
side = SidePattern.LEFT
gravity = Gravity.LEFT
}
mDebugSettingViewFloat = WarningFloat.with(it)
.setTag("DebugSettingView")
.setLayout(mDebugSettingView!!)
.setSidePattern(side)
.setGravity(gravity, offsetY = 70)
.setImmersionStatusBar(true)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
.setTag("DebugSettingView")
.setLayout(mDebugSettingView!!)
.setSidePattern(side)
.setGravity(gravity, offsetY = 70)
.setImmersionStatusBar(true)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
}
}
}
@@ -610,15 +677,16 @@ import java.util.*
*/
@Synchronized
override fun showWarningV2X(
v2xType: String,
alertContent: CharSequence?,
ttsContent: String?,
tag: String?,
listener: IMoGoWarningStatusListener?,
playTts: Boolean,
expireTime: Long
v2xType: String,
alertContent: CharSequence?,
ttsContent: String?,
tag: String?,
listener: IMoGoWarningStatusListener?,
playTts: Boolean,
expireTime: Long
) {
val playTTS = playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)
val playTTS =
playTts && !AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)
activity?.let {
val warningContent = alertContent
?: EventTypeEnum.getWarningContent(v2xType)
@@ -629,70 +697,87 @@ import java.util.*
val content = mViewNotificationProvider?.getNotificationView() ?: return
content.setWarningIcon(EventTypeEnum.getWarningIcon(v2xType))
content.setWarningContent(warningContent)
Log.d("$M_HMI$TAG", "--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime")
Reminder.enqueue(this@MoGoHmiFragment, object : PopupWindowReminder(PopupWindow(content, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT).also { itx ->
itx.isTouchable = false
itx.isFocusable = false
itx.isClippingEnabled = false
itx.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val transition = Slide(when(content.sidePattern) {
LEFT, RESULT_LEFT-> Gravity.LEFT
RIGHT, RESULT_RIGHT -> Gravity.RIGHT
TOP, RESULT_TOP -> Gravity.TOP
BOTTOM, RESULT_BOTTOM -> Gravity.BOTTOM
else -> Gravity.TOP
}).also { t ->
t.interpolator = AccelerateDecelerateInterpolator()
t.duration = 200
}
if (VERSION.SDK_INT >= VERSION_CODES.M) {
itx.enterTransition = transition
itx.exitTransition = transition
}
}) {
override fun show() {
val parent = it.window.decorView
parent.doOnAttach {
Log.d("$M_HMI$TAG", "--- show v2x dialog 2 ---: info -> v2x-type: $v2xType : expireTime: $expireTime")
popupWindow.showAtLocation(parent, content.layoutGravity, 0, 0)
}
}
override fun isOverride(): Boolean {
return true
}
override fun key(): String {
return v2xType
}
}, object : IStateChangeListener {
override fun onShow(reminder: IReminder) {
listener?.onShow()
lastShowV2XJob?.safeCancel()
lastSpeakJob?.safeCancel()
showingV2XTip = reminder
lifecycleScope.launch {
delay(expireTime)
}.also { itx ->
lastShowV2XJob = itx
}.invokeOnCompletion { _ ->
reminder.hide()
}
if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) {
lifecycleScope.launch {
speak(it, ttsContent)
}.also { itx ->
lastSpeakJob = itx
Log.d(
"$M_HMI$TAG",
"--- show v2x dialog 1 ---: info -> v2x-type: $v2xType : expireTime: $expireTime"
)
Reminder.enqueue(
this@MoGoHmiFragment,
object : PopupWindowReminder(
PopupWindow(
content,
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT
).also { itx ->
itx.isTouchable = false
itx.isFocusable = false
itx.isClippingEnabled = false
itx.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
val transition = Slide(
when (content.sidePattern) {
LEFT, RESULT_LEFT -> Gravity.LEFT
RIGHT, RESULT_RIGHT -> Gravity.RIGHT
TOP, RESULT_TOP -> Gravity.TOP
BOTTOM, RESULT_BOTTOM -> Gravity.BOTTOM
else -> Gravity.TOP
}
).also { t ->
t.interpolator = AccelerateDecelerateInterpolator()
t.duration = 200
}
if (VERSION.SDK_INT >= VERSION_CODES.M) {
itx.enterTransition = transition
itx.exitTransition = transition
}
}) {
override fun show() {
val parent = it.window.decorView
parent.doOnAttach {
Log.d(
"$M_HMI$TAG",
"--- show v2x dialog 2 ---: info -> v2x-type: $v2xType : expireTime: $expireTime"
)
popupWindow.showAtLocation(parent, content.layoutGravity, 0, 0)
}
}
}
override fun onHide(reminder: IReminder) {
listener?.onDismiss()
showingV2XTip = null
showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
}
})
override fun isOverride(): Boolean {
return true
}
override fun key(): String {
return v2xType
}
},
object : IStateChangeListener {
override fun onShow(reminder: IReminder) {
listener?.onShow()
lastShowV2XJob?.safeCancel()
lastSpeakJob?.safeCancel()
showingV2XTip = reminder
lifecycleScope.launch {
delay(expireTime)
}.also { itx ->
lastShowV2XJob = itx
}.invokeOnCompletion { _ ->
reminder.hide()
}
if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) {
lifecycleScope.launch {
speak(it, ttsContent)
}.also { itx ->
lastSpeakJob = itx
}
}
}
override fun onHide(reminder: IReminder) {
listener?.onDismiss()
showingV2XTip = null
showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
}
})
}
}
@@ -739,8 +824,8 @@ import java.util.*
* @param checkLightId 0-都是默认不亮起1-红2-黄3-绿
* @param lightSource 1:云端下发2:自车感知
*/
override fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) {
mViewTrafficLight?.showWarningTrafficLight(checkLightId,lightSource)
override fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) {
mViewTrafficLight?.showWarningTrafficLight(checkLightId, lightSource)
}
override fun isWarningTrafficLightShow(): Boolean {
@@ -814,7 +899,7 @@ import java.util.*
* @see WarningDirectionEnum
*/
override fun showWarning(direction: WarningDirectionEnum) {
Log.d(TAG,"showWarning====")
Log.d(TAG, "showWarning====")
flV2XWarningView?.showWarning(direction)
flicker(flV2XWarningView)
}
@@ -863,42 +948,42 @@ import java.util.*
mNoticeFloat = it?.let { it1 ->
noticeBannerView?.let { it2 ->
WarningFloat.with(it1)
.setTag(WaringConst.NOTICE_FOR_TRAFFIC_KEY)
.setLayout(it2)
.setSidePattern(SidePattern.TOP)
.setCountDownTime(60 * 1000 * 3)
.setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110)
.setImmersionStatusBar(true)
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onShow() {
// 创建弹窗成功才进行TTS播报
.setTag(WaringConst.NOTICE_FOR_TRAFFIC_KEY)
.setLayout(it2)
.setSidePattern(SidePattern.TOP)
.setCountDownTime(60 * 1000 * 3)
.setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110)
.setImmersionStatusBar(true)
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onShow() {
// 创建弹窗成功才进行TTS播报
// AIAssist.getInstance(activity)
// .speakTTSVoice("")
}
}
})
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
})
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
}
}
}
@@ -913,41 +998,41 @@ import java.util.*
mNoticeFloat = it.let { it1 ->
noticeBannerView?.let { it2 ->
WarningFloat.with(it1)
.setTag(WaringConst.NOTICE_FOR_NORMAL_KEY)
.setLayout(it2)
.setSidePattern(SidePattern.TOP)
.setCountDownTime(10000)
.setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110)
.setImmersionStatusBar(true)
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onShow() {
// 创建弹窗成功才进行TTS播报
// AIAssist.getInstance(activity)
// .speakTTSVoice("")
}
})
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
.setTag(WaringConst.NOTICE_FOR_NORMAL_KEY)
.setLayout(it2)
.setSidePattern(SidePattern.TOP)
.setCountDownTime(10000)
.setGravity(Gravity.CENTER_HORIZONTAL, offsetY = 110)
.setImmersionStatusBar(true)
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onShow() {
// 创建弹窗成功才进行TTS播报
// AIAssist.getInstance(activity)
// .speakTTSVoice("")
}
})
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.show()
}
}
}
@@ -1034,6 +1119,17 @@ import java.util.*
dismissToolsFloatView()
}
@BizConfig(V2I, "", BIZ_RTS)
override fun showVideoDialog(infList: List<Infrastructure>) {
context?.let {
if (roadVideoDialog == null) {
roadVideoDialog = RoadVideoDialog(it)
}
roadVideoDialog?.show(infList)
}
}
@BizConfig(V2I, "", BIZ_RTS)
private fun showCameraList(cameraList: List<CameraEntity>?) {
context?.let {
if (cameraViewFloat == null) {
@@ -1062,40 +1158,40 @@ import java.util.*
}
})
cameraViewFloat = WarningFloat.with(it)
.setTag("CameraListFloat")
.setLayout(cameraListView!!)
.setSidePattern(SidePattern.RIGHT)
.setGravity(Gravity.RIGHT, -40, 255)
.setImmersionStatusBar(true)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
.setTag("CameraListFloat")
.setLayout(cameraListView!!)
.setSidePattern(SidePattern.RIGHT)
.setGravity(Gravity.RIGHT, -40, 255)
.setImmersionStatusBar(true)
.setAnimator(object : DefaultAnimator() {
override fun enterAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.enterAnim(view, params, windowManager, sidePattern)
?.apply {
interpolator = OvershootInterpolator()
}
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onDismiss() {
cameraViewFloat = null
cameraListView = null
ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor)
}
})
.show()
override fun exitAnim(
view: View,
params: LayoutParams,
windowManager: WindowManager,
sidePattern: SidePattern
): Animator? =
super.exitAnim(view, params, windowManager, sidePattern)
?.setDuration(200)
})
.addWarningStatusListener(object : IMoGoWarningStatusListener {
override fun onDismiss() {
cameraViewFloat = null
cameraListView = null
ivCameraIcon.setBackgroundResource(R.drawable.icon_camera_nor)
}
})
.show()
} else {
cameraViewFloat?.show()
}
@@ -1126,9 +1222,9 @@ import java.util.*
}
}
private var isLeftLight :Boolean = false
private var isRightLight :Boolean = false
private var isDisappare :Boolean = false
private var isLeftLight: Boolean = false
private var isRightLight: Boolean = false
private var isDisappare: Boolean = false
/**
* 显示转向灯效果 if (HmiBuildConfig.isShowBadCaseView) {
@@ -1233,13 +1329,14 @@ import java.util.*
padSn: String,
releaseId: String
) {
ThreadUtils.runOnUiThread{
if(adUpgradeDialog == null){
adUpgradeDialog = AdUpgradeDialog(requireContext(),images, padSn, releaseId)
adUpgradeDialog?.setClickListener(object: AdUpgradeDialog.ClickListener{
ThreadUtils.runOnUiThread {
if (adUpgradeDialog == null) {
adUpgradeDialog = AdUpgradeDialog(requireContext(), images, padSn, releaseId)
adUpgradeDialog?.setClickListener(object : AdUpgradeDialog.ClickListener {
override fun confirm() {
//确认升级
CallerBindingcarManager.getBindingcarProvider().upgradeConfirm(images, padSn, releaseId)
CallerBindingcarManager.getBindingcarProvider()
.upgradeConfirm(images, padSn, releaseId)
AdUpgradeStateHelper.setConfirmUpgrade(true)
ToastUtils.showLong("最新版本下载中...")
adUpgradeDialog?.dismiss()
@@ -1258,10 +1355,10 @@ import java.util.*
}
override fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo) {
ThreadUtils.runOnUiThread{
ThreadUtils.runOnUiThread {
toolsView?.showAdUpgradeStatus(ipcUpgradeStateInfo)
ipcUpgradeStateInfo.status.let {
if(AdUpgradeStateHelper.isUpgradeSuccess(it)){
if (AdUpgradeStateHelper.isUpgradeSuccess(it)) {
ToastUtils.showLong("升级成功")
AdUpgradeStateHelper.setConfirmUpgrade(false)
}
@@ -1287,17 +1384,45 @@ import java.util.*
* 工控机监控节点上报
*/
override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) {
guardianInfo?.let {
if(reportList.size>49){
reportList.removeLast()
}
reportList.add(0,
ReportEntity(TimeUtils.millis2String(System.currentTimeMillis()),
it.src,it.level,it.msg,it.code,it.resultList,it.actionsList))
}
reportListFloatWindow?.let {
ThreadUtils.runOnUiThread{
it.refreshData(reportList)
ThreadUtils.runOnUiThread {
guardianInfo?.let {
when (it.code) {
EXIT_AUTOPILOT_FOR_PLANNING,
EXIT_AUTOPILOT_FOR_LOCATION,
EXIT_AUTOPILOT_FOR_CHASSIS,
EXIT_AUTOPILOT_FOR_DISTANCE -> {
showWarningV2X(
EventTypeEnum.TAKE_OVER_EVENT.poiType,
EventTypeEnum.TAKE_OVER_EVENT.content,
EventTypeEnum.TAKE_OVER_EVENT.tts,
EventTypeEnum.TAKE_OVER_EVENT.poiType,
object : IMoGoWarningStatusListener {
override fun onShow() {
clTakeOverView.visibility = View.VISIBLE
}
override fun onDismiss() {
clTakeOverView.visibility = View.GONE
}
},
true,
6000L
)
}
}
if (reportList.size > 49) {
reportList.removeLast()
}
reportList.add(
0,
ReportEntity(
TimeUtils.millis2String(System.currentTimeMillis()),
it.src, it.level, it.msg, it.code, it.resultList, it.actionsList
)
)
reportListFloatWindow?.refreshData(reportList)
}
}
}
@@ -1308,12 +1433,16 @@ import java.util.*
.navigation() as BaseFragment
activity?.supportFragmentManager?.beginTransaction()
?.setCustomAnimations(R.anim.slide_in, R.anim.fade_out)?.apply {
if (!fragmentOverview.isAdded) {
add(R.id.module_main_id_smp_fragment, fragmentOverview, fragmentOverview.tagName)
} else {
if (!fragmentOverview.isAdded) {
add(
R.id.module_main_id_smp_fragment,
fragmentOverview,
fragmentOverview.tagName
)
} else {
show(fragmentOverview)
}.commitAllowingStateLoss()
}
}.commitAllowingStateLoss()
}
CallerDevaToolsManager.hideStatusBar()
}

View File

@@ -27,6 +27,11 @@ import com.mogo.eagle.core.data.app.AppConfigInfo
import com.mogo.eagle.core.data.autopilot.*
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.constants.MoGoConfig
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BAG_RECORD
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BEAUTY_MODE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_RAIN_MODE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_WARNING_UPLOAD
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.data.deva.scene.SceneModule
import com.mogo.eagle.core.data.enums.TrafficTypeEnum
@@ -36,10 +41,12 @@ import com.mogo.eagle.core.data.obu.ObuStatusInfo
import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.data.upgrade.UpgradeVersionEntity
import com.mogo.eagle.core.function.api.autopilot.*
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.api.map.listener.IMoGoMapLocationListener
import com.mogo.eagle.core.function.api.obu.IMoGoObuStatusListener
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
@@ -93,8 +100,8 @@ class DebugSettingView @JvmOverloads constructor(
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoObuStatusListener,
IMoGoAutopilotStatusListener, IMoGoAutopilotCarStateListener,
IMoGoMapLocationListener, IMoGoAutopilotIdentifyListener,
IMoGoAutopilotPlanningListener, IMoGoAutopilotCarConfigListener,
IMoGoAutopilotVehicleStateListener {
IMoGoAutopilotPlanningListener,
IMoGoAutopilotVehicleStateListener, IMoGoDevaToolsFuncConfigListener {
private val TAG = "DebugSettingView"
@@ -185,10 +192,16 @@ class DebugSettingView @JvmOverloads constructor(
CallerAutopilotIdentifyListenerManager.addListener(TAG, this)
// 添加 规划路径相关回调 监听
CallerAutopilotPlanningListenerManager.addListener(TAG, this)
// 添加 工控机基础信息回调 监听
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
//添加 车辆底盘数据回调 监听
CallerAutopilotVehicleStateListenerManager.addListener(TAG, this)
//添加 业务配置监听
CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(
FuncBizConfig.FOUNDATION,
TAG,
this
)
if (logInfoView != null) {
logInfoView!!.onEnterForeground()
}
@@ -214,11 +227,12 @@ class DebugSettingView @JvmOverloads constructor(
CallerAutopilotIdentifyListenerManager.removeListener(TAG)
// 移除 规划路径相关回调 监听
CallerAutopilotPlanningListenerManager.removeListener(TAG)
// 移除 工控机基础信息回调 监听
CallerAutopilotCarConfigListenerManager.removeListener(TAG)
//移除 车辆底盘数据回调 监听
// 移除 车辆底盘数据回调 监听
CallerAutopilotVehicleStateListenerManager.removeListener(TAG)
// 移除 业务配置监听
CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(this)
if (logInfoView != null) {
logInfoView!!.onEnterBackground()
}
@@ -561,7 +575,7 @@ class DebugSettingView @JvmOverloads constructor(
// 演示模式
tbIsDemoMode.setOnCheckedChangeListener { _, isChecked ->
CallerAutoPilotManager.setDemoMode(isChecked)
if(!isChecked){
if (!isChecked) {
//关闭美化模式时,通知工控机
CallerAutoPilotManager.setIPCDemoMode(isChecked)
}
@@ -574,7 +588,7 @@ class DebugSettingView @JvmOverloads constructor(
}
//只在司机端设置美化模式开关功能
if(AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
tbIsDemoMode.visibility = View.GONE
}
@@ -652,12 +666,8 @@ class DebugSettingView @JvmOverloads constructor(
// 初始化 tracker感知数据源 数据
trackerProvider.check(
when (FunctionBuildConfig.debugTrackerProvider) {
0 -> {
R.id.trackerProviderOrigin
}
1 -> {
R.id.trackerProviderObu
}
0 -> R.id.trackerProviderOrigin
1 -> R.id.trackerProviderObu
else -> R.id.trackerProviderOrigin
}
)
@@ -666,14 +676,38 @@ class DebugSettingView @JvmOverloads constructor(
R.id.trackerProviderOrigin -> {
FunctionBuildConfig.debugTrackerProvider = 0
// update tracker provider view
trackerIPCProvider.visibility = View.VISIBLE
}
R.id.trackerProviderObu -> {
FunctionBuildConfig.debugTrackerProvider = 1
// update tracker provider view
trackerIPCProvider.visibility = View.GONE
}
}
}
// 初始化 trackerIPC 感知数据源 数据
trackerIPCProvider.check(
when (FunctionBuildConfig.trackerIPCProvider) {
0 -> R.id.trackerIPCUnion
1 -> R.id.trackerIPCObu
2 -> R.id.trackerIPCV2N
else -> R.id.trackerIPCUnion
}
)
trackerProvider.setOnCheckedChangeListener{ _, checkedId ->
when(checkedId){
R.id.trackerIPCUnion -> {
FunctionBuildConfig.trackerIPCProvider = 0
}
R.id.trackerIPCObu -> {
FunctionBuildConfig.trackerIPCProvider = 1
}
R.id.trackerIPCV2N -> {
FunctionBuildConfig.trackerIPCProvider = 2
}
}
}
// 初始化 ADAS感知数据是否绘制 选择情况
tbIsDrawIdentifyData.isChecked = FunctionBuildConfig.isDrawIdentifyData
@@ -810,20 +844,21 @@ class DebugSettingView @JvmOverloads constructor(
}
//状态中心-后台优化状态
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
val backgroundStatus = "后台运行:" + if (BackgrounderPermission.getInstance()
.isPermissionLongBackgroundRunning(context)
) "<font color='green'>已优化</font>" else "<font color='red'>未优化</font>"
tvBackgroundOperation.text = Html.fromHtml(backgroundStatus, Html.FROM_HTML_MODE_LEGACY)
tvBackgroundOperation.setOnClickListener {
BackgrounderPermission.getInstance().showPermissionLongBackgroundRunningDialog(context)
BackgrounderPermission.getInstance()
.showPermissionLongBackgroundRunningDialog(context)
}
BackgrounderPermission.getInstance().setListener {
val str =
"后台运行:" + if (it) "<font color='green'>已优化</font>" else "<font color='red'>未优化</font>"
tvBackgroundOperation.text = Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY)
}
}else {
} else {
tvBackgroundOperation.visibility = GONE
}
//设置工控机连接状态
@@ -833,7 +868,8 @@ class DebugSettingView @JvmOverloads constructor(
/**
* 设置鹰眼本地参数配置监听
*/
@SuppressLint("SetTextI18n") private fun setEagleEyeConfigListener() {
@SuppressLint("SetTextI18n")
private fun setEagleEyeConfigListener() {
//初始化刹车加速度阈值信息
val brakeThreshold = SharedPrefsMgr.getInstance(context)
.getFloat(MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, -2.5F)
@@ -885,7 +921,7 @@ class DebugSettingView @JvmOverloads constructor(
FunctionBuildConfig.isReportWarning = isChecked
}
//异常上报开关只在司机端展示
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)){
if (AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode)) {
tbReportWarning.visibility = GONE
}
@@ -896,7 +932,7 @@ class DebugSettingView @JvmOverloads constructor(
p.menuInflater.inflate(R.menu.menu_env_pop, p.menu)
MenuCompat.setGroupDividerEnabled(p.menu, true)
p.setOnMenuItemClickListener { item ->
when(item.itemId) {
when (item.itemId) {
R.id.group_hy -> {
return@setOnMenuItemClickListener false
}
@@ -1104,7 +1140,10 @@ class DebugSettingView @JvmOverloads constructor(
accelerationIsShow = isChecked
}
tbRouteDynamicEffect.isChecked = AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)
tbRouteDynamicEffect.isChecked =
AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isBus(
FunctionBuildConfig.appIdentityMode
)
tbRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
@@ -1586,50 +1625,6 @@ class DebugSettingView @JvmOverloads constructor(
*/
@SuppressLint("SetTextI18n")
private fun drawAppInfo() {
AppConfigInfo.appName = AppUtils.getAppName()
if (AppConfigInfo.appVersionCode == 0) {
AppConfigInfo.appVersionCode = AppUtils.getAppVersionCode()
}
if (AppConfigInfo.appVersionName.isNullOrEmpty()) {
AppConfigInfo.appVersionName = AppUtils.getAppVersionName()
}
if (AppConfigInfo.appPackageName.isNullOrEmpty()) {
AppConfigInfo.appPackageName = AppUtils.getAppPackageName()
}
if (AppConfigInfo.uniqueDeviceId.isNullOrEmpty()) {
AppConfigInfo.uniqueDeviceId = DeviceIdUtils.getDeviceId(AbsMogoApplication.getApp())
}
if (AppConfigInfo.widevineIDMd5.isNullOrEmpty()) {
AppConfigInfo.widevineIDMd5 =
DeviceIdUtils.getWidevineIDWithMd5(AbsMogoApplication.getApp())
}
if (MoGoAiCloudClient.getInstance().aiCloudClientConfig != null) {
AppConfigInfo.mogoSN = MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn
AppConfigInfo.mogoToken = MoGoAiCloudClient.getInstance().aiCloudClientConfig.token
}
AppConfigInfo.netMode = DebugConfig.getNetMode()
if (MogoMap.getInstance().mogoMap != null) {
AppConfigInfo.mapSdkVersion = MogoMap.getInstance().mogoMap.mapVersion
}
AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context)
AppConfigInfo.isConnectSocket = DebugConfig.isDownloadSnapshot()
when {
AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端
AppConfigInfo.isDriver = true
AppConfigInfo.isConnectedNetty = CallerTelematicManager.getServerStarted()
}
AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> {
AppConfigInfo.isDriver = false
AppConfigInfo.isConnectedNetty = CallerTelematicManager.getClientConnStatus()
AppConfigInfo.serverSn = CallerTelematicManager.getServerToken()
}
else -> {
}
}
AppConfigInfo.teleTimeStamp = CallerAutoPilotManager.getTeleTimeStamp()
/**
* 设备绑定关系
*/
@@ -1825,16 +1820,14 @@ class DebugSettingView @JvmOverloads constructor(
*/
override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
mAutoPilotStatusInfo = autoPilotStatusInfo
AppConfigInfo.isConnectAutopilot = autoPilotStatusInfo.connectStatus
AppConfigInfo.connectStatusDescribe = autoPilotStatusInfo.connectStatusDescribe
setAutopilotConnectStatus()
}
/**
* 设置工控机连接状态
*/
private fun setAutopilotConnectStatus(){
ThreadUtils.runOnUiThread{
private fun setAutopilotConnectStatus() {
ThreadUtils.runOnUiThread {
tvAutopilotConnectStatus.text = Html.fromHtml(
"工控机连接状态:${
if (AppConfigInfo.isConnectAutopilot) {
@@ -1880,6 +1873,22 @@ class DebugSettingView @JvmOverloads constructor(
}
}
override fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?) {
when (type) {
BIZ_BEAUTY_MODE -> tbIsDemoMode.isClickable = !lock
BIZ_RAIN_MODE -> tbIsRainMode.isClickable = !lock
BIZ_WARNING_UPLOAD -> tbReportWarning.isClickable = !lock
BIZ_BAG_RECORD -> {
if (lock) {
btnRecordBag.isClickable = false
} else {
btnRecordBag.isClickable = true
btnRecordBag.requestFocus()
}
}
}
}
override fun onAutopilotCarStateData(gnssInfo: MessagePad.GnssInfo?) {
mGnssInfo = gnssInfo
//实时加速度列表
@@ -1945,18 +1954,6 @@ class DebugSettingView @JvmOverloads constructor(
mRouteInfoSize = globalPathResp?.wayPointsList?.size ?: 0
}
/**
* 工控机基础信息回调
*/
override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) {
carConfigResp.let {
AppConfigInfo.plateNumber = it.plateNumber//车牌号
AppConfigInfo.iPCMacAddress = it.macAddress//工控机MAC地址
AppConfigInfo.protocolVersionNumber = it.protocolVersionValue//工控机协议版本
}
}
/**
* 工控机异常回调
*/
@@ -2077,7 +2074,8 @@ class DebugSettingView @JvmOverloads constructor(
private fun toastMsg(msg: String) {
//当司机屏处于美化演示模式、msg为空时不弹吐司
if (!FunctionBuildConfig.isDemoMode && msg.isNotEmpty()
&& AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
&& AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)
) {
ToastUtils.showLong(msg)
}
}
@@ -2135,4 +2133,5 @@ class DebugSettingView @JvmOverloads constructor(
fun showReportListWindow(show: Boolean)
}
}

View File

@@ -0,0 +1,18 @@
package com.mogo.eagle.core.function.hmi.ui.takeover
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.hmi.R
class TakeOverView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.view_take_over, this, true)
}
}

View File

@@ -229,9 +229,6 @@ class AutoPilotAndCheckView @JvmOverloads constructor(
speedLimit = carConfigResp.speedLimit
tvAcceleration.text = "加速度 ${carConfigResp.maxAcceleration} m/s²"
etInputSpeed.setText((carConfigResp.speedLimit * 3.6).toInt().toString())
AppConfigInfo.plateNumber = carConfigResp.plateNumber//车牌号
AppConfigInfo.iPCMacAddress = carConfigResp.macAddress//工控机MAC地址
AppConfigInfo.protocolVersionNumber = carConfigResp.protocolVersionValue//工控机协议版本
}
}
}

View File

@@ -114,7 +114,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
}
SocketBuildConfig.isPrintLog = false;
// 初始化DevaTools,开始链路记录
CallerDevaToolsManager.INSTANCE.init(this);
CallerDevaToolsManager.INSTANCE.init();
}
private void initOverviewDb() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

View File

@@ -48,6 +48,16 @@
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.eagle.core.function.hmi.ui.takeover.TakeOverView
android:id="@+id/clTakeOverView"
android:visibility="gone"
android:layout_width="@dimen/hmi_take_over_request_width"
android:layout_height="@dimen/hmi_take_over_request_height"
android:layout_marginTop="@dimen/hmi_take_over_request_m_top"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--自动驾驶按钮及状态-->
<com.mogo.eagle.core.function.hmi.ui.widget.AutoPilotStatusView
android:id="@+id/viewAutopilotStatus"
@@ -186,8 +196,8 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_110"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<!--APP、MAP版本-->
<com.mogo.eagle.core.function.hmi.ui.widget.VersionNameView
@@ -203,10 +213,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="30px"
app:layout_constraintTop_toTopOf="@+id/viewLimitingVelocity"
app:layout_constraintEnd_toStartOf="@+id/viewLimitingVelocity"
app:layout_goneMarginTop="30px"
app:layout_goneMarginEnd="40px"/>
app:layout_constraintTop_toTopOf="@+id/viewLimitingVelocity"
app:layout_goneMarginEnd="40px"
app:layout_goneMarginTop="30px" />
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- app:layout_constraintBottom_toBottomOf="parent"-->

View File

@@ -1783,6 +1783,44 @@
</RadioGroup>
<RadioGroup
android:id="@+id/trackerIPCProvider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintTop_toBottomOf="@id/trackerProvider">
<RadioButton
android:id="@+id/trackerIPCUnion"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="@dimen/dp_10"
android:text="融合感知数据"
android:textColor="#000"
android:textSize="@dimen/dp_24" />
<RadioButton
android:id="@+id/trackerIPCObu"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="@dimen/dp_10"
android:text="融合OBU感知数据"
android:textColor="#000"
android:textSize="@dimen/dp_24" />
<RadioButton
android:id="@+id/trackerIPCV2N"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="@dimen/dp_10"
android:text="融合V2N感知数据"
android:textColor="#000"
android:textSize="@dimen/dp_24" />
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/hmi_take_over_request_width"
android:layout_height="@dimen/hmi_take_over_request_height">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/icon_take_over_request"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -66,4 +66,7 @@
<dimen name="module_mogo_och_margin_left">40px</dimen>
<dimen name="module_mogo_och_margin_bottom">46px</dimen>
<dimen name="hmi_take_over_request_width">810px</dimen>
<dimen name="hmi_take_over_request_height">560px</dimen>
<dimen name="hmi_take_over_request_m_top">524px</dimen>
</resources>

View File

@@ -65,4 +65,8 @@
<dimen name="module_mogo_och_autopilot_status_text_size">42px</dimen>
<dimen name="module_mogo_och_margin_left">40px</dimen>
<dimen name="module_mogo_och_margin_bottom">46px</dimen>
<dimen name="hmi_take_over_request_width">810px</dimen>
<dimen name="hmi_take_over_request_height">560px</dimen>
<dimen name="hmi_take_over_request_m_top">524px</dimen>
</resources>

View File

@@ -153,7 +153,7 @@ class MoGoMapDataCollectProvider : IMoGoMapDataCollectProvider, OnTaskListener,
executor.get()?.updateLocation(
location.longitude,
location.latitude,
location.altitude,
location.altitude,
location.bearing,
location.speed,
location.provider == "GPS_RTK")

View File

@@ -5,7 +5,8 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPointCloudListener
import com.mogo.eagle.core.function.api.base.IMoGoSubscriber
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPointCloudListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_MAP
import com.zhidaoauto.map.sdk.open.business.PointCloudHelper
import java.math.BigDecimal
@@ -44,7 +45,7 @@ class MapPointCloudSubscriber private constructor()
try {// 根据配置动态控制点云是否绘制
if (FunctionBuildConfig.isDrawPointCloudData && isDrawCloudPointDockerVersion()) {
if (!isDrawPointCloud) {
Logger.d(TAG, "====开启点云渲染====")
CallerLogger.d(M_MAP + TAG, "====开启点云渲染====")
isDrawPointCloud = true
PointCloudHelper.setIsDrawPointCloud(true)//打开点云绘制
}
@@ -58,12 +59,12 @@ class MapPointCloudSubscriber private constructor()
* @param isStrong 是否加粗显示
* @return 是否执行
*/
Logger.d(TAG, "====开始传入地图点云数据====")
CallerLogger.d(M_MAP + TAG, "====开始传入地图点云数据====")
val result = PointCloudHelper.updatePointCloudDataByPb(pointCloud, true, false, false)
Logger.d(TAG, "====结束传入地图点云数据=====$result")
CallerLogger.d(M_MAP + TAG, "====结束传入地图点云数据=====$result")
} else {
if (isDrawPointCloud) {
Logger.d(TAG, "====停止点云绘制====")
CallerLogger.d(M_MAP + TAG, "====停止点云绘制====")
isDrawPointCloud = false
PointCloudHelper.setIsDrawPointCloud(false)//停止点云绘制
}

View File

@@ -21,6 +21,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.module.common.drawer.TrafficMarkerDrawer
import com.mogo.module.common.enums.EventTypeEnum
import com.mogo.module.common.enums.EventTypeHelper
import com.mogo.service.IMogoServiceApis
import com.zhidao.support.obu.MogoObuManager
import com.zhidao.support.obu.OnMogoObuListener
@@ -53,7 +54,8 @@ class MogoPrivateObuManager private constructor() {
mContext = context
connectObu(context, ipAddress)
//控制日志输出
MogoObuManager.getInstance().init(MoGoAiCloudClientConfig.getInstance().getSn(), AppConfigInfo.toString())
MogoObuManager.getInstance()
.init(MoGoAiCloudClientConfig.getInstance().getSn(), AppConfigInfo.toString())
MogoObuManager.getInstance().registerListener(mogoObuListener)
}
@@ -111,7 +113,10 @@ class MogoPrivateObuManager private constructor() {
// 接收到的原始数据
override fun onReceiveOriginData(data: String) {
super.onReceiveOriginData(data)
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onReceiveOriginData ------> data = $data")
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onReceiveOriginData ------> data = $data"
)
}
@@ -124,7 +129,10 @@ class MogoPrivateObuManager private constructor() {
// CV2X系统信息
override fun onCvxAppInitIndInfo(info: CvxAppInitIndInfo) {
super.onCvxAppInitIndInfo(info)
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxAppInitIndInfo ------> $info")
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxAppInitIndInfo ------> $info"
)
if (info != null) {
if (!info.stack_info.isNullOrEmpty()) {
mObuStatusInfo.stackInfo = info.stack_info
@@ -176,7 +184,11 @@ class MogoPrivateObuManager private constructor() {
// 同步给MAP地图
CallerMapUIServiceManager.getMapUIController()?.syncLocation2Map(data)
// 同步更新经纬度和系统时间至 AutoPilotStatusListener
CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon(System.currentTimeMillis()/1000.0,position.longitude, position.latitude)
CallerAutoPilotStatusListenerManager.updateAutoPilotLatLon(
System.currentTimeMillis() / 1000.0,
position.longitude,
position.latitude
)
}
} catch (e: Exception) {
@@ -200,7 +212,10 @@ class MogoPrivateObuManager private constructor() {
// (3) 道路事件预警信息CVX_RTI_THREAT_IND
override fun onCvxRtiThreatIndInfo(info: CvxRtiThreatIndInfo?) {
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxRtiThreatIndInfo ------> $info")
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxRtiThreatIndInfo ------> $info"
)
if (info != null && info.threat_info != null && info.ext_info != null) {
var alertContent = ""
@@ -211,12 +226,12 @@ class MogoPrivateObuManager private constructor() {
val direction =
getMessageDirection(if (info.ext_info != null) info.ext_info.pos_classification else -1)
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxRtiThreatIndInfo direction = $direction -- pos_classification = ${info.ext_info.pos_classification}"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxRtiThreatIndInfo direction = $direction -- pos_classification = ${info.ext_info.pos_classification}"
)
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxRtiThreatIndInfo appId = $appId --status = $status --level = $level -- handleDirection = $direction --rtiType = ${info.ext_info.rti_type} --direction = $direction -- pos_classification = ${info.ext_info.pos_classification} "
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxRtiThreatIndInfo appId = $appId --status = $status --level = $level -- handleDirection = $direction --rtiType = ${info.ext_info.rti_type} --direction = $direction -- pos_classification = ${info.ext_info.pos_classification} "
)
when (appId) {
// 道路危险情况预警
@@ -232,13 +247,13 @@ class MogoPrivateObuManager private constructor() {
WarningDirectionEnum.ALERT_WARNING_TOP_LEFT,
WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT -> {
appId =
EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_LEFT_SHARP.poiType
EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_LEFT_SHARP.poiType
}
WarningDirectionEnum.ALERT_WARNING_RIGHT,
WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT,
WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT -> {
appId =
EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_RIGHT_SHARP.poiType
EventTypeEnum.TYPE_USECASE_ID_ROAD_TURN_RIGHT_SHARP.poiType
}
}
}
@@ -253,7 +268,7 @@ class MogoPrivateObuManager private constructor() {
//事故
0xC -> {
appId =
EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType
EventTypeEnum.TYPE_USECASE_ID_ROAD_COLLISION_WARNING.poiType
}
//拥堵
0xD -> {
@@ -262,7 +277,7 @@ class MogoPrivateObuManager private constructor() {
//行人
0xF -> {
appId =
EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType
EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType
}
//禁止停车
0x13 -> {
@@ -271,7 +286,7 @@ class MogoPrivateObuManager private constructor() {
//学校
0x14 -> {
appId =
EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_SCHOOL.poiType
EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_SCHOOL.poiType
}
//桥梁
0x17 -> {
@@ -284,7 +299,7 @@ class MogoPrivateObuManager private constructor() {
//人行横道
0x19 -> {
appId =
EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType
EventTypeEnum.TYPE_USECASE_ID_ROAD_PEDESTRIAN_CROSSING.poiType
}
//减速慢行
0x1A -> {
@@ -315,13 +330,13 @@ class MogoPrivateObuManager private constructor() {
ttsContent = EventTypeEnum.getWarningTts(appId)
if (info.threat_info != null) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"ttsContent = $ttsContent --alertContent = $alertContent ---info.threat_info.distance = ${info.threat_info.distance} "
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"ttsContent = $ttsContent --alertContent = $alertContent ---info.threat_info.distance = ${info.threat_info.distance} "
)
if (info.threat_info.distance.toInt() != 0) {
alertContent = String.format(
EventTypeEnum.getWarningContent(appId),
info.threat_info.distance.toInt()
EventTypeEnum.getWarningContent(appId),
info.threat_info.distance.toInt()
)
} else {
alertContent = "前方拥堵,减速慢行"
@@ -329,8 +344,8 @@ class MogoPrivateObuManager private constructor() {
}
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"ttsContent = $ttsContent --alertContent = $alertContent"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"ttsContent = $ttsContent --alertContent = $alertContent"
)
}
}
@@ -344,18 +359,19 @@ class MogoPrivateObuManager private constructor() {
// CallerHmiManager.showWarning(direction)
//显示弹框,语音提示
CallerHmiManager.showWarningV2X(appId,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(appId + direction.direction).toString(),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
}
},
true,
5000L
CallerHmiManager.showWarningV2X(
appId,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(appId + direction.direction).toString(),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
}
},
true,
5000L
)
// 更新数据
TrafficDataConvertUtils.cvxRtiThreatIndInfo2TrafficData(info)?.let {
@@ -384,7 +400,10 @@ class MogoPrivateObuManager private constructor() {
// (4) V2I预警信息CVX_IVP_THREAT_IND红绿灯
override fun onCvxIvpThreatIndInfo(info: CvxIvpThreatIndInfo?) {
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "CvxIvpThreatIndInfo ------> $info")
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"CvxIvpThreatIndInfo ------> $info"
)
if (info != null && info.ext_info != null
&& info.threat_info != null
&& info.ext_info.lights != null
@@ -404,17 +423,20 @@ class MogoPrivateObuManager private constructor() {
// )
handlerTrafficLight(
info.threat_info.app_id,
info.status,
info.ext_info.lights,
info.ext_info.index
info.threat_info.app_id,
info.status,
info.ext_info.lights,
info.ext_info.index
)
}
}
// (2) 弱势交通参与者预警信息CVX_PTC_THREAT_IND
override fun onCvxPtcThreatIndInfo(info: CvxPtcThreatIndInfo?) {
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxPtcInfoIndInfo ------> $info")
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxPtcInfoIndInfo ------> $info"
)
// 交通参与者类型 0x0:未知 UNKNOWN | 0x1:非机动车 NON_MOTOR | 0x2:行人 PEDESTRIAN 0x3:RSU
if (info != null && (info.ptc_type == 1 || info.ptc_type == 2)) {
//v2i数据传输延迟
@@ -431,8 +453,8 @@ class MogoPrivateObuManager private constructor() {
// )
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxPtcInfoIndInfo ---status---> ${info.status}"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxPtcInfoIndInfo ---status---> ${info.status}"
)
var v2xType = ""
if (info.ptc_type == 1) { //摩托车
@@ -454,18 +476,19 @@ class MogoPrivateObuManager private constructor() {
// if (level == 2 || level == 3) { //不考虑level
//显示警告红边
CallerHmiManager.showWarning(direction)
CallerHmiManager.showWarningV2X(v2xType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(v2xType + direction.direction).toString(),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
}
},
true,
5000L
CallerHmiManager.showWarningV2X(
v2xType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(v2xType + direction.direction).toString(),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
}
},
true,
5000L
)
// }
// 更新数据
@@ -523,22 +546,26 @@ class MogoPrivateObuManager private constructor() {
// (1) V2V预警信息CVX_V2V_THREAT_IND
override fun onCvxV2vThreatIndInfo(info: CvxV2vThreatIndInfo?) {
CallerLogger.d("$M_OBU${MogoObuConst.TAG_MOGO_OBU}", "onCvxV2vThreatIndInfo ------> $info")
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxV2vThreatIndInfo ------> $info"
)
info?.let {
//预警信息,预警类型 threat_level 2、3
info.threat_info?.let {
//预警方位
val direction = getMessageDirection(if (info.ext_info != null) info.ext_info.target_classification else -1)
val direction =
getMessageDirection(if (info.ext_info != null) info.ext_info.target_classification else -1)
//处理预警类型
val appId = info.threat_info.app_id
val level = info.threat_info.threat_level
val status = info.status
if (info.ext_info != null) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxV2vThreatIndInfo target_classification = ${
getMessageDirection(info.ext_info.target_classification)
} --- direction = $direction --- appId = $appId ---level = $level -- status = $status"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"onCvxV2vThreatIndInfo target_classification = ${
getMessageDirection(info.ext_info.target_classification)
} --- direction = $direction --- appId = $appId ---level = $level -- status = $status"
)
}
@@ -604,8 +631,8 @@ class MogoPrivateObuManager private constructor() {
*/
private fun handlerTrafficLight(appId: Int, status: Int, lights: List<Light>, index: Int) {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"handlerTrafficLight appId = $appId --- status = $status ---index = $index ---lights.size = ${lights.size} ---lights = $lights "
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"handlerTrafficLight appId = $appId --- status = $status ---index = $index ---lights.size = ${lights.size} ---lights = $lights "
)
when (status) {
// 添加
@@ -631,9 +658,9 @@ class MogoPrivateObuManager private constructor() {
*/
@Synchronized
private fun changeTrafficLightStatus(
appId: Int,
lights: List<Light>,
index: Int
appId: Int,
lights: List<Light>,
index: Int
) {
var ttsContent = ""
var alertContent = ""
@@ -641,8 +668,8 @@ class MogoPrivateObuManager private constructor() {
if (index != -1 && lights.size >= index) {
val currentLight = lights[index]
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"currentLight = $currentLight ---currentLight.phase = ${currentLight.phase} ---rlvw_violation_type = ${currentLight.rlvw_violation_type} --- index = $index ---appId = $appId ---appId = $appId"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"currentLight = $currentLight ---currentLight.phase = ${currentLight.phase} ---rlvw_violation_type = ${currentLight.rlvw_violation_type} --- index = $index ---appId = $appId ---appId = $appId"
)
// 闯红灯预警
when (currentLight.rlvw_violation_type) {
@@ -655,8 +682,8 @@ class MogoPrivateObuManager private constructor() {
ttsContent = EventTypeEnum.getWarningTts(appId.toString())
alertContent = EventTypeEnum.getWarningContent(appId.toString())
CallerHmiManager.showWarningV2X(
appId.toString(), alertContent, ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
appId.toString(), null, true, 5000L
appId.toString(), alertContent, ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
appId.toString(), null, true, 5000L
)
}
0x3 -> {//闯黄灯 V2I_RLVW_VIOLATION_TYPE_RUNNING_YELLOW_LIGHT
@@ -666,7 +693,7 @@ class MogoPrivateObuManager private constructor() {
when (currentLight.phase) {
// 灯光不可用
0x0 -> {
CallerHmiManager.showWarningTrafficLight(0,2)
CallerHmiManager.showWarningTrafficLight(0, 2)
}
// 红灯
0x1 -> {
@@ -675,7 +702,7 @@ class MogoPrivateObuManager private constructor() {
isRedLight = true
}
isGreenLight = false
CallerHmiManager.showWarningTrafficLight(1,2)
CallerHmiManager.showWarningTrafficLight(1, 2)
val red = currentLight.count_down.toInt()
CallerHmiManager.changeCountdownRed(red)
@@ -690,7 +717,7 @@ class MogoPrivateObuManager private constructor() {
isGreenLight = true
}
isRedLight = false
CallerHmiManager.showWarningTrafficLight(3,2)
CallerHmiManager.showWarningTrafficLight(3, 2)
val green = currentLight.count_down.toInt()
CallerHmiManager.changeCountdownGreen(green)
//防止数据出现问题的容错
@@ -698,44 +725,44 @@ class MogoPrivateObuManager private constructor() {
CallerHmiManager.changeCountdownYellow(0)
// 拼接建议速度
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"speed_min = ${currentLight.glosa_suggested_speed_min} --speed_max = ${currentLight.glosa_suggested_speed_max.toInt()}"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"speed_min = ${currentLight.glosa_suggested_speed_min} --speed_max = ${currentLight.glosa_suggested_speed_max.toInt()}"
)
val adviceSpeed =
"${currentLight.glosa_suggested_speed_min.toInt()} - ${currentLight.glosa_suggested_speed_max.toInt()}"
"${currentLight.glosa_suggested_speed_min.toInt()} - ${currentLight.glosa_suggested_speed_max.toInt()}"
val adviceSpeedTts =
"${currentLight.glosa_suggested_speed_min.toInt()}${currentLight.glosa_suggested_speed_max.toInt()}"
"${currentLight.glosa_suggested_speed_min.toInt()}${currentLight.glosa_suggested_speed_max.toInt()}"
ttsContent =
String.format(
EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeedTts
)
String.format(
EventTypeEnum.getWarningTts(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeedTts
)
alertContent =
String.format(
EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeed
)
String.format(
EventTypeEnum.getWarningContent(EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType),
adviceSpeed
)
val maxSpeed = currentLight.glosa_suggested_speed_max.toInt()
if (maxSpeed > 0) {
CallerHmiManager.showWarningV2X(
EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
appId.toString(),
null,
true,
5000L
EventTypeEnum.TYPE_USECASE_ID_IVP_GREEN.poiType,
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
appId.toString(),
null,
true,
5000L
)
}
}
// 黄灯
0x3 -> {
CallerHmiManager.disableWarningV2X(appId.toString())
CallerHmiManager.showWarningTrafficLight(2,2)
CallerHmiManager.showWarningTrafficLight(2, 2)
val yellow = currentLight.count_down.toInt()
CallerHmiManager.changeCountdownYellow(yellow)
CallerHmiManager.changeCountdownGreen(0)
@@ -747,6 +774,7 @@ class MogoPrivateObuManager private constructor() {
}
//todo 二期优化此处内容,注解参数
/**
* 构造对应展示数据和场景 根据obu的场景add change delete确定是否展示
*
@@ -755,86 +783,76 @@ class MogoPrivateObuManager private constructor() {
* @see com.mogo.module.common.enums.EventTypeEnum
*/
private fun handleSdkObu(
appId: Int,
direction: WarningDirectionEnum,
status: Int,
level: Int,
info: CvxV2vThreatIndInfo
appId: Int,
direction: WarningDirectionEnum,
status: Int,
level: Int,
info: CvxV2vThreatIndInfo
) {
// 这里排除需要特殊定制的语音及文案外,其余的都可以使用 EventTypeEnum 提供的
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"handleSdkObu appId = $appId --- handleDirection = $direction ---level = $level ---status = $status"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"handleSdkObu appId = $appId --- handleDirection = $direction ---level = $level ---status = $status"
)
var alertContent: String
var ttsContent: String
var alertContent: String? = null
var ttsContent: String? = null
var changeVisualAngle = false
when (appId.toString()) {
// 变道预警,注意左后车辆/注意右后车辆
EventTypeEnum.TYPE_USECASE_ID_LCW.poiType -> {
alertContent = EventTypeEnum.getWarningContent(appId.toString())
ttsContent = EventTypeEnum.getWarningTts(appId.toString())
if (
direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT
) {
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
} else if (
direction == WarningDirectionEnum.ALERT_WARNING_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT
) {
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
EventTypeHelper.getLCW(appId, direction) { alert, tts ->
alertContent = alert
ttsContent = tts
}
}
//车辆失控预警
EventTypeEnum.TYPE_USECASE_ID_CLW.poiType -> {
alertContent = EventTypeEnum.getWarningContent(appId.toString())
ttsContent = EventTypeEnum.getWarningTts(appId.toString())
alertContent = String.format(alertContent, direction.desc)
ttsContent = String.format(ttsContent, direction.desc)
EventTypeHelper.getCLW(appId, direction) { alert, tts ->
alertContent = alert
ttsContent = tts
}
}
//左转辅助
EventTypeEnum.TYPE_USECASE_ID_LTA.poiType -> {
alertContent = EventTypeEnum.getWarningContent(appId.toString())
ttsContent = EventTypeEnum.getWarningTts(appId.toString())
EventTypeHelper.getLTA(appId) { alert, tts ->
alertContent = alert
ttsContent = tts
}
}
//异常车辆提醒
EventTypeEnum.TYPE_USECASE_ID_AVW.poiType -> {
alertContent = EventTypeEnum.getWarningContent(appId.toString())
ttsContent = EventTypeEnum.getWarningTts(appId.toString())
alertContent = String.format(alertContent, direction.desc)
ttsContent = String.format(ttsContent, direction.desc)
EventTypeHelper.getAVW(appId, direction) { alert, tts ->
alertContent = alert
ttsContent = tts
}
}
//盲区预警
EventTypeEnum.TYPE_USECASE_ID_BSW.poiType -> {
ttsContent = EventTypeEnum.getWarningTts(appId.toString())
alertContent = EventTypeEnum.getWarningContent(appId.toString())
if (
direction == WarningDirectionEnum.ALERT_WARNING_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT
) { //左后
changeVisualAngle = true
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
} else if (
direction == WarningDirectionEnum.ALERT_WARNING_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT ||
direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT
) { //右后
changeVisualAngle = true
ttsContent = String.format(ttsContent, "")
alertContent = String.format(alertContent, "")
EventTypeHelper.getBSW(appId, direction) { alert, tts, visualAngle ->
alertContent = alert
ttsContent = tts
changeVisualAngle = visualAngle
}
}
//前车急刹预警
EventTypeEnum.TYPE_USECASE_ID_EBW.poiType -> {
EventTypeHelper.getEBW(appId){ alert ,tts ->
alertContent = alert
ttsContent = tts
}
}
//前向碰撞预警
EventTypeEnum.TYPE_USECASE_ID_FCW.poiType -> {
EventTypeHelper.getFCW(appId){ alert ,tts ->
alertContent = alert
ttsContent = tts
}
}
//逆向超车预警
EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType -> {
EventTypeHelper.getDNPW(appId){ alert ,tts ->
alertContent = alert
ttsContent = tts
}
}
@@ -850,34 +868,35 @@ class MogoPrivateObuManager private constructor() {
ObuConstants.STATUS.ADD,
ObuConstants.STATUS.UPDATE -> {
CallerLogger.d(
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction"
"$M_OBU${MogoObuConst.TAG_MOGO_OBU}",
"appId2 = $appId --- level = $level ---ttsContent = $ttsContent --- alertContent = $alertContent --- direction = $direction"
)
if (level == 2 || level == 3) {
//显示弹框,语音提示
CallerHmiManager.showWarningV2X(appId.toString(),
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(appId + direction.direction).toString(),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
CallerHmiManager.showWarningV2X(
appId.toString(),
alertContent,
ttsContent,// 只有第一次才tts防止更新的时候不断的提醒
(appId + direction.direction).toString(),//使用当前事件类型+方向记录tag当发生变化的时候关闭当前弹出新的
object : IMoGoWarningStatusListener {
override fun onShow() {
super.onShow()
if (changeVisualAngle) {
CallerVisualAngleManager.changeVisualAngle(TooClose)
}
override fun onShow() {
super.onShow()
if (changeVisualAngle) {
CallerVisualAngleManager.changeVisualAngle(TooClose)
}
}
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
if (changeVisualAngle) {
CallerVisualAngleManager.changeVisualAngle(Default())
}
override fun onDismiss() {
// 关闭警告红边
CallerHmiManager.showWarning(WarningDirectionEnum.ALERT_WARNING_NON)
if (changeVisualAngle) {
CallerVisualAngleManager.changeVisualAngle(Default())
}
},
true,
5000L
}
},
true,
5000L
)
//显示警告红边
CallerHmiManager.showWarning(direction)

View File

@@ -59,6 +59,7 @@ import com.mogo.module.common.entity.*
import com.mogo.module.common.entity.V2XMessageEntity.V2XTypeEnum
import com.mogo.module.common.enums.EventTypeEnum
import com.mogo.module.common.enums.EventTypeEnum.FOURS_BLOCK_UP
import com.mogo.module.common.enums.EventTypeHelper
import com.mogo.service.statusmanager.IMogoStatusChangedListener
import com.mogo.service.statusmanager.StatusDescriptor
import com.mogo.service.statusmanager.StatusDescriptor.ACC_STATUS
@@ -525,70 +526,78 @@ object V2XEventManager : IMoGoMapLocationListener, IMoGoTokenCallback, IV2XCallb
var changeVisualAngle = false
when (message.status) {
1 -> {
var tts = ""
var content = ""
var appId = 0
var tempAppId = 0
var tempTts = ""
var tempContent = ""
when (message.typeId) {
1001 -> {
// 弱势交通碰撞预警
appId = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt()
tts = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.tts
content = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.content
EventTypeHelper.getVRU{ appId, tts, content ->
tempAppId = appId
tempTts = tts
tempContent = content
}
}
1002 -> {
// 弱势交通逆行预警
appId = EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt()
tts = "行人逆行预警"
content = "行人逆行预警"
EventTypeHelper.getVRURI { appId, tts, content ->
tempAppId = appId
tempTts = tts
tempContent = content
}
}
1003 -> {
// 交叉路口碰撞预警
changeVisualAngle = true
appId = EventTypeEnum.TYPE_USECASE_ID_ICW.poiType.toInt()
tts = EventTypeEnum.TYPE_USECASE_ID_ICW.tts
content = EventTypeEnum.TYPE_USECASE_ID_ICW.content
tempAppId = EventTypeEnum.TYPE_USECASE_ID_ICW.poiType.toInt()
tempTts = EventTypeEnum.TYPE_USECASE_ID_ICW.tts
tempContent = EventTypeEnum.TYPE_USECASE_ID_ICW.content
}
1004 -> {
// 交叉路口碰撞预警
changeVisualAngle = true
appId = EventTypeEnum.TYPE_USECASE_ID_BSW.poiType.toInt()
tts = String.format(
tempAppId = EventTypeEnum.TYPE_USECASE_ID_BSW.poiType.toInt()
tempTts = String.format(
EventTypeEnum.TYPE_USECASE_ID_BSW.tts,
getWarningDirection()
)
content = EventTypeEnum.TYPE_USECASE_ID_BSW.content
tempContent = EventTypeEnum.TYPE_USECASE_ID_BSW.content
}
1006 -> {
// 逆向超车预警
appId = EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType.toInt()
tts = EventTypeEnum.TYPE_USECASE_ID_DNPW.tts
content = EventTypeEnum.TYPE_USECASE_ID_DNPW.content
tempAppId = EventTypeEnum.TYPE_USECASE_ID_DNPW.poiType.toInt()
tempTts = EventTypeEnum.TYPE_USECASE_ID_DNPW.tts
tempContent = EventTypeEnum.TYPE_USECASE_ID_DNPW.content
}
1005 -> {
// 闯红灯预警
appId = EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt()
tts = EventTypeEnum.TYPE_USECASE_ID_IVP.tts
content = EventTypeEnum.TYPE_USECASE_ID_IVP.content
tempAppId = EventTypeEnum.TYPE_USECASE_ID_IVP.poiType.toInt()
tempTts = EventTypeEnum.TYPE_USECASE_ID_IVP.tts
tempContent = EventTypeEnum.TYPE_USECASE_ID_IVP.content
}
2001 -> {
// 最优车道
appId = EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.poiType.toInt()
tts = EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.tts
content = EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.content
EventTypeHelper.getOptLine{ appId, tts, content ->
tempAppId = appId
tempTts = tts
tempContent = content
}
}
3001 -> {
// 前方道路拥堵预警
appId = FOURS_BLOCK_UP.poiType.toInt()
tts = FOURS_BLOCK_UP.tts
content = FOURS_BLOCK_UP.content
EventTypeHelper.getTJW{ appId, tts, content ->
tempAppId = appId
tempTts = tts
tempContent = content
}
}
}
// 显示弹框,语音提示
CallerHmiManager.showWarningV2X(
appId.toString(),
content,
tts,
"$appId",
tempAppId.toString(),
tempContent,
tempTts,
"$tempAppId",
object : IMoGoWarningStatusListener {
val change = changeVisualAngle
override fun onShow() {

View File

@@ -12,7 +12,7 @@ import com.mogo.eagle.core.function.v2x.events.manager.V2XStatusManager;
import com.mogo.eagle.core.function.v2x.events.scenario.impl.AbsV2XScenario;
import com.mogo.eagle.core.function.v2x.events.scenario.view.IV2XMarker;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.mogo.logger.Logger;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.module.common.entity.MarkerExploreWay;
import com.mogo.module.common.entity.V2XMessageEntity;
import com.mogo.module.common.entity.V2XRoadEventEntity;
@@ -41,7 +41,7 @@ public class V2XRoadEventScenario extends AbsV2XScenario<V2XRoadEventEntity> imp
@Override
public void init(V2XMessageEntity<V2XRoadEventEntity> v2XMessageEntity) {
try {
Logger.d(M_V2X + TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity));
CallerLogger.INSTANCE.d(M_V2X + TAG, "v2XMessageEntity:" + GsonUtil.jsonFromObject(v2XMessageEntity));
V2XRoadEventEntity v2XRoadEventEntity = v2XMessageEntity.getContent();
if (v2XRoadEventEntity != null) {
if (v2XMessageEntity.isShowState()) {

View File

@@ -1,6 +1,9 @@
package com.mogo.eagle.core.function.v2x.redlightwarning
import android.location.Location
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_IVP_GREEN
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import com.mogo.eagle.core.data.map.MogoLatLng
import com.mogo.eagle.core.data.trafficlight.*
@@ -16,6 +19,7 @@ import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.map.navi.IMogoCarLocationChangedListener2
import com.mogo.module.common.MogoApisHandler
import com.mogo.module.common.enums.EventTypeEnum
import com.zhjt.service_biz.BizConfig
import kotlin.math.abs
import kotlin.math.ceil
import kotlin.math.floor
@@ -162,6 +166,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener,
/**
* 闯红灯预警
*/
@BizConfig(V2I,"",BIZ_IVP)
private fun redLightWarning() {
CallerLogger.d("$M_V2X$TAG", "=====闯红灯预警=====")
ThreadUtils.runOnUiThread {
@@ -172,6 +177,7 @@ class RedLightWarningManager : IMoGoTrafficLightListener, IMoGoVipSetListener,
/**
* 绿灯通行提示
*/
@BizConfig(V2I,"",BIZ_IVP_GREEN)
private fun greenLightWarning(speed: String = "50") {
CallerLogger.d("$M_V2X$TAG", "=====绿灯通行预警=====")
ThreadUtils.runOnUiThread {

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.v2x.trafficlight
import android.content.Context
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.data.trafficlight.TrafficLightControl
import com.mogo.eagle.core.data.trafficlight.TrafficLightDetail
import com.mogo.eagle.core.function.api.trafficlight.ITrafficLightProvider
import com.mogo.eagle.core.function.v2x.trafficlight.TrafficLightConst.Companion.MODULE_NAME
@@ -31,7 +32,7 @@ class TrafficLightProvider : ITrafficLightProvider {
crossingNo: String,
heading: Double,
controlTime: Int,
onSuccess: (() -> Unit),
onSuccess: ((TrafficLightControl) -> Unit),
onError: ((String) -> Unit)
) {
return MogoTrafficLightManager.INSTANCE.turnLightToGreen(

View File

@@ -4,11 +4,8 @@ import android.content.Context
import android.location.Location
import android.os.Handler
import android.os.Looper
import com.mogo.eagle.core.data.trafficlight.*
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import com.mogo.eagle.core.data.trafficlight.RoadIDResult
import com.mogo.eagle.core.data.trafficlight.TrafficLightDetail
import com.mogo.eagle.core.data.trafficlight.TrafficLightResult
import com.mogo.eagle.core.data.trafficlight.isInRange
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
@@ -159,7 +156,7 @@ class MogoTrafficLightManager : IMogoCarLocationChangedListener2 {
crossingNo: String,
heading: Double,
controlTime: Int,
onSuccess: (() -> Unit),
onSuccess: ((TrafficLightControl) -> Unit),
onError: ((String) -> Unit)
) {
trafficLightNetWorkModel.turnLightToGreen(

View File

@@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.v2x.trafficlight.network
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.trafficlight.RoadIDResult
import com.mogo.eagle.core.data.trafficlight.TrafficLightControl
import com.mogo.eagle.core.data.trafficlight.TrafficLightResult
import retrofit2.http.FieldMap
import retrofit2.http.FormUrlEncoded
@@ -22,6 +23,6 @@ interface TrafficLightApiService {
//变灯
@FormUrlEncoded
@POST("mec-etl-server/light/bdg/newTask")
suspend fun changeLight(@FieldMap turnLight: Map<String, String>): BaseResponse<Any>
suspend fun changeLight(@FieldMap turnLight: Map<String, String>): BaseResponse<TrafficLightControl>
}

View File

@@ -107,10 +107,10 @@ class TrafficLightNetWorkModel {
crossingNo: String,
heading: Double,
controlTime: Int,
onSuccess: (() -> Unit),
onSuccess: ((TrafficLightControl) -> Unit),
onError: ((String) -> Unit)
) {
request<BaseResponse<Any>> {
request<BaseResponse<TrafficLightControl>> {
val map = hashMapOf<String, String>()
start {
val trafficLightRequestData =
@@ -124,7 +124,7 @@ class TrafficLightNetWorkModel {
}
}
onSuccess {
onSuccess.invoke()
onSuccess.invoke(it.result)
}
onError {
if (it.message != null) {

View File

@@ -1,28 +1,32 @@
package com.mogo.eagle.core.function.v2x.vip
import android.content.Context
import android.location.Location
import android.os.Handler
import android.os.Looper
import android.os.Message
import com.mogo.aicloud.services.socket.IMogoOnMessageListener
import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.cloud.commons.utils.CoordinateUtils
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import com.mogo.eagle.core.data.trafficlight.*
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VIP
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N
import com.mogo.eagle.core.data.trafficlight.TrafficLightResult
import com.mogo.eagle.core.data.trafficlight.currentRoadTrafficLight
import com.mogo.eagle.core.data.trafficlight.isGreen
import com.mogo.eagle.core.data.v2x.VipMessage
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.api.trafficlight.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.trafficlight.CallerTrafficLightListenerManager
import com.mogo.eagle.core.function.call.vip.CallVipSetListenerManager
import com.mogo.eagle.core.function.v2x.trafficlight.core.MogoTrafficLightManager
import com.mogo.eagle.core.function.v2x.vip.network.VipNetWorkModel
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_V2X
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.module.common.enums.EventTypeEnum
import com.mogo.aicloud.services.socket.IMogoOnMessageListener
import kotlin.math.abs
import com.zhjt.service_biz.BizConfig
class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListener,
Handler.Callback {
@@ -39,16 +43,13 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
}
private var mContext: Context? = null
private var mLocation: Location? = null
private var turnLightFirst = false
private var turnLightEnd = true
private var turnLight = false
private var vip: Boolean = false
@Volatile
private var exit: Boolean = false
private var result: TrafficLightResult? = null
private var lastResult: TrafficLightStatus? = null
private val vipNetWorkModel = VipNetWorkModel()
private val handler = Handler(Looper.getMainLooper(), this)
@@ -78,6 +79,7 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
return VipMessage::class.java
}
@BizConfig(V2N, "", BIZ_VIP)
override fun onMsgReceived(vipMessage: VipMessage?) {
CallerLogger.d("$M_V2X$TAG", "onMsgReceived vipMessage : ${vipMessage.toString()}")
vipMessage?.let {
@@ -111,68 +113,34 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
if (trafficLightResult.currentRoadTrafficLight() == null) {
CallerLogger.d(
"$M_V2X$TAG",
"vip 获取到灯态,但没找到对应车道数据 result : $trafficLightResult , then resetConditions"
"vip 获取到灯态,但没找到对应车道数据 trafficLightResult : $trafficLightResult , then resetConditions"
)
resetConditions()
return
}
val currentResult = trafficLightResult.currentRoadTrafficLight()
lastResult = result?.currentRoadTrafficLight()
val lastResult = result?.currentRoadTrafficLight()
CallerLogger.d(
"$M_V2X$TAG",
"检查是否变灯 last.remain : ${lastResult?.remain} , color : ${lastResult?.color} , current.remain : ${currentResult?.remain} , color : ${currentResult?.color}, turnLightFirst : $turnLightFirst"
"检查是否变灯 last.remain : ${lastResult?.remain} , color : ${lastResult?.color} , current.remain : ${currentResult?.remain} , color : ${currentResult?.color}, turnLight : $turnLight"
)
this.result = trafficLightResult
lastResult?.let {
//如果上次结果和本次灯态结果变化比较大则已变灯控制HMI展示弹窗
if (abs(currentResult!!.remain - it.remain) > 5 && currentResult.isGreen()) {
CallerLogger.d("$M_V2X$TAG", "调用showWarningV2X to show")
CallerHmiManager.showWarningV2X(
EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType,
EventTypeEnum.TYPE_VIP_IDENTIFICATION.content,
EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts,
EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType,
object : IMoGoWarningStatusListener {
override fun onShow() {}
override fun onDismiss() {
CallerLogger.d(
"$M_V2X$TAG",
"showWarningV2X vip dismiss , resetConditions"
)
resetConditions()
}
},
true,
5000L
)
}
}
if (!turnLightFirst) {
if (!turnLight) {
// 首次判断,变灯
turnLightFirst = true
turnLight = true
val controlTime = if (currentResult!!.isGreen()) 45 - currentResult.remain else 45
CallerLogger.d("$M_V2X$TAG", "触发变灯 , controlTime : $controlTime")
turnLight(controlTime)
}
//可作为补偿措施,暂不启用
// mLocation?.let {
// if (canGetThroughCross(it, trafficLightResult)) {
// turnLight()
// }
// }
}
private fun resetConditions() {
turnLightFirst = false
turnLightEnd = true
turnLight = false
result = null
lastResult = null
}
private fun setVip(cancelDelayTime: Long) {
@@ -192,32 +160,13 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
if (handler.hasMessages(MSG_WHAT_VIP_CANCEL)) {
handler.removeMessages(MSG_WHAT_VIP_CANCEL)
}
resetConditions()
CallerHmiManager.vipIdentification(false)
CallVipSetListenerManager.invokeVipSetStatus(false)
CallerTrafficLightListenerManager.unRegisterTrafficLightListener(TAG)
CallerTrafficLightListenerManager.unRegisterEnterCrossRoadListener(TAG)
}
private fun canGetThroughCross(
it: Location,
trafficLightResult: TrafficLightResult
): Boolean {
return if (CoordinateUtils.calculateLineDistance(
it.longitude,
it.latitude,
trafficLightResult.lon,
trafficLightResult.lat
) < 20
&& turnLightEnd
&& trafficLightResult.laneList.mid.turnRedAtOnce()
) {
turnLightEnd = false
false
} else {
true
}
}
private fun requestVip() {
vipNetWorkModel.requestVip({
if (handler.hasMessages(MSG_WHAT_VIP_SEARCH)) {
@@ -245,20 +194,65 @@ class VipCarManager : IMogoOnMessageListener<VipMessage>, IMoGoTrafficLightListe
if (result == null || mContext == null) return
val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(mContext!!)
if (locationClient != null) {
var bearing =
val bearing =
locationClient.lastKnowLocation.bearing.toDouble()
CallerLogger.d("$M_V2X$TAG", "turnLight -- bearing : $bearing")
CallerLogger.d("$M_V2X$TAG", "-- turnLight -- ")
MogoTrafficLightManager.INSTANCE.turnLightToGreen(
result!!.lightId, result!!.crossId, bearing, controlTime,
{
CallerLogger.d("$M_V2X$TAG", "变灯请求成功")
if (it.sn == MoGoAiCloudClientConfig.getInstance().sn && it.code == 0) {
CallerLogger.d("$M_V2X$TAG", "变灯请求成功")
showWarning(
EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType,
EventTypeEnum.TYPE_VIP_IDENTIFICATION.content,
EventTypeEnum.TYPE_VIP_IDENTIFICATION.tts,
EventTypeEnum.TYPE_VIP_IDENTIFICATION.poiType
)
} else {
val time = if (it.countDown / 60 >= 1) {
"${it.countDown / 60}${it.countDown % 60}秒后重试"
} else {
val temp = if (it.countDown == 0) {
1
} else {
it.countDown
}
"${temp}秒后重试"
}
showWarning(
EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType,
EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.content + time,
EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.tts,
EventTypeEnum.TYPE_VIP_ERROR_IDENTIFICATION.poiType
)
}
},
{ errorMsg ->
CallerLogger.e("$M_V2X$TAG", "变灯请求失败 msg : $errorMsg")
ToastUtils.showLong("服务异常,请稍后重试")
})
}
}
private fun showWarning(
v2xType: String,
alertContent: CharSequence,
ttsContent: String,
tag: String
) {
CallerHmiManager.showWarningV2X(
v2xType, alertContent, ttsContent, tag,
object : IMoGoWarningStatusListener {
override fun onShow() {}
override fun onDismiss() {
resetConditions()
}
},
true,
5000L
)
}
fun destroy() {
MogoAiCloudSocketManager.getInstance(mContext)
.unregisterLifecycleListener(401025)

View File

@@ -84,7 +84,7 @@ object FunctionBuildConfig {
*/
@Volatile
@JvmField
var trackerProvider = 0
var trackerIPCProvider = 0
/**
* 地图是否绘制Adas识别回调的Marker
@@ -104,15 +104,6 @@ object FunctionBuildConfig {
@JvmField
var isDrawUnknownIdentifyData = false
/**
* 地图是否绘制 OBU 识别回调的Marker
* true - 绘制
* false - 不绘制
*/
@Volatile
@JvmField
var isDrawObuIdentifyData = true
/**
* 地图是否绘制 点云数据
* true - 绘制

View File

@@ -0,0 +1,45 @@
package com.mogo.eagle.core.data.deva.bizconfig
class FuncBizConfig {
companion object{
const val V2N = "V2N"
const val V2I = "V2I"
const val V2V = "V2V"
const val FOUNDATION = "FOUNDATION"
// V2N
const val BIZ_VIP = "BIZ_VIP" // vip变灯
const val BIZ_OPT_LINE = "BIZ_OPT_LINE" // 最优车道
const val BIZ_VRU = "BIZ_VRU" // 弱势交通
const val BIZ_VRU_RI = "BIZ_VRU_RI" // 弱势交通逆行
const val BIZ_HLW = "BIZ_HLW" // 道路提示 todo 需求不明确是施工还是所有
// V2I
const val BIZ_IVP_GREEN = "BIZ_IVP_GREEN" // 绿波通行
const val BIZ_IVP = "BIZ_IVP" // 闯红灯预警
const val BIZ_RTS = "BIZ_RTS" // 查看视频流
const val BIZ_SLW = "BIZ_SLW" // 限速提醒
const val BIZ_IVS = "BIZ_IVS" // 车内标识 todo 暂未实现
const val BIZ_TJW = "BIZ_TJW" // 道路拥堵 todo 需求来源 是从云还是从OBU过来
// V2V
const val BIZ_AVW = "BIZ_AVW" // 异常车辆提醒
const val BIZ_LCW = "BIZ_LCW" // 变道碰撞预警
const val BIZ_BSW = "BIZ_BSW" // 盲区碰撞预警
const val BIZ_EBW = "BIZ_EBW" // 前车急刹预警
const val BIZ_FCW = "BIZ_FCW" // 前向碰撞预警
const val BIZ_LTA = "BIZ_LTA" // 左转辅助预警
const val BIZ_CLW = "BIZ_CLW" // 车辆失控预警
const val BIZ_DNPW = "BIZ_DNPW" // 逆向超车预警
// Foundation
const val BIZ_BEAUTY_MODE = "BIZ_BEAUTY_MODE" // 美化模式
const val BIZ_RAIN_MODE = "BIZ_RAIN_MODE" // 雨天模式
const val BIZ_FULL_LOG = "BIZ_FULL_LOG" // 全量日志 todo
const val BIZ_TRACE_LOG = "BIZ_TRACE_LOG" // 链路日志 todo
const val BIZ_BAG_RECORD = "BIZ_BAG_RECORD" // Bag录制
const val BIZ_WARNING_UPLOAD = "BIZ_WARNING_UPLOAD" // 异常上报
const val BIZ_LIMIT_SPEED_SET = "BIZ_LIMIT_SPEED_SET" // 限速设置 todo
const val BIZ_BYPASS = "BIZ_BYPASS" // 绕障 todo 暂未实现
const val BIZ_AUTOPILOT_LANE_SELECTION = "BIZ_AUTOPILOT_LANE_SELECTION" // 择机变道 todo 暂未实现
}
}

View File

@@ -59,6 +59,7 @@ class ChainConstant {
const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_LOST"
const val CHAIN_ALIAS_CODE_CLOUD_CONNECT_ERROR = "CHAIN_ALIAS_CODE_CLOUD_CONNECT_ERROR"
const val CHAIN_ALIAS_CODE_HTTP_DNS_CHANGED = "CHAIN_ALIAS_CODE_HTTP_DNS_CHANGED"
const val CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED = "CHAIN_ALIAS_CODE_FUNC_CONFIG_CHANGED"
const val CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED = "CHAIN_ALIAS_CODE_INIT_ON_MAP_LOADED"
const val CHAIN_ALIAS_CODE_INIT_ON_MAP_INIT = "CHAIN_ALIAS_CODE_INIT_ON_MAP_INIT"

View File

@@ -1,5 +1,18 @@
package com.mogo.eagle.core.data.enums
fun WarningDirectionEnum.isLeft():Boolean{
return this.direction == WarningDirectionEnum.ALERT_WARNING_LEFT.direction
|| this.direction == WarningDirectionEnum.ALERT_WARNING_TOP_LEFT.direction
|| this.direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_LEFT.direction
}
fun WarningDirectionEnum.isRight():Boolean{
return this.direction == WarningDirectionEnum.ALERT_WARNING_RIGHT.direction
|| this.direction == WarningDirectionEnum.ALERT_WARNING_TOP_RIGHT.direction
|| this.direction == WarningDirectionEnum.ALERT_WARNING_BOTTOM_RIGHT.direction
}
/**
*@author xiaoyuzhou
*@date 2021/9/10 8:48 下午

View File

@@ -0,0 +1,6 @@
package com.mogo.eagle.core.data.trafficlight
/**
* 控灯实体
*/
data class TrafficLightControl(val sn:String,val data:String,val next:String,val countDown:Int,val code:Int)

View File

@@ -14,6 +14,11 @@ import record_cache.RecordPanelOuterClass
*/
interface IDevaToolsProvider : IProvider {
/**
* 初始化业务
*/
fun initBiz()
/**
* 开始抓取日志默认10min
*/

View File

@@ -0,0 +1,16 @@
package com.mogo.eagle.core.function.api.devatools
/**
* FuncConfig 功能配置业务回调
*/
interface IMoGoDevaToolsFuncConfigListener {
/**
* 更新业务数据注意⚠需要由业务方判断具体type业务聚合
* type : biz类型 (FuncBizConfig)
* state: 开启状态
* lock : 锁定状态
* data : json
*/
fun updateBizData(type: String, state: Boolean, lock: Boolean, data: String?)
}

View File

@@ -1,6 +1,7 @@
package com.mogo.eagle.core.function.api.trafficlight
import android.content.Context
import com.mogo.eagle.core.data.trafficlight.TrafficLightControl
import com.mogo.eagle.core.data.trafficlight.TrafficLightDetail
import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider
@@ -21,7 +22,7 @@ interface ITrafficLightProvider : IMoGoFunctionServerProvider {
crossingNo: String,
heading: Double,
controlTime:Int,
onSuccess: (() -> Unit),
onSuccess: ((TrafficLightControl) -> Unit),
onError: ((String) -> Unit)
)
}

View File

@@ -1,12 +1,9 @@
package com.mogo.eagle.core.function.call.autopilot
import android.util.*
import androidx.annotation.Nullable
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.base.CallerBase
import com.mogo.eagle.core.utilcode.kotlin.*
import com.mogo.eagle.core.utilcode.mogo.logger.*
import com.mogo.eagle.core.utilcode.util.GsonUtils
import mogo.telematics.pad.MessagePad
import mogo_msg.MogoReportMsg
@@ -180,7 +177,6 @@ object CallerAutoPilotStatusListenerManager : CallerBase() {
val listener = it.value
autoPilotMessageCode = guardianInfo?.code ?: ""
autoPilotMessageContent = guardianInfo?.msg ?: ""
Logger.d("XXXXX", "code: ${guardianInfo?.code}, msg: ${guardianInfo?.msg}")
listener.onAutopilotGuardian(guardianInfo)
}
}

View File

@@ -0,0 +1,78 @@
package com.mogo.eagle.core.function.call.devatools
import android.util.Log
import androidx.annotation.Nullable
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener
import com.zhjt.service_biz.SubBiz
import java.util.concurrent.ConcurrentHashMap
object CallerDevaToolsFuncConfigListenerManager {
private val M_DEVA_TOOLS_FUNC_CONFIG_LISTENER: ConcurrentHashMap<String, IMoGoDevaToolsFuncConfigListener> =
ConcurrentHashMap()
private val cacheMap = mutableMapOf<String,MutableList<SubBiz>>()
/**
* 添加监听
* @param tag 标记,用来注销监听使用
* @param listener 监听回调
*/
fun registerDevaToolsFuncConfigListener(
@Nullable biz: String,
@Nullable tag: String,
@Nullable listener: IMoGoDevaToolsFuncConfigListener
) {
if (M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.containsKey("$biz'_'$tag")) {
return
}
M_DEVA_TOOLS_FUNC_CONFIG_LISTENER["$biz'_'$tag"] = listener
cacheMap[biz]?.let {
invokeDevaToolsFuncConfigBizUpdate(biz,it)
}
}
/**
* 删除监听
* @param tag 标记,用来注销监听使用
*/
fun unRegisterDevaToolsFuncConfigListener(@Nullable biz: String, @Nullable tag: String) {
if (!M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.containsKey("$biz'_'$tag")) {
return
}
M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.remove("$biz'_'$tag")
}
/**
* 删除监听
* @param listener 要删除的监听对象
*/
fun unRegisterDevaToolsFuncConfigListener(@Nullable listener: IMoGoDevaToolsFuncConfigListener) {
if (!M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.containsValue(listener)) {
return
}
M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.forEach {
if (it.value == listener) {
M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.remove(it.key)
}
}
}
/**
* 由订阅方判断Type类型聚合一些
*/
fun invokeDevaToolsFuncConfigBizUpdate(biz: String, list: MutableList<SubBiz>) {
cacheMap[biz] = list
M_DEVA_TOOLS_FUNC_CONFIG_LISTENER.forEach {
val key = it.key
if (key.contains(biz)) {
list.forEach { subBiz ->
val listener = it.value
listener.updateBizData(subBiz.type, subBiz.state, subBiz.lock, subBiz.data)
}
}
}
}
}

View File

@@ -21,8 +21,8 @@ object CallerDevaToolsManager {
MogoServicePaths.PATH_DEVA_TOOLS
)
fun init(context: Context) {
devaToolsProviderApi?.init(context)
fun init() {
devaToolsProviderApi?.initBiz()
}
/**

View File

@@ -4,6 +4,8 @@ import android.view.View
import com.alibaba.android.arouter.launcher.ARouter
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.data.constants.MoGoFragmentPaths
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_SLW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2I
import com.mogo.eagle.core.data.enums.WarningDirectionEnum
import com.mogo.eagle.core.data.map.Infrastructure
import com.mogo.eagle.core.data.notice.NoticeNormalData
@@ -12,11 +14,11 @@ import com.mogo.eagle.core.data.report.ReportEntity
import com.mogo.eagle.core.function.api.hmi.IMoGoHmiViewProxy.IViewNotificationProvider
import com.mogo.eagle.core.function.api.hmi.view.IOchBusView
import com.mogo.eagle.core.function.api.hmi.view.IViewLimitingVelocity
import com.mogo.eagle.core.function.api.hmi.view.IViewNotification
import com.mogo.eagle.core.function.api.hmi.view.IViewTrafficLight
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWaringProvider
import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener
import com.mogo.eagle.core.function.call.base.CallerBase
import com.zhjt.service_biz.BizConfig
/**
* @author xiaoyuzhou
@@ -75,7 +77,7 @@ object CallerHmiManager : CallerBase() {
/**
* 控制刹车功能
*/
fun setBrakeLightFunction (isOpen: Boolean) {
fun setBrakeLightFunction(isOpen: Boolean) {
waringProviderApi?.setBrakeLightFunction(isOpen)
}
@@ -89,7 +91,7 @@ object CallerHmiManager : CallerBase() {
/**
* 开关DebugView
*/
fun toggleDebugView(){
fun toggleDebugView() {
waringProviderApi?.toggleDebugView()
}
@@ -101,8 +103,24 @@ object CallerHmiManager : CallerBase() {
* @param ttsContent tts语音播报消息
* @param tag tag绑定弹窗的标志
*/
fun showWarningV2X(v2xType: String, alertContent: CharSequence?, ttsContent: String?, tag: String?, listenerIMoGo: IMoGoWarningStatusListener?, playTts: Boolean, expireTime: Long = 5000L) {
waringProviderApi?.showWarningV2X(v2xType, alertContent, ttsContent, tag, listenerIMoGo, playTts, expireTime)
fun showWarningV2X(
v2xType: String,
alertContent: CharSequence?,
ttsContent: String?,
tag: String?,
listenerIMoGo: IMoGoWarningStatusListener?,
playTts: Boolean,
expireTime: Long = 5000L
) {
waringProviderApi?.showWarningV2X(
v2xType,
alertContent,
ttsContent,
tag,
listenerIMoGo,
playTts,
expireTime
)
}
/**
@@ -119,8 +137,8 @@ object CallerHmiManager : CallerBase() {
* @param checkLightId 0-都是默认1-红2-黄3-绿
* @param lightSource 1:云端下发2:自车感知
*/
fun showWarningTrafficLight(checkLightId: Int,lightSource: Int) {
waringProviderApi?.showWarningTrafficLight(checkLightId,lightSource)
fun showWarningTrafficLight(checkLightId: Int, lightSource: Int) {
waringProviderApi?.showWarningTrafficLight(checkLightId, lightSource)
}
/**
@@ -140,7 +158,7 @@ object CallerHmiManager : CallerBase() {
/**
* 关闭红绿灯倒计时
*/
fun disableWarningTrafficLightCountDown(){
fun disableWarningTrafficLightCountDown() {
waringProviderApi?.disableWarningTrafficLightCountDown()
}
@@ -179,6 +197,7 @@ object CallerHmiManager : CallerBase() {
*
* @param limitingSpeed 限速速度
*/
@BizConfig(V2I, "", BIZ_SLW)
fun showLimitingVelocity(limitingSpeed: Int) {
waringProviderApi?.showLimitingVelocity(limitingSpeed)
}
@@ -280,14 +299,14 @@ object CallerHmiManager : CallerBase() {
/**
* 呈现工控机升级确认框
*/
fun showAdUpgradeDialog(images: List<String>,padSn: String,releaseId: String){
fun showAdUpgradeDialog(images: List<String>, padSn: String, releaseId: String) {
waringProviderApi?.showAdUpgradeDialog(images, padSn, releaseId)
}
/**
* 更新工控机下载、升级状态
*/
fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo){
fun showAdUpgradeStatus(ipcUpgradeStateInfo: IPCUpgradeStateInfo) {
waringProviderApi?.showAdUpgradeStatus(ipcUpgradeStateInfo)
}
@@ -323,7 +342,7 @@ object CallerHmiManager : CallerBase() {
*注册工控机升级提示圆点View的回调
* @param 提示圆点View
*/
fun registerUpgradeTipsCallback(tipsView:() -> View){
fun registerUpgradeTipsCallback(tipsView: () -> View) {
waringProviderApi?.registerUpgradeTipsCallback(tipsView)
}
@@ -332,7 +351,7 @@ object CallerHmiManager : CallerBase() {
* @param code
* @param msg
*/
fun showDockerRebootResult(code: Int,msg: String){
fun showDockerRebootResult(code: Int, msg: String) {
waringProviderApi?.showDockerRebootResult(code, msg)
}
@@ -366,8 +385,12 @@ object CallerHmiManager : CallerBase() {
* @param warningReportList 提醒级别上报数据列表
* @param reportLevel 1:error级别 2:warning级别
*/
fun showIPCReportWindow(errorReportList: ArrayList<ReportEntity>,warningReportList: ArrayList<ReportEntity>,reportLevel: Int){
waringProviderApi?.showIPCReportWindow(errorReportList,warningReportList,reportLevel)
fun showIPCReportWindow(
errorReportList: ArrayList<ReportEntity>,
warningReportList: ArrayList<ReportEntity>,
reportLevel: Int
) {
waringProviderApi?.showIPCReportWindow(errorReportList, warningReportList, reportLevel)
}
fun showVideoDialog(infList: List<Infrastructure>) {
@@ -378,7 +401,7 @@ object CallerHmiManager : CallerBase() {
* bus出车/收车状态设置
* true : 显示收车; false显示出车
*/
fun changeBusOperationStatus(isOut:Boolean){
fun changeBusOperationStatus(isOut: Boolean) {
waringProviderApi?.changeBusOperationStatus(isOut)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -78,6 +78,7 @@ dependencies {
api rootProject.ext.dependencies.life_cycle_java8
api rootProject.ext.dependencies.mogochainbase
api rootProject.ext.dependencies.mogoservicebiz
}
apply from: new File(rootProject.rootDir, "gradle/upload.gradle").toString()

View File

@@ -1,7 +1,6 @@
package com.mogo.eagle.core.utilcode.mogo.logger.scene
import android.util.ArrayMap
import com.mogo.eagle.core.utilcode.mogo.logger.Logger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_ADAS_IMPL
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_CHAT
@@ -120,7 +119,6 @@ class Scene {
//此处存在用户自定义方式,可根据过滤找到对应不符合标准的模块
var logCache = sceneCache["$moduleName-"]
if (logCache == null) {
Logger.i("emArrow","tag : $tag , module : $moduleName , sceneCache : $sceneCache")
logCache = SceneLogCache(mutableMapOf(), true)
businessName?.let {
logCache.tagMap!![it] = true

View File

@@ -58,6 +58,9 @@ bytex.ASM_API=ASM7
HOOK_LOG_VERSION=1.6.1
SERVICE_CHAIN_VERSION=1.1.0
BIZCONFIG_VERSION=1.2.7
SERVICE_BIZ_VERSION=1.2.0
################ 外部依赖引用 ################
# loglib
LOGLIB_VERSION=1.3.38
@@ -83,7 +86,7 @@ MOGO_TELEMATIC_VERSION=1.4.3.26
######## MogoAiCloudSDK Version ########
# 自研地图
MAP_SDK_VERSION=2.4.2.3
MAP_SDK_OPERATION_VERSION=1.1.2
MAP_SDK_OPERATION_VERSION=1.1.2.4
# websocket
WEBSOCKET_VERSION=1.1.7
## 产品库必备配置产品库自动对versionCode和versionName版本进行升级

View File

@@ -68,6 +68,7 @@ dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation rootProject.ext.dependencies.androidxappcompat
implementation rootProject.ext.dependencies.mogochainbase
implementation rootProject.ext.dependencies.mogoservicebiz
//okhttp3的依赖
implementation 'com.squareup.okhttp3:okhttp:3.12.3'
// parser

View File

@@ -19,6 +19,7 @@ import androidx.annotation.Nullable;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.bean.VersionCompatibility;
import com.zhidao.support.adas.high.common.AutopilotAbilityManager;
import com.zhidao.support.adas.high.common.ByteUtil;
import com.zhidao.support.adas.high.common.Constants;
import com.zhidao.support.adas.high.common.CupidLogUtils;
@@ -506,9 +507,10 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
private void updateConnectStatus(@Define.IPCConnectionStatus int status, @Nullable String reason) {
ipcConnectionStatus.set(status);
if (status == Constants.IPC_CONNECTION_STATUS.CONNECTED) {
AutopilotAbilityManager.getInstance().start();
startCheckCompatibility();
} else {
AutopilotAbilityManager.getInstance().stop();
stopCheckCompatibility();
}
if (status == Constants.IPC_CONNECTION_STATUS.DISCONNECTED) {
@@ -596,6 +598,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
void setOnAdasListener(OnAdasListener adasListener) {
mAdasListener = adasListener;
AutopilotAbilityManager.getInstance().setOnAdasListener(adasListener);
}
@Override

View File

@@ -1,5 +1,6 @@
package com.zhidao.support.adas.high;
import com.zhidao.support.adas.high.bean.AutopilotAbility;
import com.zhidao.support.adas.high.common.ProtocolStatus;
import chassis.VehicleStateOuterClass;
@@ -186,4 +187,10 @@ public interface OnAdasListener {
*/
void onError(ProtocolStatus status, byte[] bytes);
/**
* 是否有能力启动自动驾驶
*
* @param ability 是否可以启动自动驾驶
*/
void onAutopilotAbility(AutopilotAbility ability);
}

View File

@@ -0,0 +1,39 @@
package com.zhidao.support.adas.high.bean;
import chassis.Chassis;
import system_master.SystemStatusInfo;
/**
* 自动驾驶能力 能否启动自动驾驶
* 未赋值表示接口通讯异常或者工控机相关节点异常 如果回调持续都是未赋值的状态表示此问题是持久性的
*/
public class AutopilotAbility {
/**
* 刹车踏板开度 0~100
* -1表示未赋值
*/
public final float brake;
/**
* 挡位
* null表示未赋值
*/
public final Chassis.GearPosition gear;
/**
* 状态查询结果
* null表示未赋值
* 不能启动自动驾驶的判断
* statusInfo.getHealthInfoList().get().getState()== SystemStatusInfo.HealthState.FAULT
* statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_STARTING
* statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_EXITING
* statusInfo.getSysState()== SystemStatusInfo.SystemState.SYS_FAULT
*/
public final SystemStatusInfo.StatusInfo statusInfo;
public AutopilotAbility(float brake, Chassis.GearPosition gear, SystemStatusInfo.StatusInfo statusInfo) {
this.brake = brake;
this.gear = gear;
this.statusInfo = statusInfo;
}
}

View File

@@ -0,0 +1,82 @@
package com.zhidao.support.adas.high.common;
import com.zhidao.support.adas.high.AdasManager;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.bean.AutopilotAbility;
import java.util.Timer;
import java.util.TimerTask;
import chassis.Chassis;
import chassis.VehicleStateOuterClass;
import system_master.SystemStatusInfo;
/**
* 是否可以启动自动驾驶能力检测
*/
public class AutopilotAbilityManager {
private static final String TAG = AutopilotAbilityManager.class.getSimpleName();
private static final long DEFAULT_DETECTION_TIME = 3 * 1000L;//默认检测时间
private static volatile AutopilotAbilityManager INSTANCE;
private OnAdasListener listener;
private volatile Timer timer;
private VehicleStateOuterClass.VehicleState vehicleState;
public void setOnAdasListener(OnAdasListener listener) {
this.listener = listener;
}
private AutopilotAbilityManager() {
}
public static AutopilotAbilityManager getInstance() {
if (INSTANCE == null) {
synchronized (AutopilotAbilityManager.class) {
if (INSTANCE == null) {
INSTANCE = new AutopilotAbilityManager();
}
}
}
return INSTANCE;
}
public void setStatusInfo(SystemStatusInfo.StatusInfo statusInfo) {
if (listener != null) {
float brake = -1;
Chassis.GearPosition gear = null;
if (vehicleState != null) {
brake = vehicleState.getBrake();
gear = vehicleState.getGear();
}
listener.onAutopilotAbility(new AutopilotAbility(brake, gear, statusInfo));
}
}
public void setVehicleState(VehicleStateOuterClass.VehicleState vehicleState) {
this.vehicleState = vehicleState;
}
public synchronized void start() {
if (timer == null) {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
AdasManager.getInstance().sendStatusQueryReq();
}
}, 2000L, DEFAULT_DETECTION_TIME);//延迟执行,避免刚连接成功后底盘信息无法及时同步
}
}
public synchronized void stop() {
if (timer != null) {
timer.cancel();
timer = null;
}
this.vehicleState = null;
}
}

View File

@@ -5,7 +5,7 @@ import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中,目前放在AutopilotStateMessage 数据接口中,此接口数据刷新不是太频繁
* 写成单例比较好控制 比如refreshLast()方法可以放到任何接收的回调中
* 与工控机链接成功后,工控机断开连接超时监测管理器
* 由于没有心跳机制,如果服务器端断网或其他非正常断开,客户端是无感知的,所以需要根据最后一次接收数据的时间进行超时检测
*/

View File

@@ -2,6 +2,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.common.AutopilotAbilityManager;
import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -15,6 +16,7 @@ public class StatusQueryRespMessage extends MyAbstractMessageHandler {
@Override
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
SystemStatusInfo.StatusInfo statusInfo= SystemStatusInfo.StatusInfo.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
AutopilotAbilityManager.getInstance().setStatusInfo(statusInfo);
if (adasListener != null) {
adasListener.onStatusQueryResp(raw.getHeader(), statusInfo);
}

View File

@@ -2,6 +2,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.common.AutopilotAbilityManager;
import com.zhidao.support.adas.high.protocol.RawData;
import chassis.VehicleStateOuterClass;
@@ -14,6 +15,7 @@ public class VehicleStateMessage extends MyAbstractMessageHandler {
@Override
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
VehicleStateOuterClass.VehicleState vehicleState = VehicleStateOuterClass.VehicleState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
AutopilotAbilityManager.getInstance().setVehicleState(vehicleState);
if (adasListener != null) {
adasListener.onVehicleState(raw.getHeader(), vehicleState);
}

View File

@@ -111,6 +111,12 @@ enum class EventTypeEnum(
GHOST_PROBE("10024", "前方盲区行人预警", "前方盲区行人预警", R.drawable.icon_warning_v2x_pedestrian_crossing,
"前方盲区行人通行,请注意", "前方盲区即将有行人通过,请减速慢行"),
//接管
TAKE_OVER_EVENT(
"20000", "注意周围、立即接管", "注意周围、立即接管", R.drawable.icon_warning_take_over,
"注意周围、立即接管", "自动驾驶退出请立即接管"
),
// 前方静止or慢速车辆报警
ALERT_FRONT_CAR("99999"),
@@ -357,7 +363,8 @@ enum class EventTypeEnum(
tts = ""
),
TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯请优先通行"),
TYPE_VIP_IDENTIFICATION("10022", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "VIP车辆优先通行", "已为您变灯请优先通行"),
TYPE_VIP_ERROR_IDENTIFICATION("10023", "", "", R.drawable.icon_warning_v2x_vip_turn_light, "请求失败,", "请求失败请稍后重试"),
TYPE_OPTIMAL_ROUTE_RECOMMEND("2000", "", "", R.drawable.icon_warning_v2x_optimal_route, "为您推荐最优路线", "已为您选择最优路线");

View File

@@ -0,0 +1,189 @@
package com.mogo.module.common.enums
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_AVW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_BSW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_CLW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_DNPW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_EBW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_FCW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LCW
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_LTA
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_OPT_LINE
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.BIZ_VRU_RI
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2N
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig.Companion.V2V
import com.mogo.eagle.core.data.enums.WarningDirectionEnum
import com.mogo.eagle.core.data.enums.isLeft
import com.mogo.eagle.core.data.enums.isRight
import com.zhjt.service_biz.BizConfig
class EventTypeHelper {
companion object {
//变道预警
@BizConfig(V2V, "", BIZ_LCW)
fun getLCW(
appId: Int,
direction: WarningDirectionEnum,
data: ((alert: String, tts: String) -> Unit)
) {
when {
direction.isLeft() -> {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString() + ""),
EventTypeEnum.getWarningTts(appId.toString() + "")
)
}
direction.isRight() -> {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString() + ""),
EventTypeEnum.getWarningTts(appId.toString() + "")
)
}
else -> {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString()),
EventTypeEnum.getWarningTts(appId.toString())
)
}
}
}
//车辆失控预警
@BizConfig(V2V, "", BIZ_CLW)
fun getCLW(
appId: Int,
direction: WarningDirectionEnum,
data: ((alert: String, tts: String) -> Unit)
) {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString() + direction.desc),
EventTypeEnum.getWarningContent(appId.toString() + direction.desc)
)
}
//左转辅助
@BizConfig(V2V, "", BIZ_LTA)
fun getLTA(appId: Int, data: ((alert: String, tts: String) -> Unit)) {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString()),
EventTypeEnum.getWarningTts(appId.toString())
)
}
//异常车辆提醒
@BizConfig(V2V, "", BIZ_AVW)
fun getAVW(
appId: Int,
direction: WarningDirectionEnum,
data: ((alert: String, tts: String) -> Unit)
) {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString() + direction.desc),
EventTypeEnum.getWarningTts(appId.toString() + direction.desc)
)
}
//盲区预警
@BizConfig(V2V, "", BIZ_BSW)
fun getBSW(
appId: Int,
direction: WarningDirectionEnum,
data: ((alert: String, tts: String, visualAngle: Boolean) -> Unit)
) {
when {
direction.isLeft() -> {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString() + ""),
EventTypeEnum.getWarningTts(appId.toString() + ""),
true
)
}
direction.isRight() -> {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString() + ""),
EventTypeEnum.getWarningTts(appId.toString() + ""),
true
)
}
else -> {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString()),
EventTypeEnum.getWarningTts(appId.toString()),
false
)
}
}
}
//弱势交通碰撞预警
@BizConfig(V2N, "", BIZ_VRU)
fun getVRU(data: ((appId: Int, tts: String, content: String) -> Unit)) {
data.invoke(
EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt(),
EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.tts,
EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.content
)
}
//弱势交通逆行预警
@BizConfig(V2N, "", BIZ_VRU_RI)
fun getVRURI(data: ((appId: Int, tts: String, content: String) -> Unit)) {
data.invoke(
EventTypeEnum.TYPE_USECASE_ID_VRUCW_PERSON.poiType.toInt(),
"行人逆行预警",
"行人逆行预警"
)
}
//最优车道
@BizConfig(V2N, "", BIZ_OPT_LINE)
fun getOptLine(data: ((appId: Int, tts: String, content: String) -> Unit)) {
data.invoke(
EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.poiType.toInt(),
EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.tts,
EventTypeEnum.TYPE_USECASE_OPTIMAL_LANE.content
)
}
//前方道路拥堵预警
fun getTJW(data: ((appId: Int, tts: String, content: String) -> Unit)) {
data.invoke(
EventTypeEnum.FOURS_BLOCK_UP.poiType.toInt(),
EventTypeEnum.FOURS_BLOCK_UP.tts,
EventTypeEnum.FOURS_BLOCK_UP.content
)
}
//前车急刹
@BizConfig(V2V, "", BIZ_EBW)
fun getEBW(appId: Int, data: ((tts: String, content: String) -> Unit)) {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString()),
EventTypeEnum.getWarningTts(appId.toString())
)
}
//前向碰撞预警
@BizConfig(V2V, "", BIZ_FCW)
fun getFCW(appId: Int, data: ((tts: String, content: String) -> Unit)) {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString()),
EventTypeEnum.getWarningTts(appId.toString())
)
}
//逆向超车预警
@BizConfig(V2V, "", BIZ_DNPW)
fun getDNPW(appId: Int, data: ((tts: String, content: String) -> Unit)) {
data.invoke(
EventTypeEnum.getWarningContent(appId.toString()),
EventTypeEnum.getWarningTts(appId.toString())
)
}
}
}

View File

@@ -12,6 +12,7 @@ import com.bytedance.apm.insight.ApmInsight;
import com.bytedance.apm.insight.ApmInsightAgent;
import com.bytedance.apm.insight.ApmInsightInitConfig;
import com.mogo.commons.constants.SharedPrefsConstants;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.eagle.core.data.bindingcar.CarInfo;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr;
@@ -35,6 +36,7 @@ import java.util.Map;
@Route(path = CrashReportConstants.PATH)
public class ApmCrashReportProvider implements ITestCrashReportProvider {
private static final String BYTEAMP_APPID = "302368";
private static final String BYTEAMP_APPID_DEV = "379950";
private static final String TAG = "ApmCrashReportProvider";
private static final String MAP_SDK_VERSION = "MAP_SDK_VERSION";
@@ -50,8 +52,7 @@ public class ApmCrashReportProvider implements ITestCrashReportProvider {
}
private void initCrash(final Context context) {
MonitorCrash crash = MonitorCrash.init(context, BYTEAMP_APPID, CommonUtils.getVersionCode(context), CommonUtils.getVersionName(context))
MonitorCrash crash = MonitorCrash.init(context, DebugConfig.isDebug() ? BYTEAMP_APPID_DEV : BYTEAMP_APPID, CommonUtils.getVersionCode(context), CommonUtils.getVersionName(context))
.setCustomDataCallback(new AttachUserData() {
@Override
public Map<? extends String, ? extends String> getUserData(CrashType type) {