From f52d4a94cb84539667852d0a22bce8a5005a22f1 Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Wed, 21 Oct 2020 15:23:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8B=A5=E5=A0=B5=E7=AD=96?= =?UTF-8?q?=E7=95=A5=E4=B8=8A=E6=8A=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/mogo-module-share/build.gradle | 2 + .../module/share/StrategyShareProvider.kt | 24 +++++- .../mogo/module/share/adas/AdasDataInfo.java | 21 +++++ .../share/adas/AdasFrontCarDistanceY.java | 11 +++ .../module/share/adas/BasePushMsgModel.java | 31 +++++++ .../share/strategyreceiver/BlockStrategy.kt | 84 +++++++++++++++++++ .../service/adas/IMogoADASController.java | 12 +++ .../service/adas/IMogoAdasDataCallback.java | 14 ++++ .../service/impl/adas/MogoADASController.java | 21 +++++ 9 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasDataInfo.java create mode 100644 modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasFrontCarDistanceY.java create mode 100644 modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/BasePushMsgModel.java create mode 100644 services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java diff --git a/modules/mogo-module-share/build.gradle b/modules/mogo-module-share/build.gradle index 93a42fe9e8..062876c676 100644 --- a/modules/mogo-module-share/build.gradle +++ b/modules/mogo-module-share/build.gradle @@ -48,11 +48,13 @@ dependencies { implementation rootProject.ext.dependencies.mogocommons implementation rootProject.ext.dependencies.modulecommon implementation rootProject.ext.dependencies.mogomoduleauth + implementation rootProject.ext.dependencies.moduleservice } else { implementation project(":foudations:mogo-utils") api project(":foudations:mogo-commons") implementation project(':modules:mogo-module-common') implementation project(':modules:mogo-module-authorize') + implementation project(':modules:mogo-module-service') } } diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/StrategyShareProvider.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/StrategyShareProvider.kt index f7c667d3fa..1bcdb35b6a 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/StrategyShareProvider.kt +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/StrategyShareProvider.kt @@ -5,6 +5,7 @@ import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.template.IProvider import com.alibaba.android.arouter.launcher.ARouter import com.mogo.commons.debug.DebugConfig +import com.mogo.module.share.adas.AdasFrontCarDistanceY import com.mogo.module.share.constant.ACCIDENT_STRATEGY_SHARE_PUSH_TYPE import com.mogo.module.share.constant.S_TAG import com.mogo.module.share.strategyreceiver.AccidentStrategyReceiver @@ -12,6 +13,9 @@ import com.mogo.module.share.strategyreceiver.BlockStrategy import com.mogo.service.IMogoServiceApis import com.mogo.service.MogoServicePaths import com.mogo.utils.logger.Logger +import com.mogo.utils.network.utils.GsonUtil +import org.json.JSONObject +import java.lang.Exception /** * 策略上报入口,服务端策略上报Push的接收地,接收后再调用tanlu相关接口进行视频抓取 @@ -30,8 +34,26 @@ class StrategyShareProvider : IProvider { // if(!DebugConfig.isLauncher()) { apis.registerCenterApi.registerMogoLocationListener(MogoServicePaths.PATH_STRATEGY_SHARE) { // Logger.d(S_TAG,"定位发生变化,准备记录速度: ${it.speed}") - blockStrategy.recordSpeed(it.speed * 3.6F) + blockStrategy.recordLocation(it.latitude, it.longitude) + } + + apis.adasControllerApi.addAdasDataCallback { + Logger.d(S_TAG, "收到adas数据===$it") + try { + val oriJson = JSONObject(it) + val action = oriJson.optInt("action", -1) + if (action == 0) { + // adas返回前车距离,单位是米 + val frontDistanceItem = GsonUtil.objectFromJson(it, AdasFrontCarDistanceY::class.java) + val distance = frontDistanceItem.result.distanceY.toDouble().toInt() + blockStrategy.refreshFrontDistance(distance) + } + } catch (e: Exception) { + Logger.e(S_TAG, e, "解析adas数据异常") + e.printStackTrace() + } + } // } } diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasDataInfo.java b/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasDataInfo.java new file mode 100644 index 0000000000..fb28a83933 --- /dev/null +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasDataInfo.java @@ -0,0 +1,21 @@ +package com.mogo.module.share.adas; + +/** + * @author nie yunlong + * @des + * @date 2020/10/20 + */ +public class AdasDataInfo { + /** + * 距离 + */ + private String distanceY; + + public String getDistanceY() { + return distanceY; + } + + public void setDistanceY(String distanceY) { + this.distanceY = distanceY; + } +} diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasFrontCarDistanceY.java b/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasFrontCarDistanceY.java new file mode 100644 index 0000000000..51b13e2df9 --- /dev/null +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/AdasFrontCarDistanceY.java @@ -0,0 +1,11 @@ +package com.mogo.module.share.adas; + +/** + * @author nie yunlong + * @des 正前方距离y + * @date 2020/10/20 + */ +public class AdasFrontCarDistanceY extends BasePushMsgModel { + + +} diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/BasePushMsgModel.java b/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/BasePushMsgModel.java new file mode 100644 index 0000000000..9f4f0fae9f --- /dev/null +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/adas/BasePushMsgModel.java @@ -0,0 +1,31 @@ +package com.mogo.module.share.adas; + +import java.io.Serializable; + +/** + * @author nie yunlong + * @des + * @date 2020/10/20 + */ +public class BasePushMsgModel implements Serializable { + //行为 + private int action; + //结果 + private T result; + + public int getAction() { + return action; + } + + public void setAction(int action) { + this.action = action; + } + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } +} diff --git a/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt b/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt index b8ba3c7cc8..eb0c2dc0d9 100644 --- a/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt +++ b/modules/mogo-module-share/src/main/java/com/mogo/module/share/strategyreceiver/BlockStrategy.kt @@ -1,6 +1,7 @@ package com.mogo.module.share.strategyreceiver import android.content.Context +import android.os.Handler import android.os.SystemClock import android.util.ArrayMap import com.mogo.commons.network.SubscribeImpl @@ -32,6 +33,8 @@ private const val SPEED_RECORD_TIME_INTERVAL = 2 * 60 * 1000L private const val STOP_FLAG_THRESHOLD = 30 private const val TAG = "BlockUploadStrategy" +private const val DISTANCE_RECORD_TIME = 3 * 60 * 1000L + /** * 用于计算拥堵策略 */ @@ -44,6 +47,10 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService */ private var stopFlag = 0 + private var currentSpeed: Int = 0 + + private var startRecordDistanceTime = 0L + /** * 拥堵速度计算上报策略 * 计算[SPEED_RECORD_TIME_INTERVAL]内的平均速度,并上报 @@ -57,6 +64,7 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService * @param speed 当前速度,单位需要是Km/h */ fun recordSpeed(speed: Float) { + currentSpeed = speed.toInt() val current = SystemClock.uptimeMillis() if (startRecordTime == 0L) { // 数据初始化 @@ -93,6 +101,60 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService } } + private var lastLat: Double = 0.0 + private var lastLon: Double = 0.0 + + /** + * 用于记录行进的距离 + */ + private var tripDistance: Int = 0 + + /** + * 距离策略上报 + * + * 1. 过去3分钟,行驶距离<1km + * 2. 前车距离<5m,获取不到前车距离时,默认此项满足 + * 3. 当前车速<40km/h + * + * 满足上述条件,自动上报拥堵 + */ + fun recordLocation(lat: Double, lon: Double) { + if (lastLat == 0.0) { + // 定位初始化,只判断一个就行了 + lastLon = lon + lastLat = lat + } else { + // 记录行进距离 + tripDistance += com.mogo.module.service.Utils.calculateLineDistance(lastLon, lastLat, lon, lat).toInt() + val current = SystemClock.uptimeMillis() + if (startRecordDistanceTime == 0L) { + startRecordDistanceTime = current + } + + if (current - startRecordDistanceTime >= DISTANCE_RECORD_TIME) { + // 超过阈值,准备判断是否拥堵 + startRecordDistanceTime = 0L + if (tripDistance < 1000 && isClose() && currentSpeed < 40) { + Logger.d(TAG, "根据距离,判定为拥堵,准备上报") + val p = TanluUploadParams(IMogoTanluProvider.TYPE_BLOCK, IMogoTanluProvider.UPLOAD_FROM_STRATEGY_BLOCK_AUTO) + val latLon = MogoLatLng(lat, lon) + p.location = latLon + apis.tanluApi.uploadRoadCondition(p) + } else { + Logger.d(TAG, "根据距离,没有判定为拥堵, tripDistance: $tripDistance, frontDistance: $frontDistance, currentSpeed: $currentSpeed") + } + tripDistance = 0 + } + } + } + + /** + * 没有有效前车距离或者前车距离小于5m + */ + private fun isClose(): Boolean { + return frontDistance in 1..4 + } + private fun uploadAverageSpeed(average: Float) { val params = ArrayMap() params["speed"] = average.toInt() @@ -115,4 +177,26 @@ class BlockStrategy(private val context: Context, private val apis: IMogoService }) } + + companion object { + const val MSG_FRONT_DISTANCE_CHECK = 1001 + const val FRONT_DISTANCE_CHECK_DELAY = 30_000L + } + + private val handler = Handler(Handler.Callback { + if (it.what == MSG_FRONT_DISTANCE_CHECK) { + frontDistance = -1 + true + } else { + false + } + }) + + @Volatile + private var frontDistance: Int = -1 + fun refreshFrontDistance(distance: Int) { + handler.removeMessages(MSG_FRONT_DISTANCE_CHECK) + frontDistance = distance + handler.sendEmptyMessageDelayed(MSG_FRONT_DISTANCE_CHECK, FRONT_DISTANCE_CHECK_DELAY) + } } \ No newline at end of file diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java index 0953142c53..363a23a088 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoADASController.java @@ -75,4 +75,16 @@ public interface IMogoADASController extends IProvider { * @param json */ void notifyAdas( String json ); + + /** + * 添加adas数据回调接口 + * @param callback 回调接口 + */ + void addAdasDataCallback(IMogoAdasDataCallback callback); + + /** + * 移除adas数据回调接口 + * @param callback 待移除的callback + */ + void removeAdasDataCallback(IMogoAdasDataCallback callback); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java new file mode 100644 index 0000000000..f9774450ca --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/adas/IMogoAdasDataCallback.java @@ -0,0 +1,14 @@ +package com.mogo.service.adas; + +/** + * adas 数据回调接口 + * + * @author tongchenfei + */ +public interface IMogoAdasDataCallback { + /** + * adas 数据回调 + * @param msg 具体数据 + */ + void onAdasDataCallback(String msg); +} diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java index 05d216b9b7..66412050c5 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/adas/MogoADASController.java @@ -13,6 +13,7 @@ import com.mogo.map.uicontroller.EnumMapUI; import com.mogo.module.common.utils.CarSeries; import com.mogo.service.MogoServicePaths; import com.mogo.service.adas.IMogoADASController; +import com.mogo.service.adas.IMogoAdasDataCallback; import com.mogo.service.impl.singleton.SingletonsHolder; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.utils.UiThreadHandler; @@ -24,9 +25,11 @@ import com.zhidao.adasconfig.common.config.EnumCarHeading; import com.zhidao.adasconfig.common.config.EnumSkinStyle; import com.zhidao.autopilot.support.api.AutopilotServiceManage; import com.zhidao.autopilot.support.api.IAutopilotServiceStatusListener; +import com.zhidao.autopilot.support.api.IAutopolitDataCallBack; import org.json.JSONObject; +import java.util.ArrayList; import java.util.List; import static com.mogo.module.common.utils.SPConst.getSpGuide; @@ -54,6 +57,8 @@ public class MogoADASController implements IMogoADASController { private IMogoStatusManager mStatusManager = SingletonsHolder.get( IMogoStatusManager.class ); + private List adasDataCallbackList = new ArrayList<>(); + private boolean mIsReleased = true; @Override @@ -90,6 +95,12 @@ public class MogoADASController implements IMogoADASController { } ); invokeShowADASOperation(); + AutopilotServiceManage.getInstance().registerAutopilotDataListener(msg -> { + Logger.d(TAG, "收到adas数据回调: " + msg); + for (IMogoAdasDataCallback callback : adasDataCallbackList) { + callback.onAdasDataCallback(msg); + } + }); } private void invokeShowADASOperation() { @@ -220,6 +231,16 @@ public class MogoADASController implements IMogoADASController { } } + @Override + public void addAdasDataCallback(IMogoAdasDataCallback callback) { + adasDataCallbackList.add(callback); + } + + @Override + public void removeAdasDataCallback(IMogoAdasDataCallback callback) { + adasDataCallbackList.remove(callback); + } + @Override public void release() { mIsReleased = true;