diff --git a/app_ipc_monitoring/src/main/AndroidManifest.xml b/app_ipc_monitoring/src/main/AndroidManifest.xml index 68c61efc7b..eff7016ee7 100644 --- a/app_ipc_monitoring/src/main/AndroidManifest.xml +++ b/app_ipc_monitoring/src/main/AndroidManifest.xml @@ -32,6 +32,7 @@ queue; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ", Locale.getDefault()); private Future future; - // private final List listeners = new ArrayList<>(); - private OnAdasClientListener listener; + private Pair listener; private volatile boolean isCutDown = true;//是否缩短日志显示 private DataDistribution() { @@ -57,17 +60,16 @@ public class DataDistribution { return INSTANCE; } - public void registerOnAdasClientListener(OnAdasClientListener listener) { - this.listener = null; + public void registerAdasClientListener(Pair listener) { this.listener = listener; -// if (!listeners.contains(listener)) { -// listeners.add(listener); -// } } -// public void unregisterOnAdasClientListener(OnAdasClientListener listener) { -// listeners.remove(listener); -// } + public void unregisterAdasClientListener(Pair listener) { + if (this.listener != null && listener != null) + if (listener.second.hashCode() == this.listener.second.hashCode()) { + this.listener = null; + } + } public void addData(BaseInfo info) { @@ -102,13 +104,13 @@ public class DataDistribution { public final List listMogoReportMessage = new ArrayList<>(); public final List listPerceptionTrafficLight = new ArrayList<>(); public final List listPredictionObstacleTrajectory = new ArrayList<>(); - public final List listBasicInfoReq = new ArrayList<>(); public final List listRecordPanel = new ArrayList<>(); public final List listGlobalPathResp = new ArrayList<>(); public final List listWarn = new ArrayList<>(); public final List listArrivalNotification = new ArrayList<>(); public final List listErrorData = new ArrayList<>(); public final List listPointCloud = new ArrayList<>(); + public final List listPlanningObjects = new ArrayList<>(); public String cutDown(String str) { if (isCutDown && str.length() > 650) { @@ -125,207 +127,128 @@ public class DataDistribution { if (listTrajectory.size() > LIST_SIZE) { listTrajectory.remove(listTrajectory.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_TRAJECTORY.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof TrackedObjects) { listTrackedObjects.add(0, time + str); if (listTrackedObjects.size() > LIST_SIZE) { listTrackedObjects.remove(listTrackedObjects.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_TRACKED_OBJECTS.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof MyPointCloud) { listPointCloud.add(0, time + str); if (listPointCloud.size() > LIST_SIZE) { listPointCloud.remove(listPointCloud.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_POINT_CLOUD.equals(listener.first)) { + listener.second.onRefresh(); + } + } else if (data instanceof PlanningObjects) { + listPlanningObjects.add(0, time + str); + if (listPlanningObjects.size() > LIST_SIZE) { + listPlanningObjects.remove(listPlanningObjects.size() - 1); + } + if (listener != null && Constants.TITLE.RECEIVE_PLANNING_OBJECTS.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof GnssInfo) { listGnssInfo.add(0, time + str); if (listGnssInfo.size() > LIST_SIZE) { listGnssInfo.remove(listGnssInfo.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_GNSS_INFO.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof VehicleState) { listVehicleState.add(0, time + str); if (listVehicleState.size() > LIST_SIZE) { listVehicleState.remove(listVehicleState.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_VEHICLE_STATE.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof AutopilotState) { listAutopilotState.add(0, time + str); if (listAutopilotState.size() > LIST_SIZE) { listAutopilotState.remove(listAutopilotState.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_AUTOPILOT_STATE.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof MogoReportMessage) { listMogoReportMessage.add(0, time + str); if (listMogoReportMessage.size() > LIST_SIZE) { listMogoReportMessage.remove(listMogoReportMessage.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_REPORT_MESSAGE.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof PerceptionTrafficLight) { listPerceptionTrafficLight.add(0, time + str); if (listPerceptionTrafficLight.size() > LIST_SIZE) { listPerceptionTrafficLight.remove(listPerceptionTrafficLight.size() - 1); } - if (listener != null) { - listener.onPerceptionTrafficLight((PerceptionTrafficLight) data); + if (listener != null && Constants.TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT.equals(listener.first)) { + listener.second.onPerceptionTrafficLight((PerceptionTrafficLight) data); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onPerceptionTrafficLight((PerceptionTrafficLight) data); -// } -// } } else if (data instanceof PredictionObstacleTrajectory) { listPredictionObstacleTrajectory.add(0, time + str); if (listPredictionObstacleTrajectory.size() > LIST_SIZE) { listPredictionObstacleTrajectory.remove(listPredictionObstacleTrajectory.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof BasicInfoReq) { - listBasicInfoReq.add(0, time + str); - if (listBasicInfoReq.size() > LIST_SIZE) { - listBasicInfoReq.remove(listBasicInfoReq.size() - 1); - } - if (listener != null) { - listener.onRefresh(); - } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } + } else if (data instanceof CarConfigResp) { - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.TITLE_CAR_CONFIG_RESP.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof RecordPanel) { listRecordPanel.add(0, time + str); if (listRecordPanel.size() > LIST_SIZE) { listRecordPanel.remove(listRecordPanel.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_RECORD_RESULT.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof GlobalPathResp) { listGlobalPathResp.add(0, time + str); if (listGlobalPathResp.size() > LIST_SIZE) { listGlobalPathResp.remove(listGlobalPathResp.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_GLOBAL_PATH_RESP.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof Warn) { listWarn.add(0, time + str); if (listWarn.size() > LIST_SIZE) { listWarn.remove(listWarn.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_WARN.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof ArrivalNotification) { listArrivalNotification.add(0, time + str); if (listArrivalNotification.size() > LIST_SIZE) { listArrivalNotification.remove(listArrivalNotification.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_ARRIVAL_NOTIFICATION.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } else if (data instanceof ErrorData) { listErrorData.add(0, time + str); if (listErrorData.size() > 100) { listErrorData.remove(listErrorData.size() - 1); } - if (listener != null) { - listener.onRefresh(); + if (listener != null && Constants.TITLE.RECEIVE_ERROR.equals(listener.first)) { + listener.second.onRefresh(); } -// if (!listeners.isEmpty()) { -// for (OnAdasClientListener listener : listeners) { -// listener.onRefresh(); -// } -// } } - return temp; } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseFragment.java index bdb8d6d1c5..0516493d30 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseFragment.java @@ -3,6 +3,7 @@ package com.zhidao.adas.client.base; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.util.Pair; import android.view.View; import androidx.annotation.NonNull; @@ -42,17 +43,25 @@ public abstract class BaseFragment extends Fragment { initHandler(); } - @Override public void onResume() { super.onResume(); - DataDistribution.getInstance().registerOnAdasClientListener(adasClientListener); + if (!isHidden()) + DataDistribution.getInstance().registerAdasClientListener(new Pair<>(title, adasClientListener)); } @Override public void onPause() { super.onPause(); -// DataDistribution.getInstance().unregisterOnAdasClientListener(adasClientListener); + DataDistribution.getInstance().unregisterAdasClientListener(new Pair<>(title, adasClientListener)); + } + + @Override + public void onHiddenChanged(boolean hidden) { + super.onHiddenChanged(hidden); + if (!hidden) { + DataDistribution.getInstance().registerAdasClientListener(new Pair<>(title, adasClientListener)); + } } @@ -185,7 +194,8 @@ public abstract class BaseFragment extends Fragment { protected void handleMessage(Message msg) { switch (msg.what) { case WHAT_REFRESH: - onRefreshView(); + if (isVisible()) + onRefreshView(); break; } } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PlanningObjects.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PlanningObjects.java new file mode 100644 index 0000000000..cc124d82c9 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/PlanningObjects.java @@ -0,0 +1,21 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class PlanningObjects extends BaseInfo { + public final MessagePad.PlanningObjects bean; + + public PlanningObjects(MessagePad.Header header, MessagePad.PlanningObjects bean) { + super("接收", bean.getSerializedSize(), header); + this.bean = bean; + } + + + @Override + public String toString() { + return super.toString() + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java index 31bff8d2bc..c49b03a313 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java @@ -4,6 +4,7 @@ import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.os.Message; +import android.util.Pair; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; @@ -20,17 +21,16 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.zhidao.adas.client.DataDistribution; import com.zhidao.adas.client.OnAdasClientListener; import com.zhidao.adas.client.R; import com.zhidao.adas.client.adapter.AutopilotConfigAdapter; import com.zhidao.adas.client.base.BaseActivity; -import com.zhidao.adas.client.bean.UpdateDataEvent; import com.zhidao.adas.client.bean.AutoPilotMode; -import com.zhidao.adas.client.DataDistribution; +import com.zhidao.adas.client.bean.UpdateDataEvent; import com.zhidao.adas.client.utils.Constants; import com.zhidao.support.adas.high.common.ThreadPoolManager; - import org.greenrobot.eventbus.EventBus; import java.util.List; @@ -38,6 +38,7 @@ import java.util.List; public class AutopilotConfigActivity extends BaseActivity { private static final String TAG = "CreateActivity"; + private Pair listenerPair; private TextView toolbar_title; private RecyclerView recyclerView; private AutopilotConfigAdapter autopilotConfigAdapter; @@ -66,6 +67,7 @@ public class AutopilotConfigActivity extends BaseActivity { getSupportActionBar().setHomeButtonEnabled(true); //设置返回键可用 initHandler(); initRecyclerView(); + listenerPair = new Pair<>(Constants.TITLE.RECEIVE_GNSS_INFO, listener); toolbar_title.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { @@ -80,6 +82,15 @@ public class AutopilotConfigActivity extends BaseActivity { protected void onResume() { super.onResume(); init(); + DataDistribution.getInstance().registerAdasClientListener(new Pair<>(Constants.TITLE.RECEIVE_GNSS_INFO, listener)); + + } + + @Override + protected void onPause() { + super.onPause(); + DataDistribution.getInstance().unregisterAdasClientListener(new Pair<>(Constants.TITLE.RECEIVE_GNSS_INFO, listener)); + } private void init() { @@ -148,17 +159,6 @@ public class AutopilotConfigActivity extends BaseActivity { ThreadPoolManager.getsInstance().execute(runnable); } - @Override - protected void onStart() { - super.onStart(); - DataDistribution.getInstance().registerOnAdasClientListener(listener); - } - - @Override - protected void onStop() { - super.onStop(); -// DataDistribution.getInstance().unregisterOnAdasClientListener(listener); - } @Override protected void onDestroy() { diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java index 228d323015..484b743dc3 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java @@ -20,7 +20,6 @@ import com.zhidao.adas.client.adapter.DataShowAdapter; import com.zhidao.adas.client.base.BaseFragment; import com.zhidao.adas.client.utils.Constants; import com.zhidao.adas.client.utils.MyLinearLayoutManager; -import com.zhidao.support.adas.high.AdasManager; /** * @author song kenan @@ -142,7 +141,9 @@ public class InfoFragment extends BaseFragment { case Constants.TITLE.RECEIVE_POINT_CLOUD: adapter.setData(DataDistribution.getInstance().listPointCloud); break; - + case Constants.TITLE.RECEIVE_PLANNING_OBJECTS: + adapter.setData(DataDistribution.getInstance().listPlanningObjects); + break; case Constants.TITLE.RECEIVE_ERROR: adapter.setData(DataDistribution.getInstance().listErrorData); break; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index 9434e4b24d..1268018481 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -32,6 +32,7 @@ import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.AppCompatButton; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.recyclerview.widget.GridLayoutManager; @@ -50,6 +51,7 @@ import com.zhidao.adas.client.R; import com.zhidao.adas.client.adapter.InfoTitleAdapter; import com.zhidao.adas.client.base.BaseActivity; import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.base.BaseFragment; import com.zhidao.adas.client.bean.ArrivalNotification; import com.zhidao.adas.client.bean.AutopilotState; import com.zhidao.adas.client.bean.BasicInfoReq; @@ -61,6 +63,7 @@ import com.zhidao.adas.client.bean.IPCConnectState; import com.zhidao.adas.client.bean.MogoReportMessage; import com.zhidao.adas.client.bean.MyPointCloud; import com.zhidao.adas.client.bean.PerceptionTrafficLight; +import com.zhidao.adas.client.bean.PlanningObjects; import com.zhidao.adas.client.bean.PredictionObstacleTrajectory; import com.zhidao.adas.client.bean.RecordPanel; import com.zhidao.adas.client.bean.TrackedObjects; @@ -86,7 +89,9 @@ import java.net.NetworkInterface; import java.net.SocketException; import java.util.ArrayList; import java.util.Enumeration; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import chassis.VehicleStateOuterClass; @@ -129,26 +134,9 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas private final List titleFragmentData = new ArrayList<>(); private final List titleBtnData = new ArrayList<>(); private final List connectStatusList = new ArrayList<>(); - private InfoTitleAdapter btnAdapter; private InfoTitleAdapter fragmentAdapter; - - private InfoFragment carFragment; - private InfoFragment viewFragment; - private InfoFragment canFragment; - private InfoFragment autoFragment; - private InfoFragment warnFragment; - private InfoFragment trajectoryFragment; - private InfoFragment autopilotWayArriveFragment; - private InfoFragment autopilotRouteFragment; - private InfoFragment badcseFragment; - private InfoFragment errorFragment; - private InfoFragment reportMessageFragment; - private InfoFragment perceptionTrafficLightFragment; - private InfoFragment predictionObstacleTrajectoryFragment; - private InfoFragment pointCloudFragment; - private VersionFragment versionFragment; + private Fragment fromFragment; private FragmentManager manager; - private FragmentTransaction transaction; private String ftpTime; private boolean isPad; private long recordKey; @@ -181,8 +169,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas if (!isPad) getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); initView(); - firstFragment(); - + showFragment(Constants.TITLE.RECEIVE_GNSS_INFO); initAdas(); connectStatus = AdasManager.getInstance().getIpcConnectionStatus(); onUpdateConnectStateView(); @@ -331,7 +318,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas //初始化fragment manager = getSupportFragmentManager(); - transaction = manager.beginTransaction(); cb_print.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -523,21 +509,22 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas titleFragmentData.add(Constants.TITLE.RECEIVE_GNSS_INFO); titleFragmentData.add(Constants.TITLE.RECEIVE_TRAJECTORY); titleFragmentData.add(Constants.TITLE.RECEIVE_TRACKED_OBJECTS); - titleFragmentData.add(Constants.TITLE.RECEIVE_POINT_CLOUD); titleFragmentData.add(Constants.TITLE.RECEIVE_VEHICLE_STATE); titleFragmentData.add(Constants.TITLE.RECEIVE_AUTOPILOT_STATE); titleFragmentData.add(Constants.TITLE.RECEIVE_REPORT_MESSAGE); titleFragmentData.add(Constants.TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT); titleFragmentData.add(Constants.TITLE.RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY); + titleFragmentData.add(Constants.TITLE.RECEIVE_POINT_CLOUD); + titleFragmentData.add(Constants.TITLE.RECEIVE_PLANNING_OBJECTS); titleFragmentData.add(Constants.TITLE.RECEIVE_CAR_CONFIG_RESP); titleFragmentData.add(Constants.TITLE.RECEIVE_RECORD_RESULT); titleFragmentData.add(Constants.TITLE.RECEIVE_GLOBAL_PATH_RESP); - titleFragmentData.add(Constants.TITLE.RECEIVE_WARN); titleFragmentData.add(Constants.TITLE.RECEIVE_ARRIVAL_NOTIFICATION); + titleFragmentData.add(Constants.TITLE.RECEIVE_WARN); titleFragmentData.add(Constants.TITLE.RECEIVE_ERROR); - titleBtnData.add("启动自动驾驶"); + titleBtnData.add("自动驾驶模式"); titleBtnData.add("自动驾驶路径查询"); titleBtnData.add("下发SN"); titleBtnData.add("数据采集5秒"); @@ -563,7 +550,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas if (animatorInfo != null) animatorInfo.setSupportsChangeAnimations(false); //创建并设置Adapter - btnAdapter = new InfoTitleAdapter(titleBtnData, false); + InfoTitleAdapter btnAdapter = new InfoTitleAdapter(titleBtnData, false); infoBtn.setAdapter(btnAdapter); btnAdapter.setOnItemClickListener(this); } @@ -603,128 +590,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onItemClick(int position, String data) { fragmentAdapter.setSelectedPosition(position); - manager = getSupportFragmentManager(); - transaction = manager.beginTransaction(); - switch (data) { - case Constants.TITLE.RECEIVE_GNSS_INFO: - firstFragment(); - break; - case Constants.TITLE.RECEIVE_VEHICLE_STATE: - if (canFragment == null) - canFragment = new InfoFragment(data); - if (!canFragment.isVisible()) { - transaction.replace(R.id.fl_info, canFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_TRACKED_OBJECTS: -// hintTrackedObjects(false); - if (viewFragment == null) - viewFragment = new InfoFragment(data); - if (!viewFragment.isVisible()) { - transaction.replace(R.id.fl_info, viewFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_AUTOPILOT_STATE: - if (autoFragment == null) - autoFragment = new InfoFragment(data); - if (!autoFragment.isVisible()) { - transaction.replace(R.id.fl_info, autoFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_WARN: - if (warnFragment == null) - warnFragment = new InfoFragment(data); - if (!warnFragment.isVisible()) { - transaction.replace(R.id.fl_info, warnFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_TRAJECTORY: - if (trajectoryFragment == null) - trajectoryFragment = new InfoFragment(data); - if (!trajectoryFragment.isVisible()) { - transaction.replace(R.id.fl_info, trajectoryFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_ARRIVAL_NOTIFICATION: - if (autopilotWayArriveFragment == null) - autopilotWayArriveFragment = new InfoFragment(data); - if (!autopilotWayArriveFragment.isVisible()) { - transaction.replace(R.id.fl_info, autopilotWayArriveFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_GLOBAL_PATH_RESP: - if (autopilotRouteFragment == null) - autopilotRouteFragment = new InfoFragment(data); - if (!autopilotRouteFragment.isVisible()) { - transaction.replace(R.id.fl_info, autopilotRouteFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_RECORD_RESULT: - if (badcseFragment == null) - badcseFragment = new InfoFragment(data); - if (!badcseFragment.isVisible()) { - transaction.replace(R.id.fl_info, badcseFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_REPORT_MESSAGE: - if (reportMessageFragment == null) - reportMessageFragment = new InfoFragment(data); - if (!reportMessageFragment.isVisible()) { - transaction.replace(R.id.fl_info, reportMessageFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT: - if (perceptionTrafficLightFragment == null) - perceptionTrafficLightFragment = new InfoFragment(data); - if (!perceptionTrafficLightFragment.isVisible()) { - transaction.replace(R.id.fl_info, perceptionTrafficLightFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY: - if (predictionObstacleTrajectoryFragment == null) - predictionObstacleTrajectoryFragment = new InfoFragment(data); - if (!predictionObstacleTrajectoryFragment.isVisible()) { - transaction.replace(R.id.fl_info, predictionObstacleTrajectoryFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_POINT_CLOUD: - if (pointCloudFragment == null) - pointCloudFragment = new InfoFragment(data); - if (!pointCloudFragment.isVisible()) { - transaction.replace(R.id.fl_info, pointCloudFragment); - transaction.commit(); - } - break; - case Constants.TITLE.RECEIVE_CAR_CONFIG_RESP: - AdasManager.getInstance().sendCarConfigReq(); - if (versionFragment == null) - versionFragment = new VersionFragment("工控机版本\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t固定IP配置"); - if (!versionFragment.isVisible()) { - transaction.replace(R.id.fl_info, versionFragment); - transaction.commit(); - } - break; - - case Constants.TITLE.RECEIVE_ERROR: - if (errorFragment == null) - errorFragment = new InfoFragment(data); - if (!errorFragment.isVisible()) { - transaction.replace(R.id.fl_info, errorFragment); - transaction.commit(); - } - break; - } + showFragment(data); } }); } @@ -878,11 +744,17 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas // LogSave.getInstance().saveLog("转换数据=" + data); } + @Override + public void onPlanningObjects(MessagePad.Header header, MessagePad.PlanningObjects planningObjects) { + PlanningObjects base = new PlanningObjects(header, planningObjects); + DataDistribution.getInstance().addData(base); + } + @Override public void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq) { BasicInfoReq info = new BasicInfoReq(header, basicInfoReq); DataDistribution.getInstance().addData(info); - AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); + AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 0); showToastCenter("收到车机基础信息请求:" + info.toString()); } @@ -1087,13 +959,28 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas >= Configuration.SCREENLAYOUT_SIZE_LARGE; } - private void firstFragment() { - if (carFragment == null) - carFragment = new InfoFragment(Constants.TITLE.RECEIVE_GNSS_INFO); - if (!carFragment.isVisible()) { - transaction.replace(R.id.fl_info, carFragment); - transaction.commit(); + private void showFragment(String title) { + Fragment to = manager.findFragmentByTag(title); + if (to == null) { + if (Constants.TITLE.RECEIVE_CAR_CONFIG_RESP.equals(title)) { + to = new VersionFragment(Constants.TITLE.TITLE_CAR_CONFIG_RESP); + } else { + to = new InfoFragment(title); + } } + FragmentTransaction transaction = manager.beginTransaction(); + if (fromFragment != null) { + transaction.hide(fromFragment); + } + if (!to.isAdded()) { + transaction.add(R.id.fl_info, to, title).commit(); + } else { + transaction.show(to).commit(); + } + if (Constants.TITLE.RECEIVE_CAR_CONFIG_RESP.equals(title)) { + AdasManager.getInstance().sendCarConfigReq(); + } + fromFragment = to; } @Override @@ -1104,6 +991,15 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } switch (position) { case 0: +// MessagePad.Line.Builder line = MessagePad.Line.newBuilder(); +// line.setLineId(10); +// line.setTrajUrl("我是TrajUrl"); +// line.setTrajMd5("我是TrajMd5"); +// line.setStopUrl("我是StopUrl"); +// line.setStopMd5("我是StopMd5"); +// line.setTimestamp(60); +// line.setVehicleModel("我是VehicleModel"); +// AdasManager.getInstance().sendTrajectoryDownloadReq(line.build()); if (autoPilotModeDialog == null) { autoPilotModeDialog = new AutoPilotModeDialog(this); } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java index deaaab40ac..a150e0619c 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/VersionFragment.java @@ -25,11 +25,15 @@ import com.zhidao.adas.client.base.BaseFragment; import com.zhidao.adas.client.bean.Config; import com.zhidao.support.adas.high.AdasManager; import com.zhidao.support.adas.high.bean.VersionCompatibility; +import com.zhidao.support.adas.high.common.Constants; import com.zhidao.support.adas.high.common.CupidLogUtils; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Locale; import mogo.telematics.pad.MessagePad; @@ -37,6 +41,7 @@ import mogo.telematics.pad.MessagePad; * @des 升级页面 */ public class VersionFragment extends BaseFragment { + private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ", Locale.getDefault()); public VersionFragment() { } @@ -159,6 +164,7 @@ public class VersionFragment extends BaseFragment { temp = ip + ":" + AdasManager.getInstance().getIpcConnectedPort(); } MessagePad.CarConfigResp adasConfig = AdasManager.getInstance().getCarConfig(); + list.add(new Config("更新时间:", AdasManager.getInstance().getIpcConnectionStatus() == Constants.IPC_CONNECTION_STATUS.CONNECTED ? sdf.format(new Date()) : null)); list.add(new Config("工控机IP:", temp)); list.add(new Config("工控机版本:", adasConfig == null ? null : adasConfig.getDockVersion())); list.add(new Config("车牌号:", adasConfig == null ? null : adasConfig.getPlateNumber())); diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java index 0a3c5498fa..190534fcc3 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java @@ -152,8 +152,10 @@ public class Constants { String RECEIVE_PERCEPTION_TRAFFIC_LIGHT = "感知红绿灯"; String RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY = "他车轨迹预测"; String RECEIVE_POINT_CLOUD = "点云透传"; + String RECEIVE_PLANNING_OBJECTS = "Planning障碍物"; // String RECEIVE_BASIC_INFO_REQ = "自动驾驶设备基础信息请求"; + String TITLE_CAR_CONFIG_RESP = "工控机版本\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t固定IP配置"; String RECEIVE_CAR_CONFIG_RESP = "信息与配置"; String RECEIVE_RECORD_RESULT = "数据采集结果"; String RECEIVE_GLOBAL_PATH_RESP = "自动驾驶路径"; diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/CrashHandler.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/CrashHandler.java new file mode 100644 index 0000000000..86a38c657a --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/CrashHandler.java @@ -0,0 +1,291 @@ +package com.zhidao.adas.client.utils; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Build; +import android.os.Environment; +import android.os.Looper; +import android.util.Log; +import android.widget.Toast; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.io.Writer; +import java.lang.Thread.UncaughtExceptionHandler; +import java.lang.reflect.Field; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + + +/** + * ClassName: CrashHandler + * Function: UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告. + * + * @author Norris Norris.sly@gmail.com + * @Date 2013 2013-3-24 下午12:27:10 + * @Fields ────────────────────────────────────────────────────────────────────────────────────────────────────── + * @Methods ────────────────────────────────────────────────────────────────────────────────────────────────────── + * 2013-3-24下午12:27:10 Modified By Norris + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + * @see ────────────────────────────────────────────────────────────────────────────────────────────────────── + * @since Ver 1.0 I used to be a programmer like you, then I took an arrow in the knee + */ +public class CrashHandler implements UncaughtExceptionHandler { + private static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "IPCMonitoring" + File.separator + "Crash" + File.separator;//程序外部存储跟目录 + /** + * Log日志的tag + * String : TAG + * + * @since 2013-3-21下午8:44:28 + */ + private static final String TAG = "NorrisInfo"; + /** + * 系统默认的UncaughtException处理类 + * Thread.UncaughtExceptionHandler : mDefaultHandler + * + * @since 2013-3-21下午8:44:43 + */ + private UncaughtExceptionHandler mDefaultHandler; + /** + * CrashHandler实例 + * CrashHandler : mInstance + * + * @since 2013-3-21下午8:44:53 + */ + private static CrashHandler mInstance = new CrashHandler(); + /** + * 程序的Context对象 + * Context : mContext + * + * @since 2013-3-21下午8:45:02 + */ + private Context mContext; + /** + * 用来存储设备信息和异常信息 + * Map : mLogInfo + * + * @since 2013-3-21下午8:46:15 + */ + private final Map mLogInfo = new HashMap(); + /** + * 用于格式化日期,作为日志文件名的一部分(FIXME 注意在windows下文件名无法使用:等符号!) + * SimpleDateFormat : mSimpleDateFormat + * + * @since 2013-3-21下午8:46:39 + */ + private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyyMMdd_HH-mm-ss"); + + /** + * Creates a new instance of CrashHandler. + */ + private CrashHandler() { + } + + /** + * getInstance:{获取CrashHandler实例 ,单例模式 } + * ────────────────────────────────── + * + * @return CrashHandler + * @throws + * @since I used to be a programmer like you, then I took an arrow in the knee Ver 1.0 + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + * 2013-3-21下午8:52:24 Modified By Norris + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + */ + public static CrashHandler getInstance() { + return mInstance; + } + + /** + * init:{初始化} + * ────────────────────────────────── + * + * @param paramContext + * @return void + * @throws + * @since I used to be a programmer like you, then I took an arrow in the knee Ver 1.0 + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + * 2013-3-21下午8:52:45 Modified By Norris + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + */ + public void init(Context paramContext) { + mContext = paramContext; + // 获取系统默认的UncaughtException处理器 + mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); + // 设置该CrashHandler为程序的默认处理器 + Thread.setDefaultUncaughtExceptionHandler(this); + } + + /** + * 当UncaughtException发生时会转入该重写的方法来处理 + * (non-Javadoc) + * + * @see UncaughtExceptionHandler#uncaughtException(Thread, Throwable) + */ + public void uncaughtException(Thread paramThread, Throwable paramThrowable) { + // 获取设备参数信息 + getDeviceInfo(mContext); +// mLogInfo.put("versionName", String.valueOf(BuildConfig.VERSION_CODE)); +// mLogInfo.put("versionCode", BuildConfig.VERSION_NAME); + // 保存日志文件 + String result = saveCrashLogToFile(paramThrowable); + mDefaultHandler.uncaughtException(paramThread, paramThrowable); +// if (!handleException(paramThrowable) && mDefaultHandler != null) { +// // 如果自定义的没有处理则让系统默认的异常处理器来处理 +// mDefaultHandler.uncaughtException(paramThread, paramThrowable); +// } else { +//// try { +//// // 如果处理了,让程序继续运行1秒再退出,保证文件保存并上传到服务器 +//// paramThread.sleep(1000); +//// } catch (InterruptedException e) { +//// e.printStackTrace(); +//// } +// // 退出程序 +// android.os.Process.killProcess(android.os.Process.myPid()); +// System.exit(1); +// } + } + + /** + * handleException:{自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.} + * ────────────────────────────────── + * + * @param paramThrowable + * @return true:如果处理了该异常信息;否则返回false. + * @throws + * @since I used to be a programmer like you, then I took an arrow in the knee Ver 1.0 + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + * 2013-3-24下午12:28:53 Modified By Norris + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + */ + public boolean handleException(Throwable paramThrowable) { + if (paramThrowable == null) + return false; + new Thread() { + public void run() { + Looper.prepare(); + Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出", Toast.LENGTH_SHORT).show(); + Looper.loop(); + } + }.start(); + // 获取设备参数信息 + getDeviceInfo(mContext); + // 保存日志文件 + String result = saveCrashLogToFile(paramThrowable); + //上传崩溃日志 + return true; + } + + /** + * getDeviceInfo:{获取设备参数信息} + * ────────────────────────────────── + * + * @param paramContext + * @throws + * @since I used to be a programmer like you, then I took an arrow in the knee Ver 1.0 + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + * 2013-3-24下午12:30:02 Modified By Norris + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + */ + public void getDeviceInfo(Context paramContext) { + try { + // 获得包管理器 + PackageManager mPackageManager = paramContext.getPackageManager(); + // 得到该应用的信息,即主Activity + PackageInfo mPackageInfo = mPackageManager.getPackageInfo( + paramContext.getPackageName(), PackageManager.GET_ACTIVITIES); + if (mPackageInfo != null) { + String versionName = mPackageInfo.versionName == null ? "null" + : mPackageInfo.versionName; + String versionCode = mPackageInfo.versionCode + ""; + mLogInfo.put("versionName", versionName); + mLogInfo.put("versionCode", versionCode); + } + } catch (NameNotFoundException e) { + e.printStackTrace(); + } + // 反射机制 + Field[] mFields = Build.class.getDeclaredFields(); + // 迭代Build的字段key-value 此处的信息主要是为了在服务器端手机各种版本手机报错的原因 + for (Field field : mFields) { + try { + field.setAccessible(true); + mLogInfo.put(field.getName(), Objects.requireNonNull(field.get("")).toString()); + } catch (IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } + + /** + * saveCrashLogToFile:{将崩溃的Log保存到本地} + * TODO 可拓展,将Log上传至指定服务器路径 + * ────────────────────────────────── + * + * @param paramThrowable + * @return FileName + * @throws + * @since I used to be a programmer like you, then I took an arrow in the knee Ver 1.0 + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + * 2013-3-24下午12:31:01 Modified By Norris + * ────────────────────────────────────────────────────────────────────────────────────────────────────── + */ + + + private String saveCrashLogToFile(Throwable paramThrowable) { + StringBuffer mStringBuffer = new StringBuffer(); + for (Map.Entry entry : mLogInfo.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + mStringBuffer.append(key + "=" + value + "\r\n"); + } + Writer mWriter = new StringWriter(); + PrintWriter mPrintWriter = new PrintWriter(mWriter); + paramThrowable.printStackTrace(mPrintWriter); + paramThrowable.printStackTrace(); + Throwable mThrowable = paramThrowable.getCause(); + // 迭代栈队列把所有的异常信息写入writer中 + while (mThrowable != null) { + mThrowable.printStackTrace(mPrintWriter); + // 换行 每个个异常栈之间换行 + mThrowable = mThrowable.getCause(); + } + + //记得关闭 + + String mResult = mWriter.toString(); + // String mResult = mWriter.toString().replace("\n", "").replace(":", "").replace("/", "").replace("\t", ""); + mStringBuffer.append(mResult); + // 保存文件,设置文件名 + String mTime = mSimpleDateFormat.format(new Date()); + String mFileName = mContext.getPackageName() + "_Exception-" + mTime + ".log"; + if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { + try { + File mDirectory = new File(FILE_PATH); + Log.v(TAG, mDirectory.toString()); + if (!mDirectory.exists()) + mDirectory.mkdirs(); + FileOutputStream mFileOutputStream = new FileOutputStream(mDirectory + File.separator + mFileName); + mFileOutputStream.write(mStringBuffer.toString().getBytes()); + mFileOutputStream.close(); + return mResult; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return mResult; + } + + +} diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 129f809740..43db57e5bd 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -8,6 +8,7 @@ import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.autopilot.toAutoPilotLine import com.mogo.eagle.core.data.autopilot.toRouteInfo import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MoGoConfig @@ -262,6 +263,10 @@ class MoGoAutopilotProvider : ) } + override fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { + AdasManager.getInstance().sendTrajectoryDownloadReq(autoPilotLine.toAutoPilotLine()) + } + override fun cancelAutoPilot() { if (AdasManager.getInstance().ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.CONNECTED) { AdasManager.getInstance().sendAutoPilotModeReq(0, 1, null) diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt index 1f04dccb81..64ec6de46d 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -247,6 +247,13 @@ class MoGoAdasListenerImpl : OnAdasListener { CallerAutopilotPointCloudListenerManager.invokeAutopilotPointCloudDataUpdate(header,pointCloud) } + override fun onPlanningObjects( + header: MessagePad.Header?, + planningObjects: MessagePad.PlanningObjects? + ) { + //planning障碍物 + } + override fun onBasicInfoReq( header: MessagePad.Header, basicInfoReq: MessagePad.BasicInfoReq? diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt index 4c7f594317..2345c60145 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotControlParameters.kt @@ -1,10 +1,9 @@ package com.mogo.eagle.core.data.autopilot -import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat import mogo.telematics.pad.MessagePad /** - * @author donghongyu + * @author donghongyuO * @since 2021/09/22 * * @@ -32,7 +31,7 @@ import mogo.telematics.pad.MessagePad * } */ -fun AutopilotControlParameters.toRouteInfo(): MessagePad.RouteInfo{ +fun AutopilotControlParameters.toRouteInfo(): MessagePad.RouteInfo { val routeInfo = MessagePad.RouteInfo.newBuilder() val startLoc = routeInfo.startLocationBuilder val endLoc = routeInfo.endLocationBuilder @@ -61,27 +60,61 @@ fun AutopilotControlParameters.toRouteInfo(): MessagePad.RouteInfo{ routeInfo.speedLimit = this.speedLimit.toDouble() routeInfo.startLocation = startLoc.build() routeInfo.endLocation = endLoc.build() + + val line = MessagePad.Line.newBuilder() + this.autoPilotLine?.let { + line.lineId = it.lineId + line.trajMd5 = it.trajMd5 + line.trajUrl = it.trajUrl + line.stopMd5 = it.stopMd5 + line.stopUrl = it.stopUrl + line.timestamp = it.timestamp + line.setVehicleModel(it.vehicleModel) + } + + routeInfo.line = line.build() + return routeInfo.build() } +fun AutopilotControlParameters.AutoPilotLine.toAutoPilotLine(): MessagePad.Line { + val line = MessagePad.Line.newBuilder() + line.lineId = this.lineId + line.trajMd5 = this.trajMd5 + line.trajUrl = this.trajUrl + line.stopMd5 = this.stopMd5 + line.stopUrl = this.stopUrl + line.timestamp = this.timestamp + line.vehicleModel = this.vehicleModel + return line.build() +} + class AutopilotControlParameters { @JvmField var startName = "" + @JvmField var endName = "" + @JvmField var startLatLon: AutoPilotLonLat? = null + @JvmField var wayLatLons: List? = null + @JvmField var endLatLon: AutoPilotLonLat? = null - var speedLimit = 0f + @JvmField - var vehicleType // 运营类型 - = 0 + var speedLimit = 0f + + @JvmField + var vehicleType = 0// 运营类型 + @JvmField var routeID = 0 //线路id(bus用) + @JvmField var routeName = "" //线路名称(bus用) @@ -91,6 +124,37 @@ class AutopilotControlParameters { @JvmField var isSpeakVoice = true + @JvmField + var autoPilotLine: AutoPilotLine? = null // 自动驾驶路线 + + class AutoPilotLine { + var lineId = 0L + var trajUrl = "" + var trajMd5 = "" + var stopUrl = "" + var stopMd5 = "" + var timestamp = 0L + var vehicleModel = "" + + constructor(lineId: Long, trajUrl: String, + trajMd5: String, stopUrl: String, + stopMd5: String, timestamp: Long, + vehicleModel: String) { + this.lineId = lineId + this.trajUrl = trajUrl + this.trajMd5 = trajMd5 + this.stopUrl = stopUrl + this.stopMd5 = stopMd5 + this.timestamp = timestamp + this.vehicleModel = vehicleModel + } + + override fun toString(): String { + return "AutoPilotLine(lineId=$lineId, trajUrl='$trajUrl', trajMd5='$trajMd5', stopUrl='$stopUrl', stopMd5='$stopMd5', timestamp=$timestamp, vehicleModel='$vehicleModel')" + } + + } + class AutoPilotLonLat { var lat = 0.0 var lon = 0.0 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt index 1815e0867f..6a0541fe02 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt @@ -34,6 +34,11 @@ interface IMoGoAutopilotProvider : IMoGoFunctionServerProvider { */ fun sendTrafficLightData(trafficLightResult: TrafficLightResult) + /** + * 发送 轨迹下载请求 + */ + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) + /** * 结束自动驾驶 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt index a80d04bf99..9e5ddeecd9 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt @@ -72,6 +72,13 @@ object CallerAutoPilotManager { providerApi?.sendTrafficLightData(trafficLightResult) } + /** + * 发送 轨迹下载请求 + */ + fun sendTrajectoryDownloadReq(autoPilotLine: AutopilotControlParameters.AutoPilotLine) { + providerApi?.sendTrajectoryDownloadReq(autoPilotLine) + } + /** * 结束自动驾驶 */ diff --git a/libraries/mogo-adas-data/src/main/proto/message_pad.proto b/libraries/mogo-adas-data/src/main/proto/message_pad.proto index dffde14f88..b563f7367e 100644 --- a/libraries/mogo-adas-data/src/main/proto/message_pad.proto +++ b/libraries/mogo-adas-data/src/main/proto/message_pad.proto @@ -19,6 +19,7 @@ enum MessageType MsgTypePerceptionTrafficLight = 0x10006; //感知红绿灯 MsgTypePredictionObstacleTrajectory = 0x10007; //他车轨迹预测 MsgTypePointCloud = 0x10008; //点云透传 + MsgTypePlanningObjects = 0x10009; //planning障碍物 MsgTypeBasicInfoReq = 0x10100; //自动驾驶设备基础信息请求 MsgTypeBasicInfoResp = 0x10101; //自动驾驶设备基础信息应答 @@ -36,6 +37,7 @@ enum MessageType MsgTypeWarn = 0x1010d; //预警数据 MsgTypeArrivalNotification = 0x1010e; //到站提醒 MsgTypeSystemCmdReq = 0x1010f; //系统命令请求, 比如系统重启,启用新镜像 + MsgTypeTrajectoryDownloadReq = 0x10110; //轨迹下载请求 } message Header @@ -83,7 +85,7 @@ message TrackedObject double heading = 10; //车辆朝向 double speed = 11; //车辆速度 uint32 drawLevel = 12; //危险等级 1 绿,2 黄,3 红 - double driverTime = 13; //驱动感知时间 + double driverTime = 13; //驱动感知时间, abandoned } message TrackedObjects @@ -112,13 +114,13 @@ message GnssInfo // message definition for MessageType: MsgTypeAutopilotState message AutopilotState { - uint32 state = 1; //0: 不可用, 1:ready, 2:自动驾驶中 + uint32 state = 1; //0: 不可用(abandoned), 1:ready, 2:自动驾驶中 uint32 camera = 2; //camera节点状态 1:开启,0:关闭 uint32 radar = 3; //雷达节点状态 1:开启,0:关闭 uint32 rtk = 4; //RTK节点状态 1:开启,0:关闭 uint32 autopilotMode = 5; //自动驾驶状态 0: 非自动驾驶,1: 自动驾驶 double speed = 6; //惯导车速 m/s - string reason = 7; //不可用原因 + string reason = 7; //不可用原因(abandoned) } // message definition for MessageType: MsgTypeReportMessage @@ -131,7 +133,36 @@ message AutopilotState // refer to prediction.proto // message definition for MessageType: MsgTypePointCloud -// refer to point_cloud.proto +// refer to mogo_point_cloud.proto + +// message definition for MessageType: MsgTypePlanningObjects +message PlanningObject +{ + uint32 uuid = 1; + uint32 type = 2; //影响自车决策的类型, 和感知的障碍物类型不是一回事 +} + +message PlanningObjects +{ + repeated PlanningObject objs = 1; +} + +// message definition for MsgTypeTrajectoryDownloadReq +message Line +{ + uint64 lineId = 1; //路线id,默认-1 + string trajUrl = 2; //轨迹文件下载的cos url,默认“” + string trajMd5 = 3; //轨迹文件md5,默认“” + string stopUrl = 4; //打点文件下载的cos url,默认“” + string stopMd5 = 5; //轨迹文件md5,默认“” + uint64 timestamp = 6; //上传轨迹完成时间戳(ms):用于MEC本地手动导入轨迹验证时不会被云端轨迹覆盖 + string vehicleModel = 7; //车型号(如红旗H9),默认“”,暂不加入校验逻辑、用于人工排查问题 +} + +message TrajectoryDownloadReq +{ + Line line = 1; //路线 +} // message definition for MessageType: MsgTypeBasicInfoReq message BasicInfoReq @@ -162,9 +193,10 @@ message RouteInfo{ repeated Location wayPoints = 5; double speedLimit = 6; //单位: km/h uint32 vehicleType = 7; - bool isSpeakVoice = 8; + bool isSpeakVoice = 8; //abandoned uint32 routeID = 9; string routeName = 10; + Line line = 11; //路线信息 } message SetAutopilotModeReq @@ -280,7 +312,7 @@ message Warn // message definition for MsgTypeArrivalNotification message ArrivalNotification { - uint32 carType = 1; //deserted + uint32 carType = 1; //abandoned Location endLocation = 2; } @@ -292,7 +324,7 @@ enum SystemCmdType { message SystemCmdReq { - SystemCmdType cmdType = 1; + SystemCmdType cmdType = 1; // } @@ -301,3 +333,6 @@ message SystemCmdReq + + + diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 1b10213717..eb90964934 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -16,7 +16,6 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.gson.Gson; import com.google.protobuf.InvalidProtocolBufferException; import com.zhidao.support.adas.high.bean.VersionCompatibility; import com.zhidao.support.adas.high.common.ByteUtil; @@ -40,8 +39,6 @@ import com.zhidao.support.adas.high.thread.DispatchHandler; import com.zhjt.service.chain.ChainLog; import com.zhjt.service.chain.TracingConstants; -import org.json.JSONObject; - import java.util.HashSet; import java.util.Timer; import java.util.TimerTask; @@ -851,5 +848,19 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec MessagePad.SystemCmdReq req = builder.build(); return sendWsMessage(MessageType.TYPE_SEND_SYSTEM_CMD_REQ.typeCode, req.toByteArray()); } + + /** + * 发送 轨迹下载请求 + * + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @return boolean + */ + @Override + public boolean sendTrajectoryDownloadReq(MessagePad.Line line) { + MessagePad.TrajectoryDownloadReq.Builder builder = MessagePad.TrajectoryDownloadReq.newBuilder(); + builder.setLine(line); + MessagePad.TrajectoryDownloadReq req = builder.build(); + return sendWsMessage(MessageType.TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ.typeCode, req.toByteArray()); + } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java index 6e5bb21f67..d1a0b7772b 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java @@ -395,6 +395,17 @@ public class AdasManager implements IAdasNetCommApi { return mChannel != null && mChannel.sendSystemCmdReq(type); } + /** + * 发送 轨迹下载请求 + * + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @return boolean + */ + @Override + public boolean sendTrajectoryDownloadReq(MessagePad.Line line) { + return mChannel != null && mChannel.sendTrajectoryDownloadReq(line); + } + /** * 获取工控机固定IP列表 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java index 334316bf03..9581e2173e 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java @@ -180,6 +180,14 @@ public interface IAdasNetCommApi { */ boolean sendSystemCmdReq(@NonNull MessagePad.SystemCmdType type); + /** + * 发送 轨迹下载请求 + * + * @param line 线路相关参数详情见PB message_pad.proto -> Line + * @return boolean + */ + boolean sendTrajectoryDownloadReq(MessagePad.Line line); + // TODO 需求暂停 待讨论 // boolean getRoutes(); diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java index 2a1c161a74..02c343889b 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasListener.java @@ -96,6 +96,14 @@ public interface OnAdasListener { */ void onPointCloud(MessagePad.Header header, MogoPointCloudOuterClass.MogoPointCloud pointCloud); + /** + * planning障碍物 + * + * @param header 头 + * @param planningObjects 数据 + */ + void onPlanningObjects(MessagePad.Header header, MessagePad.PlanningObjects planningObjects); + /** * 自动驾驶设备基础信息请求 * diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java index 4a00d3ed7e..4fb48cfc1a 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/MessageType.java @@ -21,6 +21,7 @@ public enum MessageType { TYPE_RECEIVE_PERCEPTION_TRAFFIC_LIGHT(MessagePad.MessageType.MsgTypePerceptionTrafficLight, "感知红绿灯"), TYPE_RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY(MessagePad.MessageType.MsgTypePredictionObstacleTrajectory, "他车轨迹预测"), TYPE_RECEIVE_POINT_CLOUD(MessagePad.MessageType.MsgTypePointCloud, "点云透传"), + TYPE_RECEIVE_PLANNING_OBJECTS(MessagePad.MessageType.MsgTypePlanningObjects, "planning障碍物"), TYPE_RECEIVE_BASIC_INFO_REQ(MessagePad.MessageType.MsgTypeBasicInfoReq, "自动驾驶设备基础信息请求"), TYPE_SEND_BASIC_INFO_RESP(MessagePad.MessageType.MsgTypeBasicInfoResp, "自动驾驶设备基础信息应答"), @@ -38,7 +39,8 @@ public enum MessageType { @Deprecated TYPE_RECEIVE_WARN(MessagePad.MessageType.MsgTypeWarn, "预警数据"), TYPE_RECEIVE_ARRIVAL_NOTIFICATION(MessagePad.MessageType.MsgTypeArrivalNotification, "到站提醒"), - TYPE_SEND_SYSTEM_CMD_REQ(MessagePad.MessageType.MsgTypeSystemCmdReq, "系统命令请求, 比如系统重启,启用新镜像"); + TYPE_SEND_SYSTEM_CMD_REQ(MessagePad.MessageType.MsgTypeSystemCmdReq, "系统命令请求, 比如系统重启,启用新镜像"), + TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ(MessagePad.MessageType.MsgTypeTrajectoryDownloadReq, "轨迹下载请求"); /** * 消息action code diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java index 97a16016fd..3c4ddfcd04 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/MyMessageFactory.java @@ -20,6 +20,7 @@ public class MyMessageFactory implements IMyMessageFactory { private IMsg perceptionTrafficLightMessage;//感知红绿灯 private IMsg predictionObstacleTrajectoryMessage;//他车轨迹预测 private IMsg pointCloudMessage;//透传点云数据 + private IMsg planningObjectsMessage;//planning障碍物 private IMsg basicInfoReqMessage;//自动驾驶设备基础信息请求 private IMsg carConfigRespMessage;//车机基础信息应答 @@ -80,11 +81,17 @@ public class MyMessageFactory implements IMyMessageFactory { } return predictionObstacleTrajectoryMessage; } else if (messageType == MessageType.TYPE_RECEIVE_POINT_CLOUD.typeCode) { - //他车轨迹预测 + //点云透传 if (pointCloudMessage == null) { pointCloudMessage = new PointCloudMessage(); } return pointCloudMessage; + } else if (messageType == MessageType.TYPE_RECEIVE_PLANNING_OBJECTS.typeCode) { + //planning障碍物 + if (planningObjectsMessage == null) { + planningObjectsMessage = new PlanningObjectsMessage(); + } + return planningObjectsMessage; } else if (messageType == MessageType.TYPE_RECEIVE_BASIC_INFO_REQ.typeCode) { //自动驾驶设备基础信息请求 if (basicInfoReqMessage == null) { diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PlanningObjectsMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PlanningObjectsMessage.java new file mode 100644 index 0000000000..5011a6a83e --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PlanningObjectsMessage.java @@ -0,0 +1,22 @@ +package com.zhidao.support.adas.high.msg; + + +import com.google.protobuf.InvalidProtocolBufferException; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.protocol.RawData; + +import mogo.telematics.pad.MessagePad; + +/** + * planning障碍物 + */ +public class PlanningObjectsMessage extends MyAbstractMessageHandler { + + @Override + public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException { + MessagePad.PlanningObjects planningObjects = MessagePad.PlanningObjects.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue()); + if (adasListener != null) { + adasListener.onPlanningObjects(raw.getHeader(), planningObjects); + } + } +}