diff --git a/.idea/misc.xml b/.idea/misc.xml index 733acb1920..aadec80484 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,6 +8,17 @@ + + + diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index 1ff4493a58..e86d7f0e18 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -200,10 +200,6 @@ public class MogoApplication extends AbsMogoApplication { // 第三方平台的sn是由AI云SDK中服务调用通过服务端生成的 preparePassportEnvironment(); prepareSocketAndLocationServices(apis); - //无延迟 -// UiThreadHandler.postDelayed(() -> { -// -// }, delay); } private void preparePassportEnvironment() { @@ -245,14 +241,16 @@ public class MogoApplication extends AbsMogoApplication { break; } // 设置应用服务AppId 长链、鉴权 - clientConfig.setServiceAppId("com_mogo_launcher"); + if (DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE || DebugConfig.getNetMode() == DebugConfig.NET_MODE_DEMO) { + clientConfig.setServiceAppId("com_mogo_launcher"); + } else { + clientConfig.setServiceAppId("com.mogo.launcher"); + } // 设置AI云平台分配给三方应用的签名密钥,需要从AI云平台申请 // 设置车机设备的唯一标识(这些表识必须是通过后台录入的设备) clientConfig.setThirdPartyDeviceId(Utils.getSn()); // 设置循环检测间隔时间 clientConfig.setLoopCheckDelay(15 * 1000); - // 设置是否使用MoGoAiCloud SDK内部定位进行实时数据上报 - clientConfig.setIsUseExternalLocation(true); // 设置DNS经纬度位置 clientConfig.setIHttpDnsCurrentLocation(new IHttpDnsCurrentLocation() { diff --git a/foudations/mogo-aicloud-services-apk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java b/foudations/mogo-aicloud-services-apk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java index 0a8c165e06..8ed63e49e4 100644 --- a/foudations/mogo-aicloud-services-apk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java +++ b/foudations/mogo-aicloud-services-apk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java @@ -7,10 +7,10 @@ import androidx.annotation.Keep; import com.mogo.cloud.socket.IMogoCloudSocketMsgAckListener; import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener; import com.mogo.cloud.socket.SocketManager; +import com.mogo.cloud.socket.entity.MsgBody; import com.mogo.service.connection.IMogoMsgAckListener; import com.mogo.service.connection.IMogoOnMessageListener; import com.mogo.service.connection.IMogoSocketManager; -import com.mogo.service.connection.MsgBody; import com.mogo.utils.logger.Logger; import com.zhidao.ptech.connsvr.commom.protocol.MogoCommon; @@ -105,7 +105,7 @@ public class MogoAiCloudSocketManager implements IMogoSocketManager { public void sendMsg(MsgBody body, IMogoMsgAckListener listener) { Logger.d(TAG, "sendMsg."); mAckListeners.put(body.getMsgId(), listener); - com.mogo.cloud.socket.MsgBody msgBody = new com.mogo.cloud.socket.MsgBody(); + MsgBody msgBody = new MsgBody(); msgBody.msgType(body.getMsgType()); msgBody.ack(body.isAck()); msgBody.content(body.getContent()); diff --git a/foudations/mogo-aicloud-services-sdk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java b/foudations/mogo-aicloud-services-sdk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java index 84327184c8..35dd929695 100644 --- a/foudations/mogo-aicloud-services-sdk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java +++ b/foudations/mogo-aicloud-services-sdk/src/main/java/com/mogo/aicloud/services/socket/MogoAiCloudSocketManager.java @@ -7,10 +7,10 @@ import androidx.annotation.Keep; import com.mogo.cloud.socket.IMogoCloudSocketMsgAckListener; import com.mogo.cloud.socket.IMogoCloudSocketOnMessageListener; import com.mogo.cloud.socket.SocketManager; +import com.mogo.cloud.socket.entity.MsgBody; import com.mogo.service.connection.IMogoMsgAckListener; import com.mogo.service.connection.IMogoOnMessageListener; import com.mogo.service.connection.IMogoSocketManager; -import com.mogo.service.connection.MsgBody; import com.mogo.utils.logger.Logger; import com.zhidao.ptech.connsvr.commom.protocol.MogoCommon; @@ -105,7 +105,7 @@ public class MogoAiCloudSocketManager implements IMogoSocketManager { public void sendMsg(MsgBody body, IMogoMsgAckListener listener) { Logger.d(TAG, "sendMsg."); mAckListeners.put(body.getMsgId(), listener); - com.mogo.cloud.socket.MsgBody msgBody = new com.mogo.cloud.socket.MsgBody(); + MsgBody msgBody = new MsgBody(); msgBody.msgType(body.getMsgType()); msgBody.ack(body.isAck()); msgBody.content(body.getContent()); diff --git a/gradle.properties b/gradle.properties index 05a07b99d5..313d9aa5c8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ org.gradle.parallel=true org.gradle.jvmargs=-Xmx4096m #开启gradle缓存 -org.gradle.caching=true +org.gradle.caching=trueconstraintlayout android.enableBuildCache=true #开启kotlin的增量和并行编译 @@ -157,19 +157,19 @@ LOGLIB_VERSION = 1.0.4 ######## MogoAiCloudSDK Version # 网络请求 -MOGO_NETWORK_VERSION=1.0.84 +MOGO_NETWORK_VERSION=1.1.34 # 鉴权 -MOGO_PASSPORT_VERSION=1.0.84 +MOGO_PASSPORT_VERSION=1.1.34 # 常链接 -MOGO_SOCKET_VERSION=1.0.84 +MOGO_SOCKET_VERSION=1.1.34 # 数据采集 -MOGO_REALTIME_VERSION=1.0.84 +MOGO_REALTIME_VERSION=1.1.34 # 探路,道路事件发布,获取 -MOGO_TANLU_VERSION=1.0.84 +MOGO_TANLU_VERSION=1.1.34 # 直播推流 -MOGO_LIVE_VERSION=1.0.84 +MOGO_LIVE_VERSION=1.1.34 # 直播拉流 -MOGO_TRAFFICLIVE_VERSION=1.0.84 +MOGO_TRAFFICLIVE_VERSION=1.1.34 ######## Foundation MogoAiCloud Module # mogoAiCloud apk services diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java index 88d82fe662..ea269bb845 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapNaviViewWrapper.java @@ -51,7 +51,6 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.MapCameraPosition; import com.mogo.map.uicontroller.MapControlResult; import com.mogo.map.uicontroller.VisualAngleMode; -import com.mogo.realtime.entity.ADASRecognizedResult; import com.mogo.utils.WindowUtils; import com.mogo.utils.logger.Logger; diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java index 5fd9c1bac6..e510f3e1e8 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/AMapViewWrapper.java @@ -46,7 +46,6 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.MapCameraPosition; import com.mogo.map.uicontroller.MapControlResult; import com.mogo.map.uicontroller.VisualAngleMode; -import com.mogo.realtime.entity.ADASRecognizedResult; import com.mogo.utils.NetworkUtils; import com.mogo.utils.WindowUtils; import com.mogo.utils.logger.Logger; diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java index 6d2af177af..d648ab42c1 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/uicontroller/AMapUIController.java @@ -14,7 +14,6 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.MapCameraPosition; import com.mogo.map.uicontroller.MapControlResult; import com.mogo.map.uicontroller.VisualAngleMode; -import com.mogo.realtime.entity.ADASRecognizedResult; import com.mogo.utils.logger.Logger; import java.util.List; @@ -311,9 +310,9 @@ public class AMapUIController implements IMogoMapUIController { } @Override - public void setAdasRecognizedResult(int drawlevel) { + public void setAdasRecognizedResult(int drawLevel) { if ( mClient != null ) { - mClient.setAdasRecognizedResult(drawlevel); + mClient.setAdasRecognizedResult(drawLevel); } } diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/uicontroller/AMapUIController.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/uicontroller/AMapUIController.java index e287168bd4..35a2e5e92d 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/uicontroller/AMapUIController.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/uicontroller/AMapUIController.java @@ -14,7 +14,6 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.MapCameraPosition; import com.mogo.map.uicontroller.MapControlResult; import com.mogo.map.uicontroller.VisualAngleMode; -import com.mogo.realtime.entity.ADASRecognizedResult; import com.zhidaoauto.map.sdk.open.MapAutoApi; import org.json.JSONObject; diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index 5f7d5fb774..607fcbd6f1 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -11,7 +11,6 @@ import androidx.annotation.Nullable; import com.mogo.map.MogoLatLng; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.anim.OnMarkerAnimationListener; -import com.mogo.realtime.entity.ADASRecognizedResult; import org.json.JSONObject; diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java index 7ef3e6f7f6..3a4fd0389f 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/MogoMapUIController.java @@ -13,7 +13,6 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.MapCameraPosition; import com.mogo.map.uicontroller.MapControlResult; import com.mogo.map.uicontroller.VisualAngleMode; -import com.mogo.realtime.entity.ADASRecognizedResult; import com.mogo.utils.logger.Logger; import org.json.JSONObject; diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/uploadintime/SnapshotLocationController.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/datacenter/SnapshotLocationDataCenter.java similarity index 91% rename from modules/mogo-module-common/src/main/java/com/mogo/module/common/uploadintime/SnapshotLocationController.java rename to modules/mogo-module-common/src/main/java/com/mogo/module/common/datacenter/SnapshotLocationDataCenter.java index d5a03ce8ce..b68ab53d15 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/uploadintime/SnapshotLocationController.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/datacenter/SnapshotLocationDataCenter.java @@ -1,8 +1,8 @@ -package com.mogo.module.common.uploadintime; +package com.mogo.module.common.datacenter; import com.mogo.commons.debug.DebugConfig; import com.mogo.module.common.MogoApisHandler; -import com.mogo.realtime.entity.CloudLocationInfo; +import com.mogo.service.locationinfo.CloudLocationInfo; import com.mogo.utils.logger.Logger; import org.json.JSONObject; @@ -16,20 +16,20 @@ import java.util.List; * * 实时坐标数据处理中心 */ -public class SnapshotLocationController { +public class SnapshotLocationDataCenter { private static final String TAG = "SnapshotLocationController"; - private static volatile SnapshotLocationController sInstance; + private static volatile SnapshotLocationDataCenter sInstance; - private SnapshotLocationController() { + private SnapshotLocationDataCenter() { } - public static SnapshotLocationController getInstance() { + public static SnapshotLocationDataCenter getInstance() { if (sInstance == null) { - synchronized (SnapshotLocationController.class) { + synchronized (SnapshotLocationDataCenter.class) { if (sInstance == null) { - sInstance = new SnapshotLocationController(); + sInstance = new SnapshotLocationDataCenter(); } } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java index dcbfcd4d1d..0e1b862d33 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/AdasRecognizedResultDrawer.java @@ -1,24 +1,29 @@ package com.mogo.module.common.drawer; +import android.os.Build; import android.os.Message; import android.text.TextUtils; +import android.util.Log; +import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.debug.DebugConfig; 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.constants.DataTypes; -import com.mogo.module.common.utils.SimpleHandlerThreadPool; -import com.mogo.realtime.entity.ADASRecognizedResult; -import com.mogo.utils.logger.Logger; +import com.mogo.module.common.drawer.bean.SpeedData; +import com.mogo.module.common.utils.Trigonometric; +import com.mogo.service.adas.entity.ADASRecognizedResult; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import static com.mogo.cloud.socket.entity.SocketDownDataHelper.FROM_ADAS; public /** @@ -29,20 +34,25 @@ public */ class AdasRecognizedResultDrawer extends BaseDrawer { - private static final String TAG = "AdasRecognizedResultDrawer"; + private static final String TAG = "RecognizedResultDrawer"; private static volatile AdasRecognizedResultDrawer sInstance; + /** + * 上一帧数据的缓存 + */ + private static Map mMarkersCaches = new ConcurrentHashMap<>(); + public AdasRecognizedResultDrawer() { super(); } - private final Map< String, ADASRecognizedResult > mLastPositions = new ConcurrentHashMap<>(); + private final Map mLastPositions = new ConcurrentHashMap<>(); public static AdasRecognizedResultDrawer getInstance() { - if ( sInstance == null ) { - synchronized ( AdasRecognizedResultDrawer.class ) { - if ( sInstance == null ) { + if (sInstance == null) { + synchronized (AdasRecognizedResultDrawer.class) { + if (sInstance == null) { sInstance = new AdasRecognizedResultDrawer(); } } @@ -59,212 +69,268 @@ class AdasRecognizedResultDrawer extends BaseDrawer { return sInstance; } - public boolean hasCached( String uniqueKey ) { - return mMarkersCaches.containsKey( uniqueKey ); + public boolean hasCached(String uniqueKey) { + return mMarkersCaches.containsKey(uniqueKey); } /** * 渲染 adas 识别的数据 * - * @param resultList + * @param resultList adas感知融合数据 */ - public void renderAdasRecognizedResult( List< ADASRecognizedResult > resultList ) { - if ( resultList == null || resultList.isEmpty() || !DebugConfig.isUseAdasRecognize() ) { + public void renderAdasRecognizedResult(List resultList) { + final long start = System.nanoTime(); + if (resultList == null || resultList.isEmpty() || !DebugConfig.isUseAdasRecognize()) { clearOldMarker(); return; } - if ( !MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { + if (!MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { clearOldMarker(); return; } - Map< String, IMogoMarker > newAdasRecognizedMarkersCaches = new HashMap<>(); - List< ADASRecognizedResult > newDiffSet = new ArrayList<>(); - for ( ADASRecognizedResult recognizedListResult : resultList ) { +// List allDatumsList = new ArrayList<>(); +// prepareData(resultList, allDatumsList); - if ( isUselessValue( recognizedListResult ) ) { + Map newAdasRecognizedMarkersCaches = new ConcurrentHashMap<>(); + List newDiffSet = new ArrayList<>(); + for (ADASRecognizedResult recognizedListResult : resultList) { + + if (isUselessValue(recognizedListResult)) { continue; } - // 复用之前存在的 marker String uniqueKey = recognizedListResult.uuid; - IMogoMarker marker = mMarkersCaches.remove( uniqueKey ); - if ( marker != null && !marker.isDestroyed() ) { - renderAdasOneFrame( marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches ); + IMogoMarker marker = mMarkersCaches.remove(uniqueKey); + if (marker != null && !marker.isDestroyed()) { +// Log.d(TAG, "发现缓存marker id : " + uniqueKey); + updateCacheMarkerRes(marker, recognizedListResult); + renderAdasOneFrame(marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches); } else { - // 新增差集 - newDiffSet.add( recognizedListResult ); + // 新增添加进差集 + newDiffSet.add(recognizedListResult); } } - - removeUselessMarker(); - - // 能复用的 marker 数量 - int cachedMarkerSize = mMarkersCaches.size(); - // 需要新增的 marker 数量 + removeUselessMarker(mMarkersCaches); + removeUselessLastRecord(); int newDiffSetSize = newDiffSet.size(); - // 能复用的数量 - int size = cachedMarkerSize >= newDiffSetSize ? newDiffSetSize : cachedMarkerSize; - +// Log.d(TAG, "原数据量 : " + resultList.size() + " 新增marker数量 : " + newDiffSetSize); // 复用过期 marker - if ( newDiffSetSize > 0 ) { - Iterator< Map.Entry< String, IMogoMarker > > entryIterator = mMarkersCaches.entrySet().iterator(); - for ( int i = 0; i < size; i++ ) { - ADASRecognizedResult recognizedListResult = newDiffSet.get( i ); + if (newDiffSetSize > 0) { + for (int i = 0; i < newDiffSetSize; i++) { + ADASRecognizedResult recognizedListResult = newDiffSet.get(i); String uniqueKey = recognizedListResult.uuid; - Map.Entry< String, IMogoMarker > entry = entryIterator.next(); - entryIterator.remove(); - ADASRecognizedResult old = mLastPositions.remove( entry.getKey() ); - IMogoMarker marker = entry.getValue(); - if ( marker == null ) { + IMogoMarker marker = drawAdasRecognizedDataMarker(recognizedListResult); + if (marker == null) { continue; } - - // 更新资源内容 - if ( old == null || old.type != recognizedListResult.type ) { - String resIdVal = null; - int resId = getModelRes( recognizedListResult.type ); - resIdVal = resId + ""; - String resName = mMarkerCachesResMd5Values.get( resIdVal ); - if ( !TextUtils.isEmpty( resName ) ) { - if ( !TextUtils.equals( resName, marker.getMarkerResName() ) ) { - marker.use3DResource( resName ); - } - } else { - resName = marker.use3DResource( resId ); - mMarkerCachesResMd5Values.put( resIdVal, resName ); - } - } - - renderAdasOneFrame( marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches ); - } - - // 复用过后还需新增的 marker - - for ( int i = size; i < newDiffSetSize; i++ ) { - ADASRecognizedResult recognizedListResult = newDiffSet.get( i ); - String uniqueKey = recognizedListResult.uuid; - IMogoMarker marker = drawAdasRecognizedDataMarker( recognizedListResult ); - if ( marker == null ) { - continue; - } - renderAdasOneFrame( marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches ); +// Log.d(TAG, "新增marker id : " + uniqueKey); + renderAdasOneFrame(marker, uniqueKey, recognizedListResult, newAdasRecognizedMarkersCaches); } } - if ( cachedMarkerSize - size > 0 ) { - sendMessage( MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches ); - } + sendMessage(MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches); + mMarkersCaches.clear(); mMarkersCaches = newAdasRecognizedMarkersCaches; + Log.d("ADAS数据延时绘制", "render 接收数据 -> 处理结束 " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start)) + "ms"); } - private boolean isUselessValue( ADASRecognizedResult recognizedListResult ) { - if ( recognizedListResult == null ) { - return true; - } - if ( !isRenderType( recognizedListResult.type ) ) { - return true; - } + /** + * 对数据补点 + * + * @param in + * @param out + */ + private void prepareData(List in, List out) { +// foreCastPoint(in); + out.addAll(in); + } - String uniqueKey = recognizedListResult.uuid; - if ( TextUtils.isEmpty( uniqueKey ) ) { + private final static String FORECAST = "adasForecast"; + + /** + * 基于工控机识别的数据点速度预测当前位置和距离自车距离 + * + * @param in 数据源 + */ + private void foreCastPoint(List in) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + for (ADASRecognizedResult adasResult : in) { + Log.d(FORECAST, "ready to foreCast current uuid : " + adasResult.uuid); + long internal = getCurSatelliteTime() - adasResult.satelliteTime; + if (internal <= 0) { + Log.d(FORECAST, "time internal less than 0 , uuid : " + adasResult.uuid); + continue; + } + long startTime = System.currentTimeMillis(); + // 预测点 + Log.d(FORECAST, "time internal : " + internal + " speed : " + adasResult.speed); + double foreCastDistance = adasResult.speed * internal / 1000; + Log.d(FORECAST, "foreCastDistance : " + foreCastDistance); + MogoLatLng mogoLatLng = new MogoLatLng(adasResult.lat, adasResult.lon); + MogoLatLng foreCastMogoLatLon = Trigonometric.getNewLocation(mogoLatLng, foreCastDistance, adasResult.heading); + + // 计算与自车距离 + float distanceFromSelf = CoordinateUtils.calculateLineDistance(getCurCoordinates()[0], getCurCoordinates()[1] + , foreCastMogoLatLon.getLon(), foreCastMogoLatLon.getLat()); + + long foreCastInternal = System.currentTimeMillis() - startTime; + Log.d(FORECAST, "foreCastInternal :" + foreCastInternal); //todo 耗时1~2毫秒 需要测试是否由于补点算法造成 + + adasResult.lat = foreCastMogoLatLon.getLat(); + adasResult.lon = foreCastMogoLatLon.getLon(); + adasResult.satelliteTime = (getCurSatelliteTime() - foreCastInternal); + adasResult.distance = distanceFromSelf; + } + } + } + + /** + * todo 后面涉及到此类变化的数据均改动 + * + * @param marker + * @param recognizedListResult + */ + private void updateCacheMarkerRes(IMogoMarker marker, ADASRecognizedResult recognizedListResult) { + String resIdVal; + int resId = getModelRes(recognizedListResult.type); + resIdVal = resId + ""; + String resName = mMarkerCachesResMd5Values.get(resIdVal); + if (!TextUtils.isEmpty(resName)) { + if (!TextUtils.equals(resName, marker.getMarkerResName())) { + marker.use3DResource(resName); + } + } else { + resName = marker.use3DResource(resId); + mMarkerCachesResMd5Values.put(resIdVal, resName); + } + } + + private void removeUselessLastRecord() { // todo 最好重新设计一个数据结构,用于多线程数据过期失效的场景,参见redis数据过期 + if (mLastPositions.isEmpty()) { + return; + } + Iterator iterator = mLastPositions.values().iterator(); + Log.d("EmArrow", "removeUselessLastRecord size : " + mLastPositions.size()); + while (iterator.hasNext()) { + ADASRecognizedResult result = iterator.next(); + long internal = result.satelliteTime - getCurSatelliteTime(); + if (internal > 3000) { //防止帧率过低导致误删除上一个节点对象,从而出现跳跃现象 + iterator.remove(); + } + } + } + + /** + * 过滤无用数据 + * + * @param recognizedListResult {@link ADASRecognizedResult} + * @return useless + */ + private boolean isUselessValue(ADASRecognizedResult recognizedListResult) { + if (recognizedListResult == null) { return true; } - return false; + if (nonRenderType(recognizedListResult.type)) { + return true; + } + String uniqueKey = recognizedListResult.uuid; + return TextUtils.isEmpty(uniqueKey); } /** * 绘制某个物体的一个数据 * - * @param recognizedListResult - * @param newAdasRecognizedMarkersCaches + * @param recognizedListResult {@link ADASRecognizedResult} + * @param newAdasRecognizedMarkersCaches 缓存集合 */ - private void renderAdasOneFrame( IMogoMarker marker, - String uniqueKey, - ADASRecognizedResult recognizedListResult, - Map< String, IMogoMarker > newAdasRecognizedMarkersCaches ) { + private void renderAdasOneFrame(IMogoMarker marker, + String uniqueKey, + ADASRecognizedResult recognizedListResult, + Map newAdasRecognizedMarkersCaches) { + final long start = System.nanoTime(); +// Log.d(TAG, "renderAdasOneFrame uuid : " + uniqueKey + " type : " + recognizedListResult.type + " heading : " + recognizedListResult.heading); + ADASRecognizedResult lastPosition = mLastPositions.remove(uniqueKey); + // 道路吸附 +// double lastLon = -1; +// double lastLat = -1; +// if (lastPosition != null) { +// lastLon = lastPosition.lon; +// lastLat = lastPosition.lat; +// } +// double[] matchLonLat = getMatchLonLat(recognizedListResult.uuid, recognizedListResult.lon, recognizedListResult.lat, recognizedListResult.heading, lastLon, lastLat); +// +// recognizedListResult.lon = matchLonLat[0]; +// recognizedListResult.lat = matchLonLat[1]; +// Log.d( "matchRoad", "cost = %s", System.currentTimeMillis() - start ); - final long start = System.currentTimeMillis(); - - ADASRecognizedResult lastPosition = mLastPositions.remove( uniqueKey ); - double lastLon = -1; - double lastLat = -1; - if ( lastPosition != null ) { - lastLon = lastPosition.lon; - lastLat = lastPosition.lat; - } - double[] matchLonLat = getMatchLonLat( recognizedListResult.uuid, recognizedListResult.lon, recognizedListResult.lat, recognizedListResult.heading, lastLon, lastLat ); - - recognizedListResult.lon = matchLonLat[0]; - recognizedListResult.lat = matchLonLat[1]; - - mLastPositions.put( uniqueKey, recognizedListResult ); -// Logger.d( "matchRoad", "cost = %s", System.currentTimeMillis() - start ); - - newAdasRecognizedMarkersCaches.put( uniqueKey, marker ); - if ( lastPosition != null ) { - long interval = computeAnimDuration( lastPosition.systemTime, recognizedListResult.systemTime, lastPosition.satelliteTime, recognizedListResult.satelliteTime ); - - final MogoLatLng renderLoc = new MogoLatLng( recognizedListResult.lat, recognizedListResult.lon ); - long cost = System.currentTimeMillis() - start; - final long intervalRef = interval - cost; - SimpleHandlerThreadPool.getInstance().postRender( () -> { - marker.addDynamicAnchorPosition( renderLoc, ( float ) recognizedListResult.heading, intervalRef ); - } ); - } else { - marker.setRotateAngle( ( ( float ) recognizedListResult.heading ) ); - marker.setPosition( recognizedListResult.lat, recognizedListResult.lon ); + mLastPositions.put(uniqueKey, recognizedListResult); +// Log.d(TAG, "使用缓存 id : " + uniqueKey); + long interval = 45; + if (lastPosition != null) { + interval = computeAnimDuration(lastPosition.satelliteTime, recognizedListResult.satelliteTime); } + final MogoLatLng renderLoc = new MogoLatLng(recognizedListResult.lat, recognizedListResult.lon); + long cost = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); + Log.d("ADAS动画数据","cost : " + cost); + final long intervalRef = interval - cost; + Log.d("ADAS动画数据", "最终赋值 : " + intervalRef + " 两帧间隔 : " + interval + " uuid : " + recognizedListResult.uuid); + marker.addDynamicAnchorPosition(renderLoc, (float) recognizedListResult.heading, intervalRef); String carColor = recognizedListResult.color; - if ( TextUtils.isEmpty( carColor ) ) { - carColor = getModelRenderColor( recognizedListResult.type, recognizedListResult.speed, recognizedListResult.lon, recognizedListResult.lat, recognizedListResult.heading ); + if (TextUtils.isEmpty(carColor)) { + carColor = getModelRenderColor(recognizedListResult.type, FROM_ADAS, recognizedListResult.drawlevel); } - marker.setAnchorColor( carColor ); + marker.setAnchorColor(carColor); - if ( shouldShowSpeed( recognizedListResult.type ) ) { + newAdasRecognizedMarkersCaches.put(uniqueKey, marker); + + if (shouldShowSpeed(recognizedListResult.type)) { Message msg = mRenderThreadHandler.obtainMessage(); - SpeedData obj = new SpeedData(); - obj.context = mContext; - obj.marker = marker; - obj.speed = recognizedListResult.speed; - msg.obj = obj; + msg.obj = new SpeedData(marker + , recognizedListResult.speed + , recognizedListResult.uuid + , recognizedListResult.type + , recognizedListResult.heading + , MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()); msg.what = MSG_DISPLAY_SPEED; msg.sendToTarget(); } + Log.d("ADAS数据延时", "render 刷新一台车 cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); } /** * 绘制 marker * - * @param recognizedListResult - * @return + * @param recognizedListResult {@link ADASRecognizedResult} + * @return {@link IMogoMarker} */ - private IMogoMarker drawAdasRecognizedDataMarker( ADASRecognizedResult recognizedListResult ) { - if ( recognizedListResult == null ) { + private IMogoMarker drawAdasRecognizedDataMarker(ADASRecognizedResult recognizedListResult) { + long start = System.nanoTime(); + if (recognizedListResult == null) { return null; } - String resIdVal = null; - int resId = getModelRes( recognizedListResult.type ); - resIdVal = resId + ""; + int resId = getModelRes(recognizedListResult.type); + String resIdVal = resId + ""; String carColor = recognizedListResult.color; - if ( TextUtils.isEmpty( carColor ) ) { - carColor = getModelRenderColor( recognizedListResult.type, recognizedListResult.speed, recognizedListResult.lon, recognizedListResult.lat, recognizedListResult.heading ); + if (TextUtils.isEmpty(carColor)) { + carColor = getModelRenderColor(recognizedListResult.type, FROM_ADAS, recognizedListResult.drawlevel); } MogoMarkerOptions options = new MogoMarkerOptions() - .owner( DataTypes.TYPE_MARKER_ADAS ) - .anchor( 0.5f, 0.5f ) - .set3DMode( true ) - .gps( true ) - .anchorColor( carColor ) - .controlAngle( true ) - .resName( mMarkerCachesResMd5Values.get( resIdVal ) ) - .icon3DRes( resId ) - .rotate( ( float ) recognizedListResult.heading ) - .position( new MogoLatLng( recognizedListResult.lat, recognizedListResult.lon ) ); - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager( mContext ).addMarker( DataTypes.TYPE_MARKER_ADAS, options ); - cacheMarkerIconResMd5Val( resIdVal, marker ); + .owner(DataTypes.TYPE_MARKER_ADAS) + .anchor(0.5f, 0.5f) + .set3DMode(true) + .gps(true) + .anchorColor(carColor) + .controlAngle(true) + .resName(mMarkerCachesResMd5Values.get(resIdVal)) + .icon3DRes(resId) + .rotate((float) recognizedListResult.heading) + .position(new MogoLatLng(recognizedListResult.lat, recognizedListResult.lon)); + IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(DataTypes.TYPE_MARKER_ADAS, options); + cacheMarkerIconResMd5Val(resIdVal, marker); + Log.d("ADAS数据延时", "创建一个新 marker cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); return marker; } @@ -279,12 +345,10 @@ class AdasRecognizedResultDrawer extends BaseDrawer { * 清除旧的 marker 数据 */ public void clearOldMarker() { - if ( mMarkersCaches != null ) { + if (mMarkersCaches != null) { mMarkersCaches.clear(); } - if ( mLastPositions != null ) { - mLastPositions.clear(); - } - sendMessage( MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_ADAS ); + mLastPositions.clear(); + sendMessage(MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_ADAS); } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java index 818a3e7b26..e1b7da8403 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/BaseDrawer.java @@ -1,5 +1,8 @@ package com.mogo.module.common.drawer; +import static com.mogo.cloud.socket.entity.SocketDownDataHelper.FROM_ADAS; +import static java.lang.Math.PI; + import android.content.Context; import android.graphics.Color; import android.graphics.Typeface; @@ -10,23 +13,21 @@ import android.util.Log; import android.view.ViewGroup; import android.widget.TextView; -import com.mogo.cloud.commons.utils.CoordinateUtils; import com.mogo.commons.AbsMogoApplication; import com.mogo.map.marker.IMogoMarker; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.R; import com.mogo.module.common.constants.AdasRecognizedType; -import com.mogo.module.common.uploadintime.SnapshotLocationController; +import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; +import com.mogo.module.common.drawer.bean.SpeedData; import com.mogo.utils.WorkThreadHandler; import java.util.Collection; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; - -import static java.lang.Math.PI; +import java.util.concurrent.ConcurrentHashMap; public /* @@ -37,40 +38,19 @@ public */ class BaseDrawer { - /** - * 速度显示对象 - */ - public class SpeedData { - - public IMogoMarker marker; - public Context context; - double speed; - - public void showSpeed() { - try { - showSelfSpeed(context, - marker, - speed, - MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - // 移除过期的 marker public static final int MSG_REMOVE_DIRTY_MARKERS = 9990; - /** - * 显示速度 - */ - public static final int MSG_DISPLAY_SPEED = 11; - /** * 地图刷新频率 */ public static final int MAP_RENDER_FRAME_FREQUENCY = 30; + /** + * 显示速度 + */ + public static final int MSG_DISPLAY_SPEED = 11; + /** * 移动点的时间间隔 */ @@ -79,23 +59,30 @@ class BaseDrawer { /** * 地图内部资源md5缓存,便于资源复用 */ - protected static final Map mMarkerCachesResMd5Values = new HashMap<>(); - - /** - * 上一帧数据的缓存 - */ - protected Map mMarkersCaches = new HashMap<>(); + protected static final ConcurrentHashMap mMarkerCachesResMd5Values = new ConcurrentHashMap<>(); protected final Context mContext; - protected static Handler mRenderThreadHandler = null; + private static TextView mSpeedView; public BaseDrawer() { mContext = AbsMogoApplication.getApp(); initWorkThreadHandler(); + initView(); + } + + private void initView() { + if (mSpeedView == null) { + mSpeedView = new TextView(mContext); + mSpeedView.setSingleLine(false); + mSpeedView.setTextColor(Color.WHITE); + mSpeedView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); + mSpeedView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + } } private static Handler mWorkThreadHandler; + protected static Handler mRenderThreadHandler = null; /** * 处理 marker 移除的线程 @@ -140,30 +127,29 @@ class BaseDrawer { } } - /** - * 显示速度 - * - * @param data {@link SpeedData} - */ - private static void showSpeed(SpeedData data) { - if (data == null) { - return; - } - data.showSpeed(); + private static void showSpeed(SpeedData speedData) { + showSelfSpeed(speedData.getMarker() + , speedData.getSpeed() + , speedData.getUuid() + , speedData.getType() + , speedData.getHeading() + , speedData.getIsVrMode()); } /** * 清除无效[为 null 或者 已被销毁]的 marker */ - protected void removeUselessMarker() { + protected void removeUselessMarker(Map mMarkersCaches) { if (mMarkersCaches == null || mMarkersCaches.isEmpty()) { return; } Iterator iterator = mMarkersCaches.values().iterator(); while (iterator.hasNext()) { IMogoMarker marker = iterator.next(); - if (marker == null || marker.isDestroyed()) { + if (marker != null) { iterator.remove(); + marker.remove(); + marker.destroy(); } } } @@ -187,29 +173,29 @@ class BaseDrawer { * @param type {@link AdasRecognizedType} * @return render */ - public boolean isRenderType(int type) { + public boolean nonRenderType(int type) { AdasRecognizedType recognizedType = AdasRecognizedType.valueFrom(type); - return recognizedType == AdasRecognizedType.classIdCar - || recognizedType == AdasRecognizedType.classIdMoto - || recognizedType == AdasRecognizedType.classIdBicycle - || recognizedType == AdasRecognizedType.classIdPerson - || recognizedType == AdasRecognizedType.classIdTrafficBus - || recognizedType == AdasRecognizedType.classIdTrafficTruck - || recognizedType == AdasRecognizedType.classIdUnKnow; //todo unKnow物体绘制 + return recognizedType != AdasRecognizedType.classIdCar + && recognizedType != AdasRecognizedType.classIdMoto + && recognizedType != AdasRecognizedType.classIdBicycle + && recognizedType != AdasRecognizedType.classIdPerson + && recognizedType != AdasRecognizedType.classIdTrafficBus + && recognizedType != AdasRecognizedType.classIdTrafficTruck + && recognizedType != AdasRecognizedType.classIdUnKnow; } /** - * 是否展示车速 + * 是否展示车速,UUID以及类型 * * @param type {@link AdasRecognizedType} * @return showSpeed */ public boolean shouldShowSpeed(int type) { - AdasRecognizedType recognizedType = AdasRecognizedType.valueFrom(type); - return recognizedType != AdasRecognizedType.classIdBicycle - && recognizedType != AdasRecognizedType.classIdMoto - && recognizedType != AdasRecognizedType.classIdPerson - && recognizedType != AdasRecognizedType.classIdUnKnow; //todo unKnow物体不绘制车速 + return true; //todo 验证行人预警,对行人和自行车不做infoWindow过滤 +// AdasRecognizedType recognizedType = AdasRecognizedType.valueFrom(type); +// return recognizedType != AdasRecognizedType.classIdPerson; +// &&recognizedType != AdasRecognizedType.classIdBicycle //todo Bicycle显示 +// && recognizedType != AdasRecognizedType.classIdMoto //todo moto显示 } /** @@ -220,64 +206,53 @@ class BaseDrawer { */ public int getModelRes(int type) { AdasRecognizedType recognizedType = AdasRecognizedType.valueFrom(type); - if (recognizedType == AdasRecognizedType.classIdCar - || recognizedType == AdasRecognizedType.classIdTrafficTruck) { - return R.raw.othercar; + if (recognizedType == AdasRecognizedType.classIdCar) { + // TODO 这里临时替换模型解决穿模现象 + return R.raw.tachexiaoche; } else if (recognizedType == AdasRecognizedType.classIdTrafficBus) { return R.raw.bus; - } else if (recognizedType == AdasRecognizedType.classIdBicycle - || recognizedType == AdasRecognizedType.classIdMoto) { + } else if (recognizedType == AdasRecognizedType.classIdMoto) { return R.raw.motorbike; } else if (recognizedType == AdasRecognizedType.classIdStopLine) { return R.raw.stopline; } else if (recognizedType == AdasRecognizedType.classIdWarningArrows) { return R.raw.arraw; - } else if (recognizedType == AdasRecognizedType.classIdUnKnow) { //todo unKnow物体3D模型 - return R.raw.othercar; + } else if (recognizedType == AdasRecognizedType.classIdUnKnow) { + return R.raw.tache; + } else if (recognizedType == AdasRecognizedType.classIdBicycle) { + return R.raw.zixingche; + } else if (recognizedType == AdasRecognizedType.classIdTrafficTruck) { + // TODO 这里临时替换模型解决穿模现象 + return R.raw.daba; } return R.raw.people; } /** - * 根据速度、经纬度计算距离判断车辆颜色 + * 根据数据源判断车辆预警颜色 * - * @param speed 车速 TODO 这里很可能是adas的策略 - * @param lon 经度 - * @param lat 纬度 + * @param type 车辆类型 + * @param fromType 数据来源 + * @param drawLevel 危险等级 * @return 实际车辆颜色 */ - protected String getModelRenderColor(int type, double speed, double lon, double lat, double angle) { - + protected String getModelRenderColor(int type, int fromType, int drawLevel) { AdasRecognizedType recognizedType = AdasRecognizedType.valueFrom(type); - if (recognizedType == AdasRecognizedType.classIdTrafficBus) { - return "#D8D8D8FF"; + if (recognizedType == AdasRecognizedType.classIdUnKnow) { + return Car3DModelColor.Normal.color; } - if (recognizedType == AdasRecognizedType.classIdUnKnow){ //todo unKnow颜色绘制 - return "#FF2894FF"; - } - // 距离策略 - double[] coordinates = getCurCoordinates(); - double distance = CoordinateUtils.calculateLineDistance(lon, lat, coordinates[0], coordinates[1]) * 100; - if (distance < 50) { - return Car3DModelColor.Dangerous.color; - } else if (distance < 100 && distance >= 50) { - return Car3DModelColor.Warming.color; - } - -// 他车车速和自车车速对比速度策略 -// 自车速度 >= 50% 危险 -// 10% < 自车速度 < 50% 警告 - double curSpeed = getCurSpeed(); - if (curSpeed > 0 && speed > curSpeed) { - double rate = ((speed - curSpeed) / curSpeed) * 100; - if (rate >= 50) { - return Car3DModelColor.Dangerous.color; - } else if (rate > 10 && rate < 50) { - return Car3DModelColor.Warming.color; + if (fromType == FROM_ADAS) { + switch (drawLevel) { + case 1: + return Car3DModelColor.Normal.color; + case 2: + return Car3DModelColor.Warming.color; + case 3: + return Car3DModelColor.Dangerous.color; + default: + return Car3DModelColor.Error.color; } } - - // 默认颜色 return Car3DModelColor.Normal.color; } @@ -286,10 +261,10 @@ class BaseDrawer { * * @return isCurSpeed */ - private double getCurSpeed() { + protected double getCurSpeed() { double speed = MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastSpeed(); if (speed <= 0) { - speed = SnapshotLocationController.getInstance().getCurSpeed(); + speed = SnapshotLocationDataCenter.getInstance().getCurSpeed(); } return speed; } @@ -297,20 +272,32 @@ class BaseDrawer { /** * 返回当前自车经纬度 * - * @return + * @return 0:lon 1:lat */ - private double[] getCurCoordinates() { + protected double[] getCurCoordinates() { double[] coordinates = { MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLon(), MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLat(), }; if (coordinates[0] <= 0) { - coordinates[0] = SnapshotLocationController.getInstance().getCurLon(); - coordinates[1] = SnapshotLocationController.getInstance().getCurLat(); + coordinates[0] = SnapshotLocationDataCenter.getInstance().getCurLon(); + coordinates[1] = SnapshotLocationDataCenter.getInstance().getCurLat(); } return coordinates; } + /** + * 返回当前自车SNTP时间 + * + * @return SNTP时间 + */ + protected long getCurSatelliteTime() { + String satelliteTime = MogoApisHandler.getInstance().getApis().getAdasControllerApi().getSatelliteTime(); + if (TextUtils.isEmpty(satelliteTime)) { + return System.currentTimeMillis(); + } + return Long.parseLong(satelliteTime); + } /** * 模型颜色 @@ -319,26 +306,26 @@ class BaseDrawer { Normal("#D8D8D8FF"), Warming("#FFD53EFF"), - Dangerous("#FF3C45FF"); + Dangerous("#FF3C45FF"), + Error("#00000000"); private final String color; Car3DModelColor(String color) { this.color = color; } - } - private TextView mSpeedView = null; + } /** * 展示车辆速度 * - * @param context 上下文 * @param mogoMarker {@link IMogoMarker} * @param speed 是否显示速度 * @param isVrMode 是否是vrMode */ - public void showSelfSpeed(Context context, IMogoMarker mogoMarker, double speed, boolean isVrMode) { + public static void showSelfSpeed(IMogoMarker mogoMarker, double speed, String uuid, int type, double heading, boolean isVrMode) { + Log.d("EmArrow", "showSelf uuid : " + uuid + " speed : " + speed); if (mogoMarker == null || mogoMarker.isDestroyed()) { return; } @@ -347,26 +334,15 @@ class BaseDrawer { return; } int speedIntVal = (int) (speed * 3.6); - if (speedIntVal <= 0) { + if (speedIntVal <= 0) { //速度为0 隐藏InfoWindow mogoMarker.hideInfoWindow(); return; } - String speedVal = speedIntVal + ""; - String infoResName = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().getMarkerInfoResName(speedVal); mogoMarker.setInfoWindowOffset(0, 20); - if (TextUtils.isEmpty(infoResName)) { - if (mSpeedView == null) { - mSpeedView = new TextView(context); - mSpeedView.setTextColor(Color.WHITE); - mSpeedView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); - mSpeedView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - } - mSpeedView.setText(speedVal); - mogoMarker.updateInfoWindowView(mSpeedView); - MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().setMarkerInfoResName(speedVal, mogoMarker.getMarkerInfoResName()); - } else { - mogoMarker.updateInfoWindowView(infoResName); - } +// String text = "speed : " + speedIntVal + "\n" + uuid + "\n" + "type : " + type + "\n" + "heading : " + heading; + String text = uuid + " , " + (int) heading; + mSpeedView.setText(text); + mogoMarker.updateInfoWindowView(mSpeedView); } /** @@ -395,8 +371,8 @@ class BaseDrawer { /** * 缓存绘制 marker 的 id 和 marker 资源缓存的 md5 的关系 * - * @param id - * @param marker + * @param id 缓存资源ID + * @param marker {@link IMogoMarker} */ protected static void cacheMarkerIconResMd5Val(String id, IMogoMarker marker) { if (marker == null || marker.isDestroyed()) { @@ -412,11 +388,11 @@ class BaseDrawer { /** * 道路匹配到车道中心点 * - * @param lon - * @param lat - * @param angle - * @param isRtk - * @return + * @param lon 经度 + * @param lat 纬度 + * @param angle 方向角 + * @param isRtk 是否是RTK + * @return 匹配经纬度值 */ public double[] matchRoad(String id, double lon, double lat, double angle, boolean isRtk) { final long start = System.currentTimeMillis(); @@ -432,25 +408,27 @@ class BaseDrawer { /** * 清理缓存路段数据 * - * @param id + * @param id 缓存数据Key */ public static void clearRoadCacheById(String id) { MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController().clearRoadCacheById(id); } /** - * 使用系统时间或卫星时间计算出动画的运动时间 + * 使用系统时间或卫星时间计算出动画的运动时间,最小值45,防止两个点距离过近设置的最小动画执行时间 * - * @param lastSystemTime - * @param curSystemTime - * @param lastSatelliteTime - * @param curSatelliteTime - * @return + * @param lastSatelliteTime 上一个点SNTP时间,精确值 + * @param curSatelliteTime 当前点SNTP时间,精确值 + * @return 动画运动时间 */ - public long computeAnimDuration(long lastSystemTime, long curSystemTime, long lastSatelliteTime, long curSatelliteTime) { - long systemTimeInterval = curSystemTime - lastSystemTime; - long satelliteTimeInterval = curSatelliteTime - lastSatelliteTime; - long interval = systemTimeInterval < satelliteTimeInterval || satelliteTimeInterval == 0 ? systemTimeInterval : satelliteTimeInterval; + public long computeAnimDuration(long lastSatelliteTime, long curSatelliteTime) { + if (lastSatelliteTime == 0 || curSatelliteTime == 0) { + Log.d("ADAS动画数据", "卫星时间存在错误"); + return 45; + } + long interval = curSatelliteTime - lastSatelliteTime; + Log.d("ADAS动画数据", "lastSatelliteTime : " + lastSatelliteTime + + " ---- curSatelliteTime : " + curSatelliteTime + " ===== 插值 : " + interval); if (interval < 45) { interval = 45; } @@ -460,13 +438,13 @@ class BaseDrawer { /** * 根据位置信息、车头朝向计算道路吸附 * - * @param id - * @param lon - * @param lat - * @param heading - * @param lastLon - * @param lastLat - * @return + * @param id UUID + * @param lon 经度 + * @param lat 纬度 + * @param heading 方向角 + * @param lastLon 上一个点经度 + * @param lastLat 上一个点纬度 + * @return 匹配经纬度 */ protected double[] getMatchLonLat(String id, double lon, double lat, double heading, double lastLon, double lastLat) { double[] matchedPoint = matchRoad(id, lon, @@ -475,7 +453,7 @@ class BaseDrawer { true ); - boolean match = false; + boolean match; if (matchedPoint != null) { // Logger.d( TAG, "matchPoint %s distance = %s",lineCounter, matchedPoint[2] ); match = matchedPoint[2] < 1 && matchedPoint[2] > 0; diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java index 0c3e3f2bb8..9a2c862eb8 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/SnapshotSetDataDrawer.java @@ -1,11 +1,17 @@ package com.mogo.module.common.drawer; -import android.os.Message; +import static com.mogo.module.common.constants.DataTypes.TYPE_MARKER_CLOUD_DATA; + +import android.os.Build; import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; +import com.mogo.cloud.commons.utils.CoordinateUtils; +import com.mogo.cloud.socket.entity.SocketDownData; +import com.mogo.cloud.socket.entity.SocketDownDataHelper; import com.mogo.commons.AbsMogoApplication; import com.mogo.map.MogoLatLng; import com.mogo.map.marker.IMogoMarker; @@ -15,9 +21,8 @@ import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.R; import com.mogo.module.common.api.CallChatApi; import com.mogo.module.common.constants.DataTypes; -import com.mogo.module.common.utils.SimpleHandlerThreadPool; -import com.mogo.realtime.entity.CloudRoadData; -import com.mogo.realtime.entity.MogoSnapshotSetData; +import com.mogo.module.common.utils.Trigonometric; +import com.mogo.service.adas.IMogoADASController; import com.mogo.service.statusmanager.IMogoStatusChangedListener; import com.mogo.service.statusmanager.StatusDescriptor; import com.mogo.utils.ViewUtils; @@ -26,11 +31,11 @@ import com.zhidao.carchattingprovider.ICarsChattingProvider; import com.zhidao.carchattingprovider.MogoDriverInfo; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; /** * @author congtaowang @@ -50,13 +55,13 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic super(); MogoApisHandler.getInstance().getApis() .getStatusManagerApi() - .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, this ); + .registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, this); } public static SnapshotSetDataDrawer getInstance() { - if ( sInstance == null ) { - synchronized ( SnapshotSetDataDrawer.class ) { - if ( sInstance == null ) { + if (sInstance == null) { + synchronized (SnapshotSetDataDrawer.class) { + if (sInstance == null) { sInstance = new SnapshotSetDataDrawer(); } } @@ -68,41 +73,34 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic sInstance = null; } - private Object readResolve() { - // 阻止反序列化,必须实现 Serializable 接口 - return sInstance; - } + /** + * 上一帧数据的缓存 + */ + private static final Map mMarkersCaches = new ConcurrentHashMap<>(); - private final Map< String, CloudRoadData > mLastPositions = new ConcurrentHashMap<>(); - - private boolean mIsVrMode = false; + private final Map mLastPositions = new ConcurrentHashMap<>(); /** * 注册StatusDescriptor.VR_MODE类型,VR_MODE状态改变回调 + * * @param descriptor 状态类型 * @param isTrue true - accOn、adas ui show、voice ui show、push ui show、v2x ui show */ @Override - public void onStatusChanged( StatusDescriptor descriptor, boolean isTrue ) { - Logger.d( TAG, "%s - %s", descriptor, isTrue ); + public void onStatusChanged(StatusDescriptor descriptor, boolean isTrue) { + Logger.d(TAG, "%s - %s", descriptor, isTrue); mChangeCarModeStatus = true; - sendMessage( MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches ); - mMarkersCaches = new HashMap<>(); - if ( mLastPositions != null ) { - mLastPositions.clear(); - } + sendMessage(MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches); + removeUselessMarker(mMarkersCaches); + mLastPositions.clear(); AdasRecognizedResultDrawer.getInstance().notifyVrModeChanged(); //清除ADAS old marker data } - public boolean isVrMode() { - return mIsVrMode; - } - public boolean isChangeCarModeStatus() { return mChangeCarModeStatus; } - public void setChangeCarModeStatus( boolean mChangeCarModeStatus ) { + public void setChangeCarModeStatus(boolean mChangeCarModeStatus) { this.mChangeCarModeStatus = mChangeCarModeStatus; } @@ -112,240 +110,279 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic * @param data 自车周边数据 * @return 清除结果 */ - private boolean clear( MogoSnapshotSetData data ) { - if ( !MogoApisHandler.getInstance().getApis().getStatusManagerApi().isMainPageLaunched() ) { - if ( mMarkersCaches == null ) { + private boolean clear(SocketDownData.LauncherSnapshotProto data) { + if (!MogoApisHandler.getInstance().getApis().getStatusManagerApi().isMainPageLaunched()) { + if (mMarkersCaches == null) { return false; } - if ( mMarkersCaches != null ) { - mMarkersCaches.clear(); - } - if ( mLastPositions != null ) { - mLastPositions.clear(); - } - sendMessage( MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_CLOUD_DATA ); + mMarkersCaches.clear(); + mLastPositions.clear(); + sendMessage(MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_CLOUD_DATA); return true; } - if ( data == null || ( - ( data.getAllList() == null || data.getAllList().isEmpty() ) && - ( data.getNearList() == null || data.getNearList().isEmpty() ) ) ) { - if ( mMarkersCaches != null ) { + if (data == null || ( + (data.getAllListList() == null || data.getAllListList().isEmpty()) && + (data.getNearListList() == null || data.getNearListList().isEmpty()))) { + if (mMarkersCaches != null) { mMarkersCaches.clear(); } - if ( mLastPositions != null ) { - mLastPositions.clear(); - } - sendMessage( MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_CLOUD_DATA ); + mLastPositions.clear(); + sendMessage(MSG_REMOVE_DIRTY_MARKERS, DataTypes.TYPE_MARKER_CLOUD_DATA); return true; } return false; } /** - * mogo 他车、mogo 他车识别的社会车辆、路边单元识别的车辆 + * 绘制来自云端的 mogo 他车、mogo 他车识别的社会车辆、路边单元识别的车辆 * * @param data 自车周边数据 */ - public void renderSnapshotData( MogoSnapshotSetData data ) { - - if ( clear( data ) ) { + public void renderSnapshotData(SocketDownData.LauncherSnapshotProto data) { + final long start = System.nanoTime(); + if (clear(data)) { return; } - List< CloudRoadData > allDatumsList = new ArrayList<>(); - prepareData( data.getAllList(), allDatumsList ); + if (!MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + return; + } - Map< String, IMogoMarker > newMarkersCaches = new HashMap<>( allDatumsList.size() ); - List< CloudRoadData > newDiffSet = new ArrayList<>(); + List allDatumsList = new ArrayList<>(); + prepareData(data.getAllListList(), allDatumsList); - for ( CloudRoadData cloudRoadData : allDatumsList ) { - if ( isUselessValue( cloudRoadData ) ) { + Map newMarkersCaches = new ConcurrentHashMap<>(allDatumsList.size()); + List newDiffSet = new ArrayList<>(); + for (SocketDownData.CloudRoadDataProto cloudRoadData : allDatumsList) { + + if (isUselessValue(cloudRoadData)) { continue; } - String uniqueKey = cloudRoadData.getUniqueKey(); - IMogoMarker marker = mMarkersCaches.remove( uniqueKey ); - if ( marker != null && !marker.isDestroyed() ) { - renderSnapshotOneFrame( marker, uniqueKey, cloudRoadData, newMarkersCaches ); + String uniqueKey = cloudRoadData.getUuid(); + IMogoMarker marker = mMarkersCaches.remove(uniqueKey); + if (marker != null && !marker.isDestroyed()) { + updateCacheMarkerRes(marker, cloudRoadData); + renderSnapshotOneFrame(marker, uniqueKey, cloudRoadData, newMarkersCaches); } else { - newDiffSet.add( cloudRoadData ); + newDiffSet.add(cloudRoadData); } } - - removeUselessMarker(); - - // 能复用的 marker 数量 - int cachedMarkerSize = mMarkersCaches.size(); // 需要新增的 marker 数量 int newDiffSetSize = newDiffSet.size(); - // 能复用的数量 - int size = Math.min(cachedMarkerSize, newDiffSetSize); - // 复用过期 marker - if ( newDiffSetSize > 0 ) { - Iterator< Map.Entry< String, IMogoMarker > > entryIterator = mMarkersCaches.entrySet().iterator(); - for ( int i = 0; i < size; i++ ) { - CloudRoadData cloudRoadData = newDiffSet.get( i ); - String uniqueKey = cloudRoadData.getUniqueKey(); - Map.Entry< String, IMogoMarker > entry = entryIterator.next(); - entryIterator.remove(); - CloudRoadData old = mLastPositions.remove( entry.getKey() ); - IMogoMarker marker = entry.getValue(); - if ( marker == null ) { - continue; - } - - // 更新资源内容 - if ( old == null || old.getType() != cloudRoadData.getType() ) { - String resIdVal; - int resId = getModelRes( cloudRoadData.getType() ); - resIdVal = resId + ""; - String resName = mMarkerCachesResMd5Values.get( resIdVal ); - if ( !TextUtils.isEmpty( resName ) ) { - if ( !TextUtils.equals( resName, marker.getMarkerResName() ) ) { - marker.use3DResource( resName ); - } - } else { - resName = marker.use3DResource( resId ); - mMarkerCachesResMd5Values.put( resIdVal, resName ); - } - } - - renderSnapshotOneFrame( marker, uniqueKey, cloudRoadData, newMarkersCaches ); - } - + if (newDiffSetSize > 0) { // 复用过后还需新增的 marker - - for ( int i = size; i < newDiffSetSize; i++ ) { - CloudRoadData cloudRoadData = newDiffSet.get( i ); - String uniqueKey = cloudRoadData.getUniqueKey(); - IMogoMarker marker = drawSnapshotDataMarker( cloudRoadData ); - if ( marker == null ) { + for (int i = 0; i < newDiffSetSize; i++) { + SocketDownData.CloudRoadDataProto cloudRoadData = newDiffSet.get(i); + String uniqueKey = cloudRoadData.getUuid(); + IMogoMarker marker = drawSnapshotDataMarker(cloudRoadData); + if (marker == null) { continue; } - renderSnapshotOneFrame( marker, uniqueKey, cloudRoadData, newMarkersCaches ); + renderSnapshotOneFrame(marker, uniqueKey, cloudRoadData, newMarkersCaches); } } - if ( cachedMarkerSize - size > 0 ) { - sendMessage( MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches ); + mMarkersCaches.putAll(newMarkersCaches); + // 移除超时 marker + delayRemoveUselessMarker(); + removeUselessLastRecord(); + Log.d("云端数据延时绘制", "render 接收数据 -> 处理结束 " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start)) + "ms"); + } + + /** + * todo 后面涉及到此类变化的数据均改动 + * + * @param marker {@link IMogoMarker} + * @param cloudRoadDataProto {@link SocketDownData.CloudRoadDataProto} + */ + private void updateCacheMarkerRes(IMogoMarker marker, SocketDownData.CloudRoadDataProto cloudRoadDataProto) { + String resIdVal; + int resId = getModelRes(cloudRoadDataProto.getType()); + resIdVal = resId + ""; + String resName = mMarkerCachesResMd5Values.get(resIdVal); + if (!TextUtils.isEmpty(resName)) { + if (!TextUtils.equals(resName, marker.getMarkerResName())) { + marker.use3DResource(resName); + } + } else { + resName = marker.use3DResource(resId); + mMarkerCachesResMd5Values.put(resIdVal, resName); } + } - sendMessage( MSG_REMOVE_DIRTY_MARKERS, mMarkersCaches ); - mMarkersCaches = newMarkersCaches; + private void delayRemoveUselessMarker() { + if (mMarkersCaches.isEmpty()) { + return; + } + IMogoADASController adasControllerApi = MogoApisHandler.getInstance().getApis().getAdasControllerApi(); + if (TextUtils.isEmpty(adasControllerApi.getSatelliteTime())) { + return; + } + Iterator iterator = mMarkersCaches.values().iterator(); + while (iterator.hasNext()) { + IMogoMarker result = iterator.next(); + SocketDownData.CloudRoadDataProto proto = ((SocketDownData.CloudRoadDataProto) result.getObject()); + if(proto == null){ // 后续有业务数据在操作,更新数据,不做处理 + continue; + } + long internal = Long.parseLong(adasControllerApi.getSatelliteTime()) - proto.getSatelliteTime(); + Log.d("MogoArrow", "delayRemoveUselessMarker uuid : " + proto.getUuid() + + " localTime : " + adasControllerApi.getSatelliteTime() + + " originTime : " + proto.getSatelliteTime() + + " internal : " + internal); + if (internal > 5000) { + iterator.remove(); + result.destroy(); + } + } + } + private void removeUselessLastRecord() { // todo 最好重新设计一个数据结构,用于多线程数据过期失效的场景,参见redis数据过期 + if (mLastPositions.isEmpty()) { + return; + } + IMogoADASController adasControllerApi = MogoApisHandler.getInstance().getApis().getAdasControllerApi(); + if (TextUtils.isEmpty(adasControllerApi.getSatelliteTime()) || adasControllerApi.getSatelliteTime().equals("0")) { + return; + } + Iterator iterator = mLastPositions.values().iterator(); + Log.d("EmArrow", "removeUselessLastRecord size : " + mLastPositions.size()); + while (iterator.hasNext()) { + SocketDownData.CloudRoadDataProto result = iterator.next(); + long internal = Long.parseLong(adasControllerApi.getSatelliteTime()) - result.getSatelliteTime(); + if (internal > 3000) { + iterator.remove(); + } + } } /** * 判断类型、uuid 等 * - * @param cloudRoadData {@link CloudRoadData} + * @param cloudRoadData {@link SocketDownData.CloudRoadDataProto} * @return isUselessValue */ - private boolean isUselessValue( CloudRoadData cloudRoadData ) { - if ( cloudRoadData == null ) { + private boolean isUselessValue(SocketDownData.CloudRoadDataProto cloudRoadData) { + if (cloudRoadData == null) { return true; } - if ( !isRenderType( cloudRoadData.getType() ) ) { + if (nonRenderType(cloudRoadData.getType())) { return true; } - String uniqueKey = cloudRoadData.getUniqueKey(); + String uniqueKey = cloudRoadData.getUuid(); return TextUtils.isEmpty(uniqueKey); } /** * 绘制某个物体的一个数据 * - * @param cloudRoadData {@link CloudRoadData} + * @param cloudRoadData {@link SocketDownData.CloudRoadDataProto} * @param newSnapshotCaches 缓存数据 */ - private void renderSnapshotOneFrame( IMogoMarker marker, String uniqueKey, final CloudRoadData cloudRoadData, Map< String, IMogoMarker > newSnapshotCaches ) { + private void renderSnapshotOneFrame(IMogoMarker marker, String uniqueKey, SocketDownData.CloudRoadDataProto cloudRoadData, Map newSnapshotCaches) { + final long start = System.nanoTime(); + SocketDownData.CloudRoadDataProto lastPosition = mLastPositions.remove(uniqueKey); + // 道路吸附 +// double lastLon = -1; +// double lastLat = -1; +// if (lastPosition != null) { +// lastLon = lastPosition.getWgslon(); +// lastLat = lastPosition.getWgslat(); +// } +// double[] matchLonLat = getMatchLonLat(cloudRoadData.getUuid(), cloudRoadData.getWgslon(), cloudRoadData.getWgslat(), cloudRoadData.getHeading(), lastLon, lastLat); +// SocketDownData.CloudRoadDataProto.Builder builder = cloudRoadData.toBuilder(); +// builder.setWgslon(matchLonLat[0]); +// builder.setWgslat(matchLonLat[1]); +// cloudRoadData = builder.build(); - final long start = System.currentTimeMillis(); - - CloudRoadData lastPosition = mLastPositions.remove( uniqueKey ); - - double lastLon = -1; - double lastLat = -1; - if ( lastPosition != null ) { - lastLon = lastPosition.getWgslon(); - lastLat = lastPosition.getWgslat(); - } - double[] matchLonLat = getMatchLonLat( cloudRoadData.getUniqueKey(), cloudRoadData.getWgslon(), cloudRoadData.getWgslat(), cloudRoadData.getHeading(), lastLon, lastLat ); - cloudRoadData.setWgslon( matchLonLat[0] ); - cloudRoadData.setWgslat( matchLonLat[1] ); - - mLastPositions.put( uniqueKey, cloudRoadData ); - - newSnapshotCaches.put( uniqueKey, marker ); - if ( lastPosition != null ) { - long interval = computeAnimDuration( lastPosition.getSystemTime(), cloudRoadData.getSystemTime(), lastPosition.getSatelliteTime(), cloudRoadData.getSatelliteTime() ); - - final MogoLatLng point = new MogoLatLng( cloudRoadData.getWgslat(), cloudRoadData.getWgslon() ); - long cost = System.currentTimeMillis() - start; - final long intervalRef = interval - cost; - - SimpleHandlerThreadPool.getInstance().postRender( () -> marker.addDynamicAnchorPosition( point, ( float ) cloudRoadData.getHeading(), intervalRef )); - } else { - marker.setRotateAngle( ( ( float ) cloudRoadData.getHeading() ) ); - marker.setPosition( cloudRoadData.getWgslat(), cloudRoadData.getWgslon() ); - } - - marker.setAnchorColor( getModelRenderColor( cloudRoadData.getType(), cloudRoadData.getSpeed(), cloudRoadData.getWgslon(), cloudRoadData.getWgslat(), cloudRoadData.getHeading() ) ); - - if ( shouldShowSpeed( cloudRoadData.getType() ) ) { - Message msg = mRenderThreadHandler.obtainMessage(); - SpeedData obj = new SpeedData(); - obj.context = mContext; - obj.marker = marker; - obj.speed = cloudRoadData.getSpeed(); - msg.obj = obj; - msg.what = MSG_DISPLAY_SPEED; - msg.sendToTarget(); + mLastPositions.put(uniqueKey, cloudRoadData); + long interval = 45; + if (lastPosition != null) { + interval = computeAnimDuration(lastPosition.getSatelliteTime(), cloudRoadData.getSatelliteTime()); } + final MogoLatLng point = new MogoLatLng(cloudRoadData.getWgslat(), cloudRoadData.getWgslon()); + long cost = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start); + final long intervalRef = interval - cost; + marker.addDynamicAnchorPosition(point, (float) cloudRoadData.getHeading(), intervalRef); + marker.setAnchorColor(getModelRenderColor(cloudRoadData.getType(), cloudRoadData.getFromType(), 1)); + newSnapshotCaches.put(uniqueKey, marker); +// if (shouldShowSpeed(cloudRoadData.getType())) { +// Message msg = mRenderThreadHandler.obtainMessage(); +// msg.obj = new SpeedData(marker +// , cloudRoadData.getSpeed() +// , cloudRoadData.getUuid() +// , cloudRoadData.getType() +// , cloudRoadData.getHeading() +// , MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()); +// msg.what = MSG_DISPLAY_SPEED; +// msg.sendToTarget(); +// } + Log.d("云端数据延时", "render 刷新一台车 cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); } /** - * 过滤数据 + * 过滤数据,对数据补点 * * @param in 输入集合 * @param out 输出集合 */ - private void prepareData( List< CloudRoadData > in, List< CloudRoadData > out ) { - filterData( in ); - out.addAll( in ); + private void prepareData(List in, List out) { +// foreCastPoint(in, out); + out.addAll(in); } + private final static String FORECAST = "snapshotForecast"; + /** - * vr 模式下显示合并数据,否则只显示 mogo 车辆上报的数据 + * 基于云平台下发的数据点速度预测当前位置和距离自车距离 * - * @param data 道路数据集合 + * @param in 数据源 */ - private void filterData( List< CloudRoadData > data ) { - if ( data == null || data.isEmpty() ) { - return; - } - if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { - return; - } - List< CloudRoadData > newList = new ArrayList<>(); - for ( CloudRoadData cloudRoadData : data ) { - if ( cloudRoadData.getFromType() != CloudRoadData.FROM_MY_LOCATION ) { - continue; + private void foreCastPoint(List in, List out) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + for (SocketDownData.CloudRoadDataProto proto : in) { + SocketDownData.CloudRoadDataProto.Builder builder = proto.toBuilder(); + Log.d(FORECAST, "ready to foreCast current uuid : " + proto.getUuid()); + long internal = getCurSatelliteTime() - builder.getSatelliteTime(); + if (internal <= 0) { + Log.d(FORECAST, "time internal less than 0 , uuid : " + proto.getUuid()); + out.add(proto); + continue; + } + long startTime = System.currentTimeMillis(); + // 预测点 + Log.d(FORECAST, "time internal : " + internal + " speed : " + proto.getSpeed()); + double foreCastDistance = proto.getSpeed() * internal / 1000; + Log.d(FORECAST, "foreCastDistance : " + foreCastDistance); + MogoLatLng mogoLatLng = new MogoLatLng(proto.getWgslat(), proto.getWgslon()); + MogoLatLng foreCastMogoLatLon = Trigonometric.getNewLocation(mogoLatLng, foreCastDistance, proto.getHeading()); + + // 计算与自车距离 + float distanceFromSelf = CoordinateUtils.calculateLineDistance(getCurCoordinates()[0], getCurCoordinates()[1] + , foreCastMogoLatLon.getLon(), foreCastMogoLatLon.getLat()); + + long foreCastInternal = System.currentTimeMillis() - startTime; + Log.d(FORECAST, "foreCastInternal :" + foreCastInternal); //todo 耗时1~2毫秒 需要测试是否由于补点算法造成 + + builder.setWgslat(foreCastMogoLatLon.getLat()); + builder.setWgslon(foreCastMogoLatLon.getLon()); + builder.setSatelliteTime(getCurSatelliteTime() - foreCastInternal); + builder.setDistance(distanceFromSelf); + proto = builder.build(); + out.add(proto); } - newList.add( cloudRoadData ); } - data.clear(); - data.addAll( newList ); } /** * 绑定点击事件 */ - public void bindClickListener( IMogoMarker marker ) { - if ( marker == null || marker.isDestroyed() ) { + public void bindClickListener(IMogoMarker marker) { + if (marker == null || marker.isDestroyed()) { return; } - marker.setOnMarkerClickListener( this ); + marker.setOnMarkerClickListener(this); } /** @@ -354,45 +391,46 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic * @param data 道路数据 * @return {@link IMogoMarker} */ - public IMogoMarker drawSnapshotDataMarker( CloudRoadData data ) { - if ( data == null ) { + public IMogoMarker drawSnapshotDataMarker(SocketDownData.CloudRoadDataProto data) { + long start = System.nanoTime(); + if (data == null) { return null; } MogoMarkerOptions options = new MogoMarkerOptions() - .owner( DataTypes.TYPE_MARKER_CLOUD_DATA ) - .anchor( 0.5f, 0.5f ) - .rotate( ( float ) data.getHeading() ) - .object( data ) - .gps( true ) - .controlAngle( true ) - .position( new MogoLatLng( data.getWgslat(), data.getWgslon() ) ); + .owner(TYPE_MARKER_CLOUD_DATA) + .anchor(0.5f, 0.5f) + .rotate((float) data.getHeading()) + .object(data) + .gps(true) + .controlAngle(true) + .position(new MogoLatLng(data.getWgslat(), data.getWgslon())); String resIdVal; - if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { - options.set3DMode( true ); - options.anchorColor( getModelRenderColor( data.getType(), data.getSpeed(), data.getWgslon(), data.getWgslat(), data.getHeading() ) ); - int resId = getModelRes( data.getType() ); + if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + options.set3DMode(true); + options.anchorColor(getModelRenderColor(data.getType(), data.getFromType(), 1)); + int resId = getModelRes(data.getType()); resIdVal = resId + ""; - options.resName( mMarkerCachesResMd5Values.get( resIdVal ) ); - options.icon3DRes( resId ); + options.resName(mMarkerCachesResMd5Values.get(resIdVal)); + options.icon3DRes(resId); } else { - options.set3DMode( false ); - View view = inflateView( data ); - options.icon( view ); + options.set3DMode(false); + View view = inflateView(data); + options.icon(view); resIdVal = view.getId() + ""; } - IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager( mContext ).addMarker( DataTypes.TYPE_MARKER_CLOUD_DATA, options ); - cacheMarkerIconResMd5Val( resIdVal, marker ); + IMogoMarker marker = MogoApisHandler.getInstance().getApis().getMapServiceApi().getMarkerManager(mContext).addMarker(TYPE_MARKER_CLOUD_DATA, options); + cacheMarkerIconResMd5Val(resIdVal, marker); - if ( !TextUtils.isEmpty( data.getSn() ) ) { - bindClickListener( marker ); + if (!TextUtils.isEmpty(data.getSn())) { + bindClickListener(marker); } - + Log.d("云端数据延时", "创建一个新 marker cost : " + TimeUnit.NANOSECONDS.toMillis((System.nanoTime() - start))); return marker; } - public String get3DCacheId( String resIdVal ) { - return mMarkerCachesResMd5Values.get( resIdVal ); + public String get3DCacheId(String resIdVal) { + return mMarkerCachesResMd5Values.get(resIdVal); } /** @@ -401,12 +439,12 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic * @param data 道路数据 * @return marker */ - public View inflateView( CloudRoadData data ) { - View rootView = LayoutInflater.from( AbsMogoApplication.getApp() ).inflate( R.layout.module_commons_layout_car, null ); - ImageView iv = rootView.findViewById( R.id.module_commons_marker_car_model ); - int viewIdLike = get2DModel( data ); - iv.setImageResource( viewIdLike ); - rootView.setId( viewIdLike ); + public View inflateView(SocketDownData.CloudRoadDataProto data) { + View rootView = LayoutInflater.from(AbsMogoApplication.getApp()).inflate(R.layout.module_commons_layout_car, null); + ImageView iv = rootView.findViewById(R.id.module_commons_marker_car_model); + int viewIdLike = get2DModel(data); + iv.setImageResource(viewIdLike); + rootView.setId(viewIdLike); return rootView; } @@ -416,71 +454,71 @@ public class SnapshotSetDataDrawer extends BaseDrawer implements IMogoMarkerClic * @param data 道路数据 * @return 2D贴图id */ - private int get2DModel( CloudRoadData data ) { - switch ( data.getFromType() ) { - case CloudRoadData.FROM_ADAS: - case CloudRoadData.FROM_ROAD_UNIT: - case CloudRoadData.FROM_MY_LOCATION: + private int get2DModel(SocketDownData.CloudRoadDataProto data) { + switch (data.getFromType()) { + case SocketDownDataHelper.FROM_ADAS: + case SocketDownDataHelper.FROM_ROAD_UNIT: + case SocketDownDataHelper.FROM_MY_LOCATION: default: return R.drawable.icon_map_marker_car_gray; } } @Override - public boolean onMarkerClicked( IMogoMarker marker ) { - if ( marker != null && !marker.isDestroyed() ) { - if ( marker.getObject() instanceof CloudRoadData ) { - showCarCallPanel( ( ( CloudRoadData ) marker.getObject() ) ); + public boolean onMarkerClicked(IMogoMarker marker) { + if (marker != null && !marker.isDestroyed()) { + if (marker.getObject() instanceof SocketDownData.CloudRoadDataProto) { + showCarCallPanel(((SocketDownData.CloudRoadDataProto) marker.getObject())); } } return true; } /** - * 展示用户信息米娜版 + * 展示用户信息面版 * * @param data 道路数据 */ - private void showCarCallPanel( CloudRoadData data ) { + private void showCarCallPanel(SocketDownData.CloudRoadDataProto data) { MogoDriverInfo driverInfo = new MogoDriverInfo(); - driverInfo.setLat( data.getLat() ); - driverInfo.setLon( data.getLon() ); - driverInfo.setSn( data.getSn() ); + driverInfo.setLat(data.getLat()); + driverInfo.setLon(data.getLon()); + driverInfo.setSn(data.getSn()); ICarsChattingProvider carChatting = CallChatApi.getInstance().getApiProvider(); - if ( carChatting != null ) { + if (carChatting != null) { try { - carChatting.showUserWindow( TAG, driverInfo, mContext ); - } catch ( Exception e ) { - Logger.e( TAG, e, "showCarCallPanel" ); + carChatting.showUserWindow(TAG, driverInfo, mContext); + } catch (Exception e) { + Logger.e(TAG, e, "showCarCallPanel"); } } } - public void changeIconResourceIfNecessary( CloudRoadData cloudRoadData, IMogoMarker marker ) { - if ( isChangeCarModeStatus() ) { - setChangeCarModeStatus( false ); - if ( MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode() ) { - marker.getMogoMarkerOptions().set3DMode( true ); - int resId = getModelRes( cloudRoadData.getType() ); - String resName = get3DCacheId( resId + "" ); - if ( TextUtils.isEmpty( resName ) ) { - marker.use3DResource( resId ); - cacheMarkerIconResMd5Val( resId + "", marker ); + public void changeIconResourceIfNecessary(SocketDownData.CloudRoadDataProto cloudRoadData, IMogoMarker marker) { + if (isChangeCarModeStatus()) { + setChangeCarModeStatus(false); + if (MogoApisHandler.getInstance().getApis().getStatusManagerApi().isVrMode()) { + marker.getMogoMarkerOptions().set3DMode(true); + int resId = getModelRes(cloudRoadData.getType()); + String resName = get3DCacheId(resId + ""); + if (TextUtils.isEmpty(resName)) { + marker.use3DResource(resId); + cacheMarkerIconResMd5Val(resId + "", marker); } else { - marker.use3DResource( resName ); + marker.use3DResource(resName); } } else { - marker.getMogoMarkerOptions().set3DMode( false ); - View view = inflateView( cloudRoadData ); + marker.getMogoMarkerOptions().set3DMode(false); + View view = inflateView(cloudRoadData); int resId = view.getId(); - String resName = get3DCacheId( resId + "" ); - if ( TextUtils.isEmpty( resName ) ) { - marker.setIcon( ViewUtils.fromView( view ) ); - cacheMarkerIconResMd5Val( resId + "", marker ); + String resName = get3DCacheId(resId + ""); + if (TextUtils.isEmpty(resName)) { + marker.setIcon(ViewUtils.fromView(view)); + cacheMarkerIconResMd5Val(resId + "", marker); } else { - marker.use2DResource( resName ); + marker.use2DResource(resName); } } } diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/bean/SpeedData.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/bean/SpeedData.java new file mode 100644 index 0000000000..71d1cdfa10 --- /dev/null +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/drawer/bean/SpeedData.java @@ -0,0 +1,73 @@ +package com.mogo.module.common.drawer.bean; + +import com.mogo.map.marker.IMogoMarker; + +/** + * 速度显示对象 + */ +public class SpeedData { + + public IMogoMarker marker; + public double speed; + public String uuid; + public int type; + public double heading; + public boolean isVrMode; + + public SpeedData(IMogoMarker marker, double speed, String uuid, int type, double heading, boolean isVrMode) { + this.marker = marker; + this.speed = speed; + this.uuid = uuid; + this.type = type; + this.heading = heading; + this.isVrMode = isVrMode; + } + + public IMogoMarker getMarker() { + return marker; + } + + public void setMarker(IMogoMarker marker) { + this.marker = marker; + } + + public double getSpeed() { + return speed; + } + + public void setSpeed(double speed) { + this.speed = speed; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public double getHeading() { + return heading; + } + + public void setHeading(double heading) { + this.heading = heading; + } + + public boolean getIsVrMode() { + return isVrMode; + } + + public void setIsVrMode(boolean isVrMode) { + this.isVrMode = isVrMode; + } +} diff --git a/modules/mogo-module-common/src/main/res/raw/daba.n3d b/modules/mogo-module-common/src/main/res/raw/daba.n3d new file mode 100644 index 0000000000..58dc21fbc1 Binary files /dev/null and b/modules/mogo-module-common/src/main/res/raw/daba.n3d differ diff --git a/modules/mogo-module-common/src/main/res/raw/tache.n3d b/modules/mogo-module-common/src/main/res/raw/tache.n3d new file mode 100644 index 0000000000..166f262aa6 Binary files /dev/null and b/modules/mogo-module-common/src/main/res/raw/tache.n3d differ diff --git a/modules/mogo-module-common/src/main/res/raw/tachexiaoche.n3d b/modules/mogo-module-common/src/main/res/raw/tachexiaoche.n3d new file mode 100644 index 0000000000..69b521719f Binary files /dev/null and b/modules/mogo-module-common/src/main/res/raw/tachexiaoche.n3d differ diff --git a/modules/mogo-module-common/src/main/res/raw/zixingche.n3d b/modules/mogo-module-common/src/main/res/raw/zixingche.n3d new file mode 100644 index 0000000000..afee072bf7 Binary files /dev/null and b/modules/mogo-module-common/src/main/res/raw/zixingche.n3d differ diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java index 4cad2a8c34..e94b33701c 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/CameraLiveManager.java @@ -6,18 +6,18 @@ import android.view.ViewGroup; import androidx.annotation.Nullable; +import com.mogo.cloud.socket.entity.SocketDownData; import com.mogo.commons.AbsMogoApplication; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.extensions.R; import com.mogo.module.extensions.live.impl.AbsCameraScenario; -import com.mogo.realtime.entity.CloudRoadData; import com.mogo.service.windowview.IMogoTopViewStatusListener; import com.mogo.utils.logger.Logger; /** * 路边摄像头直播控制 V2XPushLiveCarScenario */ -public class CameraLiveManager extends AbsCameraScenario implements IMogoTopViewStatusListener { +public class CameraLiveManager extends AbsCameraScenario implements IMogoTopViewStatusListener { private static final String TAG = "CameraLiveManager"; private static CameraLiveManager mCameraLiveManager; private boolean isShowWindow; @@ -38,7 +38,7 @@ public class CameraLiveManager extends AbsCameraScenario implemen } @Override - public void init(@Nullable CloudRoadData cloudRoadData) { + public void init(@Nullable SocketDownData.CloudRoadDataProto cloudRoadData) { Log.d(TAG, "CameraLiveManager init -----> isShowWindow = " + isShowWindow); if (isShowWindow) { close(); diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java index d443489e32..d6f8778ba3 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/PushCameraLiveWindow.java @@ -9,10 +9,10 @@ import android.view.View; import android.widget.ImageView; import android.widget.RelativeLayout; +import com.mogo.cloud.socket.entity.SocketDownData; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.extensions.R; import com.mogo.module.extensions.live.impl.ICameraWindow; -import com.mogo.realtime.entity.CloudRoadData; import com.mogo.service.imageloader.MogoImageView; import com.mogo.utils.logger.Logger; @@ -21,7 +21,7 @@ import com.mogo.utils.logger.Logger; * 点击摄像头 marker * vr路边摄像头弹窗 V2XPushLiveCarWindow */ -public class PushCameraLiveWindow extends RelativeLayout implements ICameraWindow { +public class PushCameraLiveWindow extends RelativeLayout implements ICameraWindow { private static final String TAG = "PushCameraLiveWindow"; private CameraLiveGSYVideoView mLiveGSYVideoView; private MogoImageView mIvReportHead; @@ -65,7 +65,7 @@ public class PushCameraLiveWindow extends RelativeLayout implements ICameraWindo * 展示直播Windows */ @Override - public void show(CloudRoadData entity) { + public void show(SocketDownData.CloudRoadDataProto entity) { if (entity != null) { Logger.w(TAG, "更新直播信息 show entity = " + entity); if (!TextUtils.isEmpty(entity.getRtmpUrl())) { @@ -76,7 +76,7 @@ public class PushCameraLiveWindow extends RelativeLayout implements ICameraWindo mLiveGSYVideoView.startLive(entity.getRtmpUrl()); } - countDownV2XEvent(entity); + countDownV2XEvent(); } } @@ -99,7 +99,7 @@ public class PushCameraLiveWindow extends RelativeLayout implements ICameraWindo /** * 窗体倒计时 */ - public void countDownV2XEvent(CloudRoadData data) { + public void countDownV2XEvent() { // 倒计时 if (runnableV2XEvent == null) { runnableV2XEvent = () -> { diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java index 4fb82a7310..7be9d9f0be 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/live/impl/AbsCameraScenario.java @@ -2,15 +2,15 @@ package com.mogo.module.extensions.live.impl; import androidx.annotation.Nullable; -import com.mogo.realtime.entity.CloudRoadData; +import com.mogo.cloud.socket.entity.SocketDownData; public abstract class AbsCameraScenario implements ICameraScenario { protected String TAG = "AbsCameraScenario"; private ICameraWindow mV2XWindow; - private CloudRoadData mCloudRoadData; + private SocketDownData.CloudRoadDataProto mCloudRoadData; - public abstract void init(@Nullable CloudRoadData cloudRoadData); + public abstract void init(@Nullable SocketDownData.CloudRoadDataProto cloudRoadData); @Override public void close() { @@ -27,11 +27,11 @@ public abstract class AbsCameraScenario implements ICameraScenario { this.mV2XWindow = mV2XWindow; } - public CloudRoadData getmCloudRoadData() { + public SocketDownData.CloudRoadDataProto getmCloudRoadData() { return mCloudRoadData; } - public void setmCloudRoadData(CloudRoadData mCloudRoadData) { + public void setmCloudRoadData(SocketDownData.CloudRoadDataProto mCloudRoadData) { this.mCloudRoadData = mCloudRoadData; } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java index 77b70f302c..14b310a9a4 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/AdasNoticeHelper.java @@ -7,12 +7,11 @@ import android.content.IntentFilter; import android.os.Handler; import android.os.Message; +import com.mogo.cloud.socket.entity.SocketDownData; import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.location.MogoLocation; import com.mogo.module.common.MogoApisHandler; import com.mogo.module.extensions.navi.VrModeNavInfoView; -import com.mogo.realtime.api.MoGoAiCloudRealTime; -import com.mogo.realtime.entity.MogoSnapshotSetData; import com.mogo.realtime.socket.IMogoCloudOnMsgListener; import com.mogo.service.adas.IMogoAdasWarnMessageCallback; import com.mogo.service.adas.MogoADASWarnType; @@ -203,7 +202,8 @@ public class AdasNoticeHelper implements IMogoAdasWarnMessageCallback, IMogoLoca } @Override - public void onMsgReceived(MogoSnapshotSetData obj) { + public void onMsgReceived(SocketDownData.LauncherSnapshotProto mogoSnapshotSetData) { } + } diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java index 08677fa374..240dd6e88d 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/CameraLiveNoticeHelper.java @@ -6,6 +6,7 @@ import android.graphics.BitmapFactory; import android.text.TextUtils; import android.util.Log; +import com.mogo.cloud.socket.entity.SocketDownData; import com.mogo.commons.AbsMogoApplication; import com.mogo.map.marker.IMogoMarker; import com.mogo.map.marker.IMogoMarkerClickListener; @@ -16,8 +17,6 @@ import com.mogo.module.extensions.live.CameraLiveManager; import com.mogo.module.extensions.live.CameraWindow3DAdapter; import com.mogo.module.extensions.live.PushDataType; import com.mogo.realtime.api.MoGoAiCloudRealTime; -import com.mogo.realtime.entity.CloudRoadData; -import com.mogo.realtime.entity.MogoSnapshotSetData; import com.mogo.realtime.socket.IMogoCloudOnMsgListener; import com.mogo.utils.TipToast; import com.mogo.utils.logger.Logger; @@ -30,7 +29,7 @@ public class CameraLiveNoticeHelper implements IMogoCloudOnMsgListener { private static final String TAG = "CameraLiveNoticeHelper"; private Context mContext; private static IMogoMarker mMogoMarker; - private CloudRoadData mCloudRoadData; + private SocketDownData.CloudRoadDataProto mCloudRoadData; private volatile boolean isVrMode; private volatile boolean isVrModeMarker; private volatile String mCurrentUuid; @@ -81,7 +80,7 @@ public class CameraLiveNoticeHelper implements IMogoCloudOnMsgListener { * * @param roadData 道路数据 */ - private void addVrCameraMarker(CloudRoadData roadData) { + private void addVrCameraMarker(SocketDownData.CloudRoadDataProto roadData) { Log.e(TAG, "addVrCameraMarker --lat = " + roadData.getLat() + "--lon =" + roadData.getLon() + "--uuid = " + roadData.getUuid() + "---rtmpUrl =" + roadData.getRtmpUrl()); if (!TextUtils.isEmpty(roadData.getRtmpUrl())) { removeCameraMarker(); @@ -108,7 +107,7 @@ public class CameraLiveNoticeHelper implements IMogoCloudOnMsgListener { * * @param roadData 道路数据 */ - private void addNormalCameraMarker(CloudRoadData roadData) { + private void addNormalCameraMarker(SocketDownData.CloudRoadDataProto roadData) { Log.e(TAG, "addNormalCameraMarker --lat = " + roadData.getLat() + " --lon =" + roadData.getLon() + "--uuid = " + roadData.getUuid() + "---rtmpUrl =" + roadData.getRtmpUrl()); if (!TextUtils.isEmpty(roadData.getRtmpUrl())) { removeCameraMarker(); @@ -137,7 +136,7 @@ public class CameraLiveNoticeHelper implements IMogoCloudOnMsgListener { } } - private void renderMarker(MogoSnapshotSetData obj) { + private void renderMarker(SocketDownData.LauncherSnapshotProto obj) { if (obj != null) { if (obj.getCamera() != null && !TextUtils.isEmpty(obj.getCamera().getRtmpUrl())) { mCloudRoadData = obj.getCamera(); @@ -189,8 +188,8 @@ public class CameraLiveNoticeHelper implements IMogoCloudOnMsgListener { } @Override - public void onMsgReceived(MogoSnapshotSetData mogoSnapshotSetData) { - //Logger.d(TAG, "onMsgReceived mogoSnapshotSetData : " + mogoSnapshotSetData); + public void onMsgReceived(SocketDownData.LauncherSnapshotProto mogoSnapshotSetData) { renderMarker(mogoSnapshotSetData); } + } diff --git a/modules/mogo-module-service/src/main/AndroidManifest.xml b/modules/mogo-module-service/src/main/AndroidManifest.xml index 5ff3cff7d9..3448c2bb9b 100644 --- a/modules/mogo-module-service/src/main/AndroidManifest.xml +++ b/modules/mogo-module-service/src/main/AndroidManifest.xml @@ -14,5 +14,13 @@ + + + + + + + + diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java index baa8ddec73..8878076d39 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServiceProvider.java @@ -16,6 +16,7 @@ import com.mogo.map.location.IMogoLocationListener; import com.mogo.map.marker.IMogoMarkerClickListener; import com.mogo.map.navi.IMogoNaviListener; import com.mogo.module.common.utils.CarSeries; +import com.mogo.module.service.dispatch.DispatchAutoPilotManager; import com.mogo.module.service.location.MogoRTKLocation; import com.mogo.service.module.IMogoModuleLifecycle; import com.mogo.service.module.IMogoModuleProvider; @@ -101,9 +102,10 @@ public class MogoServiceProvider implements IMogoModuleProvider { MarkerServiceHandler.init( context ); // if ( DebugConfig.isNeedUploadCoordinatesDurationInTime() ) { // } - MogoRTKLocation.getInstance().init(); +// MogoRTKLocation.getInstance().init(); //todo RTK LOCATION Close MogoServices.getInstance().preInit( context ); MogoServices.getInstance().init( AbsMogoApplication.getApp() ); + DispatchAutoPilotManager.getInstance().initSocket(context); UiThreadHandler.postDelayed( () -> { }, 5_000L ); } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java index 49b1f3ffd8..718e5bf453 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/MogoServices.java @@ -34,7 +34,7 @@ import com.mogo.module.common.MogoModulePaths; import com.mogo.module.common.entity.MarkerResponse; import com.mogo.module.common.map.MapCenterPointStrategy; import com.mogo.module.common.map.Scene; -import com.mogo.module.common.uploadintime.SnapshotLocationController; +import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; import com.mogo.module.service.autopilot.AutoPilotRemoteController; import com.mogo.module.service.handler.MainLooperHandler; import com.mogo.module.service.handler.RefreshWorkThreadHandler; @@ -47,6 +47,7 @@ import com.mogo.module.service.refresh.AutoRefreshStrategy; import com.mogo.module.service.refresh.CustomRefreshStrategy; import com.mogo.module.service.refresh.RefreshObject; import com.mogo.module.service.strategy.CarIconDisplayStrategy; +import com.mogo.module.service.timedelay.TimeDelayUploadManager; import com.mogo.module.service.ttsConfig.TtsConfigModleData; import com.mogo.realtime.api.MoGoAiCloudRealTime; import com.mogo.service.adas.IMogoADASController; @@ -391,6 +392,7 @@ public class MogoServices implements IMogoMapListener, if ( DebugConfig.isNeedUploadCoordinatesDurationInTime() ) { MoGoAiCloudRealTime.startRealTime( mContext, DebugConfig.getSocketAppId() ); } + TimeDelayUploadManager.getInstance().init(context); } public void initLocationServiceProcess( Context context ) { @@ -960,6 +962,11 @@ public class MogoServices implements IMogoMapListener, @Override public void onAdasCarDataCallback( ADASCarStateInfo stateInfo ) { + + if(TimeDelayUploadManager.getInstance().isMock()){ //模拟数据时,不更新由工控机传输的自车位置 + return; + } + if ( stateInfo != null && stateInfo.getValues() != null ) { JSONObject data = new JSONObject(); try { @@ -991,7 +998,7 @@ public class MogoServices implements IMogoMapListener, e.printStackTrace(); } MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map( data ); - SnapshotLocationController.getInstance().syncAdasLocationInfo( data ); + SnapshotLocationDataCenter.getInstance().syncAdasLocationInfo( data ); } catch ( Exception e ) { e.printStackTrace(); } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchAutoPilotManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchAutoPilotManager.java new file mode 100644 index 0000000000..638996831b --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchAutoPilotManager.java @@ -0,0 +1,178 @@ +package com.mogo.module.service.dispatch; + +import static com.mogo.module.service.dispatch.model.DispatchServiceModel.DISPATCH_RESULT_AFFIRM; + +import android.content.Context; +import android.location.Location; +import android.os.Handler; +import android.os.Message; + +import com.mogo.map.MogoLatLng; +import com.mogo.map.location.MogoLocation; +import com.mogo.map.navi.IMogoCarLocationChangedListener2; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.service.dispatch.bean.AutopilotRoute; +import com.mogo.module.service.dispatch.bean.DispatchAdasAutoPilotLocReceiverBean; +import com.mogo.module.service.dispatch.bean.DispatchData; +import com.mogo.module.service.dispatch.bean.EndLatLon; +import com.mogo.module.service.dispatch.bean.StartLatLon; +import com.mogo.module.service.dispatch.model.DispatchResult; +import com.mogo.module.service.dispatch.model.DispatchServiceModel; +import com.mogo.module.service.dispatch.model.IDispatch; +import com.mogo.service.adas.RemoteControlAutoPilotParameters; +import com.mogo.service.connection.IMogoOnMessageListener; +import com.mogo.utils.logger.Logger; +import com.mogo.utils.network.utils.GsonUtil; + +import java.util.ArrayList; +import java.util.List; + +//todo 后续拆解是否放到网约车模块,画线部分已与产品沟通,放入后续迭代需求 +//负责监听自动驾驶状态并进行状态上报,自动驾驶路线上报,接收调度指令展示指令弹窗 +public class DispatchAutoPilotManager implements IMogoOnMessageListener + , DispatchRemindDialog.IDispatchRemindClickListener + , IMogoCarLocationChangedListener2 { + + private static final String TAG = "DispatchAutoPilotManager"; + private static volatile DispatchAutoPilotManager instance; + private static final byte[] obj = new byte[0]; + private Context mContext; + private static final int MSG_SOCKET_TYPE = 501000; + private static final int MSG_TYPE_SHOW_DIALOG = 0; + + private DispatchRemindDialog dispatchRemindDialog; + private MogoLocation mogoLocation; + private DispatchAdasAutoPilotLocReceiverBean receiverBean; + + private DispatchAutoPilotManager() { + + } + + public static DispatchAutoPilotManager getInstance() { + if (instance == null) { + synchronized (obj) { + if (instance == null) { + instance = new DispatchAutoPilotManager(); + } + } + } + return instance; + } + + private final Handler handler = new Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (msg.what == MSG_TYPE_SHOW_DIALOG) { + DispatchAdasAutoPilotLocReceiverBean msgData = (DispatchAdasAutoPilotLocReceiverBean) msg.obj; + dispatchRemindDialog.showDialog(msgData); + } + } + }; + + public void initSocket(Context context) { + mContext = context; + MogoApisHandler.getInstance() + .getApis() + .getSocketManagerApi(context).registerOnMessageListener(MSG_SOCKET_TYPE, this); + MogoApisHandler.getInstance().getApis().getRegisterCenterApi() + .registerCarLocationChangedListener(TAG, this); + dispatchRemindDialog = new DispatchRemindDialog(context); + dispatchRemindDialog.addIDispatchRemindListener(this); + } + + @Override + public Class target() { + return DispatchAdasAutoPilotLocReceiverBean.class; + } + + @Override + public void onMsgReceived(DispatchAdasAutoPilotLocReceiverBean adasAutoPilotLocReceiverBean) { + if (adasAutoPilotLocReceiverBean != null + && adasAutoPilotLocReceiverBean.getStartLat() != 0.0 + && adasAutoPilotLocReceiverBean.getStartLon() != 0.0) { + this.receiverBean = adasAutoPilotLocReceiverBean; + Message message = new Message(); + message.what = MSG_TYPE_SHOW_DIALOG; + message.obj = adasAutoPilotLocReceiverBean; + handler.sendMessage(message); + } + } + + + @Override + public void affirm() { + DispatchServiceModel.getInstance().dispatchResultUpload(DISPATCH_RESULT_AFFIRM, new IDispatch() { + @Override + public void onSuccess() { + Logger.d(TAG, ""); + RemoteControlAutoPilotParameters currentAutopilot = new RemoteControlAutoPilotParameters(); + currentAutopilot.isSpeakVoice = false; + currentAutopilot.startLatLon = new RemoteControlAutoPilotParameters.AutoPilotLonLat(receiverBean.getStartLat(), receiverBean.getStartLon()); + currentAutopilot.endLatLon = new RemoteControlAutoPilotParameters.AutoPilotLonLat(receiverBean.getEndLat(), receiverBean.getEndLon()); + currentAutopilot.vehicleType = 10; + Logger.d(TAG, "开启自动驾驶====" + currentAutopilot); + MogoApisHandler.getInstance().getApis().getAdasControllerApi().aiCloudToAdasData(currentAutopilot); + } + + @Override + public void onError(String msg) { + + } + }); + } + + @Override + 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()); + mogoLocation = loc; + } + + @Override + public void onCarLocationChanged(MogoLatLng mogoLatLng) { + + } + + public void test() { + Logger.d(TAG, "test to trigger mock autopilot"); + DispatchAdasAutoPilotLocReceiverBean adasAutoPilotLocReceiverBean = new DispatchAdasAutoPilotLocReceiverBean( + "1", 26.825571122, 112.5762410415, "起点---5号跑道", + 26.825571122, 112.5762410415, "终点---鄂州机场", + "" + System.currentTimeMillis(), "AR453航班", "实现调度", System.currentTimeMillis()); + this.receiverBean = adasAutoPilotLocReceiverBean; + dispatchRemindDialog.showDialog(adasAutoPilotLocReceiverBean); + } + + public void testUploadAutopilotRoute() { + List list = new ArrayList<>(); + AutopilotRoute.RouteModels routeModels = new AutopilotRoute.RouteModels(); + routeModels.setLat(12.12); + routeModels.setLon(13.14); + list.add(routeModels); + DispatchServiceModel.getInstance().uploadAutopilotRoute(list); + } + + public void testDispatchResultUpload() { + DispatchServiceModel.getInstance().dispatchResultUpload(DISPATCH_RESULT_AFFIRM, new IDispatch() { + @Override + public void onSuccess() { + + } + + @Override + public void onError(String msg) { + + } + }); + } + +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchRemindDialog.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchRemindDialog.java new file mode 100644 index 0000000000..1633edf47f --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchRemindDialog.java @@ -0,0 +1,70 @@ +package com.mogo.module.service.dispatch; + +import android.content.Context; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.mogo.module.common.dialog.BaseFloatDialog; +import com.mogo.module.service.R; +import com.mogo.module.service.dispatch.bean.DispatchAdasAutoPilotLocReceiverBean; +import com.mogo.utils.logger.Logger; + + +public class DispatchRemindDialog extends BaseFloatDialog { + + private static final String TAG = "DispatchRemindDialog"; + private IDispatchRemindClickListener mListener; + + private final TextView tvStartLoc; + private final TextView tvEndLoc; + private final TextView tvTaskTime; + private final TextView tvFlightInfo; + private final TextView tvTaskContent; + + public DispatchRemindDialog(@NonNull Context context) { + super(context); + setContentView(R.layout.module_dialog_adas_dispatch_remind); + setCanceledOnTouchOutside(false); + tvStartLoc = findViewById(R.id.module_services_dispatch_dialog_start_content); + tvEndLoc = findViewById(R.id.module_services_dispatch_dialog_end_content); + tvTaskTime = findViewById(R.id.module_services_dispatch_dialog_task_time); + tvFlightInfo = findViewById(R.id.module_services_dispatch_dialog_flight_time); + tvTaskContent = findViewById(R.id.module_services_dispatch_dialog_task_content); + Button btnAffirm = (Button) findViewById(R.id.module_services_dispatch_dialog_confirm); + btnAffirm.setOnClickListener(v -> { + if (mListener != null) { + mListener.affirm(); + dismissDialog(); + } + }); + + } + + public void showDialog(DispatchAdasAutoPilotLocReceiverBean dispatchContent) { + show(); + tvStartLoc.setText(dispatchContent.getStartLocAddress()); + tvEndLoc.setText(dispatchContent.getEndLocAddress()); + tvTaskTime.setText(dispatchContent.getTaskTime()); + tvFlightInfo.setText(dispatchContent.getFlightInfo()); + tvTaskContent.setText(dispatchContent.getTaskInfo()); + } + + private void dismissDialog() { + dismiss(); + } + + public void addIDispatchRemindListener(IDispatchRemindClickListener listener) { + if (listener == null) { + Logger.d(TAG, "addIDispatchRemindListener listener is null"); + return; + } + this.mListener = listener; + } + + public interface IDispatchRemindClickListener { + + void affirm(); + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchTestPanelBroadCastReceiver.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchTestPanelBroadCastReceiver.java new file mode 100644 index 0000000000..131c732eb0 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/DispatchTestPanelBroadCastReceiver.java @@ -0,0 +1,49 @@ +package com.mogo.module.service.dispatch; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.mogo.utils.logger.Logger; + +public class DispatchTestPanelBroadCastReceiver extends BroadcastReceiver { + + private static final String TAG = "DispatchTestPanelBroadCastReceiver"; + + /** + * Adas测试控制面板广播Action + */ + public static final String BROADCAST_TEST_PANEL_CONTROL_TYPE_EXTRA_KEY = "sceneType"; + + private Context mContext; + + @Override + public void onReceive(Context context, Intent intent) { + try { + this.mContext = context; + int sceneType = intent.getIntExtra(BROADCAST_TEST_PANEL_CONTROL_TYPE_EXTRA_KEY, 0); + Logger.d(TAG, "textPanelOpenType:" + sceneType); + // 分发场景 + dispatchSceneTest(sceneType); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 分发处理场景 + * + * @param sceneType 场景类型 + */ + private void dispatchSceneTest(int sceneType) { + Logger.d(TAG, "sceneType=" + sceneType); + if (sceneType == 0) {//打开调度弹窗 + DispatchAutoPilotManager.getInstance().test(); + } else if(sceneType == 1){ //验证自动驾驶路线上报接口 + DispatchAutoPilotManager.getInstance().testUploadAutopilotRoute(); + } else if(sceneType == 2){ //验证自动驾驶调度上报接口 + DispatchAutoPilotManager.getInstance().testDispatchResultUpload(); + } + } + +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutonomousDriveStatusBean.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutonomousDriveStatusBean.java new file mode 100644 index 0000000000..bbaa51fc9a --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutonomousDriveStatusBean.java @@ -0,0 +1,41 @@ +package com.mogo.module.service.dispatch.bean; + +/** + * 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; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutopilotRoute.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutopilotRoute.java new file mode 100644 index 0000000000..c4c4012bee --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutopilotRoute.java @@ -0,0 +1,75 @@ +package com.mogo.module.service.dispatch.bean; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +/** + * @author song kenan + * @des + * @date 2021/6/21 + */ + +public class AutopilotRoute { + + @SerializedName("action") + private String action; + @SerializedName("models") + private List models; + + public static class RouteModels { + @SerializedName("lat") + private Double lat; + @SerializedName("lon") + private Double lon; + + 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; + } + + @Override + public String toString() { + return "RouteModels{" + + "lat=" + lat + + ", lon=" + lon + + '}'; + } + + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public List getModels() { + return models; + } + + public void setModels(List models) { + this.models = models; + } + + @Override + public String toString() { + return "AutopilotRoute{" + + "action='" + action + '\'' + + ", models=" + models + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutopilotStatus.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutopilotStatus.java new file mode 100644 index 0000000000..b732a3d8e6 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/AutopilotStatus.java @@ -0,0 +1,108 @@ +package com.mogo.module.service.dispatch.bean; + +import java.io.Serializable; + +/** + * @author nie yunlong + * @des + * @date 2020/7/14 + */ +public class AutopilotStatus implements Serializable { + + /** + * action : autopilotstate + * values : {"state":0,"reason":""} + */ + + private String action; + private ValuesBean values; + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public ValuesBean getValues() { + return values; + } + + public void setValues(ValuesBean values) { + this.values = values; + } + + public static class ValuesBean { + /** + * 0是不可用 1是ready 2是自动驾驶start + * + * @return + */ + private int state; + /** + * 车速 m/s + */ + private float speed; + /** + * 不可用原因 + */ + private String reason; + /** + * 摄像头状态 1代表开启,0代表关闭 + */ + private int camera; + /** + * 雷达状态 1代表开启,0代表关闭 + */ + private int radar; + /** + * RTK状态 1代表开启,0代表关闭 + */ + private int rtk; + /** + * 自动驾驶状态 0非自动驾驶,1自动驾驶 + */ + private int pilotmode; + + + public int getState() { + return state; + } + + public void setState(int state) { + this.state = state; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public float getSpeed() { + return speed; + } + + public void setSpeed(float speed) { + this.speed = speed; + } + public int getCamera() { + return camera; + } + + public int getRadar() { + return radar; + } + + public int getRtk() { + return rtk; + } + + public int getPilotmode() { + return pilotmode; + } + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/DispatchAdasAutoPilotLocReceiverBean.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/DispatchAdasAutoPilotLocReceiverBean.java new file mode 100644 index 0000000000..f77b0aa9d6 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/DispatchAdasAutoPilotLocReceiverBean.java @@ -0,0 +1,138 @@ +package com.mogo.module.service.dispatch.bean; + +public class DispatchAdasAutoPilotLocReceiverBean { + + private String poiId; + + private double startLat; + private double startLon; + private String startLocAddress; + + private double endLat; + private double endLon; + private String endLocAddress; + + private String taskTime; + private String flightInfo; + private String taskInfo; + private long systemTime; + + public DispatchAdasAutoPilotLocReceiverBean(String poiId, double startLat, double startLon, String startLocAddress, double endLat, double endLon, String endLocAddress, String taskTime, String flightInfo, String taskInfo, long systemTime) { + this.poiId = poiId; + this.startLat = startLat; + this.startLon = startLon; + this.startLocAddress = startLocAddress; + this.endLat = endLat; + this.endLon = endLon; + this.endLocAddress = endLocAddress; + this.taskTime = taskTime; + this.flightInfo = flightInfo; + this.taskInfo = taskInfo; + this.systemTime = systemTime; + } + + public String getPoiId() { + return poiId; + } + + public void setPoiId(String poiId) { + this.poiId = poiId; + } + + public double getStartLat() { + return startLat; + } + + public void setStartLat(double startLat) { + this.startLat = startLat; + } + + public double getStartLon() { + return startLon; + } + + public void setStartLon(double startLon) { + this.startLon = startLon; + } + + public String getStartLocAddress() { + return startLocAddress; + } + + public void setStartLocAddress(String startLocAddress) { + this.startLocAddress = startLocAddress; + } + + public double getEndLat() { + return endLat; + } + + public void setEndLat(double endLat) { + this.endLat = endLat; + } + + public double getEndLon() { + return endLon; + } + + public void setEndLon(double endLon) { + this.endLon = endLon; + } + + public String getEndLocAddress() { + return endLocAddress; + } + + public void setEndLocAddress(String endLocAddress) { + this.endLocAddress = endLocAddress; + } + + public String getTaskTime() { + return taskTime; + } + + public void setTaskTime(String taskTime) { + this.taskTime = taskTime; + } + + public String getFlightInfo() { + return flightInfo; + } + + public void setFlightInfo(String flightInfo) { + this.flightInfo = flightInfo; + } + + public String getTaskInfo() { + return taskInfo; + } + + public void setTaskInfo(String taskInfo) { + this.taskInfo = taskInfo; + } + + public long getSystemTime() { + return systemTime; + } + + public void setSystemTime(long systemTime) { + this.systemTime = systemTime; + } + + @Override + public String toString() { + return "DispatchAdasAutoPilotLocReceiverBean{" + + "poiId='" + poiId + '\'' + + ", startLat=" + startLat + + ", startLon=" + startLon + + ", startLocAddress='" + startLocAddress + '\'' + + ", endLat=" + endLat + + ", endLon=" + endLon + + ", endLocAddress='" + endLocAddress + '\'' + + ", taskTime='" + taskTime + '\'' + + ", flightInfo='" + flightInfo + '\'' + + ", taskInfo='" + taskInfo + '\'' + + ", systemTime=" + systemTime + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/DispatchData.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/DispatchData.java new file mode 100644 index 0000000000..c26e44aa4a --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/DispatchData.java @@ -0,0 +1,38 @@ +package com.mogo.module.service.dispatch.bean; + +import com.mogo.module.service.dispatch.model.DispatchResult; + +public class DispatchData { + + private String action; + private DispatchResult result; + + public DispatchData(String action, DispatchResult result) { + this.action = action; + this.result = result; + } + + public String getAction() { + return action; + } + + public void setAction(String action) { + this.action = action; + } + + public DispatchResult getResult() { + return result; + } + + public void setResult(DispatchResult result) { + this.result = result; + } + + @Override + public String toString() { + return "DispatchData{" + + "action='" + action + '\'' + + ", result=" + result + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/EndLatLon.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/EndLatLon.java new file mode 100644 index 0000000000..4e552f6394 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/EndLatLon.java @@ -0,0 +1,36 @@ +package com.mogo.module.service.dispatch.bean; + +public class EndLatLon { + + private double lat; + private double lon; + + public EndLatLon(double lat, double lon) { + this.lat = lat; + this.lon = lon; + } + + 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; + } + + @Override + public String toString() { + return "EndLatLon{" + + "lat=" + lat + + ", lon=" + lon + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportDispatchResult.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportDispatchResult.java new file mode 100644 index 0000000000..be30e5f217 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportDispatchResult.java @@ -0,0 +1,36 @@ +package com.mogo.module.service.dispatch.bean; + +public class ReportDispatchResult { + + private String sn; + private int dispatchResult; + + public ReportDispatchResult(String sn, int dispatchResult) { + this.sn = sn; + this.dispatchResult = dispatchResult; + } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public int getDispatchResult() { + return dispatchResult; + } + + public void setDispatchResult(int dispatchResult) { + this.dispatchResult = dispatchResult; + } + + @Override + public String toString() { + return "ReportDispatchResult{" + + "sn='" + sn + '\'' + + ", dispatchResult=" + dispatchResult + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportSiteBean.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportSiteBean.java new file mode 100644 index 0000000000..08ab34fa53 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportSiteBean.java @@ -0,0 +1,40 @@ +package com.mogo.module.service.dispatch.bean; + +/** + * 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; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportedRoute.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportedRoute.java new file mode 100644 index 0000000000..51acdb95d7 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/ReportedRoute.java @@ -0,0 +1,36 @@ +package com.mogo.module.service.dispatch.bean; + + +/** + * 上报自动驾驶规划的路径 + */ +public class ReportedRoute { + private String sn; + private AutopilotStatus.ValuesBean bean; + private String siteList; + + public ReportedRoute(String sn, AutopilotStatus.ValuesBean bean) { + this.sn = sn; + this.bean = bean; + } + + public ReportedRoute(String sn, String siteList) { + this.sn = sn; + this.siteList = siteList; + } + + public String getSiteList() { + return siteList; + } + + public String getState() { + return "{\"sn\":\"" + sn + "\",\"state\":" + bean.getState() + ",\"speed\":" + bean.getSpeed() + ",\"reason\":\"" + bean.getReason() + "\",\"camera\":" + bean.getCamera() + ",\"radar\":" + bean.getRadar() + ",\"rtk\":" + bean.getRtk() + "}"; + } + + public String getRoute() { + return "{\"sn\":\"" + sn + "\",\"siteList\":" + siteList + "}"; + + } + + +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/StartLatLon.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/StartLatLon.java new file mode 100644 index 0000000000..8aac7f52be --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/bean/StartLatLon.java @@ -0,0 +1,36 @@ +package com.mogo.module.service.dispatch.bean; + +public class StartLatLon { + + private double lat; + private double lon; + + public StartLatLon(double lat, double lon) { + this.lat = lat; + this.lon = lon; + } + + 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; + } + + @Override + public String toString() { + return "StartLatLon{" + + "lat=" + lat + + ", lon=" + lon + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/DispatchResult.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/DispatchResult.java new file mode 100644 index 0000000000..d712c08743 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/DispatchResult.java @@ -0,0 +1,39 @@ +package com.mogo.module.service.dispatch.model; + +import com.mogo.module.service.dispatch.bean.EndLatLon; +import com.mogo.module.service.dispatch.bean.StartLatLon; + +public class DispatchResult { + + private StartLatLon startLatLon; + private EndLatLon endLatLon; + + public DispatchResult(StartLatLon startLatLon, EndLatLon endLatLon) { + this.startLatLon = startLatLon; + this.endLatLon = endLatLon; + } + + public StartLatLon getStartLatLon() { + return startLatLon; + } + + public void setStartLatLon(StartLatLon startLatLon) { + this.startLatLon = startLatLon; + } + + public EndLatLon getEndLatLon() { + return endLatLon; + } + + public void setEndLatLon(EndLatLon endLatLon) { + this.endLatLon = endLatLon; + } + + @Override + public String toString() { + return "DispatchResult{" + + "startLatLon=" + startLatLon + + ", endLatLon=" + endLatLon + + '}'; + } +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/DispatchServiceModel.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/DispatchServiceModel.java new file mode 100644 index 0000000000..4fae916708 --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/DispatchServiceModel.java @@ -0,0 +1,121 @@ +package com.mogo.module.service.dispatch.model; + +import static com.mogo.commons.context.ContextHolderUtil.getContext; +import static com.mogo.module.common.constants.HostConst.DATA_SERVICE_HOST; + +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.commons.data.BaseData; +import com.mogo.commons.network.SubscribeImpl; +import com.mogo.module.common.MogoApisHandler; +import com.mogo.module.service.dispatch.bean.AutopilotRoute; +import com.mogo.module.service.dispatch.bean.ReportDispatchResult; +import com.mogo.module.service.dispatch.bean.ReportedRoute; +import com.mogo.utils.logger.Logger; +import com.mogo.utils.network.RequestOptions; +import com.mogo.utils.network.utils.GsonUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class DispatchServiceModel { + + private static final String TAG = "AdasServiceModel"; + private static volatile DispatchServiceModel instance; + private static final byte[] obj = new byte[0]; + + public static final int DISPATCH_RESULT_AFFIRM = 0; + public static final int DISPATCH_RESULT_MANUAL_CANCEL = 1; + public static final int DISPATCH_RESULT_TIMER_CANCEL = 2; + + private final IDispatchAdasApiService mAdasApiService; + + private DispatchServiceModel() { + this.mAdasApiService = MogoApisHandler.getInstance().getApis().getNetworkApi().create(IDispatchAdasApiService.class, DATA_SERVICE_HOST); + } + + public static DispatchServiceModel getInstance() { + if (instance == null) { + synchronized (obj) { + if (instance == null) { + instance = new DispatchServiceModel(); + } + } + } + return instance; + } + + /** + * 上报自动驾驶路线 + * + * @param list 路线集合 + */ + public void uploadAutopilotRoute(List list) { + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + ReportedRoute reportedRoute = new ReportedRoute(sn, GsonUtil.jsonFromObject(list)); + Map map = new HashMap<>(); + map.put("sn", sn); + map.put("data", GsonUtil.jsonFromObject(reportedRoute)); + mAdasApiService.uploadAutopilotRoute(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SubscribeImpl(RequestOptions.create(getContext())) { + @Override + public void onNext(BaseData o) { + super.onNext(o); + Logger.d(TAG, "uploadAutopilotRoute success"); + } + + @Override + public void onError(Throwable e) { + super.onError(e); + Logger.d(TAG, "uploadAutopilotRoute error : " + e.getMessage()); + } + + @Override + public void onSuccess(BaseData o) { + super.onSuccess(o); + } + }); + } + + /** + * 上报调度处理结果 + * + * @param dispatchResultType int + */ + public void dispatchResultUpload(int dispatchResultType, IDispatch dispatch) { + String sn = MoGoAiCloudClientConfig.getInstance().getSn(); + ReportDispatchResult reportDispatchResult = new ReportDispatchResult(sn, dispatchResultType); + Map map = new HashMap<>(); + map.put("sn", sn); + map.put("data", GsonUtil.jsonFromObject(reportDispatchResult)); + mAdasApiService.uploadDispatchResult(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new SubscribeImpl(RequestOptions.create(getContext())) { + @Override + public void onNext(BaseData o) { + super.onNext(o); + Logger.d(TAG, "dispatchResultUpload success"); + dispatch.onSuccess(); + } + + @Override + public void onError(Throwable e) { + super.onError(e); + Logger.d(TAG, "dispatchResultUpload error : " + e.getMessage()); + dispatch.onError(e.getMessage()); + } + + @Override + public void onSuccess(BaseData o) { + super.onSuccess(o); + } + }); + } + +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/IDispatch.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/IDispatch.java new file mode 100644 index 0000000000..6616add34e --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/IDispatch.java @@ -0,0 +1,8 @@ +package com.mogo.module.service.dispatch.model; + +public interface IDispatch { + + void onSuccess(); + + void onError(String msg); +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/IDispatchAdasApiService.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/IDispatchAdasApiService.java new file mode 100644 index 0000000000..bbfffdc4ee --- /dev/null +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/dispatch/model/IDispatchAdasApiService.java @@ -0,0 +1,33 @@ +package com.mogo.module.service.dispatch.model; + +import com.mogo.commons.data.BaseData; + +import java.util.Map; + +import io.reactivex.Observable; +import retrofit2.http.FieldMap; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface IDispatchAdasApiService { + + /** + * 上报自动驾驶路径 服务于业务调度 + * + * @param parameters map + * @return {@link BaseData} + */ + @FormUrlEncoded + @POST("/dataService/autoDriver/receiveCarPreSetPath") + Observable uploadAutopilotRoute(@FieldMap Map parameters); + + /** + * 上报自动驾驶调度处理结果 服务于业务调度 + * + * @param parameters map + * @return {@link BaseData} + */ + @FormUrlEncoded + @POST("/dataService/autoDriver/receiverDestSiteResult") + Observable uploadDispatchResult(@FieldMap Map parameters); +} diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/ADASStatusIntentHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/ADASStatusIntentHandler.java index 90f21f8a24..c83e6a4b33 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/ADASStatusIntentHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/ADASStatusIntentHandler.java @@ -4,7 +4,7 @@ import android.content.Context; import android.content.Intent; import android.text.TextUtils; -import com.mogo.module.common.uploadintime.SnapshotLocationController; +import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; import com.mogo.module.service.MarkerServiceHandler; import com.mogo.module.service.ServiceConst; import com.mogo.module.service.carinfo.CarStateInfo; @@ -73,7 +73,7 @@ class ADASStatusIntentHandler implements IntentHandler { data.putOpt( "acceleration", stateInfo.getValues().getAcceleration() ); data.putOpt( "yawRate", stateInfo.getValues().getYaw_rate() ); MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map( data ); - SnapshotLocationController.getInstance().syncAdasLocationInfo( data ); + SnapshotLocationDataCenter.getInstance().syncAdasLocationInfo( data ); } catch ( Exception e ) { e.printStackTrace(); } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java index e829abc695..e08421f39e 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java @@ -13,6 +13,8 @@ import android.view.View; import android.widget.TextView; import com.mogo.cloud.commons.utils.CoordinateUtils; +import com.mogo.cloud.socket.entity.SocketDownData; +import com.mogo.cloud.socket.entity.SocketDownDataHelper; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.voice.AIAssist; @@ -31,16 +33,14 @@ import com.mogo.module.common.MogoApisHandler; import com.mogo.module.common.constants.DataTypes; import com.mogo.module.common.dialog.WMDialog; import com.mogo.module.common.drawer.SnapshotSetDataDrawer; -import com.mogo.module.common.uploadintime.SnapshotLocationController; +import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; import com.mogo.module.service.MarkerServiceHandler; import com.mogo.module.service.R; import com.mogo.module.service.status.EnvStatusManager; import com.mogo.module.service.timedelay.TimeDelayUploadManager; -import com.mogo.realtime.entity.ADASRecognizedResult; -import com.mogo.realtime.entity.CloudRoadData; -import com.mogo.realtime.entity.MogoSnapshotSetData; import com.mogo.service.adas.RemoteControlAutoPilotParameters; import com.mogo.service.adas.entity.ADASCarStateInfo; +import com.mogo.service.adas.entity.ADASRecognizedResult; import com.mogo.service.entrance.ButtonIndex; import com.mogo.utils.TipToast; import com.mogo.utils.WorkThreadHandler; @@ -77,9 +77,11 @@ public class MockIntentHandler implements IntentHandler { final int oper = intent.getIntExtra("oper", -1); switch (oper) { case 1: + // 展示自车位置 MarkerServiceHandler.getMapUIController().showMyLocation(intent.getBooleanExtra("status", true)); break; case 2: + // 发起求助 boolean status = intent.getBooleanExtra("status", false); MarkerServiceHandler.getMogoStatusManager().setSeekHelping(TAG, status); break; @@ -339,7 +341,7 @@ public class MockIntentHandler implements IntentHandler { MarkerServiceHandler.getApis().getRefreshStrategyControllerApi().restartAutoRefreshAtTime(duration); IMogoMarker marker = MarkerServiceHandler.getMarkerManager().addMarker(TAG, options); MarkerServiceHandler.getMogoStatusManager().setUserInteractionStatus(TAG, true, false); - if(!MarkerServiceHandler.getApis().getStatusManagerApi().isVrMode()){ + if (!MarkerServiceHandler.getApis().getStatusManagerApi().isVrMode()) { MarkerServiceHandler.getMapUIController().moveToCenter(mogoLatLngs.get(0)); } WorkThreadHandler.getInstance().post(() -> marker.startSmooth(mogoLatLngs, duration)); @@ -403,7 +405,6 @@ public class MockIntentHandler implements IntentHandler { .syncLocation2Map(null); break; case 40: - double[][] coors = new double[][]{{40.17511749267578, 116.74359130859375}, {40.20258331298828, 116.74071502685547}, {40.202598571777344, 116.74067687988281}, @@ -444,7 +445,6 @@ public class MockIntentHandler implements IntentHandler { {40.20254135131836, 116.74005889892578}, {40.20252990722656, 116.74007415771484}, {40.20254898071289, 116.74008178710938}, - {40.20254135131836, 116.74005889892578}, {40.20252227783203, 116.74006652832031}, {40.20254898071289, 116.74002838134766}, @@ -543,8 +543,8 @@ public class MockIntentHandler implements IntentHandler { .openVrMode(false); break; case 46:// 模拟 自车周边数据 - String json = "{\"allList\":[{\"type\":3,\"uuid\":\"10009-5152\",\"lat\":40.1990809296,\"lon\":116.7393252195,\"speed\":0.0,\"heading\":0.0,\"systemTime\":1614329151909,\"vehicleType\":0,\"distance\":576.0,\"fromType\":3,\"isOnline\":0},{\"type\":3,\"uuid\":\"10009-5161\",\"lat\":40.1990827227,\"lon\":116.739325826,\"speed\":0.0,\"heading\":0.0,\"systemTime\":1614329151909,\"vehicleType\":0,\"distance\":576.0,\"fromType\":3,\"isOnline\":0}],\"nearList\":[],\"time\":1614329152238}"; - SnapshotSetDataDrawer.getInstance().renderSnapshotData(GsonUtil.objectFromJson(json, MogoSnapshotSetData.class)); +// String json = "{\"allList\":[{\"type\":3,\"uuid\":\"10009-5152\",\"lat\":40.1990809296,\"lon\":116.7393252195,\"speed\":0.0,\"heading\":0.0,\"systemTime\":1614329151909,\"vehicleType\":0,\"distance\":576.0,\"fromType\":3,\"isOnline\":0},{\"type\":3,\"uuid\":\"10009-5161\",\"lat\":40.1990827227,\"lon\":116.739325826,\"speed\":0.0,\"heading\":0.0,\"systemTime\":1614329151909,\"vehicleType\":0,\"distance\":576.0,\"fromType\":3,\"isOnline\":0}],\"nearList\":[],\"time\":1614329152238}"; +// SnapshotSetDataDrawer.getInstance().renderSnapshotData(GsonUtil.objectFromJson(json, MogoSnapshotSetData.class)); break; case 47:// 模拟鹰眼模式下绘制车辆周边的数据 mTimeTickHandler.sendEmptyMessageDelayed(1, 0L); @@ -603,8 +603,8 @@ public class MockIntentHandler implements IntentHandler { DebugConfig.setSelfCarSpeedYOffset(intent.getIntExtra("yOffset", 20)); break; case 51:// 模拟路口车辆移动 - mLocationMockHandler.sendEmptyMessageDelayed(100, 0L); - mLocationMockHandler.sendEmptyMessageDelayed(101, 1000L); +// mLocationMockHandler.sendEmptyMessageDelayed(100, 0L); +// mLocationMockHandler.sendEmptyMessageDelayed(101, 1000L); break; case 52: // 打开连调工控机、ADAS的控制面板 @@ -616,7 +616,7 @@ public class MockIntentHandler implements IntentHandler { DebugConfig.setUseAdasRecognize(isUseAdasRecognize); break; case 54: - mTimeTickCarHandler.sendEmptyMessageDelayed(1, 0L); +// mTimeTickCarHandler.sendEmptyMessageDelayed(1, 0L); break; case 55: //开启模拟数据Mock,用于验证算法准确性 @@ -647,18 +647,22 @@ public class MockIntentHandler implements IntentHandler { */ private void handleRoadSideMockDataIntent() throws Exception { if (roadSizeBr == null) { - roadSizeBr = new BufferedReader(new InputStreamReader(AbsMogoApplication.getApp().getAssets().open("roadSide.txt"))); + roadSizeBr = new BufferedReader(new InputStreamReader(AbsMogoApplication.getApp().getAssets().open("roadSide.txt"))); //todo 需要重新模拟一个test数据 } String carsLine = roadSizeBr.readLine(); - MogoSnapshotSetData data = new MogoSnapshotSetData(); - List allList = GsonUtil.arrayFromJson(carsLine, CloudRoadData.class); - for (CloudRoadData cloudRoadData : allList) { - cloudRoadData.setWgslat(cloudRoadData.getLat()); - cloudRoadData.setWgslon(cloudRoadData.getLon()); - cloudRoadData.setFromType(CloudRoadData.FROM_ROAD_UNIT); + SocketDownData.LauncherSnapshotProto.Builder data = SocketDownData.LauncherSnapshotProto.newBuilder(); + List allList = GsonUtil.arrayFromJson(carsLine, SocketDownData.CloudRoadDataProto.class); + if (allList == null || allList.size() == 0) { + return; } - data.setAllList(allList); - SnapshotSetDataDrawer.getInstance().renderSnapshotData(data); + for (SocketDownData.CloudRoadDataProto cloudRoadData : allList) { + cloudRoadData.toBuilder() + .setWgslat(cloudRoadData.getLon()) + .setWgslon(cloudRoadData.getLon()) + .setFromType(SocketDownDataHelper.FROM_ROAD_UNIT); + } + data.addAllAllList(allList); + SnapshotSetDataDrawer.getInstance().renderSnapshotData(data.build()); mLocationMockHandler.sendEmptyMessageDelayed(101, 100L); } @@ -848,9 +852,9 @@ public class MockIntentHandler implements IntentHandler { //改变rtk定位数据,触发自车移动 MarkerServiceHandler.getApis().getMapServiceApi().getMapUIController().syncLocation2Map(jo); Log.i("mock-timer-loc-map", "cost " + (System.currentTimeMillis() - start) + "ms"); - SnapshotLocationController.getInstance().syncAdasLocationInfo(jo); + SnapshotLocationDataCenter.getInstance().syncAdasLocationInfo(jo); Log.i("mock-timer-loc", "cost " + (System.currentTimeMillis() - start) + "ms"); - Log.i("mock-timer-loc-info",jo.toString()); + Log.i("mock-timer-loc-info", jo.toString()); return true; } @@ -861,29 +865,30 @@ public class MockIntentHandler implements IntentHandler { * 模拟快照意图 */ private boolean handleMockSnapshotIntent2() throws Exception { - if (br4 == null) { - br4 = new BufferedReader(new InputStreamReader(AbsMogoApplication.getApp().getAssets().open("snapshot.txt"))); - } - String line = br4.readLine(); - if (line == null) { - throw new Exception("end of file 2."); - } - MogoSnapshotSetData data = new MogoSnapshotSetData(); - List allList = new ArrayList<>(); - CloudRoadData cloudRoadData = GsonUtil.objectFromJson(line, CloudRoadData.class); - if (cloudRoadData == null) { - return false; - } - cloudRoadData.setWgslon(cloudRoadData.getLon()); - cloudRoadData.setWgslat(cloudRoadData.getLat()); - cloudRoadData.setUuid("1_21"); - allList.add(cloudRoadData); - data.setAllList(allList); - - final long start = System.currentTimeMillis(); - SnapshotSetDataDrawer.getInstance().renderSnapshotData(data); - Log.i("mock-timer-snapshot", "cost " + (System.currentTimeMillis() - start) + "ms"); -// mLocationMockHandler.sendEmptyMessageDelayed( 21, 100L ); +// if (br4 == null) { +// br4 = new BufferedReader(new InputStreamReader(AbsMogoApplication.getApp().getAssets().open("snapshot.txt"))); todo 需要重新模拟一个test数据 +// } +// String line = br4.readLine(); +// if (line == null) { +// throw new Exception("end of file 2."); +// } +// SocketDownData.LauncherSnapshotProto.Builder data = SocketDownData.LauncherSnapshotProto.newBuilder(); +// List allList = new ArrayList<>(); +// SocketDownData.CloudRoadDataProto cloudRoadData = GsonUtil.objectFromJson(line, SocketDownData.CloudRoadDataProto.class); +// if (cloudRoadData == null) { +// return false; +// } +// SocketDownData.CloudRoadDataProto.Builder builder = cloudRoadData.toBuilder(); +// builder.setWgslat(cloudRoadData.getLon()); +// builder.setWgslon(cloudRoadData.getLat()); +// builder.setUuid("1_21"); +// allList.add(cloudRoadData); +// data.addAllAllList(allList); +// +// final long start = System.currentTimeMillis(); +// SnapshotSetDataDrawer.getInstance().renderSnapshotData(data.build()); +// Log.i("mock-timer-snapshot", "cost " + (System.currentTimeMillis() - start) + "ms"); +//// mLocationMockHandler.sendEmptyMessageDelayed( 21, 100L ); return true; } @@ -897,8 +902,8 @@ public class MockIntentHandler implements IntentHandler { final long start = System.currentTimeMillis(); if (readers == null) { - readers = new BufferedReader[10]; - for (int i = 0; i < 10; i++) { + readers = new BufferedReader[200]; + for (int i = 0; i < 200; i++) { readers[i] = new BufferedReader(new InputStreamReader(AbsMogoApplication.getApp().getAssets().open("adas" + i + ".txt"))); } } @@ -912,10 +917,7 @@ public class MockIntentHandler implements IntentHandler { } } - AdasRec adasRec = new AdasRec(); - adasRec.models = allList; - - MogoApisHandler.getInstance().getApis().getAdasControllerApi().mockAdasRecognized(GsonUtil.jsonFromObject(adasRec)); + MogoApisHandler.getInstance().getApis().getAdasControllerApi().mockAdasRecognized(allList); Log.i("mock-timer-adas", "cost " + (System.currentTimeMillis() - start) + "ms"); return true; } @@ -942,16 +944,9 @@ public class MockIntentHandler implements IntentHandler { } } - AdasRec adasRec = new AdasRec(); - adasRec.models = allList; - - MogoApisHandler.getInstance().getApis().getAdasControllerApi().mockAdasRecognized(GsonUtil.jsonFromObject(adasRec)); + MogoApisHandler.getInstance().getApis().getAdasControllerApi().mockAdasRecognized(allList); Log.i("mock-timer-adas", "cost " + (System.currentTimeMillis() - start) + "ms"); return true; } - public static class AdasRec { - public String action = "view"; - public List models; - } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java index 6fba82182a..9ba837f2c8 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/location/MogoRTKLocation.java @@ -1,5 +1,6 @@ package com.mogo.module.service.location; +import android.annotation.SuppressLint; import android.content.Context; import android.location.Criteria; import android.location.Location; @@ -9,8 +10,8 @@ import android.os.Bundle; import com.mogo.commons.AbsMogoApplication; import com.mogo.module.common.MogoApisHandler; -import com.mogo.module.common.uploadintime.SnapshotLocationController; -import com.mogo.realtime.entity.CloudLocationInfo; +import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; +import com.mogo.service.locationinfo.CloudLocationInfo; import com.mogo.utils.logger.Logger; public class MogoRTKLocation { @@ -29,6 +30,7 @@ public class MogoRTKLocation { private MogoRTKLocation() { } + @SuppressLint("MissingPermission") public void init() { locationManager = (LocationManager) AbsMogoApplication.getApp().getApplicationContext().getSystemService(Context.LOCATION_SERVICE); String provider = locationManager.getBestProvider(getCriteria(), true); @@ -74,7 +76,7 @@ public class MogoRTKLocation { cloudLocationInfo.setSystemTime(System.currentTimeMillis()); cloudLocationInfo.setTileId(String.valueOf(MogoApisHandler.getInstance().getApis().getMapServiceApi().getMapUIController() .getTileId(location.getLongitude(), location.getLatitude()))); - SnapshotLocationController.getInstance().syncLocationInfo(cloudLocationInfo); + SnapshotLocationDataCenter.getInstance().syncLocationInfo(cloudLocationInfo); } } else { Logger.e(TAG, "location == null"); @@ -102,7 +104,7 @@ public class MogoRTKLocation { if (locationManager != null && locationListener != null) { locationManager.removeUpdates(locationListener); } else { - Logger.d(TAG, "stop failed , reason : loc" + locationManager + " , or loc listener: " + locationListener + " is null"); + Logger.d(TAG, "stop failed , listener: " + locationListener + " is null"); } } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java index 12adef687c..88d670da3a 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/marker/MapMarkerManager.java @@ -7,6 +7,7 @@ import android.os.Message; import android.text.TextUtils; import android.util.Log; +import com.mogo.cloud.socket.entity.SocketDownData; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.debug.DebugConfig; import com.mogo.map.MogoLatLng; @@ -39,10 +40,9 @@ import com.mogo.module.service.network.RefreshCallback; import com.mogo.module.service.network.RefreshModel; import com.mogo.module.service.polyline.LimberCollisionPolyline; import com.mogo.realtime.api.MoGoAiCloudRealTime; -import com.mogo.realtime.entity.ADASRecognizedResult; -import com.mogo.realtime.entity.MogoSnapshotSetData; import com.mogo.realtime.socket.IMogoCloudOnMsgListener; import com.mogo.service.adas.IMogoADASControlStatusChangedListener; +import com.mogo.service.adas.entity.ADASRecognizedResult; import com.mogo.service.module.IMogoBizActionDoneListener; import com.mogo.utils.ResourcesHelper; import com.mogo.utils.ThreadPoolService; @@ -147,7 +147,7 @@ public class MapMarkerManager implements IMogoMarkerClickListener, } @Override - public void onMsgReceived(MogoSnapshotSetData mogoSnapshotSetData) { + public void onMsgReceived(SocketDownData.LauncherSnapshotProto mogoSnapshotSetData) { DebugConfig.setStatus(DebugConfig.sDownloadSnapshot, true); Message msg = mSnapshotHandler.obtainMessage(); msg.obj = mogoSnapshotSetData; @@ -207,8 +207,8 @@ public class MapMarkerManager implements IMogoMarkerClickListener, @Override public void handleMessage(Message msg) { super.handleMessage(msg); - if (msg.obj instanceof MogoSnapshotSetData) { - SnapshotSetDataDrawer.getInstance().renderSnapshotData(((MogoSnapshotSetData) msg.obj)); + if (msg.obj instanceof SocketDownData.LauncherSnapshotProto) { + SnapshotSetDataDrawer.getInstance().renderSnapshotData(((SocketDownData.LauncherSnapshotProto) msg.obj)); } else if (msg.obj == null) { SnapshotSetDataDrawer.getInstance().renderSnapshotData(null); } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/spi/SPIRealTimeUpload.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/spi/SPIRealTimeUpload.java index 5ea8b7eb10..e1bb7f6830 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/spi/SPIRealTimeUpload.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/spi/SPIRealTimeUpload.java @@ -1,29 +1,16 @@ package com.mogo.module.service.spi; import com.elegant.spi.annotations.Service; -import com.mogo.module.common.uploadintime.SnapshotLocationController; -import com.mogo.module.service.MarkerServiceHandler; +import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; import com.mogo.realtime.api.IRealTimeProvider; -import com.mogo.realtime.entity.ADASRecognizedResult; -import com.mogo.realtime.entity.CloudLocationInfo; +import com.mogo.realtime.entity.SocketReceiveDataProto3; -import java.util.List; @Service(value = IRealTimeProvider.class) public class SPIRealTimeUpload implements IRealTimeProvider { @Override - public List getLastADASRecognizedResult() { - return MarkerServiceHandler.getADASController().getLastADASRecognizedResult(); - } - - @Override - public List getLocationMsg() { - return SnapshotLocationController.getInstance().getSendLocationData(); - } - - @Override - public int getLocationAccuracy() { - return SnapshotLocationController.getInstance().getDataAccuracy(); + public SocketReceiveDataProto3.SocketReceiveDataProto getLocationMsg() { + return null; } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/status/EnvStatusManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/status/EnvStatusManager.java index 2f33265028..6597e5b600 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/status/EnvStatusManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/status/EnvStatusManager.java @@ -5,10 +5,12 @@ import android.graphics.Color; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.text.TextUtils; import android.view.Gravity; import android.view.ViewGroup; import android.widget.TextView; +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.commons.debug.DebugConfig; import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.module.common.MogoApisHandler; @@ -69,16 +71,17 @@ public class EnvStatusManager { private void renderStatus() { String[] sStatusName = { - "定位", - "近景", - "下发", - "AUTO", - "长链", + "工控机定位", + "ADAS近景感知", + "云端远景感知", + "自动驾驶状态", + "socket长链", "经度", "纬度", "网络状态", "App版本", - "Map版本" + "Map版本", + "SN" }; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < sStatusName.length; i++) { @@ -92,7 +95,12 @@ public class EnvStatusManager { } else if (i == 8) { stringBuilder.append(getVersionName(mContext, "com.mogo.launcher.f")).append("\n"); } else if (i == 9) { - stringBuilder.append(AppUtils.getCustomMapSDKVersion(mContext)).append("\n"); + String mapVersion = AppUtils.getCustomMapSDKVersion(mContext); + if (!TextUtils.isEmpty(mapVersion)) { + stringBuilder.append(mapVersion).append("\n"); + } + } else if(i == 10){ + stringBuilder.append(MoGoAiCloudClientConfig.getInstance().getSn()).append("\n"); } else { stringBuilder.append("true".equals(DebugConfig.getStatus(i, true)) ? "正常" : "异常").append("\n"); } @@ -108,10 +116,6 @@ public class EnvStatusManager { mStatusTv.setTextColor(Color.WHITE); } } - - //添加网络状态 - - // } private Context mContext; diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/timedelay/TimeDelayUploadManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/timedelay/TimeDelayUploadManager.java index 891d6bd9a6..9d828d0d40 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/timedelay/TimeDelayUploadManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/timedelay/TimeDelayUploadManager.java @@ -4,22 +4,23 @@ import android.content.Context; import android.os.Build; import android.os.Handler; import android.os.Message; +import android.text.TextUtils; import androidx.annotation.RequiresApi; +import com.mogo.cloud.passport.MoGoAiCloudClientConfig; +import com.mogo.cloud.socket.entity.SocketDownData; import com.mogo.commons.data.BaseData; import com.mogo.commons.network.SubscribeImpl; -import com.mogo.commons.network.Utils; import com.mogo.module.common.MogoApisHandler; -import com.mogo.module.common.uploadintime.SnapshotLocationController; +import com.mogo.module.common.datacenter.SnapshotLocationDataCenter; import com.mogo.module.service.MarkerServiceHandler; import com.mogo.module.service.network.TimeDelayApiService; import com.mogo.module.service.network.bean.MockSocketReceiverData; import com.mogo.module.service.network.bean.MockSocketSendData; import com.mogo.realtime.api.MoGoAiCloudRealTime; -import com.mogo.realtime.entity.CloudRoadData; -import com.mogo.realtime.entity.MogoSnapshotSetData; import com.mogo.realtime.socket.IMogoCloudOnMsgListener; +import com.mogo.service.adas.IMogoADASController; import com.mogo.service.connection.IMogoOnMessageListener; import com.mogo.utils.WorkThreadHandler; import com.mogo.utils.logger.Logger; @@ -53,6 +54,7 @@ public class TimeDelayUploadManager implements IMogoOnMessageListener cloudRoadData.getUuid().contains("serialNumber_")) .findAny() @@ -149,12 +157,19 @@ public class TimeDelayUploadManager implements IMogoOnMessageListener map = new HashMap<>(); - map.put("sn", Utils.getSn()); + map.put("sn", MoGoAiCloudClientConfig.getInstance().getSn()); map.put("data", GsonUtil.jsonFromObject(mockSocketSendData)); Logger.d(TAG, "mockSocketSendData : " + GsonUtil.jsonFromObject(mockSocketSendData)); - Logger.d(TAG, "data uuid : " + result.getUuid() + " duration : " + (System.currentTimeMillis() - result.getSatelliteTime())); + Logger.d(TAG, "data uuid : " + result.getUuid() + " duration : " + (satelliteTime - result.getSatelliteTime())); timeDelayApiService.uploadDelayData(map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -171,4 +186,5 @@ public class TimeDelayUploadManager implements IMogoOnMessageListener + + + + + \ No newline at end of file diff --git a/modules/mogo-module-service/src/main/res/drawable/bg_adas_dispatch_affirm.xml b/modules/mogo-module-service/src/main/res/drawable/bg_adas_dispatch_affirm.xml new file mode 100644 index 0000000000..950da70a41 --- /dev/null +++ b/modules/mogo-module-service/src/main/res/drawable/bg_adas_dispatch_affirm.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-service/src/main/res/layout/module_dialog_adas_dispatch_remind.xml b/modules/mogo-module-service/src/main/res/layout/module_dialog_adas_dispatch_remind.xml new file mode 100644 index 0000000000..dc73333dcb --- /dev/null +++ b/modules/mogo-module-service/src/main/res/layout/module_dialog_adas_dispatch_remind.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +