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

This commit is contained in:
wujifei
2021-04-09 19:45:43 +08:00
53 changed files with 821 additions and 464 deletions

View File

@@ -54,7 +54,7 @@ public class V2XStatusManager {
if (mLocation == null) {
mLocation = new MogoLocation();
}
//Logger.d(V2XConst.MODULE_NAME, "当前车辆位置:" + mLocation.toString());
Logger.d(V2XConst.MODULE_NAME, "当前车辆位置:" + mLocation.toString());
return mLocation;
}

View File

@@ -0,0 +1,27 @@
package com.mogo.module.v2x.entity.net;
import java.util.List;
/**
* @author donghongyu
* @date 4/8/21 4:52 PM
* 最优路线推荐
*/
public class V2XRouteRes {
private String sn;//车机SN
private String roadId;//当前道路唯一标识
private int laneNum;//当前车道唯一标识
private int mostLaneNum;//最优车道号
private double mostSpeed;//最优车道平均速度
private List locusList;//线性经纬度轨迹列表
private double locusLat;
private double locusLon;
private double heading;// 车头朝向
private long satelliteTime;//定位卫星时间
private long showTime;//展示时间
private int warningType;// 1-最优车道2-安全距离3-交通预警
}

View File

@@ -23,6 +23,8 @@ import com.mogo.module.v2x.V2XConst;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.alarm.V2XAlarmServer;
import com.mogo.module.v2x.network.V2XRefreshCallback;
import com.mogo.module.v2x.observer.CarLocationSubject;
import com.mogo.module.v2x.observer.V2XOptimalRouteObserver;
import com.mogo.module.v2x.scenario.impl.V2XScenarioManager;
import com.mogo.module.v2x.scenario.scene.obu.V2XObuEventScenario;
import com.mogo.module.v2x.utils.ADASUtils;
@@ -50,7 +52,10 @@ import static com.mogo.module.v2x.V2XConst.MODULE_NAME;
* desc : V2X中用到的位置监听。处理刷新频率以及位置改变是否触发道路事件警报
* version: 1.0
*/
public class V2XLocationListener implements IMogoLocationListener, CarStatusListener, IMogoCarLocationChangedListener2 {
public class V2XLocationListener
implements IMogoLocationListener,
CarStatusListener,
IMogoCarLocationChangedListener2 {
private String TAG = "V2XLocationListener";
private MogoLocation mLastCarLocation;
@@ -61,7 +66,14 @@ public class V2XLocationListener implements IMogoLocationListener, CarStatusList
private static V2XLocationListener mV2XLocationListener;
private CarLocationSubject mCarLocationSubject;
private V2XLocationListener() {
mCarLocationSubject = new CarLocationSubject();
// 注册最优路线的推荐观察者
mCarLocationSubject.registerObserver(
V2XOptimalRouteObserver.TYPE,
V2XOptimalRouteObserver.getInstance());
}
public synchronized static V2XLocationListener getInstance() {
@@ -74,22 +86,22 @@ public class V2XLocationListener implements IMogoLocationListener, CarStatusList
}
@Override
public void onCarLocationChanged( MogoLatLng latLng ) {
public void onCarLocationChanged(MogoLatLng latLng) {
// do not impl
}
@Override
public void onCarLocationChanged2( Location location ) {
public void onCarLocationChanged2(Location location) {
MogoLocation loc = new MogoLocation();
loc.setTime( loc.getTime());
loc.setAccuracy( location.getAccuracy() );
loc.setSpeed( location.getSpeed());
loc.setLongitude( location.getLongitude() );
loc.setLatitude( location.getLatitude() );
loc.setAltitude( location.getAltitude() );
loc.setBearing( location.getBearing() );
loc.setProvider( location.getProvider() );
onLocationChangedImpl( loc );
loc.setTime(loc.getTime());
loc.setAccuracy(location.getAccuracy());
loc.setSpeed(location.getSpeed());
loc.setLongitude(location.getLongitude());
loc.setLatitude(location.getLatitude());
loc.setAltitude(location.getAltitude());
loc.setBearing(location.getBearing());
loc.setProvider(location.getProvider());
onLocationChangedImpl(loc);
}
@Override
@@ -97,8 +109,9 @@ public class V2XLocationListener implements IMogoLocationListener, CarStatusList
// onLocationChangedImpl(location);
}
private void onLocationChangedImpl(MogoLocation location){
private void onLocationChangedImpl(MogoLocation location) {
try {
mCarLocationSubject.setCarLocation(location);
//Logger.d(V2XConst.MODULE_NAME, "V2X预警--onLocationChanged: " + GsonUtil.jsonFromObject(location));
// 刷新角度
getCurrentCarAngle(location);
@@ -143,8 +156,12 @@ public class V2XLocationListener implements IMogoLocationListener, CarStatusList
if (mMogoPolyline != null && (V2XServiceManager.getMoGoV2XStatusManager().isRoadEventPOIShow()
|| V2XServiceManager.getMoGoV2XStatusManager().isOtherSeekHelpPOIShow())
&& V2XServiceManager.getV2XStatusManager().getTargetMoGoLatLng() != null) {
mMogoPolyline.setPoints(Arrays.asList(new MogoLatLng(location.getLatitude(), location.getLongitude()),
V2XServiceManager.getV2XStatusManager().getTargetMoGoLatLng()));
// 取出原有的绘制线的经纬度点
List<MogoLatLng> pointsOdl = mMogoPolyline.getPoints();
// 重新设置第一个坐标,也就是当前车辆位置
pointsOdl.set(0, new MogoLatLng(location.getLatitude(), location.getLongitude()));
mMogoPolyline.setPoints(pointsOdl);
float zoomLevel = V2XServiceManager.getMapUIController().getZoomLevel();
//Logger.d(V2XConst.MODULE_NAME, "当前地图的缩放比例为:" + zoomLevel);

View File

@@ -6,6 +6,8 @@ import com.alibaba.android.arouter.facade.template.IProvider;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.module.common.entity.V2XRoadEventEntity;
import java.util.List;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com

View File

@@ -1,20 +1,21 @@
package com.mogo.module.v2x.manager.impl;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.util.Log;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.cloud.commons.utils.CoordinateUtils;
import com.mogo.map.MogoLatLng;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.navi.IMogoCarLocationChangedListener2;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.drawer.MarkerDrawer;
import com.mogo.module.common.drawer.V2XWarnDataDrawer;
import com.mogo.module.common.entity.V2XMessageEntity;
import com.mogo.module.common.drawer.marker.EmptyMarkerView;
import com.mogo.module.common.drawer.marker.SimpleWindow3DAdapter;
import com.mogo.module.common.entity.V2XWarningEntity;
import com.mogo.module.service.MarkerServiceHandler;
import com.mogo.module.service.receiver.MogoReceiver;
@@ -23,15 +24,18 @@ import com.mogo.module.v2x.V2XConst;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.entity.model.DrawLineInfo;
import com.mogo.module.v2x.manager.IMoGoV2XCloundDataManager;
import com.mogo.module.v2x.marker.V2XFrontTargetMarkerView;
import com.mogo.module.v2x.utils.LocationUtils;
import com.mogo.utils.UiThreadHandler;
import com.mogo.utils.ViewUtils;
import com.mogo.utils.WorkThreadHandler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.mogo.module.common.constants.DataTypes.TYPE_MARKER_CLOUD_STOP_LINE_DATA;
import static com.mogo.module.v2x.V2XConst.V2X_FRONT_WARNING_MARKER;
import static com.mogo.module.v2x.V2XServiceManager.getContext;
/**
@@ -44,7 +48,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog
private boolean isSelfLineClear;
private List fillPoints = new ArrayList();//停止线经纬度合集
@Override
public void init(Context context) {
MogoApisHandler.getInstance().getApis().getRegisterCenterApi()
@@ -66,21 +69,20 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog
Log.d(V2XConst.LOG_NAME_WARN, "direction = " + cloundWarningInfo.getDirection());
if (cloundWarningInfo.getDirection() == 1) { //前方
//停止线前方画线
MogoLatLng newLocation = LocationUtils.getNewLocation((MogoLatLng) fillPoints.get(0), 80, cloundWarningInfo.heading);
MogoLatLng newLocation = LocationUtils.getNewLocation((MogoLatLng) fillPoints.get(0), 80, cloundWarningInfo.getAngle());
WorkThreadHandler.getInstance().postDelayed(() -> {
//添加停止线marker
drawStopLineWith2Resource();
//二轮车和行人的渲染和移动
V2XWarnDataDrawer.getInstance().renderWarnData(cloundWarningInfo);
//绘制识别物与交汇点连线,并且更新连线数据
drawStopLine(cloundWarningInfo, newLocation);
//添加停止线marker
handleStopLine();
}, 0);
}, 200);
UiThreadHandler.postDelayed(() -> {
V2XServiceManager.getMoGoPersonWarnPolylineManager().clearLine();
V2XServiceManager.getMoGoWarnPolylineManager().clearLine();
V2XServiceManager.getMoGoStopPolylineManager().clearLine();
isSelfLineClear = true;
}, 8000);
@@ -90,7 +92,7 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog
drawOtherObjectLine(cloundWarningInfo);
//二轮车和行人的渲染和移动
V2XWarnDataDrawer.getInstance().renderWarnData(cloundWarningInfo);
}, 0);
}, 200);
//延迟3秒清理线
UiThreadHandler.postDelayed(() -> {
@@ -118,6 +120,39 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog
}
}
/*
* 2D资源绘制停止线
* */
private void drawStopLineWith2Resource() {
//自车位置39.97665425796924--116.41769983329762
mCloundWarningInfo.setCarLocation(new MogoLatLng(39.97665425796924,116.41769983329762));//测试数据
MogoLatLng carlo = mCloundWarningInfo.getCarLocation();
if (carlo == null) {
double lon = MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLon();
double lat = MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLat();
carlo = new MogoLatLng(lat, lon);
}
//自车行驶方向的前方*米的经纬度,该经纬度在停止线上
MogoLatLng drawStopLineLon = LocationUtils.getNewLocation(carlo, mCloundWarningInfo.getStopLineDistance(), mCloundWarningInfo.getAngle());
Log.d(TAG, "2D资源绘制停止线"+drawStopLineLon);
MogoMarkerOptions optionsRipple = new MogoMarkerOptions()
.latitude(drawStopLineLon.getLat())
.longitude(drawStopLineLon.getLon())
.anchor(0.5f, 0.5f)
.zIndex(MarkerDrawer.MARKER_Z_INDEX_HIGH);
optionsRipple
.icon(ViewUtils.fromView(new EmptyMarkerView(V2XServiceManager.getContext())));
IMogoMarker stopLine = V2XServiceManager.getMarkerManager().addMarker(TYPE_MARKER_CLOUD_STOP_LINE_DATA, optionsRipple);
stopLine.setInfoWindowAdapter(new SimpleWindow3DAdapter(new V2XFrontTargetMarkerView(V2XServiceManager.getContext())));
stopLine.showInfoWindow();
// UiThreadHandler.postDelayed(() -> {
// stopLine.hideInfoWindow();
// }, 8000);
}
/**
* 绘制停止线前方线 TODO 需要实时给行人当前位置
*/
@@ -193,8 +228,21 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog
*/
@Override
public void onCarLocationChanged2(Location latLng) {
// Log.d(V2XConst.LOG_NAME_WARN, "onCarLocationChanged2 latLng = " + latLng.getLatitude() + "--" + latLng.getLongitude() + "---isSelfLineClear = " + isSelfLineClear);
//当行人经纬度交点 经纬度不为空,开始画线,否则清理
Log.e(V2XConst.LOG_NAME_WARN, "onCarLocationChanged2 latLng = " + latLng.getLatitude() + "--" + latLng.getLongitude() + "---isSelfLineClear = " + isSelfLineClear);
//当行人经纬度交点 开始画线,否则清理
mCloundWarningInfo.setCarLocation(new MogoLatLng(latLng.getLatitude(), latLng.getLongitude()));
drawSlefCarLine(latLng);
}
@Override
public void onCarLocationChanged(MogoLatLng latLng) {
}
/**
* 绘制自车连线
*/
private void drawSlefCarLine(Location latLng) {
if (!isSelfLineClear) {
IMogoPolyline mogoPolyline = V2XServiceManager.getMoGoWarnPolylineManager().getMogoWarnPolyline();
if (mCloundWarningInfo != null) {
@@ -223,12 +271,6 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog
}
}
@Override
public void onCarLocationChanged(MogoLatLng latLng) {
}
/**
* 补点后的停止线经纬度合集
*/
@@ -261,7 +303,7 @@ public class MoGoV2XCloundDataManager implements IMoGoV2XCloundDataManager, IMog
private MogoLatLng getMogoLat(MogoLatLng latlng) {
MogoLatLng newLocation = LocationUtils.getNewLocation(latlng, mCloundWarningInfo.getDistance(), mCloundWarningInfo.getDirection());
return newLocation;
return newLocation;
}
}

View File

@@ -6,10 +6,10 @@ import com.alibaba.android.arouter.facade.annotation.Route;
import com.mogo.map.MogoLatLng;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.module.v2x.MoGoV2XServicePaths;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.common.entity.V2XPoiTypeEnum;
import com.mogo.module.common.entity.V2XRoadEventEntity;
import com.mogo.module.v2x.MoGoV2XServicePaths;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.manager.IMoGoV2XPolylineManager;
import java.util.ArrayList;
@@ -66,7 +66,7 @@ public class MoGoV2XPolylineManager implements IMoGoV2XPolylineManager {
} else {
options.add(V2XServiceManager.getV2XStatusManager().getLocation());
}
// 目标车辆位置
// 目标车辆、道路事件位置
options.add(V2XServiceManager.getV2XStatusManager().getTargetMoGoLatLng());
// 绘制线的对象

View File

@@ -0,0 +1,44 @@
package com.mogo.module.v2x.marker;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import com.mogo.module.common.drawer.marker.MapMarkerBaseView;
import com.mogo.module.common.entity.MarkerShowEntity;
import com.mogo.module.v2x.R;
/**
* @author liujing
* @description 前方预警目标物2D资源实现,目前只有停止线,可以按需添加其他类型
* @since: 2021/4/9
*/
public class V2XFrontTargetMarkerView extends MapMarkerBaseView {
private String TAG = "V2XFrontTargetMarkerView";
public V2XFrontTargetMarkerView(Context context) {
super(context);
}
public V2XFrontTargetMarkerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public V2XFrontTargetMarkerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void initView(Context context) {
LayoutInflater.from( context ).inflate(R.layout.v2x_front_target_info_view, this );
}
@Override
public void updateView(MarkerShowEntity markerShowEntity) {
}
}

View File

@@ -0,0 +1,13 @@
package com.mogo.module.v2x.observer;
import com.mogo.map.location.MogoLocation;
/**
* @author donghongyu
* @date 4/9/21 2:14 PM
* 当前车辆位置观察者接口
*/
public abstract class CarLocationObserver {
// 更新状态
public abstract void update(MogoLocation carLocation);
}

View File

@@ -0,0 +1,63 @@
package com.mogo.module.v2x.observer;
import com.mogo.map.location.MogoLocation;
import java.util.HashMap;
import java.util.Set;
/**
* @author donghongyu
* @date 4/9/21 2:12 PM
* 当前车辆订阅
*/
public class CarLocationSubject {
// 车辆位置
public MogoLocation carLocation;
// 观察者集合
private HashMap<String, CarLocationObserver> observers = new HashMap<String, CarLocationObserver>();
/**
* 设置新的车辆位置
*
* @param carLocation 车辆位置
*/
public void setCarLocation(MogoLocation carLocation) {
this.carLocation = carLocation;
notifyAllObservers();
}
/**
* 添加观察者
*
* @param observerType 观察者类型
* @param observer 新的观察者
*/
public void registerObserver(String observerType, CarLocationObserver observer) {
observers.put(observerType, observer);
}
/**
* 移除指定类型的观察者
*
* @param observerType 观察者类型
*/
public void removeObserver(String observerType) {
observers.remove(observerType);
}
/**
* 通知所有观察者更新
*/
private void notifyAllObservers() {
Set<String> keySet = observers.keySet();
for (String s : keySet) {
CarLocationObserver observer = observers.get(s);
if (observer != null) {
observer.update(carLocation);
}
}
}
}

View File

@@ -0,0 +1,50 @@
package com.mogo.module.v2x.observer;
import com.mogo.map.location.MogoLocation;
import com.mogo.module.v2x.overlay.V2XOptimalRouteOverlay;
import java.util.List;
/**
* @author donghongyu
* @date 4/9/21 2:38 PM
* 最优路线推荐
*/
public class V2XOptimalRouteObserver extends CarLocationObserver {
public static String TYPE = "V2XOptimalRouteObserver";
private static V2XOptimalRouteObserver v2XOptimalRouteObserver;
//最优路线覆盖物绘制
private V2XOptimalRouteOverlay mV2XOptimalRouteOverlay;
// 要绘制的数据
private List<double[]> polylinePoint;
public static V2XOptimalRouteObserver getInstance() {
if (v2XOptimalRouteObserver == null) {
synchronized (V2XOptimalRouteObserver.class) {
if (v2XOptimalRouteObserver == null) {
v2XOptimalRouteObserver = new V2XOptimalRouteObserver();
}
}
}
return v2XOptimalRouteObserver;
}
private V2XOptimalRouteObserver() {
mV2XOptimalRouteOverlay = new V2XOptimalRouteOverlay();
}
/**
* 设置推荐路线
*
* @param polylinePoint 推荐的路线
*/
public void setPolylinePoint(List<double[]> polylinePoint) {
this.polylinePoint = polylinePoint;
}
@Override
public void update(MogoLocation carLocation) {
mV2XOptimalRouteOverlay.draw(carLocation, polylinePoint);
}
}

View File

@@ -0,0 +1,66 @@
package com.mogo.module.v2x.overlay;
import com.mogo.map.MogoLatLng;
import com.mogo.map.location.MogoLocation;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.utils.LocationUtils;
import java.util.ArrayList;
import java.util.List;
/**
* 最优路线推荐的图覆盖物
*
* @author donghongyu
* @date 4/8/21 6:06 PM
*/
public class V2XOptimalRouteOverlay {
private IMogoPolyline mMoGoPolyline;
// 连接线参数
private MogoPolylineOptions mPolylineOptions;
// 线路径集合
private List<MogoLatLng> mPolylinePointList;
public V2XOptimalRouteOverlay() {
mPolylineOptions = new MogoPolylineOptions();
// 渐变色
List<Integer> colors = new ArrayList<>();
colors.add(0xFFF95959);
// 线条粗细,渐变,渐变色值
mPolylineOptions.width(25).useGradient(true).colorValues(colors);
// 绘制路径集合
mPolylinePointList = new ArrayList<>();
}
/**
* 绘制最优路线
*
* @param polylinePoint 要绘制的经纬度度集合
*/
public IMogoPolyline draw(MogoLocation carLocal, List<double[]> polylinePoint) {
if (mMoGoPolyline != null) {
mMoGoPolyline.remove();
mPolylinePointList.clear();
}
if (polylinePoint != null) {
// 将当前车辆位置放进去
mPolylinePointList.add(new MogoLatLng(carLocal.getLatitude(), carLocal.getLongitude()));
// 过滤后台推送的推荐路线集合
for (double[] polyline : polylinePoint) {
MogoLatLng pointMoGoLatLng = new MogoLatLng(polyline[1], polyline[0]);
//需要剔除已经行驶过的经纬度,这里需要比对推荐路线集合中的点是否在当前车辆行驶方向前面如果不在则抛弃
if (LocationUtils.isPointOnCarFront(carLocal, pointMoGoLatLng)) {
mPolylinePointList.add(pointMoGoLatLng);
}
}
}
// 替换路径集合
mPolylineOptions.points(mPolylinePointList);
// 绘制线
mMoGoPolyline = V2XServiceManager.getMogoOverlayManager().addPolyline(mPolylineOptions);
return mMoGoPolyline;
}
}

View File

@@ -104,11 +104,12 @@ public class V2XScenarioManager implements IV2XScenarioManager {
mV2XScenario = new V2XRecommendRouteScenario();
break;
case V2XMessageEntity.V2XTypeEnum.ALERT_PUSH_VR_SHOW:
if (V2XServiceManager.getMoGoStatusManager().isVrMode()) {
mV2XScenario = new V2XOptimalRouteVREventScenario();
} else {
mV2XScenario = null;
}
// if (V2XServiceManager.getMoGoStatusManager().isVrMode()) {
//
// } else {
// mV2XScenario = null;
// }
mV2XScenario = new V2XOptimalRouteVREventScenario();
break;
case V2XMessageEntity.V2XTypeEnum.ALERT_THE_FRONT_CRASH_WARNING_TOP:
case V2XMessageEntity.V2XTypeEnum.ALERT_THE_FRONT_CRASH_WARNING_LEFT:

View File

@@ -20,7 +20,7 @@ import com.mogo.utils.TipToast;
* author : donghongyu
* e-mail : 1358506549@qq.com
* date : 2020/5/15 5:37 PM
* desc : TODO 演示使用的推送单车机直播场景
* desc : TODO 推送直播场景 非演示
* version: 1.0
*/
public class V2XPushLiveCarScenario extends AbsV2XScenario<V2XPushMessageEntity> implements IMogoTopViewStatusListener {
@@ -44,11 +44,9 @@ public class V2XPushLiveCarScenario extends AbsV2XScenario<V2XPushMessageEntity>
show();
} else {
TipToast.shortTip("附近没有可直播车机");
//Logger.e(V2XConst.MODULE_NAME, "直播地址为null");
}
} else {
setV2XMessageEntity(v2XMessageEntity);
//Logger.w(V2XConst.MODULE_NAME, "要处理的场景已经存在,丢弃这次初始化");
}
}
@@ -65,9 +63,15 @@ public class V2XPushLiveCarScenario extends AbsV2XScenario<V2XPushMessageEntity>
int height = (int) V2XUtils.getApp().getResources().getDimension(V2XServiceManager.getMoGoStatusManager().isVrMode() ?
R.dimen.module_v2x_event_see_live_window_height_vr : R.dimen.module_v2x_event_see_live_window_height);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(width, height);
V2XServiceManager
.getMogoTopViewManager()
.addViewNoLinkage(getV2XWindow().getView(), layoutParams, this);
if (V2XServiceManager.getMoGoStatusManager().isVrMode()) {
V2XServiceManager
.getMogoTopViewManager()
.addViewNoLinkage(getV2XWindow().getView(), layoutParams, this);
} else {
V2XServiceManager
.getMogoTopViewManager()
.addView(getV2XWindow().getView(), layoutParams, this);
}
getV2XWindow().show(getV2XMessageEntity().getContent());
V2XServiceManager.getMoGoV2XStatusManager().setLiveCarWindowShow(TAG, true);
}
@@ -111,23 +115,19 @@ public class V2XPushLiveCarScenario extends AbsV2XScenario<V2XPushMessageEntity>
@Override
public void onViewAdded(View view) {
//Logger.d(MODULE_NAME, "展示 Window 动画结束");
ADASUtils.broadcastToADAS(V2XServiceManager.getContext(), getV2XMessageEntity().getContent());
}
@Override
public void onViewRemoved(View view) {
//Logger.d(MODULE_NAME, "关闭 Window 动画结束");
}
@Override
public void beforeViewAddAnim(View view) {
//Logger.d(MODULE_NAME, "展示 Window 开始");
}
@Override
public void beforeViewRemoveAnim(View view) {
//Logger.d(MODULE_NAME, "关闭 Window 开始");
// 重置场景提示的消息
setV2XMessageEntity(null);
V2XServiceManager.getMoGoV2XStatusManager().setLiveCarWindowShow(TAG, false);

View File

@@ -6,6 +6,7 @@ import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
@@ -19,7 +20,6 @@ import com.mogo.module.v2x.scenario.view.IV2XWindow;
import com.mogo.module.v2x.utils.MarkerUtils;
import com.mogo.module.v2x.view.V2XLiveGSYVideoView;
import com.mogo.service.imageloader.MogoImageView;
import com.mogo.utils.logger.Logger;
import static com.mogo.module.v2x.V2XConst.MODULE_NAME;
@@ -27,20 +27,18 @@ import static com.mogo.module.v2x.V2XConst.MODULE_NAME;
* author : donghongyu
* e-mail : 1358506549@qq.com
* date : 2020/4/24 11:34 AM
* desc : TODO 演示使用的推送单车机直播场景
* version: 1.0
*/
public class V2XPushLiveCarWindow extends V2XBasWindow implements IV2XWindow<V2XPushMessageEntity> {
private Context mContext;
private V2XLiveGSYVideoView mV2XLiveGSYVideoView;
private MogoImageView mIvReportHead;
private ImageView pushVideoClose;
// 弹窗状态监听
private V2XWindowStatusListener mV2XWindowStatusListener;
// 直播30秒自动关闭
private static Handler handlerV2XEvent = new Handler();
private static final Handler handlerV2XEvent = new Handler();
private static Runnable runnableV2XEvent;
public V2XPushLiveCarWindow() {
@@ -57,17 +55,18 @@ public class V2XPushLiveCarWindow extends V2XBasWindow implements IV2XWindow<V2X
public V2XPushLiveCarWindow(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
initView(context);
}
public void initView(Context context) {
//Logger.w(MODULE_NAME, "初始化直播小窗口View。。。。。");
LayoutInflater.from(context).inflate(R.layout.item_v2x_push_live_video, this);
LayoutInflater.from(context).inflate(V2XServiceManager.getMoGoStatusManager().isVrMode()
? R.layout.item_v2x_push_live_video_vr
: R.layout.item_v2x_push_live_video, this);
// 详情列表
mV2XLiveGSYVideoView = findViewById(R.id.videoPlayer);
mIvReportHead = findViewById(R.id.ivReportHead);
pushVideoClose = findViewById(R.id.pushVideoClose);
ImageView pushVideoClose = findViewById(R.id.pushVideoClose);
pushVideoClose.setOnClickListener(v -> {
//移除窗体
V2XServiceManager
@@ -114,7 +113,7 @@ public class V2XPushLiveCarWindow extends V2XBasWindow implements IV2XWindow<V2X
mV2XWindowStatusListener.onViewClose();
}
// 停止倒计时
if (handlerV2XEvent != null && runnableV2XEvent != null) {
if (runnableV2XEvent != null) {
handlerV2XEvent.removeCallbacks(runnableV2XEvent);
runnableV2XEvent = null;
}

View File

@@ -14,6 +14,7 @@ import com.mogo.module.common.entity.V2XMessageEntity;
import com.mogo.module.common.entity.V2XPushMessageEntity;
import com.mogo.module.v2x.R;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.utils.ToastUtils;
import com.mogo.module.v2x.voice.V2XVoiceCallbackListener;
import com.mogo.module.v2x.voice.V2XVoiceManager;
import com.mogo.service.statusmanager.StatusDescriptor;
@@ -52,7 +53,6 @@ public class V2XVoiceCallLiveBiz {
}
private Context mContext;
private V2XVoiceCallLiveScenario mV2XVoiceCallLiveScenario;
//语音词指令 查看前车视频回调
private final V2XVoiceCallbackListener v2XVoiceCallbackFrontLiveCarListener = (command, intent) -> {
@@ -106,8 +106,7 @@ public class V2XVoiceCallLiveBiz {
LiveStreamManagerImpl.getInstance(AbsMogoApplication.getApp(),
MoGoAiCloudClientConfig.getInstance().getThirdPartyDeviceId());
V2XMessageEntity<V2XPushMessageEntity> v2XMessageEntity = buildCallLiveParams(null, null);
mV2XVoiceCallLiveScenario = new V2XVoiceCallLiveScenario();
mV2XVoiceCallLiveScenario.setV2XWindow(new V2XVoiceCallLiveCarWindow());
V2XVoiceCallLiveScenario mV2XVoiceCallLiveScenario = new V2XVoiceCallLiveScenario();
mV2XVoiceCallLiveScenario.init(v2XMessageEntity);
}
@@ -121,17 +120,18 @@ public class V2XVoiceCallLiveBiz {
public void liveUrlResult(String liveUrl) {
if (!TextUtils.isEmpty(liveUrl)) {
V2XMessageEntity<V2XPushMessageEntity> v2XMessageEntity = buildCallLiveParams(null, liveUrl);
mV2XVoiceCallLiveScenario = new V2XVoiceCallLiveScenario();
mV2XVoiceCallLiveScenario.setV2XWindow(new V2XVoiceCrossRoadLiveWindow());
mV2XVoiceCallLiveScenario.init(v2XMessageEntity);
V2XPushLiveCarScenario pushLiveCarScenario = new V2XPushLiveCarScenario();
pushLiveCarScenario.init(v2XMessageEntity);
} else {
Logger.d(MODULE_NAME, "getOpenRoadCameraLive 路口实况直播地址为空");
ToastUtils.showShort(R.string.v2x_front_live_url_null);
}
}
@Override
public void onError(String errorMsg) {
Logger.d(MODULE_NAME, "getOpenRoadCameraLive : " + errorMsg);
ToastUtils.showShort(R.string.v2x_front_live_url_null);
}
});
}
@@ -148,6 +148,7 @@ public class V2XVoiceCallLiveBiz {
v2XPushMessageEntity.setVideoSn(sn);
v2XPushMessageEntity.setVideoUrl(liveUrl);
v2XPushMessageEntity.setShowWindow(true);
v2XPushMessageEntity.setExpireTime(1000 * 30);
V2XMessageEntity<V2XPushMessageEntity> v2XMessageEntity = new V2XMessageEntity<>();
v2XMessageEntity.setType(V2XMessageEntity.V2XTypeEnum.ALERT_VOICE_CALL_FOR_LIVECAR_SHOW);
v2XMessageEntity.setContent(v2XPushMessageEntity);

View File

@@ -4,7 +4,6 @@ import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
@@ -24,7 +23,10 @@ import static com.mogo.module.v2x.V2XConst.MODULE_NAME;
public class V2XVoiceCallLiveCarWindow extends V2XBasWindow
implements IV2XWindow<V2XPushMessageEntity> {
private CarZegoLiveVideoView mV2XCarLiveVideoView;
private static final int COUNT_DOWN_TIMER = 1_000;
private static final int ALL_EXPIRE_TIMER = 1_000 * 30;
private static int EXPIRE_TIMER = ALL_EXPIRE_TIMER;
private TextView tvCountDown;
private ImageView ivVideoPlayingSign;
private boolean isVideoPlay = false;
@@ -32,13 +34,9 @@ public class V2XVoiceCallLiveCarWindow extends V2XBasWindow
// 处理道路事件30秒倒计时
private final Handler handlerV2XEvent = new Handler();
private Runnable runnableV2XEvent;
private static final int COUNT_DOWN_TIMER = 1_000;
private static final int ALL_EXPIRE_TIMER = 1_000 * 30;
private static int EXPIRE_TIMER = ALL_EXPIRE_TIMER;
public V2XVoiceCallLiveCarWindow() {
this(V2XServiceManager.getContext(), null);
Logger.d(MODULE_NAME, "V2XVoiceCallLiveCarWindow INIT");
}
public V2XVoiceCallLiveCarWindow(Context context, AttributeSet attrs) {
@@ -52,8 +50,10 @@ public class V2XVoiceCallLiveCarWindow extends V2XBasWindow
private void initView(Context context) {
Logger.w(MODULE_NAME, "V2X===初始化语音呼叫直播视图");
LayoutInflater.from(context).inflate(R.layout.window_see_carlive_video, this);
mV2XCarLiveVideoView = findViewById(R.id.videoPlayer);
LayoutInflater.from(context).inflate(V2XServiceManager.getMoGoStatusManager().isVrMode()
? R.layout.window_see_carlive_video_vr
: R.layout.window_see_carlive_video, this);
CarZegoLiveVideoView mV2XCarLiveVideoView = findViewById(R.id.videoPlayer);
tvCountDown = findViewById(R.id.tvCountDown);
ivVideoPlayingSign = findViewById(R.id.ivVideoPlayingSign);
mV2XCarLiveVideoView.addOnVideoStatusChangeListener(videoPlaying -> {
@@ -86,13 +86,10 @@ public class V2XVoiceCallLiveCarWindow extends V2XBasWindow
public void close() {
// 停止倒计时
stopCountDown();
if (V2XServiceManager
.getMogoTopViewManager().isViewAdded(this)) {
//移除窗体
V2XServiceManager
.getMogoTopViewManager()
.removeView(this);
}
//移除窗体
V2XServiceManager
.getMogoTopViewManager()
.removeView(this);
}
@Override
@@ -113,7 +110,6 @@ public class V2XVoiceCallLiveCarWindow extends V2XBasWindow
if (runnableV2XEvent == null) {
runnableV2XEvent = () -> {
EXPIRE_TIMER = EXPIRE_TIMER - COUNT_DOWN_TIMER;
Logger.d(MODULE_NAME, "V2X=== Window 30秒倒计时开始当前 " + EXPIRE_TIMER / COUNT_DOWN_TIMER + "");
tvCountDown.setVisibility(View.VISIBLE);
ivVideoPlayingSign.setVisibility(View.VISIBLE);
tvCountDown.setText(String.valueOf(EXPIRE_TIMER / COUNT_DOWN_TIMER));
@@ -126,12 +122,10 @@ public class V2XVoiceCallLiveCarWindow extends V2XBasWindow
} else {
handlerV2XEvent.removeCallbacks(runnableV2XEvent);
}
Logger.d(MODULE_NAME, "V2X=== Window 展示开始倒计时");
handlerV2XEvent.postDelayed(runnableV2XEvent, COUNT_DOWN_TIMER);
}
private void stopCountDown() {
Logger.d(MODULE_NAME, "V2X=== Window 倒计时停止。。。");
if (handlerV2XEvent != null && runnableV2XEvent != null) {
handlerV2XEvent.removeCallbacks(runnableV2XEvent);
runnableV2XEvent = null;

View File

@@ -1,7 +1,7 @@
package com.mogo.module.v2x.scenario.scene.livecar;
import android.view.View;
import android.widget.RelativeLayout;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
@@ -20,27 +20,26 @@ import static com.mogo.module.v2x.V2XConst.MODULE_NAME;
/**
* author : unknown
* desc : 语音呼叫查看直播场景,包括车辆直播 或者 路口实况 window区分不同页面window逻辑实现
* desc : 语音呼叫查看直播场景,包括车辆直播 或者 路口实况 window区分不同页面window逻辑实现,前方直播车辆由AICloudSdk中实现上层仅传入SurfaceView和经纬度
*/
public class V2XVoiceCallLiveScenario extends AbsV2XScenario<V2XPushMessageEntity> implements IMogoTopViewStatusListener {
public V2XVoiceCallLiveScenario() {
setV2XWindow(new V2XVoiceCallLiveCarWindow());
}
@Override
public void init(@Nullable V2XMessageEntity<V2XPushMessageEntity> v2XMessageEntity) {
if (v2XMessageEntity == null) {
TipToast.shortTip("附近没有可直播车机");
return;
}
if (v2XMessageEntity.isShowState()) {
if (!isSameScenario(v2XMessageEntity)
&& V2XServiceManager.getMoGoStatusManager().isMainPageLaunched()) {
setV2XMessageEntity(v2XMessageEntity);
Logger.d(V2XConst.MODULE_NAME, "v2XMessageEntity : " + v2XMessageEntity + " getVideoSn : " + v2XMessageEntity.getContent().getVideoSn());
if (v2XMessageEntity != null) {
Logger.d(V2XConst.MODULE_NAME, "准备展示直播窗口");
show();
} else {
TipToast.shortTip("附近没有可直播车机");
Logger.e(V2XConst.MODULE_NAME, "直播地址为null");
}
Logger.d(V2XConst.MODULE_NAME, "v2XMessageEntity : " + v2XMessageEntity);
show();
} else {
setV2XMessageEntity(v2XMessageEntity);
Logger.w(V2XConst.MODULE_NAME, "要处理的场景已经存在,丢弃这次初始化");
@@ -64,11 +63,7 @@ public class V2XVoiceCallLiveScenario extends AbsV2XScenario<V2XPushMessageEntit
R.dimen.module_v2x_event_window_width_vr : R.dimen.module_v2x_event_window_width);
int height = (int) V2XUtils.getApp().getResources().getDimension(V2XServiceManager.getMoGoStatusManager().isVrMode() ?
R.dimen.module_v2x_event_see_live_window_height_vr : R.dimen.module_v2x_event_see_live_window_height);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(width, height);
layoutParams.topMargin = (int) V2XUtils.getApp().getResources().getDimension(V2XServiceManager.getMoGoStatusManager().isVrMode() ?
R.dimen.module_v2x_event_window_top_margin_vr : R.dimen.module_v2x_event_window_top_margin);
layoutParams.rightMargin = (int) V2XUtils.getApp().getResources().getDimension(V2XServiceManager.getMoGoStatusManager().isVrMode() ?
R.dimen.module_v2x_event_window_right_margin_vr : R.dimen.module_v2x_event_window_right_margin);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(width, height);
if (V2XServiceManager.getMoGoStatusManager().isVrMode()) {
V2XServiceManager
.getMogoTopViewManager()

View File

@@ -1,17 +1,13 @@
package com.mogo.module.v2x.scenario.scene.route;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.module.common.entity.V2XPushMessageEntity;
import com.mogo.module.v2x.V2XConst;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.observer.V2XOptimalRouteObserver;
import com.mogo.module.v2x.scenario.view.IV2XMarker;
import com.mogo.module.v2x.utils.MarkerUtils;
import com.mogo.utils.logger.Logger;
import java.util.ArrayList;
import java.util.List;
/**
* author : donghongyu
* e-mail : 1358506549@qq.com
@@ -22,8 +18,6 @@ import java.util.List;
public class V2XOptimalRouteVREventMarker implements IV2XMarker<V2XPushMessageEntity> {
private final String TAG = "V2XPushVREventMarker";
private static IMogoPolyline mMogoPolyline;
@Override
public void drawPOI(V2XPushMessageEntity entity) {
Logger.w(V2XConst.MODULE_NAME + "_" + TAG, "drawPOI 绘制VR Marker");
@@ -32,10 +26,6 @@ public class V2XOptimalRouteVREventMarker implements IV2XMarker<V2XPushMessageEn
// 清除道路事件
V2XServiceManager
.getMoGoV2XMarkerManager().clearALLPOI();
if (mMogoPolyline != null) {
mMogoPolyline.remove();
}
// 绘制引导线
drawableRecommendPolyline(entity);
} catch (Exception e) {
@@ -49,23 +39,7 @@ public class V2XOptimalRouteVREventMarker implements IV2XMarker<V2XPushMessageEn
* @param entity
*/
void drawableRecommendPolyline(V2XPushMessageEntity entity) {
// 连接线参数
MogoPolylineOptions options = new MogoPolylineOptions();
// 渐变色
List<Integer> colors = new ArrayList<>();
colors.add(0xFFF95959);
// 线条粗细,渐变,渐变色值
options.width(20).useGradient(true).colorValues(colors);
for (double[] doubles : entity.getRecommendPolyline()) {
options.add(doubles[0], doubles[1]);
}
// 绘制线的对象
mMogoPolyline = V2XServiceManager.getMogoOverlayManager().addPolyline(options);
V2XOptimalRouteObserver.getInstance().setPolylinePoint(entity.getRecommendPolyline());
}
@Override
@@ -79,10 +53,6 @@ public class V2XOptimalRouteVREventMarker implements IV2XMarker<V2XPushMessageEn
}
public void clearLine() {
if (mMogoPolyline != null) {
mMogoPolyline.remove();
mMogoPolyline = null;
V2XServiceManager.getV2XStatusManager().setAlarmInfo(null);
}
V2XOptimalRouteObserver.getInstance().setPolylinePoint(null);
}
}

View File

@@ -53,6 +53,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout {
private Button mBtnTriggerRoadEvent;
private Button mBtnClearRoadEvent;
private Button mBtnTriggerPushEvent;
private Button mBtnTriggerWarningEvent;
private Button mBtnTriggerPushLiveCarEvent;
private Button mBtnTriggerAnimationEvent;
private Button mBtnbtnFrontCarLiveEvent;
@@ -67,6 +68,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout {
private ToggleButton nBtnTriggerVR;
private Button mBtnAdasDataWarn;
private Button btnTriggerRearVIPCarTip,
btnTriggerVehicleBrakes,
btnTriggerRearDangerousVehicles,
@@ -114,6 +116,7 @@ public class V2XTestConsoleWindow extends ConstraintLayout {
flTestPanelShunYi = findViewById(R.id.flTestPanelShunYi);
flTestPanelVR = findViewById(R.id.flTestPanelVR);
mBtnTriggerOpen = findViewById(R.id.btnTriggerOpen);
mBtnTriggerWarningEvent = findViewById(R.id.btnTriggerWarningEvent);
mBtnClearRoadEvent = findViewById(R.id.btnClearRoadEvent);
mBtnTriggerRoadEvent = findViewById(R.id.btnTriggerRoadEvent);
mBtnTriggerPushEvent = findViewById(R.id.btnTriggerPushEvent);
@@ -220,6 +223,16 @@ public class V2XTestConsoleWindow extends ConstraintLayout {
});
//车路云—场景预警-V1.0 碰撞预警
mBtnTriggerWarningEvent.setOnClickListener(v -> {
V2XMessageEntity<V2XWarningEntity> v2XMessageEntity =
TestOnLineCarUtils.getV2XScenarioPushFrontWarningEventData();
Intent intent = new Intent(V2XConst.BROADCAST_SCENE_HANDLER_ACTION);
intent.putExtra(V2XConst.BROADCAST_SCENE_EXTRA_KEY, v2XMessageEntity);
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
});
mBtnTriggerPushEvent.setOnClickListener(v -> {
V2XMessageEntity<V2XPushMessageEntity> v2XMessageEntity =
TestOnLineCarUtils.getV2XScenarioPushEventData();

View File

@@ -8,21 +8,31 @@ import com.mogo.map.MogoLatLng;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.module.common.MogoApisHandler;
import com.mogo.module.common.drawer.MarkerDrawer;
import com.mogo.module.common.drawer.marker.EmptyMarkerView;
import com.mogo.module.common.drawer.marker.IMarkerView;
import com.mogo.module.common.drawer.marker.MapMarkerAdapter;
import com.mogo.module.common.drawer.marker.SimpleWindow3DAdapter;
import com.mogo.module.common.entity.MarkerLocation;
import com.mogo.module.common.entity.MarkerShowEntity;
import com.mogo.module.common.entity.V2XWarningEntity;
import com.mogo.module.v2x.R;
import com.mogo.module.v2x.V2XConst;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.entity.model.DrawLineInfo;
import com.mogo.module.v2x.marker.OptimalSpeedMarkerView;
import com.mogo.module.v2x.marker.V2XFrontTargetMarkerView;
import com.mogo.module.v2x.scenario.view.IV2XMarker;
import com.mogo.module.v2x.utils.LocationUtils;
import com.mogo.utils.ViewUtils;
import com.mogo.utils.WorkThreadHandler;
import java.util.ArrayList;
import java.util.List;
import static com.mogo.module.v2x.V2XConst.V2X_FRONT_WARNING_MARKER;
import static com.mogo.module.v2x.V2XConst.V2X_OPTIMAL_SPEED_MARKER;
/**
* @author liujing
* @description 前方预警marker打点 绘制安全线和预警线
@@ -33,7 +43,7 @@ public class V2XWarningMarker implements IV2XMarker {
private V2XWarningEntity mMarkerEntity;
private MarkerShowEntity markerShowEntity = new MarkerShowEntity();
private Context mContext = V2XServiceManager.getContext();
private List fillPoints = new ArrayList();//停止线经纬度合集
private IMogoMarker optimalMarker = null;
@Override
public void drawPOI(Object entity) {
@@ -45,16 +55,16 @@ public class V2XWarningMarker implements IV2XMarker {
markerShowEntity.setMarkerLocation(location);
if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) {
pointsBetween();
//绘制停止线
// drawStopLines(fillPoints);
drawSafeLine();
WorkThreadHandler.getInstance().postDelayed(() -> {
V2XServiceManager.getMarkerManager().removeMarkers(V2XConst.V2X_FRONT_STOP_LINE);
V2XServiceManager.getMoGoWarnPolylineManager().clearLine();
}, 6_000);
}
MogoMarkerOptions optionsRipple = new MogoMarkerOptions()
.latitude(mMarkerEntity.getLat())
.longitude(mMarkerEntity.getLon())
.anchor(0.5f, 0.5f)
.zIndex(MarkerDrawer.MARKER_Z_INDEX_HIGH);
optionsRipple
.icon(ViewUtils.fromView(new EmptyMarkerView(mContext)));
optimalMarker = V2XServiceManager.getMarkerManager().addMarker(V2X_FRONT_WARNING_MARKER, optionsRipple);
optimalMarker.setInfoWindowAdapter(new SimpleWindow3DAdapter(new V2XFrontTargetMarkerView(mContext)));
optimalMarker.showInfoWindow();
} catch (Exception e) {
@@ -62,117 +72,10 @@ public class V2XWarningMarker implements IV2XMarker {
}
//绘制安全距离
private void drawSafeLine() {
clearPOI();
WorkThreadHandler.getInstance().postDelayed(() -> {
//自车位置
MogoLatLng car = V2XServiceManager.getNavi().getCarLocation();
if (car != null) {
//根据到停止线的距离和方向角获取经纬度
MogoLatLng
stopLineLo = LocationUtils.getNewLocation(car, mMarkerEntity.getStopLineDistance(), mMarkerEntity.getAngle());
// if (mMarkerEntity.getCollisionLat() > 0 && mMarkerEntity.getCollisionLon() > 0) {
// drawLine(car, stopLineLo);
// }
} else {
Log.d(TAG, "自车位置没有拿到");
}
}, 0);
}
//补点后的停止线经纬度合集
public void pointsBetween() {
try {
fillPoints.clear();
List stopLines = mMarkerEntity.getStopLines();
if (stopLines.size() > 1) {
MogoLatLng x = mMarkerEntity.getStopLines().get(0);
MogoLatLng y = mMarkerEntity.getStopLines().get(1);
//两点间的距离
float distance = CoordinateUtils.calculateLineDistance(x.lon, x.lat, y.lon, y.lat);
float average = distance / 3;
//两点间的角度
double angle = LocationUtils.getAngle(x.lon, x.lat, y.lon, y.lat);
//根据距离和角度获取下个点的经纬度
fillPoints.add(x);
for (int i = 1; i < 3; i++) {
MogoLatLng newLocation = LocationUtils.getNewLocation(x, average * i, angle);
fillPoints.add(newLocation);
}
fillPoints.add(y);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//绘制停止线-通过打点的方式实现
private void drawStopLines(List points) {
clearPOI();
V2XServiceManager.getMarkerManager().removeMarkers(V2XConst.V2X_FRONT_STOP_LINE);
for (int i = 0; i < points.size(); i++) {
MogoLatLng latLng = (MogoLatLng) points.get(i);
drawMarkerWithLocation(latLng, V2XConst.V2X_FRONT_STOP_LINE);
}
}
private void drawMarkerWithLocation(MogoLatLng latLng, String tag) {
MogoMarkerOptions options = new MogoMarkerOptions()
.object(markerShowEntity)
.latitude(latLng.lat)
.longitude(latLng.lon);
IMarkerView iMarkerView = MapMarkerAdapter.getMarkerView(mContext, markerShowEntity, options);
options.icon3DRes(com.mogo.module.service.R.raw.people);
options.anchor(0.5f, 0.5f);
options.anchorColor("#FF4040");
IMogoMarker marker = V2XServiceManager.getMarkerManager().addMarker(tag, options);
iMarkerView.setMarker(marker);
marker.setToTop();
}
//绘制并返回marker
public IMogoMarker drawMarkerAndReturn(MarkerShowEntity markerShowEntity) {
MogoMarkerOptions options = new MogoMarkerOptions()
.object(markerShowEntity)
.latitude(markerShowEntity.getMarkerLocation().getLat())
.longitude(markerShowEntity.getMarkerLocation().getLon());
IMarkerView iMarkerView = MapMarkerAdapter.getMarkerView(mContext, markerShowEntity, options);
options.icon3DRes(com.mogo.module.service.R.raw.people);
options.anchorColor("#FF4040");
IMogoMarker marker = V2XServiceManager.getMarkerManager().addMarker(V2XConst.V2X_FRONT_WARNING_MARKER, options);
iMarkerView.setMarker(marker);
marker.setToTop();
return marker;
}
//绘制线
public void drawLine(MogoLatLng s, MogoLatLng e) {
DrawLineInfo drawLineInfo = new DrawLineInfo();
drawLineInfo.setStartLocation(s);
drawLineInfo.setEndLocation(e);
drawLineInfo.setWidth(60);
V2XServiceManager.getMoGoWarnPolylineManager().drawWarnPolyline(mContext, drawLineInfo);
}
//平移
public void smooth(IMogoMarker marker) {
List<MogoLatLng> latLngs = new ArrayList<>();
MogoLatLng sLocation = new MogoLatLng(mMarkerEntity.getLat(), mMarkerEntity.getLon());
MogoLatLng endLocation = new MogoLatLng(mMarkerEntity.getCollisionLat(), mMarkerEntity.getCollisionLon());
latLngs.add(sLocation);
latLngs.add(endLocation);
marker.startSmoothInMs(latLngs, 3000);
WorkThreadHandler.getInstance().postDelayed(() -> {
clearLine();
}, 3_000);
}
@Override
public void clearPOI() {
V2XServiceManager.getMarkerManager().removeMarkers(V2XConst.V2X_FRONT_WARNING_MARKER);
V2XServiceManager.getMarkerManager().removeMarkers(V2X_FRONT_WARNING_MARKER);
}
public void clearLine() {

View File

@@ -1,13 +1,12 @@
package com.mogo.module.v2x.utils;
import android.location.Location;
import android.util.Log;
import com.mogo.map.MogoLatLng;
import com.mogo.map.location.MogoLocation;
import com.mogo.map.search.geo.IMogoGeoSearchListener;
import com.mogo.map.search.geo.MogoGeocodeResult;
import com.mogo.map.search.geo.MogoPoiItem;
import com.mogo.map.search.geo.MogoRegeocodeResult;
import com.mogo.map.search.geo.query.MogoRegeocodeQuery;
import com.mogo.map.search.poisearch.IMogoPoiSearch;
import com.mogo.map.search.poisearch.IMogoPoiSearchListener;
@@ -69,6 +68,11 @@ public class LocationUtils {
poiSearch.searchPOIAsyn();
}
/**
* 获取当前位置
*
* @return 当前位置
*/
public static MogoLatLng getCurrentLatLon() {
MogoLatLng latLon = V2XServiceManager.getNavi().getCarLocation();
if (latLon == null) {
@@ -89,9 +93,9 @@ public class LocationUtils {
return latLon;
}
/*
/**
* 计算两点间的角度
* */
*/
public static double getAngle(double lon1, double lat1, double lon2,
double lat2) {
double fLat = Math.PI * (lat1) / 180.0;
@@ -108,9 +112,9 @@ public class LocationUtils {
}
}
/*
/**
* 根据角度获取指定距离点的经纬度
* */
*/
public static MogoLatLng getNewLocation(MogoLatLng st, double distance, double angle) {
mRadLo = st.getLon() * Math.PI / 180.;
mRadLa = st.getLat() * Math.PI / 180.;
@@ -124,4 +128,31 @@ public class LocationUtils {
return new MogoLatLng(lat_new, lon_new);
}
/**
* 获取传入的经纬度在车辆的什么位置
*
* @return 顺时针true-前false-后
*/
public static boolean isPointOnCarFront(MogoLocation carLocal, MogoLatLng pointLocal) {
double carLon = carLocal.getLongitude();
double carLat = carLocal.getLatitude();
double poiLon = pointLocal.getLon();
double poiLat = pointLocal.getLat();
float carAngle = carLocal.getBearing();
// 计算车辆与点之间的夹角
int diffAngle = DrivingDirectionUtils.getDegreeOfCar2Poi(
carLon, carLat, poiLon, poiLat, (int) carAngle);
if (diffAngle <= 90) {
Log.i(TAG, "目标点在车辆--前方");
return true;
} else {
Log.i(TAG, "目标点在车辆--后方");
return false;
}
}
}

View File

@@ -13,8 +13,6 @@ import android.widget.TextView;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import com.mogo.cloud.live.manager.LiveStreamManagerImpl;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.cloud.trafficlive.api.ITrafficCarLiveCallBack;
import com.mogo.cloud.trafficlive.api.MoGoAiCloudTrafficLive;
import com.mogo.commons.AbsMogoApplication;
@@ -38,7 +36,6 @@ public class CarZegoLiveVideoView extends RoundLayout {
private SurfaceView mSurfaceView;
private ProgressBar mLoading;
private ConstraintLayout mClLoadError;
private TextView mTvRefreshButton;
private String liveSn;
// 重新刷新直播流
@@ -73,7 +70,7 @@ public class CarZegoLiveVideoView extends RoundLayout {
mLoading.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(context, R.color.live_video_progress_bar_loading_color), PorterDuff.Mode.MULTIPLY);
mClLoadError = findViewById(R.id.clLoadError);
mTvRefreshButton = findViewById(R.id.tvRefreshButton);
TextView mTvRefreshButton = findViewById(R.id.tvRefreshButton);
mTvRefreshButton.setOnClickListener(v -> {
mLoading.setVisibility(VISIBLE);
mClLoadError.setVisibility(GONE);

View File

@@ -57,7 +57,6 @@ public class V2XCrossRoadVideoView extends RoundLayout {
private final GSYVideoOptionBuilder gsyVideoOptionBuilder = new GSYVideoOptionBuilder();
private ProgressBar mLoading;
private ConstraintLayout mClLoadError;
private TextView mTvRefreshButton;
private boolean init = false;
private MarkerCarInfo.CarLiveInfo mCarLiveInfo;
@@ -83,6 +82,7 @@ public class V2XCrossRoadVideoView extends RoundLayout {
public V2XCrossRoadVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
Logger.d(TAG, "constructor invoke initView");
initView(context);
}
@@ -101,7 +101,7 @@ public class V2XCrossRoadVideoView extends RoundLayout {
mLoading.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(context, R.color.live_video_progress_bar_loading_color), PorterDuff.Mode.MULTIPLY);
mClLoadError = findViewById(R.id.clLoadError);
mTvRefreshButton = findViewById(R.id.tvRefreshButton);
TextView mTvRefreshButton = findViewById(R.id.tvRefreshButton);
mTvRefreshButton.setOnClickListener(v -> {
mLoading.setVisibility(VISIBLE);
mClLoadError.setVisibility(GONE);
@@ -152,7 +152,6 @@ public class V2XCrossRoadVideoView extends RoundLayout {
* @param carLiveInfo 要直播的设备信息,如果没有直播的地址需要重新获取最新的直播地址
*/
public void startLive(MarkerCarInfo.CarLiveInfo carLiveInfo) {
initView(this.getContext());
// 进行直播播放
if (mTxcVideoView != null
&& carLiveInfo != null) {

View File

@@ -7,7 +7,6 @@ import android.os.Bundle;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
@@ -18,8 +17,6 @@ import com.mogo.commons.voice.AIAssist;
import com.mogo.module.common.entity.MarkerCarInfo;
import com.mogo.module.v2x.R;
import com.mogo.module.v2x.V2XServiceManager;
import com.mogo.module.v2x.entity.net.V2XLivePushVoRes;
import com.mogo.module.v2x.network.V2XRefreshCallback;
import com.mogo.module.v2x.utils.V2XUtils;
import com.mogo.module.v2x.voice.V2XVoiceCallbackListener;
import com.mogo.module.v2x.voice.V2XVoiceConstants;
@@ -50,16 +47,14 @@ public class V2XLiveGSYVideoView extends RoundLayout implements IMogoSkinCompatS
private ProgressBar mLoading;
private TXLivePlayer mLivePlayer;
private ConstraintLayout mClLoadError;
private TextView mTvRefreshButton;
private MogoSkinCompatBackgroundHelperDelegate mBackgroundTintHelper;
private final MogoSkinCompatBackgroundHelperDelegate mBackgroundTintHelper;
private MarkerCarInfo.CarLiveInfo mCarLiveInfo;
// 重新刷新直播流
private V2XVoiceCallbackListener v2XVoiceCallbackRefreshListener = new V2XVoiceCallbackListener() {
private final V2XVoiceCallbackListener v2XVoiceCallbackRefreshListener = new V2XVoiceCallbackListener() {
@Override
public void onCallback(String command, Intent intent) {
//startHeartLive(mCarLiveInfo);
mLoading.setVisibility(VISIBLE);
mClLoadError.setVisibility(GONE);
if (mCarLiveInfo != null) {
@@ -87,7 +82,7 @@ public class V2XLiveGSYVideoView extends RoundLayout implements IMogoSkinCompatS
private void initView(Context context) {
LayoutInflater.from(context)
.inflate(R.layout.view_video_layout_normal, this);
//mPlayerView 即 step1 中添加的界面 view
//mPlayerView 即 step1 中添加的界面 view
mTxcVideoView = findViewById(R.id.txcVideoView);
//创建 player 对象
mLivePlayer = new TXLivePlayer(context);
@@ -106,15 +101,12 @@ public class V2XLiveGSYVideoView extends RoundLayout implements IMogoSkinCompatS
mLoading.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(context, R.color.live_video_progress_bar_loading_color), PorterDuff.Mode.MULTIPLY);
mClLoadError = findViewById(R.id.clLoadError);
mTvRefreshButton = findViewById(R.id.tvRefreshButton);
mTvRefreshButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mLoading.setVisibility(VISIBLE);
mClLoadError.setVisibility(GONE);
if (mCarLiveInfo != null) {
startLive(mCarLiveInfo);
}
TextView mTvRefreshButton = findViewById(R.id.tvRefreshButton);
mTvRefreshButton.setOnClickListener(v -> {
mLoading.setVisibility(VISIBLE);
mClLoadError.setVisibility(GONE);
if (mCarLiveInfo != null) {
startLive(mCarLiveInfo);
}
});
}
@@ -141,33 +133,33 @@ public class V2XLiveGSYVideoView extends RoundLayout implements IMogoSkinCompatS
}
// 根据SN重新获取直播流地址
else {
V2XServiceManager
.getV2XRefreshModel()
.livePush(new V2XRefreshCallback<V2XLivePushVoRes>() {
@Override
public void onSuccess(V2XLivePushVoRes result) {
Logger.e(MODULE_NAME, "从服务端获取最新直播信息:" + GsonUtil.jsonFromObject(result));
mClLoadError.setVisibility(GONE);
mClLoadError.setVisibility(GONE);
try {
MarkerCarInfo.CarLiveInfo carRealLiveInfo = new MarkerCarInfo.CarLiveInfo();
carRealLiveInfo.setVideoUrl(result.getResult().getPlayUrl().getRtmp());
carRealLiveInfo.setVideoSn(carLiveInfo.getVideoSn());
carRealLiveInfo.setVideoChannel(result.getResult().getVideoChannel());
setCarLiveInfo(carLiveInfo);
playLiveVideo(carRealLiveInfo);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFail(String msg) {
Logger.e(MODULE_NAME, "播放器:" + msg);
mLoading.setVisibility(GONE);
mClLoadError.setVisibility(VISIBLE);
}
}, carLiveInfo.getVideoSn(), 0);
// V2XServiceManager
// .getV2XRefreshModel()
// .livePush(new V2XRefreshCallback<V2XLivePushVoRes>() {
// @Override
// public void onSuccess(V2XLivePushVoRes result) {
// Logger.e(MODULE_NAME, "从服务端获取最新直播信息:" + GsonUtil.jsonFromObject(result));
// mClLoadError.setVisibility(GONE);
// mClLoadError.setVisibility(GONE);
// try {
// MarkerCarInfo.CarLiveInfo carRealLiveInfo = new MarkerCarInfo.CarLiveInfo();
// carRealLiveInfo.setVideoUrl(result.getResult().getPlayUrl().getRtmp());
// carRealLiveInfo.setVideoSn(carLiveInfo.getVideoSn());
// carRealLiveInfo.setVideoChannel(result.getResult().getVideoChannel());
// setCarLiveInfo(carLiveInfo);
// playLiveVideo(carRealLiveInfo);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
// @Override
// public void onFail(String msg) {
// Logger.e(MODULE_NAME, "播放器:" + msg);
// mLoading.setVisibility(GONE);
// mClLoadError.setVisibility(VISIBLE);
// }
// }, carLiveInfo.getVideoSn(), 0);
}
}
}
@@ -223,7 +215,7 @@ public class V2XLiveGSYVideoView extends RoundLayout implements IMogoSkinCompatS
/**
* 刷新直播心跳
*
* @param carLiveInfo
* @param carLiveInfo 直播info
*/
private void startHeartLive(MarkerCarInfo.CarLiveInfo carLiveInfo) {
try {
@@ -248,20 +240,25 @@ public class V2XLiveGSYVideoView extends RoundLayout implements IMogoSkinCompatS
// true 代表清除最后一帧画面
mLivePlayer.stopPlay(true);
mTxcVideoView.onDestroy();
// 停止推流
V2XServiceManager
.getV2XRefreshModel()
.livePush(new V2XRefreshCallback<V2XLivePushVoRes>() {
@Override
public void onSuccess(V2XLivePushVoRes result) {
Logger.d(MODULE_NAME, "播放器:" + result);
}
@Override
public void onFail(String msg) {
Logger.e(MODULE_NAME, "播放器:" + msg);
}
}, carLiveInfo.getVideoSn(), 1);
// if (carLiveInfo.getVideoUrl() != null) {
// return;
// }
// 停止推流
// V2XServiceManager
// .getV2XRefreshModel()
// .livePush(new V2XRefreshCallback<V2XLivePushVoRes>() {
// @Override
// public void onSuccess(V2XLivePushVoRes result) {
// Logger.d(MODULE_NAME, "播放器:" + result);
// }
//
// @Override
// public void onFail(String msg) {
// Logger.e(MODULE_NAME, "播放器:" + msg);
// }
// }, carLiveInfo.getVideoSn(), 1);
} catch (Exception e) {
e.printStackTrace();
}