Merge remote-tracking branch 'origin/dev_hengyang_base' into dev_hengyang_base

This commit is contained in:
wujifei
2021-06-21 19:53:12 +08:00
81 changed files with 1321 additions and 235 deletions

View File

@@ -38,7 +38,7 @@ dependencies {
implementation rootProject.ext.dependencies.androidxappcompat
implementation rootProject.ext.dependencies.androidxconstraintlayout
implementation rootProject.ext.dependencies.arouter
implementation rootProject.ext.dependencies.rxandroid
annotationProcessor rootProject.ext.dependencies.aroutercompiler

View File

@@ -0,0 +1,51 @@
package com.mogo.module.adas;
import android.content.Context;
import com.mogo.module.adas.entity.AdasAutoPilotLocReceiverBean;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.service.connection.IMogoOnMessageListener;
public class AdasAutoPilotManager implements IMogoOnMessageListener<AdasAutoPilotLocReceiverBean> {
private static volatile AdasAutoPilotManager instance;
private static final byte[] obj = new byte[0];
private static final int MSG_SOCKET_TYPE = 1;
private Context mContext;
private AdasAutoPilotManager() {
}
public static AdasAutoPilotManager getInstance() {
if (instance == null) {
synchronized (obj) {
if (instance == null) {
instance = new AdasAutoPilotManager();
}
}
}
return instance;
}
public void initSocket(Context context) {
this.mContext = context;
MogoApisHandler.getInstance()
.getApis()
.getSocketManagerApi(mContext).registerOnMessageListener(MSG_SOCKET_TYPE, this);
}
@Override
public Class<AdasAutoPilotLocReceiverBean> target() {
return AdasAutoPilotLocReceiverBean.class;
}
@Override
public void onMsgReceived(AdasAutoPilotLocReceiverBean adasAutoPilotLocReceiverBean) {
if (adasAutoPilotLocReceiverBean != null
&& adasAutoPilotLocReceiverBean.getLat() != 0.0
&& adasAutoPilotLocReceiverBean.getLon() != 0.0) {
}
}
}

View File

@@ -0,0 +1,11 @@
package com.mogo.module.adas;
/**
* Created by XuYong on 2021/5/28 15:24
*/
public class AdasConstant {
public static final String HOST_DEV = "http://dzt-test.zhidaohulian.com";
public static final String HOST_TEST = "http://dzt-test.zhidaohulian.com";
public static final String HOST_DEMO = "http://dzt-show.zhidaohulian.com";
public static final String HOST_PRODUCT = "https://dzt.zhidaohulian.com";
}

View File

@@ -1,7 +1,17 @@
package com.mogo.module.adas;
import android.os.RemoteException;
import com.google.gson.Gson;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.data.BaseData;
import com.mogo.commons.network.SubscribeImpl;
import com.mogo.module.adas.entity.AutonomousDriveStatusBean;
import com.mogo.module.adas.entity.ReportSiteBean;
import com.mogo.module.adas.entity.WarnMessageModel;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.utils.logger.Logger;
import com.mogo.utils.network.RequestOptions;
import com.mogo.utils.network.utils.GsonUtil;
import com.zhidao.autopilotservice.model.AdasAIDLAutopilotArriveModel;
import com.zhidao.autopilotservice.model.AdasAIDLAutopilotStateModel;
@@ -18,6 +28,18 @@ import com.zhidao.support.adas.high.bean.WarnMessageInfo;
import com.zhidao.support.adas.high.common.MsgActionType;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import io.reactivex.Flowable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import static com.mogo.commons.context.ContextHolderUtil.getContext;
/**
* Created by XuYong on 2021/4/25 14:43
@@ -25,14 +47,22 @@ import java.util.ArrayList;
public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusListener {
private final String TAG = "AdasEventManager";
private final Gson gson;
private final ArrayList<AdasDataListener> iAdasEventListeners = new ArrayList<>();
private final ArrayList<AdasStatusListener> iAdasStatusListeners = new ArrayList<>();
private IAdasApiService mAdasApiService;
private Disposable uploadAutopilotStatus;
//自动驾驶状态
private int mCurrentAutopilotStatus = -1;
//自动驾驶车速度
private float mCurrentAutopilotSpeed = 0;
private Disposable mdDisposable;
//自动驾驶状态
private AutopilotStatus.ValuesBean mAutopilotStatus = null;
public AdasEventManager() {
gson = GsonUtil.getGson();
mAdasApiService = MogoApisHandler.getInstance().getApis().getNetworkApi().create( IAdasApiService.class, AdasConstant.HOST_PRODUCT );
}
public void addEventListener(AdasDataListener listener) {
@@ -65,6 +95,11 @@ public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusL
}
}
public void removeStatusListener() {
Logger.d(TAG,"注销adas状态事件监听");
iAdasStatusListeners.clear();
}
@Override
public void onWarnMessage(WarnMessageInfo warnMessageInfo) {
Logger.d(TAG,"onWarnMessage " + warnMessageInfo);
@@ -145,7 +180,6 @@ public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusL
AutopilotStatus.ValuesBean autopilotStatusValues = autopilotStatus.getValues();
AutopilotStatus.ValuesBean mAutopilotStatus;
if (autopilotStatusValues != null) {
AdasAIDLAutopilotStateModel adasAIDLAutopilotStateModel=new AdasAIDLAutopilotStateModel();
adasAIDLAutopilotStateModel.setReason(autopilotStatusValues.getReason());
@@ -154,14 +188,15 @@ public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusL
float speed = autopilotStatusValues.getSpeed();
adasAIDLAutopilotStateModel.setState(state);
adasAIDLAutopilotStateModel.setSpeed(speed);
mCurrentAutopilotStatus = state;
mCurrentAutopilotSpeed = speed;
for (AdasDataListener listener:iAdasEventListeners) {
if (listener != null) {
listener.notifyAutopilotState(adasAIDLAutopilotStateModel);
}
}
}
}
}
@Override
@@ -174,8 +209,12 @@ public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusL
if (endLatLon != null) {
AdasAIDLAutopilotArriveModel adasAIDLAutopilotArriveModel = new AdasAIDLAutopilotArriveModel();
adasAIDLAutopilotArriveModel.setCarType(result.getCarType());
adasAIDLAutopilotArriveModel.setLat(endLatLon.getLat());
adasAIDLAutopilotArriveModel.setLon(endLatLon.getLon());
double lon = endLatLon.getLon();
double lat = endLatLon.getLat();
adasAIDLAutopilotArriveModel.setLat(lat);
adasAIDLAutopilotArriveModel.setLon(lon);
Logger.d(TAG,"autopilotArrive reportSite");
reportSite(lon, lat);
for (AdasDataListener listener:iAdasEventListeners) {
if (listener != null) {
listener.autopilotArrive(adasAIDLAutopilotArriveModel);
@@ -188,7 +227,7 @@ public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusL
@Override
public void onAutopilotRoute(String route) {
//todo
}
@Override
@@ -197,6 +236,7 @@ public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusL
for (AdasStatusListener listener :iAdasStatusListeners) {
listener.onServiceConnected();
}
updateDriveStatusTask();
}
@Override
@@ -206,4 +246,80 @@ public class AdasEventManager implements OnAdasListener, OnAdasMsgConnectStatusL
listener.onServiceDisconnected();
}
}
public void updateDriveStatusTask() {
Logger.d(TAG,"updateDriveStatusTask");
mdDisposable = Flowable.interval(0,5, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(@NonNull Long aLong) throws Exception {
updateDriveStatus();
}
});
}
private void updateDriveStatus() {
String sn = MoGoAiCloudClientConfig.getInstance().getSn();
AutonomousDriveStatusBean request = new AutonomousDriveStatusBean(sn, mCurrentAutopilotStatus, mCurrentAutopilotSpeed);
RequestBody requestBody = RequestBody.create( MediaType.get( "application/json;charset=UTF-8" ), GsonUtil.jsonFromObject( request ) );
mAdasApiService.updateAutonomousDriveStatus(requestBody).
subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() )
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(getContext())) {
@Override
public void onError(String message, int code) {
super.onError(message, code);
}
@Override
public void onError(Throwable e) {
super.onError(e);
}
@Override
public void onSuccess(BaseData o) {
super.onSuccess(o);
Logger.d(TAG,"updateDriveStatus success");
}
});
}
private void reportSite( double lon, double lat) {
String sn = MoGoAiCloudClientConfig.getInstance().getSn();
ReportSiteBean reportSiteBean = new ReportSiteBean(sn, lon, lat);
RequestBody requestBody = RequestBody.create( MediaType.get( "application/json;charset=UTF-8" ), GsonUtil.jsonFromObject( reportSiteBean ) );
mAdasApiService.updateReportSite(requestBody).
subscribeOn( Schedulers.io() ).observeOn( AndroidSchedulers.mainThread() )
.subscribe(new SubscribeImpl<BaseData>(RequestOptions.create(getContext())) {
@Override
public void onError(String message, int code) {
super.onError(message, code);
}
@Override
public void onError(Throwable e) {
super.onError(e);
}
@Override
public void onSuccess(BaseData o) {
super.onSuccess(o);
Logger.d(TAG,"autopilotArrive success");
}
});
}
public AdasAIDLAutopilotStateModel autopilotStateCall() {
AdasAIDLAutopilotStateModel adasAIDLAutopilotStateModel=new AdasAIDLAutopilotStateModel();
if (mAutopilotStatus != null) {
adasAIDLAutopilotStateModel.setSpeed(mAutopilotStatus.getSpeed());
adasAIDLAutopilotStateModel.setState(mAutopilotStatus.getState());
adasAIDLAutopilotStateModel.setReason(mAutopilotStatus.getReason());
}
return adasAIDLAutopilotStateModel;
}
}

View File

@@ -6,6 +6,7 @@ import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.facade.template.IProvider;
import com.mogo.service.MogoServicePaths;
import com.mogo.utils.logger.Logger;
import com.zhidao.autopilotservice.model.AdasAIDLAutopilotStateModel;
import com.zhidao.support.adas.high.AdasManager;
@@ -24,9 +25,9 @@ public class AdasProvider implements IProvider {
@Override
public void init(Context context) {
Logger.d(TAG, "初始化 AdasProvider 模块");
adasEventManager = new AdasEventManager();
initAdas(context, adasEventManager);
initAutoPilotBusiness(context);
}
private void initAdas(Context context, AdasEventManager adasEventManager) {
@@ -35,6 +36,10 @@ public class AdasProvider implements IProvider {
AdasManager.getInstance().setOnAdasConnectStatusListener(adasEventManager);
}
private void initAutoPilotBusiness(Context context) {
AdasAutoPilotManager.getInstance().initSocket(context);
}
public void addAdasEventListener(AdasDataListener listener) {
adasEventManager.addEventListener(listener);
}
@@ -51,8 +56,46 @@ public class AdasProvider implements IProvider {
adasEventManager.removeStatusListener(listener);
}
public void removeAdasStatusListener() {
adasEventManager.removeStatusListener();
}
public void sendWsMessage(String msg) {
AdasManager.getInstance().aiCloudToAdasData(msg);
}
public void cancelPilot() {
if (AdasManager.getInstance().isSocketConnect()) {
AdasManager.getInstance().controlAutopilotCarHead();
}
}
public void hideAdas() {
}
public void showAdas() {
}
public void killAdas() {
}
//原ADAS sdk中为空实现
public void settingCarModelListInfo(String msg) {
}
//原ADAS sdk中为空实现
public void setSettingStatus(boolean show) {
}
//原ADAS sdk中为空实现
public void setUseAlgorithm(boolean open) {
}
public AdasAIDLAutopilotStateModel autopilotStateCall() {
return adasEventManager.autopilotStateCall();
}
}

View File

@@ -0,0 +1,41 @@
package com.mogo.module.adas;
/**
* Created by XuYong on 2021/5/28 16:12
*/
public class AutonomousDriveStatusBean {
private String sn;
private int status;
private float vehicleSpeed;
public AutonomousDriveStatusBean(String sn, int status, float vehicleSpeed) {
this.sn = sn;
this.status = status;
this.vehicleSpeed = vehicleSpeed;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public float getVehicleSpeed() {
return vehicleSpeed;
}
public void setVehicleSpeed(float vehicleSpeed) {
this.vehicleSpeed = vehicleSpeed;
}
}

View File

@@ -0,0 +1,24 @@
package com.mogo.module.adas;
import com.mogo.commons.data.BaseData;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
/**
* Created by XuYong on 2021/5/28 14:24
*/
public interface IAdasApiService {
//上传自动驾驶状态接口
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
@POST( "/yycp-carDataService/autonomousDrive/updateAutonomousDriveStatus" )
Observable<BaseData> updateAutonomousDriveStatus(@Body RequestBody requestBody );
//站点上报
@Headers( {"Content-Type:application/json;charset=UTF-8"} )
@POST( "/yycp-carDataService/autonomousDrive/reportSite" )
Observable<BaseData> updateReportSite(@Body RequestBody requestBody );
}

View File

@@ -0,0 +1,40 @@
package com.mogo.module.adas;
/**
* Created by XuYong on 2021/5/31 16:24
*/
public class ReportSiteBean {
private String sn;
private double lon;
private double lat;
public ReportSiteBean(String sn, double lon, double lat) {
this.sn = sn;
this.lon = lon;
this.lat = lat;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public double getLon() {
return lon;
}
public void setLon(double lon) {
this.lon = lon;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
}

View File

@@ -0,0 +1,69 @@
package com.mogo.module.adas.entity;
public class AdasAutoPilotLocReceiverBean {
private int poiId;
private double lat;
private double lon;
private String poiAddress;
private long systemTime;
public AdasAutoPilotLocReceiverBean(int poiId, double lat, double lon, String poiAddress, long systemTime) {
this.poiId = poiId;
this.lat = lat;
this.lon = lon;
this.poiAddress = poiAddress;
this.systemTime = systemTime;
}
public int getPoiId() {
return poiId;
}
public void setPoiId(int poiId) {
this.poiId = poiId;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
public double getLon() {
return lon;
}
public void setLon(double lon) {
this.lon = lon;
}
public String getPoiAddress() {
return poiAddress;
}
public void setPoiAddress(String poiAddress) {
this.poiAddress = poiAddress;
}
public long getSystemTime() {
return systemTime;
}
public void setSystemTime(long systemTime) {
this.systemTime = systemTime;
}
@Override
public String toString() {
return "AdasAutoPilotLocReceiverBean{" +
"poiId=" + poiId +
", lat=" + lat +
", lon=" + lon +
", poiAddress='" + poiAddress + '\'' +
", systemTime=" + systemTime +
'}';
}
}

View File

@@ -0,0 +1,41 @@
package com.mogo.module.adas.entity;
/**
* Created by XuYong on 2021/5/28 16:12
*/
public class AutonomousDriveStatusBean {
private String sn;
private int status;
private float vehicleSpeed;
public AutonomousDriveStatusBean(String sn, int status, float vehicleSpeed) {
this.sn = sn;
this.status = status;
this.vehicleSpeed = vehicleSpeed;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public float getVehicleSpeed() {
return vehicleSpeed;
}
public void setVehicleSpeed(float vehicleSpeed) {
this.vehicleSpeed = vehicleSpeed;
}
}

View File

@@ -0,0 +1,40 @@
package com.mogo.module.adas.entity;
/**
* Created by XuYong on 2021/5/31 16:24
*/
public class ReportSiteBean {
private String sn;
private double lon;
private double lat;
public ReportSiteBean(String sn, double lon, double lat) {
this.sn = sn;
this.lon = lon;
this.lat = lat;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public double getLon() {
return lon;
}
public void setLon(double lon) {
this.lon = lon;
}
public double getLat() {
return lat;
}
public void setLat(double lat) {
this.lat = lat;
}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.module.adas;
package com.mogo.module.adas.entity;
import com.zhidao.support.adas.high.bean.WarnMessageInfo;

View File

@@ -0,0 +1,18 @@
package com.mogo.module.adas.view;
import android.content.Context;
import androidx.annotation.NonNull;
import com.mogo.module.adas.R;
import com.mogo.module.common.dialog.BaseFloatDialog;
public class DispatchRemindDialog extends BaseFloatDialog {
public DispatchRemindDialog(@NonNull Context context) {
super(context);
setContentView(R.layout.dialog_adas_dispatch_remind);
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="@dimen/adas_dispatch_remind_dialog_corner"/>
<solid android:color="@color/adas_dispatch_remind_background"/>
</shape>

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"
android:layout_width="@dimen/adas_dispatch_remind_dialog_width"
android:layout_height="@dimen/adas_dispatch_remind_dialog_height"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="adas_dispatch_remind_dialog_width">950px</dimen>
<dimen name="adas_dispatch_remind_dialog_height">540px</dimen>
<dimen name="adas_dispatch_remind_dialog_corner">32px</dimen>
</resources>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="adas_dispatch_remind_loc">#1F9BFE</color>
<color name="adas_dispatch_remind_background">#E63B4577</color>
<color name="adas_dispatch_remind_count_down_bg">#4D000000</color>
</resources>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="adas_dispatch_remind_dialog_width">950px</dimen>
<dimen name="adas_dispatch_remind_dialog_height">540px</dimen>
<dimen name="adas_dispatch_remind_dialog_corner">32px</dimen>
</resources>

View File

@@ -380,10 +380,6 @@ public class EntranceFragment extends MvpFragment<EntranceView, EntrancePresente
mSwitchMapModeImage = (ImageView) findViewById(R.id.module_switch_model_icon);
mSwitchMapModeLayout.setOnClickListener(clickListener);
mSwitchText = (TextView) findViewById(R.id.module_switch_model_text);
if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_LENOVO) {
enterVrMode();
}
}
private int debugPanelClickCount = 0;
@@ -393,7 +389,6 @@ public class EntranceFragment extends MvpFragment<EntranceView, EntrancePresente
private Group groupFix;
private void enterVrMode() {
if (!localIsVrMode) {
tvEnterVrMode.setVisibility(View.GONE);
mMove2CurrentLocation.setVisibility(View.GONE);
mUploadRoadCondition.setVisibility(View.GONE);
@@ -415,11 +410,9 @@ public class EntranceFragment extends MvpFragment<EntranceView, EntrancePresente
flSpeed.setVisibility(View.VISIBLE);
mSwitchMapModeLayout.setVisibility(View.VISIBLE);
mApis.getV2XListenerManager().changeTipWindowStatusForListener(ACTION_V2X_REMOVE_TIP_WINDOW);
}
}
private void exitVrMode() {
if (localIsVrMode) {
EntranceViewHolder.getInstance().forceHideNoticeView();
tvEnterVrMode.setVisibility(View.VISIBLE);
mMove2CurrentLocation.setVisibility(View.VISIBLE);
@@ -443,7 +436,6 @@ public class EntranceFragment extends MvpFragment<EntranceView, EntrancePresente
flSpeed.setVisibility(View.GONE);
mSwitchMapModeLayout.setVisibility(View.GONE);
clTrafficLight.setVisibility(View.GONE);
}
}
private void debugCrashWarn() {
@@ -722,29 +714,21 @@ public class EntranceFragment extends MvpFragment<EntranceView, EntrancePresente
TopViewAnimHelper.getInstance().setIMogoMapUIController(mMApUIController);
TopViewNoLinkageAnimHelper.getInstance().setIMogoMapUIController(mMApUIController);
// 进入vr模式不可缩放地图
if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_LENOVO) {
UiThreadHandler.postDelayed(this::stepIntoVrMode, 3_500L);
}
mClickShareVoiceStrings =
getContext().getResources().getStringArray(R.array.click_share_voice_guide_array);
mInnerGuideVoiceStrings =
getContext().getResources().getStringArray(R.array.search_voice_guide_inner_array);
mOuterGuideVoiceStrings =
getContext().getResources().getStringArray(R.array.search_voice_guide_outer_array);
}
/**
* 进入鹰眼模式,设置手势缩放地图失效
*/
private void stepIntoVrMode() {
Logger.d(TAG, "进入vr模式");
MogoApisHandler.getInstance()
.getApis()
.getMapServiceApi()
.getMapUIController()
.openVrMode(false);
//TODO 因为衡阳6.30交付没有2D模式临时方案进入vr模式不可缩放地图
if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_LENOVO) {
// 进入鹰眼模式,设置手势缩放地图失效
Logger.d(TAG, "进入vr模式");
mMApUIController.changeMapMode(EnumMapUI.Type_VR);
MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, true );
}
}
@Override

View File

@@ -7,9 +7,14 @@
<!-- <stroke-->
<!-- android:width="1dp"-->
<!-- android:color="#182155" />-->
<!-- <corners-->
<!-- android:bottomLeftRadius="@dimen/dp_100"-->
<!-- android:bottomRightRadius="@dimen/dp_20"-->
<!-- android:topLeftRadius="@dimen/dp_20"-->
<!-- android:topRightRadius="@dimen/dp_100" />-->
<corners
android:bottomLeftRadius="@dimen/dp_100"
android:bottomRightRadius="@dimen/dp_20"
android:topLeftRadius="@dimen/dp_20"
android:topRightRadius="@dimen/dp_100" />
android:bottomLeftRadius="130px"
android:bottomRightRadius="30px"
android:topLeftRadius="30px"
android:topRightRadius="130px" />
</shape>

View File

@@ -5,7 +5,7 @@
<dimen name="module_ext_speed_height">460px</dimen>
<dimen name="module_ext_arcView_width">320px</dimen>
<dimen name="module_ext_arcView_height">320px</dimen>
<dimen name="module_ext_arcView_stroke_with">15px</dimen>
<dimen name="module_ext_arcView_stroke_with">20px</dimen>
<dimen name="module_ext_arcView_center_text_size">110px</dimen>
<dimen name="module_ext_arcView_des_text_size">40px</dimen>
<dimen name="module_switch_map">279px</dimen>

View File

@@ -69,7 +69,7 @@
<item>提前看看出行路况,试试唤醒小智说,“中关村路况怎么样”</item>
</string-array>
<string name="module_map_model_normal">默认视角</string>
<string name="module_map_model_normal">近距视角</string>
<string name="module_map_model_faster">远距视角</string>
</resources>

View File

@@ -437,7 +437,9 @@ public class MogoServices implements IMogoMapListener,
// isNeedUploadCoordinatesDurationInTime() ) { //todo 实时在线车辆需要注释否则在2D模式下不能展示
// }
//请求在线车辆数据,刷新地图在线车辆
MapMarkerManager.getInstance().getOnlineCarDataByAutoRefreshStrategy( ro.mLonLat );
if (!mLastStatusIsVr){
MapMarkerManager.getInstance().getOnlineCarDataByAutoRefreshStrategy( ro.mLonLat );
}
Logger.i( TAG, "刷新半径 = %s, 点 = %s, zoomLevel = %s, amount = %s", ro.mRadius, ro.mLonLat, mLastZoomLevel, ro.mAmount );
}
@@ -938,6 +940,8 @@ public class MogoServices implements IMogoMapListener,
@Override
public void onMapModeChanged( EnumMapUI ui ) {
Log.i(TAG, "onMapModeChanged:" + ui);
clearAllData();
if ( ui == EnumMapUI.Type_VR ) {
if ( !mLastStatusIsVr ) {
MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode( TAG, true );

View File

@@ -8,7 +8,6 @@ import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.service.launchercard.LauncherCardRefresher;
import com.mogo.module.service.marker.MapMarkerManager;
import com.mogo.module.service.strategy.CarIconDisplayStrategy;
import com.mogo.module.service.vrmode.VrModeController;
import com.mogo.service.statusmanager.IMogoStatusChangedListener;
import com.mogo.service.statusmanager.StatusDescriptor;
import com.mogo.utils.UiThreadHandler;
@@ -90,7 +89,6 @@ abstract class StatusChangedAdapter implements IMogoStatusChangedListener {
MogoServices.getInstance().unregisterInternalUnWakeupWords();
MogoServices.getInstance().stopAutoRefreshStrategy();
}
VrModeController.getInstance().onMainPageResumeStatusChanged(resume);
}
public void onMainPageIsBackgroundStatusChanged(boolean isBackground) {
@@ -163,7 +161,6 @@ abstract class StatusChangedAdapter implements IMogoStatusChangedListener {
}
public void onVrModeChanged(boolean isVrMode) {
VrModeController.getInstance().onVrModeChanged(isVrMode);
if (MarkerServiceHandler.getMogoStatusManager().isSeekHelping()) {
onSeekHelpingStatusChanged(true);
}

View File

@@ -617,6 +617,10 @@ public class MockIntentHandler implements IntentHandler {
case 55:
//开启模拟数据Mock用于验证算法准确性
TimeDelayUploadManager.getInstance().init(context);
break;
case 56:
// 开启数据采集 自车定位和视觉识别
break;
}
}

View File

@@ -0,0 +1,75 @@
package com.mogo.module.service.mocktools;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import com.mogo.utils.WorkThreadHandler;
import java.io.File;
public class DataCollectionHandler {
private static volatile DataCollectionHandler handler;
private static final byte[] obj = new byte[0];
private volatile boolean openDataCollect = false;
private Handler mLocationDataCollectHandler;
private Handler mRecognizeDataCollectHandler;
private static final String WRITE_FILE_PATH = Environment.getExternalStorageDirectory().getPath() + File.separator + "mockWrite";
private DataCollectionHandler() {
}
public static DataCollectionHandler getInstance() {
if (handler == null) {
synchronized (obj) {
if (handler == null) {
handler = new DataCollectionHandler();
}
}
}
return handler;
}
public void start() {
openDataCollect = true;
}
public boolean canCollectData() {
return openDataCollect;
}
public void collectLocationDataToFile(String locationData) {
if (mLocationDataCollectHandler == null) {
mLocationDataCollectHandler = new Handler(WorkThreadHandler.newInstance("data-collect-thread").getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
}
}
public void collectRecogniseDataToFile() {
if (mRecognizeDataCollectHandler == null) {
mRecognizeDataCollectHandler = new Handler(WorkThreadHandler.newInstance("recognize-collect-thread").getLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
}
}
public void stop() {
openDataCollect = false;
mLocationDataCollectHandler = null;
mRecognizeDataCollectHandler = null;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@@ -94,7 +94,8 @@ dependencies {
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation project(':modules:mogo-module-obu')
implementation rootProject.ext.dependencies.mebulaobu
// implementation rootProject.ext.dependencies.mebulaobu
implementation rootProject.ext.dependencies.mogoobu
}

View File

@@ -17,6 +17,7 @@ import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.voice.AIAssist;
import com.mogo.map.location.MogoLocation;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.drawer.AdasRecognizedResultDrawer;
import com.mogo.module.common.entity.V2XMessageEntity;
import com.mogo.module.common.entity.V2XObuEventEntity;
import com.mogo.module.common.entity.V2XPushMessageEntity;
@@ -29,6 +30,8 @@ import com.mogo.module.v2x.utils.DrivingDirectionUtils;
import com.mogo.module.v2x.utils.ObuConfig;
import com.mogo.module.v2x.utils.TestOnLineCarUtils;
import com.mogo.module.v2x.utils.ToastUtils;
import com.mogo.module.v2x.utils.V2XUtils;
import com.mogo.service.adas.entity.ADASRecognizedResult;
import com.mogo.service.entrance.IMogoEntranceButtonController;
import com.mogo.utils.UiThreadHandler;
import com.mogo.utils.logger.Logger;
@@ -38,15 +41,26 @@ import com.zhidao.mogo.module.obu.obu.IObuCallback;
import com.zhidao.mogo.module.obu.obu.bean.MogoObuEventInfo;
import com.zhidao.mogo.module.obu.obu.bean.MogoObuLocationInfo;
import com.zhidao.mogo.module.obu.obu.bean.MogoObuTrafficLightInfo;
import com.zhidao.support.nebulaobu.NebulaObuClient;
import com.zhidao.support.nebulaobu.OnObuListener;
import com.zhidao.support.nebulaobu.model.ActiveSafetyInfo;
import com.zhidao.support.nebulaobu.model.ObuInfo;
import com.zhidao.support.nebulaobu.model.ObuInfoMore;
//import com.zhidao.support.nebulaobu.NebulaObuClient;
//import com.zhidao.support.nebulaobu.OnObuListener;
//import com.zhidao.support.nebulaobu.model.ActiveSafetyInfo;
//import com.zhidao.support.nebulaobu.model.ObuInfo;
//import com.zhidao.support.nebulaobu.model.ObuInfoMore;
import com.zhidao.support.obu.MogoObuManager;
import com.zhidao.support.obu.OnMogoObuListener;
import com.zhidao.support.obu.constants.ObuConstants;
import com.zhidao.support.obu.model.CvxAppInitIndInfo;
import com.zhidao.support.obu.model.CvxHvCarIndInfo;
import com.zhidao.support.obu.model.CvxHvInfoIndInfo;
import com.zhidao.support.obu.model.CvxRvInfoIndInfo;
import com.zhidao.support.obu.model.CvxSetConfigCfmInfo;
import com.zhidao.support.obu.model.CvxV2vThreatIndInfo;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -85,6 +99,7 @@ public class V2XObuManager implements IObuCallback, Handler.Callback {
private final Handler handler = new Handler(this);
private final ObuTypeExchangeReceiver obuTypeExchangeReceiver = new ObuTypeExchangeReceiver();
private ObuManager obuManager;
final String icw_data = "02000114010000000000001effd7892b11a4440af70100142a03000907e506100e2917019000005662010a45000b0000220847162c000037970010000a17f6215c459478b6010347ac045000090a0006012c01f4009600080073007300730073000b000000000000000000000000000000002b000037780000247300003261000000000000426c827f47001200100000000000000000000021220000349a006c0010000a17f63ecb45947ba301030000332c0010000a17f642e945947bea010300004d580010000a17f6435545947e4e0103000054c40010000a17f6413a45947f96010300005c300010000a17f62c2845947d140103000070e40010000a17f5fdb14594786001030000992000060004ffec2710";
public void init(Context context) {
Logger.d(MODULE_NAME, "obuManager初始化--");
@@ -94,12 +109,19 @@ public class V2XObuManager implements IObuCallback, Handler.Callback {
obuManager.registerObuDataChangedListener(this);
//使用adas部门obu sdk (星云)
NebulaObuClient.getInstance().init(context);
NebulaObuClient.getInstance().registerObu(100);
NebulaObuClient.getInstance().registerObuListener(listener);
// NebulaObuClient.getInstance().init(context);
// NebulaObuClient.getInstance().registerObu(100);
// NebulaObuClient.getInstance().registerObuListener(listener);
//自研obu
MogoObuManager.getInstance().init(context);
MogoObuManager.getInstance().connect();
MogoObuManager.getInstance().registerListener(mogoObuListener);
//TODO 测试
// MogoObuManager.getInstance().test(icw_data);
// UiThreadHandler.postDelayed( () -> {
// //TODO 测试
// MarkerServiceHandler.getApis().getV2XListenerManager().warningChangedForListenerWithDirection(3, MogoReceiver.ACTION_V2X_FRONT_WARNING);
// handleSdkObu(1);
//
@@ -109,66 +131,184 @@ public class V2XObuManager implements IObuCallback, Handler.Callback {
context.registerReceiver(obuTypeExchangeReceiver, filter);
}
public void release() {
NebulaObuClient.getInstance().unregisterObu();
NebulaObuClient.getInstance().unregisterObuListener();
}
/**
* 星云obu数据监听
*/
private OnObuListener listener = new OnObuListener() {
private OnMogoObuListener mogoObuListener = new OnMogoObuListener() {
@Override
public void onRegister() {
public void onConnected() {
//OBU连接成功
Logger.d("liyz", "onConnected ------> ");
}
@Override
public void onConnectFail(boolean isNeedReconnect) {
Logger.d("liyz", "onConnectFail ------> ");
//OBU连接失败
}
@Override
public void onUnregister() {
public void onDisconnect() {
Logger.d("liyz", "onDisconnect ------> ");
//OBU断开连接
}
@Override
public void onObuInfo(ObuInfo info) {
Logger.d("liyz", "onObuInfo ------> " + info.toString());
public void onReceiveOriginData(String data) {
super.onReceiveOriginData(data);
Logger.d("liyz", "onReceiveOriginData ------> data = " + data);
//接收到的原始数据
}
@Override
public void onWarningInfo(List<ActiveSafetyInfo> infoList) {
if (infoList != null) {
if (infoList.size() > 0) { //一般只有一个
ActiveSafetyInfo info = infoList.get(0);
Logger.d("liyz", "onWarningInfo type ------> " + info.getWarningtype() + "--size = " + infoList.size());
if (info.getWarningtype() == 3) {
if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) {
handleSdkObu(2);
}
}
public void onSendData(byte[] bytes) {
super.onSendData(bytes);
//发送的数据
Logger.d("liyz", "onSendData ------> ");
}
@Override
public void onCvxAppInitIndInfo(CvxAppInitIndInfo info) {
super.onCvxAppInitIndInfo(info);
Logger.d("liyz", "onCvxAppInitIndInfo ------> " + info.toString());
//CV2X系统信息
}
@Override
public void onCvxSetConfigCfm(CvxSetConfigCfmInfo info) {
super.onCvxSetConfigCfm(info);
Logger.d("liyz", "onCvxSetConfigCfm ------> " + info.toString());
//设置CV2X系统的配置确认
}
@Override
public void onCvxHvCarIndInfo(CvxHvCarIndInfo info) {
//主车车辆信息
Logger.d("liyz", "onCvxHvCarIndInfo ------> " + info.toString());
}
@Override
public void onCvxHvInfoIndInfo(CvxHvInfoIndInfo info) {
//主车信息
}
@Override
public void onCvxRvInfoIndInfo(CvxRvInfoIndInfo info) {
//远车信息
Logger.d("liyz", "onCvxRvInfoIndInfo ------> " + info.toString());
}
@Override
public void onCvxV2vThreatIndInfo(CvxV2vThreatIndInfo info) {
//预警信息
Logger.e("liyz", "onCvxV2vThreatIndInfo ------> " + info.toString());
//预警类型 threat_level 3
if (info != null) {
if (info.getThreat_info() != null && info.getControl() != null &&
info.getThreat_info().getThreat_level() == 3) { //看看2的情况
//预警方位
int direction = V2XUtils.getDirection((float) info.getExt_info().getAzimuth());
Log.d("liyz", "direction = " + direction + "---azimuth = " + (float) info.getExt_info().getAzimuth());
MarkerServiceHandler.getApis().getV2XListenerManager().warningChangedForListenerWithDirection(direction, MogoReceiver.ACTION_V2X_FRONT_WARNING);
//处理预警类型
int appId = info.getThreat_info().getApp_id();
handleSdkObu(getEventType(appId));
}
//预警数据的组装,车辆实时移动和变色 TODO 这里需要obu提供他车列表
AdasRecognizedResultDrawer.getInstance().renderAdasRecognizedResult(getResultList(info));
} else {
Log.e("liyz", "info == null ");
}
}
};
private int getEventType(int appid) {
if (appid == ObuConstants.USE_CASE_ID.EBW) {
return ObuConstant.TYPE_URGENCY_COLLISION_WARNING;
} else if (appid == ObuConstants.USE_CASE_ID.ICW) {
return ObuConstant.TYPE_CROSS_COLLISION_WARNING;
}
return 0;
}
private List<ADASRecognizedResult> resultList = null;
private List<ADASRecognizedResult> getResultList(CvxV2vThreatIndInfo info) {
if (resultList == null) {
resultList = new ArrayList<>();
}
ADASRecognizedResult adasRecognizedResult = new ADASRecognizedResult();
adasRecognizedResult.uuid = info.getVehicle_id();
if (info.getBasic_info() != null && info.getBasic_info().getPosition() != null) {
adasRecognizedResult.lat = info.getBasic_info().getPosition().getLatitude();
adasRecognizedResult.lon = info.getBasic_info().getPosition().getLongitude();
}
adasRecognizedResult.type = 3; //小轿车
adasRecognizedResult.heading = info.getBasic_info().getHeading();
adasRecognizedResult.speed = info.getBasic_info().getSpeed();
resultList.add(adasRecognizedResult);
return resultList;
}
// public void release() {
// NebulaObuClient.getInstance().unregisterObu();
// NebulaObuClient.getInstance().unregisterObuListener();
// MogoObuManager.getInstance().unregisterListener();
// }
/**
* 星云obu数据监听
*/
// private OnObuListener listener = new OnObuListener() {
// @Override
// public void onRegister() {
// }
//
// @Override
// public void onConnectFail(boolean isNeedReconnect) {
// }
//
// @Override
// public void onUnregister() {
// }
//
// @Override
// public void onObuInfo(ObuInfo info) {
// }
//
// @Override
// public void onWarningInfo(List<ActiveSafetyInfo> infoList) {
// if (infoList != null) {
// if (infoList.size() > 0) { //一般只有一个
// ActiveSafetyInfo info = infoList.get(0);
// Logger.d("liyz", "onWarningInfo type ------> " + info.getWarningtype() + "--size = " + infoList.size());
// if (info.getWarningtype() == 3) {
// if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) {
// handleSdkObu(2);
// }
// }
// }
// }
// }
// };
private void handleSdkObu(int type) {
V2XMessageEntity<V2XObuEventEntity> messageEntity = new V2XMessageEntity<>();
messageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_OBU_EVENT);
V2XObuEventEntity urgencyEvent = new V2XObuEventEntity();
if (type == 1) { //交叉路口碰撞预警 TODO
if (type == ObuConstant.TYPE_CROSS_COLLISION_WARNING) { //交叉路口碰撞预警
urgencyEvent.setType(ObuConstant.TYPE_CROSS_COLLISION_WARNING);
urgencyEvent.setDesc(V2XObuEventScenario.URGENCY_CROING_WARN_TEXT);
} else if (type == 2) { // 前车紧急制动预警
} else if (type == ObuConstant.TYPE_URGENCY_COLLISION_WARNING) { // 前车紧急制动预警
urgencyEvent.setType(ObuConstant.TYPE_URGENCY_COLLISION_WARNING);
urgencyEvent.setDesc(V2XObuEventScenario.URGENCY_COLLISION_WARN_TEXT);
} else {
urgencyEvent.setType(ObuConstant.TYPE_URGENCY_COLLISION_WARNING);
urgencyEvent.setDesc(V2XObuEventScenario.URGENCY_COLLISION_WARN_TEXT);
// urgencyEvent.setType(ObuConstant.TYPE_URGENCY_COLLISION_WARNING);
// urgencyEvent.setDesc(V2XObuEventScenario.URGENCY_COLLISION_WARN_TEXT);
}
messageEntity.setContent(urgencyEvent);
@@ -367,7 +507,7 @@ public class V2XObuManager implements IObuCallback, Handler.Callback {
// 暂无设计图,先简单显示
V2XObuEventEntity tmpEvent = new V2XObuEventEntity();
tmpEvent.setType(eventType);
tmpEvent.setDesc(info.getType()+"--"+info.getDescribe());
tmpEvent.setDesc(info.getType() + "--" + info.getDescribe());
messageEntity.setContent(tmpEvent);
V2XObuEventScenario.getInstance().init(messageEntity);
break;

View File

@@ -44,7 +44,7 @@ public class V2XObuEventScenario extends AbsV2XScenario<V2XObuEventEntity> imple
public static final String URGENCY_COLLISION_WARN_TEXT_ONE = "前车急刹,注意保持安全距离!";
public static final String URGENCY_COLLISION_WARN_TEXT = "前车急刹";
public static final String URGENCY_CROING_WARN_TEXT = "交叉路口碰撞预警";
public static final String URGENCY_CROING_WARN_TEXT = "注意交叉路口车辆";
private static final int MSG_CLOSE_OBU_WINDOW = 1001;
private static final int DEFAULT_EXPIRE_TIME = 20_000;

View File

@@ -85,7 +85,7 @@ public class V2XObuEventWindow extends FrameLayout implements IV2XWindow<V2XObuE
break;
case ObuConstant.TYPE_CROSS_COLLISION_WARNING:
// 交叉路口碰撞预警
ivTypeIcon.setImageResource(R.drawable.v2x_icon_ahead_car_brake);
ivTypeIcon.setImageResource(R.drawable.v2x_icon_car_collide_warning);
tvDesc.setText(entity.getDesc());
tvType.setText("交叉路口碰撞预警");
tvType.setBackgroundResource(R.drawable.bg_v2x_event_type_read);

View File

@@ -79,8 +79,6 @@ public class V2XWarningMarker implements IV2XMarker {
Log.d(TAG, "显示时间为++" + String.valueOf(showTime));
pointsBetween();
bearing = V2XLocationListener.getInstance().getLastCarLocation().getBearing();
//预警蒙层
MarkerServiceHandler.getApis().getV2XListenerManager().warningChangedForListenerWithDirection(mCloundWarningInfo.getDirection(), MogoReceiver.ACTION_V2X_FRONT_WARNING);
isSelfLineClear = false;
isFirstLocation = false;
V2XServiceManager.getMarkerManager().removeMarkers(WARNING_ARROWS);
@@ -127,6 +125,9 @@ public class V2XWarningMarker implements IV2XMarker {
isSelfLineClear = true;
}, showTime);
}
//预警蒙层
MarkerServiceHandler.getApis().getV2XListenerManager().warningChangedForListenerWithDirection(mCloundWarningInfo.getDirection(), MogoReceiver.ACTION_V2X_FRONT_WARNING);
}
/**

View File

@@ -779,4 +779,16 @@ public class V2XUtils {
return flag;
}
public static int getDirection(float degree) {
if (degree > 45 && degree < 135) {
return 1; //前方
} else if (degree > 135 && degree < 225) {
return 4; //右方
} else if ((degree < 45 && degree > 0) || degree < 360 && degree > 315) {
return 3; //左方
}
return 1;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@@ -2,7 +2,7 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:width="328dp" android:height="98dp">
<shape android:shape="rectangle">
<gradient android:angle="360" android:endColor="#ff616381" android:startColor="#ff48495e" />
<gradient android:angle="360" android:endColor="#5060BC" android:startColor="#5060BC" />
<corners android:radius="@dimen/dp_20" />
</shape>
</item>

View File

@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#3D4053"
android:background="#3B4577"
android:gravity="center"
app:roundLayoutRadius="@dimen/dp_30"
tools:layout_height="@dimen/module_v2x_event_see_live_window_height">

View File

@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/module_v2x_event_see_live_window_height"
android:background="@color/live_video_background_color"
android:background="#3B4577"
app:roundLayoutRadius="@dimen/dp_20">
<com.mogo.module.v2x.view.SimpleLiveVideoPlayer