diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java index c881ebcc7d..60d9fa8eca 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseOchBusTabFragment.java @@ -3,18 +3,15 @@ package com.mogo.och.bus.fragment; import android.animation.ObjectAnimator; import android.content.Intent; import android.graphics.Color; -import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; -import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.Group; @@ -24,10 +21,7 @@ import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; -import com.mogo.eagle.core.data.autopilot.AutoPilotRecordResult; -import com.mogo.eagle.core.data.autopilot.AutopilotWarnMessage; import com.mogo.eagle.core.data.config.HmiBuildConfig; -import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; @@ -45,7 +39,8 @@ import com.mogo.och.bus.R; import com.mogo.och.bus.view.BusArcView; import com.mogo.och.bus.view.SlidePanelView; -import java.util.ArrayList; +import mogo.telematics.pad.MessagePad; +import record_cache.RecordPanelOuterClass; /** * 网约车基础Fragment,主要负责布局通用界面,处理站点面板和通话面板互斥情况 @@ -65,7 +60,7 @@ public abstract class BaseOchBusTabFragment { - Log.d(TAG,"长按显示状态工具栏"); + Log.d(TAG, "长按显示状态工具栏"); Intent intent = new Intent(); intent.putExtra("oper", 52); MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent); @@ -168,13 +163,13 @@ public abstract class BaseOchBusTabFragment // MogoApisHandler.getInstance().getApis() // .getAdasControllerApi() // .mockOchStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE, "不能使用") - debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) + debugAutoPilotStatus(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) ); // 模拟 可自动驾驶,工控机连接正常,且处于人工干预状态 @@ -182,7 +177,7 @@ public abstract class BaseOchBusTabFragment // MogoApisHandler.getInstance().getApis() // .getAdasControllerApi().mockOchStatus(-1, "Arrived") - debugArrivedStation() + debugArrivedStation() ); tvOperationStatus.setOnClickListener(view -> { onChangeOperationStatus(); }); - + mSettingBtn = findViewById(R.id.module_mogo_och_setting_layout); mSettingBtn.setOnClickListener(v -> { // TODO: 2021/12/9 @@ -239,17 +234,15 @@ public abstract class BaseOchBusTabFragment trafficData) { } - - @Override - public void onAutopilotWarnMessage(@Nullable AutopilotWarnMessage autopilotWarnMessage) { } + public void onAutopilotWarnMessage(MessagePad.Warn warn) { + } /** * 测试到站 @@ -295,20 +288,21 @@ public abstract class BaseOchBusTabFragment { // ctvAutopilotStatus.setChecked(isInAutopilot); - changeAutopilotBtnView(autopilotStatus,isAnimateRunning); + changeAutopilotBtnView(autopilotStatus, isAnimateRunning); }); } - private void changeAutopilotBtnView(int autopilotStatus,boolean isAnimateRunning) { - Logger.d( TAG, "onStateChangeChangeAutopilotBtnView: " + autopilotStatus +"isAnimateRunning = "+isAnimateRunning); + private void changeAutopilotBtnView(int autopilotStatus, boolean isAnimateRunning) { + Logger.d(TAG, "onStateChangeChangeAutopilotBtnView: " + autopilotStatus + "isAnimateRunning = " + isAnimateRunning); if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE == autopilotStatus) {//0不可用 - if (isAnimateRunning){ + if (isAnimateRunning) { stopAutopilotAnimation(); ctvAutopilotStatusIv.setImageResource(R.drawable.bus_wrong_autopilot_icon); ctvAutopilotStatusTv.setTextColor(getResources().getColor(R.color.bus_autopilot_text_color_normal)); @@ -326,11 +320,11 @@ public abstract class BaseOchBusTabFragment{ + public void hidPanel() { + getActivity().runOnUiThread(() -> { flStationPanelContainer.setVisibility(View.GONE); }); } - public void showPanel(){ - getActivity().runOnUiThread(()->{ + public void showPanel() { + getActivity().runOnUiThread(() -> { flStationPanelContainer.setVisibility(View.VISIBLE); }); } @@ -421,6 +415,7 @@ public abstract class BaseOchBusTabFragment 60 ? "#DB3137" : "#3E77F6")); mouduleArc.setValues(speed); @@ -487,7 +483,7 @@ public abstract class BaseOchBusTabFragment +public class OchBusFragment extends BaseOchBusTabFragment implements SlidePanelView.OnSlidePanelMoveToEndListener, View.OnClickListener { private static final String TAG = "OchBusFragment"; @@ -44,7 +45,7 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu private TextView mStartStationFlag; private TextView mNextStationName; private TextView mEndStationFlag; -// private TextView mDebugArrive; + // private TextView mDebugArrive; private TextView mSwitchLine; //切换路线 private int mCurrentStation = 0; @@ -61,24 +62,24 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu @Override protected void initViews() { super.initViews(); - mBus = findViewById( R.id.module_och_bus_tag ); - mCurrentStationName = findViewById( R.id.module_och_bus_current_station ); - mStartStationFlag = findViewById( R.id.module_och_bus_start_station_tag ); - mNextStationName = findViewById( R.id.module_och_bus_order_end_station ); - mEndStationFlag = findViewById( R.id.module_och_bus_end_station_tag ); + mBus = findViewById(R.id.module_och_bus_tag); + mCurrentStationName = findViewById(R.id.module_och_bus_current_station); + mStartStationFlag = findViewById(R.id.module_och_bus_start_station_tag); + mNextStationName = findViewById(R.id.module_och_bus_order_end_station); + mEndStationFlag = findViewById(R.id.module_och_bus_end_station_tag); mSwitchLine = findViewById(R.id.switch_line_btn); // mDebugArrive = findViewById(R.id.module_och_bus_arrive_station); - if ( DebugConfig.isDebug() ) { - mBus.setOnClickListener( view -> { - TipToast.shortTip( "重置了车站状态" ); + if (DebugConfig.isDebug()) { + mBus.setOnClickListener(view -> { + TipToast.shortTip("重置了车站状态"); mPresenter.queryBusRoutes(); - } ); + }); - mBus.setOnLongClickListener( view -> { + mBus.setOnLongClickListener(view -> { getActivity().finish(); return true; - } ); + }); //debug下调用测试面板 mCurrentStationName.setOnLongClickListener(v -> { debugTestBar(); @@ -86,19 +87,19 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu }); } - Logger.d( TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); + Logger.d(TAG, "initView: " + CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()); // 初始化的时候设置 UI 按钮状态 - switch ( CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() ) { + switch (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState()) { case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE: hideAutopilotBiz(); break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE: showAutopilotBiz(); - onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE ,false); + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE, false); break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING: showAutopilotBiz(); - onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ,false); + onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, false); break; default: break; @@ -114,7 +115,7 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu @NonNull @Override protected OchBusPresenter createPresenter() { - return new OchBusPresenter( this ); + return new OchBusPresenter(this); } @Override @@ -128,30 +129,30 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu * @param stationList 车站列表信息 * @param currentStation 当前站点 * @param nextStation 下个站点 - * @param isArrived 是否都站 + * @param isArrived 是否都站 */ - public void refreshBusStations( List< OchBusStation > stationList, int currentStation, int nextStation ,boolean isArrived) { + public void refreshBusStations(List stationList, int currentStation, int nextStation, boolean isArrived) { mCurrentStation = currentStation; - if ( getActivity() == null ) { + if (getActivity() == null) { return; } - getActivity().runOnUiThread( () -> { - if ( stationList == null ) { + getActivity().runOnUiThread(() -> { + if (stationList == null) { // 获取小巴数据失败 return; } // 渲染小巴路线数据 - renderCurrentStationStatus( stationList, currentStation, nextStation ,isArrived); - } ); + renderCurrentStationStatus(stationList, currentStation, nextStation, isArrived); + }); } /** * 重新刷新站点信息 isArrived 是否到站 */ - private void renderCurrentStationStatus( List< OchBusStation > stationList, int currentStation - , int nextStation ,boolean isArrived) { - Log.d("MapMaker= ","currentStation="+currentStation+",nextStation="+nextStation+"isArrived="+isArrived); + private void renderCurrentStationStatus(List stationList, int currentStation + , int nextStation, boolean isArrived) { + Log.d("MapMaker= ", "currentStation=" + currentStation + ",nextStation=" + nextStation + "isArrived=" + isArrived); String currentStationName = null; String nextStationName = null; int startStationFlagVisibility = View.INVISIBLE; @@ -162,70 +163,70 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu boolean isArriveAtStartStation = false; // 获取当前站点的名称 - currentStationName = stationList.get( currentStation ).getName(); + currentStationName = stationList.get(currentStation).getName(); startStation = stationList.get(0); endStation = stationList.get(stationList.size() - 1); // 是否到达起点 - if ( currentStation == 0 ) { + if (currentStation == 0) { startStationFlagVisibility = View.VISIBLE; isArriveAtStartStation = true; mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start)); // Log.d("MapMaker= ","起点="); - setOrRemoveMapMaker(true, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat() - ,startStation.getLon(),R.drawable.icon_station_start_end); - setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() - ,endStation.getLon(),R.drawable.icon_station_start_end); - } else if ( currentStation > 0 && currentStation < stationList.size() - 1 ) {// 是否到达站点 + setOrRemoveMapMaker(true, OchBusConst.BUS_START_MAP_MAKER, startStation.getLat() + , startStation.getLon(), R.drawable.icon_station_start_end); + setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(), R.drawable.icon_station_start_end); + } else if (currentStation > 0 && currentStation < stationList.size() - 1) {// 是否到达站点 // Log.d("MapMaker= ","中间="); isArriveAtStation = true; // mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_start1)); - setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat() - ,startStation.getLon(),R.drawable.icon_station_start_end); - setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() - ,endStation.getLon(),R.drawable.icon_station_start_end); - } else if ( currentStation == stationList.size() - 1 ) {// 是否到达终点 + setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER, startStation.getLat() + , startStation.getLon(), R.drawable.icon_station_start_end); + setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(), R.drawable.icon_station_start_end); + } else if (currentStation == stationList.size() - 1) {// 是否到达终点 // Log.d("MapMaker= ","终点="); isArriveEndStation = true; nextStationName = "--"; mStartStationFlag.setText(getResources().getString(R.string.bus_arrive_to_end_end)); startStationFlagVisibility = View.VISIBLE; endStationFlagVisibility = View.INVISIBLE; - setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat() - ,startStation.getLon(),R.drawable.icon_station_start_end); - if (isArrived){ - setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() - ,endStation.getLon(),R.drawable.icon_station_start_end); - }else { - setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() - ,endStation.getLon(),R.drawable.icon_station_start_end); + setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER, startStation.getLat() + , startStation.getLon(), R.drawable.icon_station_start_end); + if (isArrived) { + setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(), R.drawable.icon_station_start_end); + } else { + setOrRemoveMapMaker(true, OchBusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(), R.drawable.icon_station_start_end); } } // 获取下一站点名称 - if ( nextStation > currentStation && nextStation <= stationList.size() - 1 ) { - nextStationName = stationList.get( nextStation ).getName(); + if (nextStation > currentStation && nextStation <= stationList.size() - 1) { + nextStationName = stationList.get(nextStation).getName(); } // 是否到达终点 - if ( nextStation == stationList.size() - 1 ) { + if (nextStation == stationList.size() - 1) { endStationFlagVisibility = View.VISIBLE; } // 重置滑动按钮文字 - if ( isArriveEndStation ) { - showSlidePanle( "单程结束" ); - } else if ( isArriveAtStartStation ) { - showSlidePanle( "滑动出发" ); - } else if ( isArriveAtStation ) { - showSlidePanle( "滑动出发" ); + if (isArriveEndStation) { + showSlidePanle("单程结束"); + } else if (isArriveAtStartStation) { + showSlidePanle("滑动出发"); + } else if (isArriveAtStation) { + showSlidePanle("滑动出发"); } - mCurrentStationName.setText( currentStationName ); - mNextStationName.setText( nextStationName ); - mStartStationFlag.setVisibility( startStationFlagVisibility ); - mEndStationFlag.setVisibility( endStationFlagVisibility ); + mCurrentStationName.setText(currentStationName); + mNextStationName.setText(nextStationName); + mStartStationFlag.setVisibility(startStationFlagVisibility); + mEndStationFlag.setVisibility(endStationFlagVisibility); } public void hideOchBus() { @@ -256,8 +257,8 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu /** * 设置自动驾驶可用状态 */ - public void onAutopilotEnableChange( boolean isEnable ) { - if ( isEnable ) { + public void onAutopilotEnableChange(boolean isEnable) { + if (isEnable) { showAutopilotBiz(); } else { hideAutopilotBiz(); @@ -272,14 +273,15 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu /** * 修改经营状态 + * * @param launch true-收车,false-出车 */ - public void changeOperationStatus( boolean launch ) { + public void changeOperationStatus(boolean launch) { isOperationStatus = launch; - if ( launch ) { + if (launch) { // 出车的时候重制站点状态 mPresenter.queryBusRoutes(); - tvOperationStatus.setText( "收车" ); + tvOperationStatus.setText("收车"); showSlidePanle("滑动出发"); showPanel(); } else { @@ -289,19 +291,20 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu hidPanel(); //移除起点终点 - if (null != startStation){ - setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER,startStation.getLat() - ,startStation.getLon(),R.drawable.icon_station_start_end); + if (null != startStation) { + setOrRemoveMapMaker(false, OchBusConst.BUS_START_MAP_MAKER, startStation.getLat() + , startStation.getLon(), R.drawable.icon_station_start_end); } - if (null != endStation){ - setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER,endStation.getLat() - ,endStation.getLon(),R.drawable.icon_station_start_end); + if (null != endStation) { + setOrRemoveMapMaker(false, OchBusConst.BUS_END_MAP_MAKER, endStation.getLat() + , endStation.getLon(), R.drawable.icon_station_start_end); } } } /** * VR模式切换 + * * @param isVRMode */ public void onVRModeChanged(boolean isVRMode) { @@ -312,13 +315,14 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu /** * 绘制地图起点终点 + * * @param isAdd * @param uuid * @param iconId */ - private void setOrRemoveMapMaker(boolean isAdd, String uuid,double lat,double longi, int iconId){ - if (isAdd){ - Log.d("setMapMaker= ",uuid+"=latitude="+lat+",longitude="+longi); + private void setOrRemoveMapMaker(boolean isAdd, String uuid, double lat, double longi, int iconId) { + if (isAdd) { + Log.d("setMapMaker= ", uuid + "=latitude=" + lat + ",longitude=" + longi); MogoMarkerOptions options = new MogoMarkerOptions(); options.anchorColor("#000000");//不设置报错,暂时随便设置个 options.setGps(true);//使用wgs 必须设置true @@ -329,27 +333,27 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu options.longitude(longi); MogoApisHandler.getInstance().getApis().getMapServiceApi() .getMarkerManager(AbsMogoApplication.getApp()).addMarker(uuid, options); - }else { - Log.d("RemoveMapMaker=",uuid+"=latitude="+lat+",longitude="+longi); + } else { + Log.d("RemoveMapMaker=", uuid + "=latitude=" + lat + ",longitude=" + longi); MogoApisHandler.getInstance().getApis().getMapServiceApi() .getMarkerManager(AbsMogoApplication.getApp()).removeMarkers(uuid); } } - public void debugAutoPilotStatus(int status){ + public void debugAutoPilotStatus(int status) { mPresenter.debugAutoPilotStatus(status); } @Override public void onClick(View v) { - if (v.getId() == R.id.switch_line_btn ){//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线 + if (v.getId() == R.id.switch_line_btn) {//切换路线条件: 自动驾驶过程中,点击则toast提示:自动驾驶中,不可切换路线 //本次行程未结束,不支持切换路线。点击则toast提示:当前行程未完成,不可切换路线 if (CallerAutoPilotStatusListenerManager.INSTANCE.getAutoPilotStatusInfo().getState() - == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ + == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning1)); return; } - if (mCurrentStation > 0){ + if (mCurrentStation > 0) { TipToast.longTip(getResources().getString(R.string.bus_switch_line_btn_warning2)); return; } @@ -357,4 +361,9 @@ public class OchBusFragment extends BaseOchBusTabFragment< OchBusFragment, OchBu startActivity(intent); } } + + @Override + public void onAutopilotIdentifyDataUpdate(List trafficData) { + + } } diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java index 6b741f08cf..b1886bb4fc 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/presenter/OchBusPresenter.java @@ -1,14 +1,13 @@ package com.mogo.och.bus.presenter; + import android.location.Location; import android.os.Looper; import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; + import com.mogo.commons.mvp.Presenter; -import com.mogo.commons.voice.AIAssist; -import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo; -import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; @@ -23,17 +22,19 @@ import com.mogo.och.bus.callback.SlidePannelHideCallback; import com.mogo.och.bus.fragment.OchBusFragment; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; + /** * 网约车小巴 * * @author tongchenfei */ -public class OchBusPresenter extends Presenter< OchBusFragment > +public class OchBusPresenter extends Presenter implements CarOperationStatusCallback, RefreshBusStationsCallback, SlidePannelHideCallback , IMoGoAutopilotStatusListener, IOCHBusControllerStatusCallback { @@ -44,16 +45,16 @@ public class OchBusPresenter extends Presenter< OchBusFragment > private List mStationList = new ArrayList<>(); private int mCurrentStation = 0; - public OchBusPresenter( OchBusFragment view ) { - super( view ); + public OchBusPresenter(OchBusFragment view) { + super(view); //2021.11.1 鹰眼架构整合,由IMoGoAutopilotStatusListener逐步替代IMogoAdasOCHCallback接口 CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this); OchBusOrderModel.getInstance().init(); } @Override - public void onCreate( @NonNull LifecycleOwner owner ) { - super.onCreate( owner ); + public void onCreate(@NonNull LifecycleOwner owner) { + super.onCreate(owner); OchBusOrderModel.getInstance().queryOperationStatus(); OchBusOrderModel.getInstance().queryBusRoutes(); initModelListener(); @@ -66,39 +67,39 @@ public class OchBusPresenter extends Presenter< OchBusFragment > releaseListener(); } - public void initModelListener(){ + public void initModelListener() { OchBusOrderModel.getInstance().setCarOperationStatusCallback(this); OchBusOrderModel.getInstance().setRefreshBusStationsCallback(this); OchBusOrderModel.getInstance().setSlidePannelHideCallback(this); OchBusOrderModel.getInstance().setControllerStatusCallback(this); } - public void releaseListener(){ + public void releaseListener() { OchBusOrderModel.getInstance().setCarOperationStatusCallback(null); OchBusOrderModel.getInstance().setRefreshBusStationsCallback(null); OchBusOrderModel.getInstance().setSlidePannelHideCallback(null); OchBusOrderModel.getInstance().setControllerStatusCallback(null); } - public void queryBusRoutes(){ + public void queryBusRoutes() { OchBusOrderModel.getInstance().queryBusRoutes(); } - public void debugResetStationStatus(){ + public void debugResetStationStatus() { OchBusOrderModel.getInstance().debugResetStationStatus(); } - public void autoDriveToNextStation(boolean isRestart){ + public void autoDriveToNextStation(boolean isRestart) { currentAutopilotStatus = -1; OchBusOrderModel.getInstance().autoDriveToNextStation(isRestart); } - public void restartAutopilot(){ + public void restartAutopilot() { currentAutopilotStatus = -1; OchBusOrderModel.getInstance().restartAutopilot(); } - public void onChangeOperationStatus(){ + public void onChangeOperationStatus() { OchBusOrderModel.getInstance().onChangeOperationStatus(); } @@ -115,9 +116,9 @@ public class OchBusPresenter extends Presenter< OchBusFragment > mStationList.addAll(stationList); mCurrentStation = currentStation; functionDemoModeChange(); - Log.d("OchBusOrderModel ="," mCurrentStation ="+mCurrentStation); - if ( mView != null ) { - mView.refreshBusStations( stationList, currentStation, nextStation ,isArrived); + Log.d("OchBusOrderModel =", " mCurrentStation =" + mCurrentStation); + if (mView != null) { + mView.refreshBusStations(stationList, currentStation, nextStation, isArrived); } } @@ -125,32 +126,27 @@ public class OchBusPresenter extends Presenter< OchBusFragment > // Log.d("OchBusOrderModel ="," functionDemoModeChange ="+mCurrentStation); if (FunctionBuildConfig.isDemoMode && ( - (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1) + (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1) || ( - (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1) + (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1) && OchBusOrderModel.getInstance().isGoingToNextStation() ) ) - ){ - mView.onAutopilotStatusChanged( IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING ,false); + ) { + mView.onAutopilotStatusChanged(IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING, false); } } @Override public void hideSlidePanel() { - if (mView != null){ + if (mView != null) { mView.hideSlidePanel(); } } @Override - public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo autopilotStationInfo) { - OchBusOrderModel.getInstance().onArriveAt(autopilotStationInfo); - } - - @Override - public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) { - + public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification arrivalNotification) { + OchBusOrderModel.getInstance().onArriveAt(arrivalNotification); } @Override @@ -162,69 +158,69 @@ public class OchBusPresenter extends Presenter< OchBusFragment > public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { if (autopilotStatusInfo == null) return; int state = autopilotStatusInfo.getState(); - Logger.d( TAG, "onStateChange: " + state +"currentAutopilotStatus = "+currentAutopilotStatus); - switch ( state ) { + Logger.d(TAG, "onStateChange: " + state + "currentAutopilotStatus = " + currentAutopilotStatus); + switch (state) { case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE: - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE){ - if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){//2-->1语音提示 + if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE) { + if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->1语音提示 // AIAssist.getInstance( getContext() ).speakTTSVoice( "已进入人工驾驶模式" ); } currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_ENABLE; // 设置UI【自动驾驶】按钮是否展示 - mView.onAutopilotEnableChange( true ); - if ( OchBusOrderModel.getInstance().isGoingToNextStation() ) { + mView.onAutopilotEnableChange(true); + if (OchBusOrderModel.getInstance().isGoingToNextStation()) { mView.hideSlidePanel(); } if (FunctionBuildConfig.isDemoMode && ( - (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1) + (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1) || ( - (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1) + (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1) && OchBusOrderModel.getInstance().isGoingToNextStation() - ) - ) - ){ - Log.d("OchBusOrderModel=","有美化功能"); + ) + ) + ) { + Log.d("OchBusOrderModel=", "有美化功能"); return; } // 改变UI自动驾驶状态 - mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning); + mView.onAutopilotStatusChanged(currentAutopilotStatus, isAnimateRunning); } break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING: - runOnUIThread(()->mView.stopAutopilotAnimation()); - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){ + runOnUIThread(() -> mView.stopAutopilotAnimation()); + if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING; // 改变UI自动驾驶状态 - mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning); + mView.onAutopilotStatusChanged(currentAutopilotStatus, isAnimateRunning); } isAnimateRunning = false; break; case IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE: - if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE){ - if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING){//2-->0语音提示 + if (currentAutopilotStatus != IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE) { + if (currentAutopilotStatus == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//2-->0语音提示 // AIAssist.getInstance( getContext() ).speakTTSVoice( "自动驾驶已停止,请人工接管" ); } currentAutopilotStatus = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE; if (FunctionBuildConfig.isDemoMode && ( - (mCurrentStation > 0 && mCurrentStation < mStationList.size()-1) + (mCurrentStation > 0 && mCurrentStation < mStationList.size() - 1) || ( - (mCurrentStation == 0 || mCurrentStation == mStationList.size() -1) + (mCurrentStation == 0 || mCurrentStation == mStationList.size() - 1) && OchBusOrderModel.getInstance().isGoingToNextStation() ) ) - ){ - Log.d("OchBusOrderModel=","有美化功能"); + ) { + Log.d("OchBusOrderModel=", "有美化功能"); return; } - mView.onAutopilotEnableChange( false ); - mView.onAutopilotStatusChanged( currentAutopilotStatus ,isAnimateRunning); + mView.onAutopilotEnableChange(false); + mView.onAutopilotStatusChanged(currentAutopilotStatus, isAnimateRunning); } isAnimateRunning = false; break; default: - mView.onAutopilotEnableChange( false ); + mView.onAutopilotEnableChange(false); break; } } @@ -236,7 +232,7 @@ public class OchBusPresenter extends Presenter< OchBusFragment > @Override public void onCarLocationChanged(Location location) { - if (null != location){ + if (null != location) { runOnUIThread(() -> mView.updateSpeedView(location.getSpeed())); } } @@ -244,7 +240,7 @@ public class OchBusPresenter extends Presenter< OchBusFragment > @Override public void startOpenAutopilot() { isAnimateRunning = true; - runOnUIThread(()->mView.startAutopilotAnimation()); + runOnUIThread(() -> mView.startAutopilotAnimation()); // TODO: 2021/8/20 无工控机环境, 手动调起自动驾驶开启返回结果,有工控机环境要删除 // UiThreadHandler.postDelayed(new Runnable() { // @Override @@ -254,12 +250,12 @@ public class OchBusPresenter extends Presenter< OchBusFragment > // },2300); } - private void runOnUIThread( Runnable executor ) { - if ( executor == null ) { + private void runOnUIThread(Runnable executor) { + if (executor == null) { return; } - if ( Looper.myLooper() != Looper.getMainLooper() ) { - UiThreadHandler.post( executor ); + if (Looper.myLooper() != Looper.getMainLooper()) { + UiThreadHandler.post(executor); } else { executor.run(); } @@ -267,11 +263,17 @@ public class OchBusPresenter extends Presenter< OchBusFragment > /** * 测试使用 + * * @param status */ - public void debugAutoPilotStatus(int status){ + public void debugAutoPilotStatus(int status) { AutopilotStatusInfo info = new AutopilotStatusInfo(); info.setState(status); onAutopilotStatusResponse(info); } + + @Override + public void onAutopilotGuardian(MogoReportMsg.MogoReportMessage guardianInfo) { + + } } diff --git a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java index 47cbfd0b01..e790784ebb 100644 --- a/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java +++ b/OCH/mogo-och-taxi-passenger/src/main/java/com/mogo/och/taxi/passenger/callback/IOCHTaxiPassengerAutopilotPlanningCallback.java @@ -1,13 +1,14 @@ package com.mogo.och.taxi.passenger.callback; -import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; import java.util.List; +import mogo.telematics.pad.MessagePad; + /** * @author: wangmingjun * @date: 2021/11/1 */ -public interface IOCHTaxiPassengerAutopilotPlanningCallback { - void routeResult(List models); +interface IOCHTaxiAutopilotPlanningCallback { + void routeResult(List models); } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java index 36949f59b9..9d5760ca70 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/callback/IOCHTaxiAutopilotPlanningCallback.java @@ -1,13 +1,14 @@ package com.mogo.och.taxi.callback; -import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; import java.util.List; +import mogo.telematics.pad.MessagePad; + /** * @author: wangmingjun * @date: 2021/11/1 */ public interface IOCHTaxiAutopilotPlanningCallback { - void routeResult(List models); + void routeResult(List models); } \ No newline at end of file diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java index b6c229a305..c0f8dfc642 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/model/MogoOCHTaxiModelNew.java @@ -14,9 +14,7 @@ import com.mogo.commons.debug.DebugConfig; import com.mogo.eagle.core.data.BaseData; import com.mogo.eagle.core.data.autopilot.ADASTrajectoryInfo; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; -import com.mogo.eagle.core.data.autopilot.AutopilotGuardianStatusInfo; import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; -import com.mogo.eagle.core.data.autopilot.AutopilotStationInfo; import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.map.MogoLocation; @@ -68,10 +66,12 @@ import java.util.List; import io.reactivex.exceptions.UndeliverableException; import io.reactivex.functions.Consumer; import io.reactivex.plugins.RxJavaPlugins; +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; /** * Created by pangfan on 2021/8/19 - * + *

* 网约车 - 出租车业务逻辑处理 */ public class MogoOCHTaxiModelNew { @@ -126,7 +126,7 @@ public class MogoOCHTaxiModelNew { this.mOrderStatusCallback = callback; } - public void init( Context context ) { + public void init(Context context) { mContext = context.getApplicationContext(); initListeners(); @@ -146,27 +146,27 @@ public class MogoOCHTaxiModelNew { public void accept(Throwable e) { if (e instanceof UndeliverableException) { e = e.getCause(); - Log.d(TAG,"UndeliverableException"); + Log.d(TAG, "UndeliverableException"); } if ((e instanceof IOException)) {// // fine, irrelevant network problem or API that throws on cancellation - Log.d(TAG,"IOException"); + Log.d(TAG, "IOException"); return; } if (e instanceof InterruptedException) { // fine, some blocking code was interrupted by a dispose call - Log.d(TAG,"InterruptedException"); + Log.d(TAG, "InterruptedException"); return; } if ((e instanceof NullPointerException) || (e instanceof IllegalArgumentException)) { // that's likely a bug in the application - Log.d(TAG,"NullPointerException or IllegalArgumentException"); + Log.d(TAG, "NullPointerException or IllegalArgumentException"); Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } if (e instanceof IllegalStateException) { // that's a bug in RxJava or in a custom operator - Log.d(TAG,"IllegalStateException"); + Log.d(TAG, "IllegalStateException"); Thread.currentThread().getUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), e); return; } @@ -180,7 +180,7 @@ public class MogoOCHTaxiModelNew { } } - public void startOrStopOrderLoop(){ + public void startOrStopOrderLoop() { if (NetworkUtils.isConnected(mContext)) { startOrStopOrderLoop(mOCHCarStatus == 1); } @@ -195,26 +195,26 @@ public class MogoOCHTaxiModelNew { MogoApisHandler.getInstance() .getApis() .getSocketManagerApi(mContext) - .registerLifecycleListener(10010,mSocketLifeCycleLisnter); + .registerLifecycleListener(10010, mSocketLifeCycleLisnter); // 2021.11.1重构自动驾驶 实现接口 IMoGoAutopilotStatusListener 注册监听 替换IMogoAdasOCHCallback接口 CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, mGoAutopilotStatusListener); MogoApisHandler.getInstance() .getApis() .getIntentManagerApi() - .registerIntentListener( ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener ); + .registerIntentListener(ConnectivityManager.CONNECTIVITY_ACTION, mNetWorkIntentListener); MogoApisHandler.getInstance() .getApis() .getStatusManagerApi() - .registerStatusChangedListener( TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener ); + .registerStatusChangedListener(TAG, StatusDescriptor.VR_MODE, mMogoStatusChangedListener); // 达到起始站围栏监听 MogoApisHandler.getInstance() .getApis() .getRegisterCenterApi() - .registerCarLocationChangedListener( TAG, mCarLocationChangedListener2); + .registerCarLocationChangedListener(TAG, mCarLocationChangedListener2); //2021.11.1 自动驾驶路线规划接口 - CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG,moGoAutopilotPlanningListener); + CallerAutopilotPlanningListenerManager.INSTANCE.addListener(TAG, moGoAutopilotPlanningListener); } private void releaseListeners() { @@ -275,13 +275,14 @@ public class MogoOCHTaxiModelNew { } @Override - public void onFail(int code, String msg) { } + public void onFail(int code, String msg) { + } }); } //更新出车收车状态 public void updateCarStatus() { - if ( mOCHCarStatus == -1){ + if (mOCHCarStatus == -1) { queryCarStatus(); return; } @@ -316,7 +317,7 @@ public class MogoOCHTaxiModelNew { /** * 查询订单状态:进行中/待服务(轮询防止因crash导致应用重启、断网没收到推送等) - * + *

* 注:只有在本地缓存mCurrentOCHOrder为null时(已完成or已取消有明确结果)或id相同且status不同时, * 才更新最新进行中单到本地 */ @@ -424,7 +425,7 @@ public class MogoOCHTaxiModelNew { //更新当前订单状态 public void updateOCHOrderStatus(final OrderStatusEnum orderStatus) { - if ( mCurrentOCHOrder == null ) { + if (mCurrentOCHOrder == null) { return; } final String orderNo = mCurrentOCHOrder.orderNo; @@ -550,7 +551,7 @@ public class MogoOCHTaxiModelNew { /** * 查询新到预约单 - * + *

* 注:只有在本地缓存mNewBookingOrder为null时(执行完抢单or司机关闭改单),才更新新到待抢单 */ public void queryNewBookingOrder() { @@ -765,7 +766,7 @@ public class MogoOCHTaxiModelNew { //检测当前订单 public boolean checkCurrentOCHOrder() { - if ( mCurrentOCHOrder != null + if (mCurrentOCHOrder != null && mCurrentOCHOrder.startSiteGcjPoint != null && mCurrentOCHOrder.endSiteGcjPoint != null) { return true; @@ -776,7 +777,7 @@ public class MogoOCHTaxiModelNew { //以当前订单为基础,开启自动驾驶 public void startAutoPilot() { if (!checkCurrentOCHOrder()) { - Logger.e( TAG, "no order or order is empty." ); + Logger.e(TAG, "no order or order is empty."); TipToast.shortTip("当前订单不存在或异常!"); return; } @@ -800,7 +801,7 @@ public class MogoOCHTaxiModelNew { parameters.endLatLon = new AutopilotControlParameters.AutoPilotLonLat(endWgsLat, endWgsLon); CallerAutoPilotManager.INSTANCE.startAutoPilot(parameters); Logger.d(TAG, "start autopilot with parameter: %s", GsonUtil.jsonFromObject(parameters) - +" ,startSiteName="+ mCurrentOCHOrder.startSiteAddr+" ,endSiteName="+mCurrentOCHOrder.endSiteAddr); + + " ,startSiteName=" + mCurrentOCHOrder.startSiteAddr + " ,endSiteName=" + mCurrentOCHOrder.endSiteAddr); if (DebugConfig.isDebug()) { // TipToast.shortTip("Start autopilot!"); } @@ -814,7 +815,7 @@ public class MogoOCHTaxiModelNew { try { CallerAutoPilotManager.INSTANCE.cancelAutoPilot(); Logger.d(TAG, "结束自动驾驶"); - } catch ( Exception e ) { + } catch (Exception e) { e.printStackTrace(); } } @@ -829,7 +830,7 @@ public class MogoOCHTaxiModelNew { double startLat = mCurrentOCHOrder.startSiteGcjPoint.get(1); double distance = CoordinateUtils.calculateLineDistance( startLon, startLat, - location.getLongitude(), location.getLatitude() ); + location.getLongitude(), location.getLatitude()); if (DebugConfig.isDebug() && mCurrentOCHOrder.orderStatus == OrderStatusEnum.OnTheWayToStartStation.getCode()) { // TipToast.shortTip("距离上车点:" + Double.valueOf(distance).intValue()); @@ -840,21 +841,21 @@ public class MogoOCHTaxiModelNew { // mOrderStatusCallback.onCurrentOrderDistToStartChanged((long) distance, 0); // } - if ( distance > OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) { + if (distance > OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { distance = CoordinateUtils.calculateLineDistance(startLon, startLat, MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLon(), - MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLat() ); + MogoApisHandler.getInstance().getApis().getAdasControllerApi().getLastLat()); } - if ( distance <= OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE ) { - updateOCHOrderStatus( OrderStatusEnum.ArriveAtStartStation); + if (distance <= OCHTaxiConst.ARRIVE_AT_START_STATION_DISTANCE) { + updateOCHOrderStatus(OrderStatusEnum.ArriveAtStartStation); return; } } // TODO: 2021/9/12 - public void calculateTravelDistance(Location carLocation){ - if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size()>0) { + public void calculateTravelDistance(Location carLocation) { + if (checkCurrentOCHOrder() && mCurrentOCHOrder.endSiteGcjPoint.size() > 0) { double endLon = mCurrentOCHOrder.endSiteGcjPoint.get(0); double endLat = mCurrentOCHOrder.endSiteGcjPoint.get(1); double distance = CoordinateUtils.calculateLineDistance( @@ -870,10 +871,10 @@ public class MogoOCHTaxiModelNew { //监听网络变化,避免启动机器时无网导致无法更新订单信息 private IMogoIntentListener mNetWorkIntentListener = new IMogoIntentListener() { @Override - public void onIntentReceived( String intentStr, Intent intent ) { - Logger.d( TAG, "onIntentReceived = %s", intentStr ); - if ( ConnectivityManager.CONNECTIVITY_ACTION.equals( intentStr ) ) { - if ( NetworkUtils.isConnected( mContext ) ) { + public void onIntentReceived(String intentStr, Intent intent) { + Logger.d(TAG, "onIntentReceived = %s", intentStr); + if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intentStr)) { + if (NetworkUtils.isConnected(mContext)) { startOrStopOrderLoop(mOCHCarStatus == 1); queryCarStatus(); } @@ -895,20 +896,26 @@ public class MogoOCHTaxiModelNew { private IMogoLifecycleListener mSocketLifeCycleLisnter = new IMogoLifecycleListener() { @Override - public void onConnectFailure() { Logger.e(TAG,"socket onConnectFailure"); } + public void onConnectFailure() { + Logger.e(TAG, "socket onConnectFailure"); + } @Override - public void onConnectSuccess() { Logger.e(TAG,"socket onConnectSuccess"); } + public void onConnectSuccess() { + Logger.e(TAG, "socket onConnectSuccess"); + } @Override - public void onConnectLost() { Logger.e(TAG,"socket onConnectLost"); } + public void onConnectLost() { + Logger.e(TAG, "socket onConnectLost"); + } }; // 自车定位 private IMogoCarLocationChangedListener2 mCarLocationChangedListener2 = new IMogoCarLocationChangedListener2() { @Override - public void onCarLocationChanged2( Location location ) { + public void onCarLocationChanged2(Location location) { IMogoServiceApis apis = MogoApisHandler.getInstance().getApis(); MogoLocation mogoLocation = new MogoLocation(); mogoLocation.setAccuracy(location.getAccuracy()); @@ -970,13 +977,19 @@ public class MogoOCHTaxiModelNew { } updateOCHOrderStatus(OrderStatusEnum.OnTheWayToEndStation); } - private IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener(){ + + private final IMoGoAutopilotStatusListener mGoAutopilotStatusListener = new IMoGoAutopilotStatusListener() { + + @Override + public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) { + + } @Override public void onAutopilotStatusResponse(@NotNull AutopilotStatusInfo autopilotStatusInfo) { if (autopilotStatusInfo == null) return; int state = autopilotStatusInfo.getState(); - Logger.d( TAG, "state = %s", state ); + Logger.d(TAG, "state = %s", state); if (state == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { if (mADASStatusCallback != null) mADASStatusCallback.onAutopilotRunning(); if (mCurrentOCHOrder != null @@ -1018,12 +1031,7 @@ public class MogoOCHTaxiModelNew { } @Override - public void onAutopilotGuardian(@Nullable AutopilotGuardianStatusInfo autopilotGuardianStatusInfo) { - - } - - @Override - public void onAutopilotArriveAtStation(@Nullable AutopilotStationInfo data) { + public void onAutopilotArriveAtStation(MessagePad.ArrivalNotification data) { if (data == null || !checkCurrentOCHOrder() || (getCurOrderStatus() == OrderStatusEnum.ArriveAtEndStation)) { return; @@ -1034,34 +1042,35 @@ public class MogoOCHTaxiModelNew { updateOCHOrderStatus(OrderStatusEnum.ArriveAtEndStation); } }; - private IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener(){ + private final IMoGoAutopilotPlanningListener moGoAutopilotPlanningListener = new IMoGoAutopilotPlanningListener() { + + @Override + public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) { + if (null != routeList && routeList.getWayPointsList().size() > 0){ +// mAutopilotPlanningCallback.routeResult(routeList.getModels()); + updateOrderRoute(routeList.getWayPointsList()); + } + } @Override public void onAutopilotTrajectory(ArrayList trajectoryInfos) { } - @Override - public void onAutopilotRotting(AutopilotRouteInfo routeList) { - if (null != routeList && routeList.getModels() != null){ -// mAutopilotPlanningCallback.routeResult(routeList.getModels()); - updateOrderRoute(routeList.getModels()); - } - } }; /** * 上报订单全路径规划数据 * @param models */ - public void updateOrderRoute(List models) { + public void updateOrderRoute(List models) { List points = new ArrayList<>(); for (int i =0; i < models.size(); i++){ OrderRouteUpdateReqBean.Result point = new OrderRouteUpdateReqBean.Result(); - point.latitude = models.get(i).getLat(); - point.longitude = models.get(i).getLon(); + point.latitude = models.get(i).getLatitude(); + point.longitude = models.get(i).getLongitude(); points.add(point); } @@ -1079,7 +1088,5 @@ public class MogoOCHTaxiModelNew { }); } - /** - * END - */ + } diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java index 60937e9ff7..29865b5624 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/presenter/OCHTaxiPresenter.java @@ -11,11 +11,9 @@ import androidx.lifecycle.LifecycleOwner; import com.mogo.commons.AbsMogoApplication; import com.mogo.commons.mvp.Presenter; -import com.mogo.eagle.core.data.autopilot.AutopilotRouteInfo; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.utilcode.mogo.logger.Logger; import com.mogo.eagle.core.utilcode.util.UiThreadHandler; -import com.mogo.och.taxi.callback.IOCHTaxiAutopilotPlanningCallback; import com.mogo.och.taxi.constant.OrderStatusEnum; import com.mogo.och.taxi.bean.OrderQueryRespBean; import com.mogo.och.taxi.bean.OrderQueryRouteInfoRespBean; diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java index 6542111b9c..0d8bab297d 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/BaseOchTaxiTabFragment.java @@ -3,7 +3,6 @@ package com.mogo.och.taxi.ui; import android.animation.ObjectAnimator; import android.content.Intent; import android.graphics.drawable.AnimationDrawable; -import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -16,7 +15,6 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.FragmentTransaction; @@ -27,11 +25,8 @@ import com.mogo.commons.mvp.IView; import com.mogo.commons.mvp.MvpFragment; import com.mogo.commons.mvp.Presenter; import com.mogo.commons.voice.AIAssist; -import com.mogo.eagle.core.data.autopilot.AutoPilotRecordResult; import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters; -import com.mogo.eagle.core.data.autopilot.AutopilotWarnMessage; import com.mogo.eagle.core.data.config.HmiBuildConfig; -import com.mogo.eagle.core.data.traffic.TrafficData; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotIdentifyListener; import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager; @@ -48,7 +43,8 @@ import com.mogo.module.common.constants.DataTypes; import com.mogo.module.common.view.OnPreventFastClickListener; import com.mogo.och.taxi.R; -import java.util.ArrayList; +import mogo.telematics.pad.MessagePad; +import record_cache.RecordPanelOuterClass; /** @@ -71,7 +67,7 @@ public abstract class BaseOchTaxiTabFragment { - Log.d(TAG,"长按显示状态工具栏"); + Log.d(TAG, "长按显示状态工具栏"); Intent intent = new Intent(); intent.putExtra("oper", 52); MogoApisHandler.getInstance().getApis().getIntentManagerApi().invoke("com.mogo.mock", intent); @@ -176,7 +172,7 @@ public abstract class BaseOchTaxiTabFragment { // if (groupTestPanel.getVisibility() == View.VISIBLE) { - groupTestPanel.setVisibility(View.GONE); + groupTestPanel.setVisibility(View.GONE); // } else { // groupTestPanel.setVisibility(View.VISIBLE); // } @@ -234,9 +230,9 @@ public abstract class BaseOchTaxiTabFragment trafficData) { } - - @Override - public void onAutopilotRecordResult(@Nullable AutoPilotRecordResult record) { - if (!HmiBuildConfig.isShowBadCaseView && record != null && record.getType() == 1 && record.getStat() == 100) { - CallerDevaToolsManager.INSTANCE.onReceiveBadCaseRecord(record); + public void onAutopilotRecordResult(@Nullable RecordPanelOuterClass.RecordPanel recordPanel) { + if (!HmiBuildConfig.isShowBadCaseView && recordPanel != null && recordPanel.getType() == 1 && recordPanel.getStat() == 100) { + CallerDevaToolsManager.INSTANCE.onReceiveBadCaseRecord(recordPanel); } } @Override - public void onAutopilotWarnMessage(@Nullable AutopilotWarnMessage autopilotWarnMessage) { } + public void onAutopilotWarnMessage(MessagePad.Warn warn) { + } public void showNotice(String notice) { getActivity().runOnUiThread(() -> { @@ -293,6 +287,7 @@ public abstract class BaseOchTaxiTabFragment { if (isStarting && IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != status) { @@ -321,7 +316,8 @@ public abstract class BaseOchTaxiTabFragment { if (tvOperationStatus == null) return; tvOperationStatus.setVisibility(visible); }); } - public void updateSpeedView(float newSpeed){ + public void updateSpeedView(float newSpeed) { int speed = (int) (Math.abs(newSpeed) * 3.6F); // 倒车时工控机反馈定位信息中speed为负值 mSpeedView.setText(String.valueOf(speed)); } @@ -490,22 +487,22 @@ public abstract class BaseOchTaxiTabFragment { - List list = new ArrayList<>(); + List list = new ArrayList<>(); for (int i = 0; i < 200 ; i++){ - AutopilotRouteInfo.RouteModels routeModels = new AutopilotRouteInfo.RouteModels(); + MessagePad.Location.Builder builder = MessagePad.Location.newBuilder(); if (i <= 100){ - routeModels.setLat(40.199248903658166); - routeModels.setLon(116.73435586102245 + i * 0.0001); + builder.setLatitude(40.199248903658166); + builder.setLongitude(116.73435586102245 + i * 0.0001); }else { - routeModels.setLat(40.199248903658166 + i * 0.0001); - routeModels.setLon(116.73435586102245 + 100 * 0.0001); + builder.setLatitude(40.199248903658166 + i * 0.0001); + builder.setLongitude(116.73435586102245 + 100 * 0.0001); } - list.add(routeModels); + list.add(builder.build()); } MogoOCHTaxiModelNew.getInstance().updateOrderRoute(list); }); @@ -346,4 +349,9 @@ public class OCHTaxiFragment extends BaseOchTaxiTabFragment trafficData) { + + } } diff --git a/app/src/androidTest/java/com/mogo/functions/test/AutoPilotBadCaseTest.kt b/app/src/androidTest/java/com/mogo/functions/test/AutoPilotBadCaseTest.kt index eeefe099fd..33b6edda37 100644 --- a/app/src/androidTest/java/com/mogo/functions/test/AutoPilotBadCaseTest.kt +++ b/app/src/androidTest/java/com/mogo/functions/test/AutoPilotBadCaseTest.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.flow.* import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import record_cache.RecordPanelOuterClass import java.text.SimpleDateFormat import java.util.* import java.util.concurrent.TimeUnit @@ -20,14 +21,15 @@ import kotlin.random.Random @LargeTest class AutoPilotBadCaseTest { - lateinit var launch: ActivityScenario + private lateinit var launch: ActivityScenario @Before fun launch() { launch = ActivityScenario.launch(MainLauncherActivity::class.java) } - @ExperimentalCoroutinesApi @Test + @ExperimentalCoroutinesApi + @Test fun showBadCaseEntrance1(): Unit = runBlocking(Dispatchers.Main) { delay(5000) var index = 0 @@ -36,17 +38,19 @@ class AutoPilotBadCaseTest { .asFlow() .onEach { delay(TimeUnit.SECONDS.toMillis(5)) - CallerDevaToolsManager.onReceiveBadCaseRecord(AutoPilotRecordResult().also { + val builder = RecordPanelOuterClass.RecordPanel.newBuilder() + builder.also { it.diskFree = (100 + index).toLong() - it.duration = 60.0 - it.fileName = "/user/general/record_$index.log" + it.duration = 60.0.toFloat() + it.filename = "/user/general/record_$index.log" it.id = 10 + index - it.key = "yyy_$index" + it.key = index.toLong() it.stat = 100 it.type = 1 it.timestamp = SimpleDateFormat("yyyyMMddHHmmss").format(Date()) index++ - }) + } + CallerDevaToolsManager.onReceiveBadCaseRecord(builder.build()) } .flowOn(Dispatchers.Default) .collect() @@ -54,8 +58,9 @@ class AutoPilotBadCaseTest { } - @ExperimentalCoroutinesApi @Test - fun showBadCaseEntrance2():Unit = runBlocking(Dispatchers.Main) { + @ExperimentalCoroutinesApi + @Test + fun showBadCaseEntrance2(): Unit = runBlocking(Dispatchers.Main) { delay(5000) var index = 0 (1 until 50) @@ -67,24 +72,27 @@ class AutoPilotBadCaseTest { } else { delay(Random(20).nextLong()) } - CallerDevaToolsManager.onReceiveBadCaseRecord(AutoPilotRecordResult().also { + val builder = RecordPanelOuterClass.RecordPanel.newBuilder() + builder.also { it.diskFree = (100 + index).toLong() - it.duration = 60.0 - it.fileName = "/user/general/record_$index.log" + it.duration = 60.0.toFloat() + it.filename = "/user/general/record_$index.log" it.id = 10 + index - it.key = "yyy_$index" + it.key = index.toLong() it.stat = 100 it.type = 1 it.timestamp = SimpleDateFormat("yyyyMMddHHmmss").format(Date()) index++ - }) + } + CallerDevaToolsManager.onReceiveBadCaseRecord(builder.build()) } .flowOn(Dispatchers.Default) .collect() delay(TimeUnit.HOURS.toMillis(2)) } - @ExperimentalCoroutinesApi @Test + @ExperimentalCoroutinesApi + @Test fun showBadCaseEntrance3(): Unit = runBlocking(Dispatchers.Main) { var index = 0 (1 until 50) @@ -92,17 +100,19 @@ class AutoPilotBadCaseTest { .asFlow() .onEach { delay(TimeUnit.SECONDS.toMillis(20)) - CallerDevaToolsManager.onReceiveBadCaseRecord(AutoPilotRecordResult().also { + val builder = RecordPanelOuterClass.RecordPanel.newBuilder() + builder.also { it.diskFree = (100 + index).toLong() - it.duration = 60.0 - it.fileName = "/user/general/record_$index.log" + it.duration = 60.0.toFloat() + it.filename = "/user/general/record_$index.log" it.id = 10 + index - it.key = "yyy_$index" + it.key = index.toLong() it.stat = 100 it.type = 1 it.timestamp = SimpleDateFormat("yyyyMMddHHmmss").format(Date()) index++ - }) + } + CallerDevaToolsManager.onReceiveBadCaseRecord(builder.build()) } .flowOn(Dispatchers.Default) .collect() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e9f00755d4..209b9e5144 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ android:label="@string/app_shell_name" android:largeHeap="true" android:resizeableActivity="false" + android:usesCleartextTraffic="true" android:supportsRtl="true" android:theme="@style/AppTheme.App" tools:replace="android:label"> diff --git a/app/src/main/java/com/mogo/launcher/MogoApplication.java b/app/src/main/java/com/mogo/launcher/MogoApplication.java index b0c38da4f5..46711ea231 100644 --- a/app/src/main/java/com/mogo/launcher/MogoApplication.java +++ b/app/src/main/java/com/mogo/launcher/MogoApplication.java @@ -40,7 +40,7 @@ public class MogoApplication extends MainMoGoApplication { @Override protected void initCloudClientConfig() { - // todo 使用旧Socket链路 true = 旧链路,false = 新链路 + // 使用旧Socket链路 true = 旧链路,false = 新链路 if (DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxi") || DebugConfig.getProductFlavor().equals("fPadLenovoOchBus") || DebugConfig.getProductFlavor().equals("fPadLenovoOchTaxiPassenger") diff --git a/modules/mogo-module-carchatting/.gitignore b/app_ipc_monitoring/.gitignore similarity index 100% rename from modules/mogo-module-carchatting/.gitignore rename to app_ipc_monitoring/.gitignore diff --git a/app_ipc_monitoring/README.md b/app_ipc_monitoring/README.md new file mode 100644 index 0000000000..922a02ab55 --- /dev/null +++ b/app_ipc_monitoring/README.md @@ -0,0 +1 @@ +# 工控机测试程序 \ No newline at end of file diff --git a/app_ipc_monitoring/build.gradle b/app_ipc_monitoring/build.gradle new file mode 100644 index 0000000000..9bb528f9a9 --- /dev/null +++ b/app_ipc_monitoring/build.gradle @@ -0,0 +1,62 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.2" + defaultConfig { + applicationId "com.zhidao.adas.client" + minSdkVersion 19 + targetSdkVersion 22 + multiDexEnabled true + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + flavorDimensions "multi_device" + + packagingOptions { + //解决编译时com.android.builder.merge.DuplicateRelativeFileException: More than one file was found with OS independent path 'META-INF/rxjava.properties'这个错误 + exclude 'META-INF/rxjava.properties' + } + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + productFlavors { + passenger { + dimension "multi_device" + buildConfigField 'boolean', 'IS_CLIENT', 'true' + } + driver { + dimension "multi_device" + buildConfigField 'boolean', 'IS_CLIENT', 'false' + } + + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.1' + implementation 'androidx.recyclerview:recyclerview:1.2.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + implementation "com.google.code.gson:gson:2.8.9" + implementation project(':libraries:mogo-adas') + implementation project(':core:mogo-core-data') + implementation project(':core:mogo-core-utils') +// api "com.zhidao.support.adas:high:1.2.1.2_bate21" + implementation 'org.greenrobot:eventbus:3.2.0' + implementation 'com.android.support:multidex:1.0.3' + implementation 'com.mogo.cloud:telematic:1.3.31' +} diff --git a/modules/mogo-module-carchattingprovider/proguard-rules.pro b/app_ipc_monitoring/proguard-rules.pro similarity index 100% rename from modules/mogo-module-carchattingprovider/proguard-rules.pro rename to app_ipc_monitoring/proguard-rules.pro diff --git a/app_ipc_monitoring/src/androidTest/java/com/zhidao/adas/client/ExampleInstrumentedTest.java b/app_ipc_monitoring/src/androidTest/java/com/zhidao/adas/client/ExampleInstrumentedTest.java new file mode 100644 index 0000000000..a69d6cb30b --- /dev/null +++ b/app_ipc_monitoring/src/androidTest/java/com/zhidao/adas/client/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.zhidao.adas.client; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.zhidao.adas.client", appContext.getPackageName()); + } +} diff --git a/app_ipc_monitoring/src/main/AndroidManifest.xml b/app_ipc_monitoring/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..5da8d114a8 --- /dev/null +++ b/app_ipc_monitoring/src/main/AndroidManifest.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseAdapter.java new file mode 100644 index 0000000000..495e2f4d8d --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseAdapter.java @@ -0,0 +1,110 @@ +package com.zhidao.adas.client.base; + + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + + +/** + * RecycleView Adapter + * Created by renfeicui on 2018/10/12. + */ +public abstract class BaseAdapter extends RecyclerView.Adapter { + protected String TAG = this.getClass().getSimpleName(); + protected List mDatas; + protected Context mContext; + private OnItemClickListener mItemClick; + + public interface OnItemClickListener { + void onItemClick(int position, D data); + } + + + public BaseAdapter() { + } + + public BaseAdapter(List mDatas) { + this.mDatas = mDatas; + } + + public BaseAdapter(OnItemClickListener listener) { + mItemClick = listener; + } + + public BaseAdapter(List mDatas, OnItemClickListener listener) { + this.mDatas = mDatas; + mItemClick = listener; + } + + public void setData(List mDatas) { + this.mDatas = mDatas; + notifyDataSetChanged(); + } + + public void setOnItemClickListener(OnItemClickListener listener) { + mItemClick = listener; + } + + /*** + * 获取制定 位置的Data + * @param position 下标 + * @return Data + */ + public D getItem(int position) { + return mDatas == null ? null : mDatas.get(position); + } + + @Override + public int getItemCount() { + return mDatas == null ? 0 : mDatas.size(); + } + + @Override + public void onBindViewHolder(@NonNull VH viewHolder, int position) { + D bean = getItem(position); + onBindDataToItem(viewHolder, bean, position); + } + + + @NonNull + @Override + public VH onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) { + mContext = viewGroup.getContext(); + return getViewHolder(getItemViewResource(viewGroup)); + } + + /*** + * 同onBindViewHolder() + * @param viewHolder viewHolder + * @param data 数据 + * @param position 下标 + */ + protected abstract void onBindDataToItem(VH viewHolder, D data, int position); + + /*** + * 获取Item布局 + * @return id + */ + protected abstract View getItemViewResource(ViewGroup viewGroup); + + /** + * 获取ViewHolder + * + * @param view + * @return + */ + protected abstract VH getViewHolder(View view); + + public void onClick(BaseViewHolder viewHolder) { + if (mItemClick != null) { + mItemClick.onItemClick(viewHolder.getAdapterPosition(), getItem(viewHolder.getAdapterPosition())); + } + } + +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseViewHolder.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseViewHolder.java new file mode 100644 index 0000000000..3c62985326 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseViewHolder.java @@ -0,0 +1,27 @@ +package com.zhidao.adas.client.base; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + + +public abstract class BaseViewHolder extends RecyclerView.ViewHolder { + private T adapter; + public View itemView; + + public BaseViewHolder(View itemView, final T adapter) { + super(itemView); + this.itemView = itemView; + this.adapter = adapter; + itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + adapter.onClick(BaseViewHolder.this); + } + }); + + } + + + +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ArrivalNotification.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ArrivalNotification.java new file mode 100644 index 0000000000..8ee24ac34e --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ArrivalNotification.java @@ -0,0 +1,21 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class ArrivalNotification extends Base { + public final MessagePad.ArrivalNotification bean; + + public ArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutopilotState.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutopilotState.java new file mode 100644 index 0000000000..f067d388d1 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/AutopilotState.java @@ -0,0 +1,22 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class AutopilotState extends Base { + public final MessagePad.AutopilotState bean; + + public AutopilotState(MessagePad.Header header, MessagePad.AutopilotState bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Base.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Base.java new file mode 100644 index 0000000000..e492bd77ef --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Base.java @@ -0,0 +1,21 @@ +package com.zhidao.adas.client.bean; + + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public abstract class Base { + public final MessagePad.Header header; + public final int len; + + public Base(int len, MessagePad.Header header) { + this.len = 8 + header.getSerializedSize() + len; + this.header = header; + } + + @Override + public String toString() { + return len + "##Header:[" + TextFormat.printer().escapingNonAscii(false).shortDebugString(header)+"]\n"; + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BasicInfoReq.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BasicInfoReq.java new file mode 100644 index 0000000000..4fb4076519 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/BasicInfoReq.java @@ -0,0 +1,21 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class BasicInfoReq extends Base { + public final MessagePad.BasicInfoReq bean; + + public BasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/CarConfigResp.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/CarConfigResp.java new file mode 100644 index 0000000000..aa9d82790d --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/CarConfigResp.java @@ -0,0 +1,21 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class CarConfigResp extends Base { + public final MessagePad.CarConfigResp bean; + + public CarConfigResp(MessagePad.Header header, MessagePad.CarConfigResp bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Config.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Config.java new file mode 100644 index 0000000000..9f18c1fd2b --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Config.java @@ -0,0 +1,11 @@ +package com.zhidao.adas.client.bean; + +public class Config { + public final String name; + public final String value; + + public Config(String name, String value) { + this.name = name; + this.value = value; + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java new file mode 100644 index 0000000000..aded5d05cc --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/ErrorData.java @@ -0,0 +1,19 @@ +package com.zhidao.adas.client.bean; + +import com.zhidao.support.adas.high.common.DigitalTrans; +import com.zhidao.support.adas.high.common.ProtocolStatus; + +public class ErrorData { + private final ProtocolStatus status; + private final byte[] bytes; + + public ErrorData(ProtocolStatus status, byte[] bytes) { + this.status = status; + this.bytes = bytes; + } + + @Override + public String toString() { + return status + "\n原始数据:" + DigitalTrans.byte2HexStr(bytes); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GlobalPathResp.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GlobalPathResp.java new file mode 100644 index 0000000000..3b8f694d1e --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GlobalPathResp.java @@ -0,0 +1,21 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class GlobalPathResp extends Base { + public final MessagePad.GlobalPathResp bean; + + public GlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GnssInfo.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GnssInfo.java new file mode 100644 index 0000000000..3b47532d5b --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/GnssInfo.java @@ -0,0 +1,22 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class GnssInfo extends Base { + public final MessagePad.GnssInfo bean; + + public GnssInfo(MessagePad.Header header, MessagePad.GnssInfo bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MogoReportMessage.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MogoReportMessage.java new file mode 100644 index 0000000000..c51c98185b --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/MogoReportMessage.java @@ -0,0 +1,23 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; + +public class MogoReportMessage extends Base { + public final MogoReportMsg.MogoReportMessage bean; + + public MogoReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/RecordPanel.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/RecordPanel.java new file mode 100644 index 0000000000..7d5e01696f --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/RecordPanel.java @@ -0,0 +1,22 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; +import record_cache.RecordPanelOuterClass; + +public class RecordPanel extends Base { + public final RecordPanelOuterClass.RecordPanel bean; + + public RecordPanel(MessagePad.Header header, RecordPanelOuterClass.RecordPanel bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/TrackedObjects.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/TrackedObjects.java new file mode 100644 index 0000000000..8a5061ac41 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/TrackedObjects.java @@ -0,0 +1,19 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class TrackedObjects extends Base { + private MessagePad.TrackedObjects bean; + + public TrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Trajectory.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Trajectory.java new file mode 100644 index 0000000000..b78095766c --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Trajectory.java @@ -0,0 +1,19 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class Trajectory extends Base { + public final MessagePad.Trajectory bean; + + public Trajectory(MessagePad.Header header, MessagePad.Trajectory bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } + +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/VehicleState.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/VehicleState.java new file mode 100644 index 0000000000..db44e63ce7 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/VehicleState.java @@ -0,0 +1,20 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import chassis.VehicleStateOuterClass; +import mogo.telematics.pad.MessagePad; + +public class VehicleState extends Base { + public final VehicleStateOuterClass.VehicleState bean; + + public VehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Warn.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Warn.java new file mode 100644 index 0000000000..310ceee8a9 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/Warn.java @@ -0,0 +1,19 @@ +package com.zhidao.adas.client.bean; + +import com.google.protobuf.TextFormat; + +import mogo.telematics.pad.MessagePad; + +public class Warn extends Base { + public final MessagePad.Warn bean; + + public Warn(MessagePad.Header header, MessagePad.Warn bean) { + super(bean.getSerializedSize(), header); + this.bean = bean; + } + + @Override + public String toString() { + return super.toString() + "Data:" + TextFormat.printer().escapingNonAscii(false).printToString(bean); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java new file mode 100644 index 0000000000..e9d598dbd7 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AiCloudToStartAutopilot.java @@ -0,0 +1,31 @@ +package com.zhidao.adas.client.ui.autopilot; + +import java.util.List; + +public class AiCloudToStartAutopilot { + + private String action = "aiCloudToStartAutopilot"; + public ResultDTO result; + + public static class ResultDTO { + public EndLatLonDTO endLatLon; + public Integer speedLimit = 20; + public StartLatLonDTO startLatLon; + public List wayLatLons; + + public static class EndLatLonDTO { + public Double lat; + public Double lon; + } + + public static class StartLatLonDTO { + public Double lat; + public Double lon; + } + + public static class WayLatLonsDTO { + public Double lat; + public Double lon; + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java new file mode 100644 index 0000000000..351dbe15c9 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/autopilot/AutopilotConfigActivity.java @@ -0,0 +1,305 @@ +package com.zhidao.adas.client.ui.autopilot; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.Switch; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.gson.Gson; + +import com.google.gson.reflect.TypeToken; +import com.zhidao.support.adas.high.AdasManager; +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.utils.Constants; +import com.zhidao.adas.client.utils.PreferencesUtils; + +import java.util.List; + + +public class AutopilotConfigActivity extends AppCompatActivity { + + public static void launch(Context context) { + Intent intent = new Intent(context,AutopilotConfigActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + private Gson gson = new Gson(); + private EditText start_lon1; + private EditText start_lat1; + private EditText stop_lon1; + private EditText stop_lat1; + private EditText t_lon1; + private EditText t_lat1; + + private EditText start_lon2; + private EditText start_lat2; + private EditText stop_lon2; + private EditText stop_lat2; + private EditText t_lon2; + private EditText t_lat2; + + private EditText start_lon3; + private EditText start_lat3; + private EditText stop_lon3; + private EditText stop_lat3; + private EditText t_lon3; + private EditText t_lat3; + + private EditText start_lon4; + private EditText start_lat4; + private EditText stop_lon4; + private EditText stop_lat4; + private EditText t_lon4; + private EditText t_lat4; + private List list; + + AiCloudToStartAutopilot data1; + AiCloudToStartAutopilot data2; + AiCloudToStartAutopilot data3; + AiCloudToStartAutopilot data4; + private String init_all_path = "[\n" + + " {\n" + + " \"action\": \"aiCloudToStartAutopilot\",\n" + + " \"result\": {\n" + + " \"endLatLon\": {\n" + + " \"lat\": 26.82355278566775,\n" + + " \"lon\": 112.57001723522112\n" + + " },\n" + + " \"speedLimit\": 20,\n" + + " \"startLatLon\": {\n" + + " \"lat\": 26.820319143036112,\n" + + " \"lon\": 112.57770688564666\n" + + " },\n" + + " \"wayLatLons\": [{\n" + + " \"lat\": 40.1984044,\n" + + " \"lon\": 116.7323222\n" + + " }]\n" + + " }\n" + + " },\n" + + " {\n" + + " \"action\": \"aiCloudToStartAutopilot\",\n" + + " \"result\": {\n" + + " \"endLatLon\": {\n" + + " \"lat\": 40.1979005,\n" + + " \"lon\": 116.7261382\n" + + " },\n" + + " \"speedLimit\": 20,\n" + + " \"startLatLon\": {\n" + + " \"lat\": 40.1992337,\n" + + " \"lon\": 116.7386131\n" + + " },\n" + + " \"wayLatLons\": [{\n" + + " \"lat\": 40.1984044,\n" + + " \"lon\": 116.7323222\n" + + " }]\n" + + " }\n" + + " },\n" + + " {\n" + + " \"action\": \"aiCloudToStartAutopilot\",\n" + + " \"result\": {\n" + + " \"endLatLon\": {\n" + + " \"lat\": 40.1979005,\n" + + " \"lon\": 116.7261382\n" + + " },\n" + + " \"speedLimit\": 20,\n" + + " \"startLatLon\": {\n" + + " \"lat\": 40.1992337,\n" + + " \"lon\": 116.7386131\n" + + " },\n" + + " \"wayLatLons\": [{\n" + + " \"lat\": 40.1984044,\n" + + " \"lon\": 116.7323222\n" + + " }]\n" + + " }\n" + + " },\n" + + " {\n" + + " \"action\": \"aiCloudToStartAutopilot\",\n" + + " \"result\": {\n" + + " \"endLatLon\": {\n" + + " \"lat\": 40.1979005,\n" + + " \"lon\": 116.7261382\n" + + " },\n" + + " \"speedLimit\": 20,\n" + + " \"startLatLon\": {\n" + + " \"lat\": 40.1992337,\n" + + " \"lon\": 116.7386131\n" + + " },\n" + + " \"wayLatLons\": [{\n" + + " \"lat\": 40.1984044,\n" + + " \"lon\": 116.7323222\n" + + " }]\n" + + " }\n" + + " }\n" + + "]"; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_autopilot_cloud_config); + start_lon1 = findViewById(R.id.start_lon1); + start_lat1 = findViewById(R.id.start_lat1); + stop_lon1 = findViewById(R.id.stop_lon1); + stop_lat1 = findViewById(R.id.stop_lat1); + t_lon1 = findViewById(R.id.t_lon1); + t_lat1 = findViewById(R.id.t_lat1); + + start_lon2 = findViewById(R.id.start_lon2); + start_lat2 = findViewById(R.id.start_lat2); + stop_lon2 = findViewById(R.id.stop_lon2); + stop_lat2 = findViewById(R.id.stop_lat2); + t_lon2 = findViewById(R.id.t_lon2); + t_lat2 = findViewById(R.id.t_lat2); + + start_lon3 = findViewById(R.id.start_lon3); + start_lat3 = findViewById(R.id.start_lat3); + stop_lon3 = findViewById(R.id.stop_lon3); + stop_lat3 = findViewById(R.id.stop_lat3); + t_lon3 = findViewById(R.id.t_lon3); + t_lat3 = findViewById(R.id.t_lat3); + + start_lon4 = findViewById(R.id.start_lon4); + start_lat4 = findViewById(R.id.start_lat4); + stop_lon4 = findViewById(R.id.stop_lon4); + stop_lat4 = findViewById(R.id.stop_lat4); + t_lon4 = findViewById(R.id.t_lon4); + t_lat4 = findViewById(R.id.t_lat4); + //开始执行 + final Button button = findViewById(R.id.start); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String json = PreferencesUtils.getString(AutopilotConfigActivity.this, Constants.SEL_PATH, null); + if (TextUtils.isEmpty(json)) { + Toast.makeText(AutopilotConfigActivity.this, "请先选择路线", Toast.LENGTH_SHORT).show(); + return; + } + json = json.split("##")[1]; + Log.i("开始执行自动驾驶", json); +// AdasManager.getInstance().aiCloudToAdasData(json); + } + }); + findViewById(R.id.save).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + data1.result.startLatLon.lon = Double.parseDouble(start_lon1.getText().toString().trim()); + data1.result.startLatLon.lat = Double.parseDouble(start_lat1.getText().toString().trim()); + data1.result.endLatLon.lon = Double.parseDouble(stop_lon1.getText().toString().trim()); + data1.result.endLatLon.lat = Double.parseDouble(stop_lat1.getText().toString().trim()); + data1.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon1.getText().toString().trim()); + data1.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat1.getText().toString().trim()); + + + data2.result.startLatLon.lon = Double.parseDouble(start_lon2.getText().toString().trim()); + data2.result.startLatLon.lat = Double.parseDouble(start_lat2.getText().toString().trim()); + data2.result.endLatLon.lon = Double.parseDouble(stop_lon2.getText().toString().trim()); + data2.result.endLatLon.lat = Double.parseDouble(stop_lat2.getText().toString().trim()); + data2.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon2.getText().toString().trim()); + data2.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat2.getText().toString().trim()); + + + data3.result.startLatLon.lon = Double.parseDouble(start_lon3.getText().toString().trim()); + data3.result.startLatLon.lat = Double.parseDouble(start_lat3.getText().toString().trim()); + data3.result.endLatLon.lon = Double.parseDouble(stop_lon3.getText().toString().trim()); + data3.result.endLatLon.lat = Double.parseDouble(stop_lat3.getText().toString().trim()); + data3.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon3.getText().toString().trim()); + data3.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat3.getText().toString().trim()); + + + data4.result.startLatLon.lon = Double.parseDouble(start_lon4.getText().toString().trim()); + data4.result.startLatLon.lat = Double.parseDouble(start_lat4.getText().toString().trim()); + data4.result.endLatLon.lon = Double.parseDouble(stop_lon4.getText().toString().trim()); + data4.result.endLatLon.lat = Double.parseDouble(stop_lat4.getText().toString().trim()); + data4.result.wayLatLons.get(0).lon = Double.parseDouble(t_lon4.getText().toString().trim()); + data4.result.wayLatLons.get(0).lat = Double.parseDouble(t_lat4.getText().toString().trim()); + + + PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.ALL_PATH, gson.toJson(list)); + } + }); + View path1 = findViewById(R.id.path1); + View path2 = findViewById(R.id.path2); + View path3 = findViewById(R.id.path3); + View path4 = findViewById(R.id.path4); + path1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(AutopilotConfigActivity.this, "已设置路线1", Toast.LENGTH_SHORT).show(); + PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "1##" + gson.toJson(list.get(0))); + button.setText("开始执行自动驾驶(路线1)"); + } + }); + path2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(AutopilotConfigActivity.this, "已设置路线2", Toast.LENGTH_SHORT).show(); + PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "2##" + gson.toJson(list.get(1))); + button.setText("开始执行自动驾驶(路线2)"); + } + }); + path3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(AutopilotConfigActivity.this, "已设置路线3", Toast.LENGTH_SHORT).show(); + PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "3##" + gson.toJson(list.get(2))); + button.setText("开始执行自动驾驶(路线3)"); + } + }); + path4.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(AutopilotConfigActivity.this, "已设置路线4", Toast.LENGTH_SHORT).show(); + PreferencesUtils.putString(AutopilotConfigActivity.this, Constants.SEL_PATH, "4##" + gson.toJson(list.get(3))); + button.setText("开始执行自动驾驶(路线4)"); + } + }); + + String allPath = PreferencesUtils.getString(AutopilotConfigActivity.this, Constants.ALL_PATH, init_all_path); + list = gson.fromJson(allPath, new TypeToken>() { + }.getType()); + data1 = list.get(0); + data2 = list.get(1); + data3 = list.get(2); + data4 = list.get(3); + start_lon1.setText(String.valueOf(data1.result.startLatLon.lon)); + start_lat1.setText(String.valueOf(data1.result.startLatLon.lat)); + stop_lon1.setText(String.valueOf(data1.result.endLatLon.lon)); + stop_lat1.setText(String.valueOf(data1.result.endLatLon.lat)); + t_lon1.setText(String.valueOf(data1.result.wayLatLons.get(0).lon)); + t_lat1.setText(String.valueOf(data1.result.wayLatLons.get(0).lat)); + + start_lon2.setText(String.valueOf(data2.result.startLatLon.lon)); + start_lat2.setText(String.valueOf(data2.result.startLatLon.lat)); + stop_lon2.setText(String.valueOf(data2.result.endLatLon.lon)); + stop_lat2.setText(String.valueOf(data2.result.endLatLon.lat)); + t_lon2.setText(String.valueOf(data2.result.wayLatLons.get(0).lon)); + t_lat2.setText(String.valueOf(data2.result.wayLatLons.get(0).lat)); + + start_lon3.setText(String.valueOf(data3.result.startLatLon.lon)); + start_lat3.setText(String.valueOf(data3.result.startLatLon.lat)); + stop_lon3.setText(String.valueOf(data3.result.endLatLon.lon)); + stop_lat3.setText(String.valueOf(data3.result.endLatLon.lat)); + t_lon3.setText(String.valueOf(data3.result.wayLatLons.get(0).lon)); + t_lat3.setText(String.valueOf(data3.result.wayLatLons.get(0).lat)); + + start_lon4.setText(String.valueOf(data4.result.startLatLon.lon)); + start_lat4.setText(String.valueOf(data4.result.startLatLon.lat)); + stop_lon4.setText(String.valueOf(data4.result.endLatLon.lon)); + stop_lat4.setText(String.valueOf(data4.result.endLatLon.lat)); + t_lon4.setText(String.valueOf(data4.result.wayLatLons.get(0).lon)); + t_lat4.setText(String.valueOf(data4.result.wayLatLons.get(0).lat)); + + + } + +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java new file mode 100644 index 0000000000..88dd8b7c35 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/ConfigAdapter.java @@ -0,0 +1,62 @@ +package com.zhidao.adas.client.ui.mian; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.base.BaseViewHolder; +import com.zhidao.adas.client.bean.Config; + +import java.util.List; + +/** + * @author song kenan + * @des + * @date 2021/8/13 + */ +public class ConfigAdapter extends BaseAdapter { + + + public ConfigAdapter() { + + } + + @Override + public void setData(List mDatas) { + super.setData(mDatas); + } + + @Override + protected void onBindDataToItem(ViewHolder viewHolder, Config data, int position) { + if (data == null) { + return; + } + viewHolder.name.setText(data.name); + viewHolder.value.setText(data.value); + + } + + @Override + protected View getItemViewResource(ViewGroup viewGroup) { + return LayoutInflater.from(mContext).inflate(R.layout.item_config, viewGroup, false); + } + + @Override + protected ViewHolder getViewHolder(View view) { + return new ViewHolder(view, this); + } + + class ViewHolder extends BaseViewHolder { + TextView name; + TextView value; + + public ViewHolder(View itemView, ConfigAdapter adapter) { + super(itemView, adapter); + name = itemView.findViewById(R.id.name); + value = itemView.findViewById(R.id.value); + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java new file mode 100644 index 0000000000..b268d58d1b --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/DataShowAdapter.java @@ -0,0 +1,71 @@ +package com.zhidao.adas.client.ui.mian; + +import android.annotation.SuppressLint; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.TextView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.base.BaseViewHolder; + +import java.util.Random; + + +//log所用 +public class DataShowAdapter extends BaseAdapter { + private final int[] colors = {Color.parseColor("#FA8072"), Color.parseColor("#FF00FF"), Color.parseColor("#228B22"), Color.parseColor("#871f78")}; + private final Random random = new Random(); + + public void refreshView(int position) { + if (position == -1) { + notifyDataSetChanged(); + } else { + notifyItemInserted(position); + } +// notifyDataSetChanged(); +// L.i(TAG, "position=" + position); + } + + @SuppressLint("SetTextI18n") + @Override + protected void onBindDataToItem(ViewHolder viewHolder, String data, int position) { + if (data.contains("##")) { + String[] temp = data.split("##"); + viewHolder.id.setText("[" + temp[0] + "]" + (position + 1) + ". "); + viewHolder.editText.setTextColor(colors[random.nextInt(4)]); + viewHolder.editText.setText(temp[1]); + } else { + viewHolder.id.setText((position + 1) + ". "); + viewHolder.editText.setTextColor(colors[random.nextInt(4)]); + viewHolder.editText.setText(data); + } + + } + + @Override + protected View getItemViewResource(ViewGroup viewGroup) { + return LayoutInflater.from(mContext).inflate(R.layout.item_log_info, viewGroup, false); + } + + + @Override + protected ViewHolder getViewHolder(View view) { + return new ViewHolder(view, this); + } + + + class ViewHolder extends BaseViewHolder { + EditText editText; + TextView id; + + public ViewHolder(View itemView, DataShowAdapter adapter) { + super(itemView, adapter); + editText = itemView.findViewById(R.id.log); + id = itemView.findViewById(R.id.id); + } + } +} \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java new file mode 100644 index 0000000000..51d06b0e10 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoFragment.java @@ -0,0 +1,273 @@ +package com.zhidao.adas.client.ui.mian; + +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.bean.ArrivalNotification; +import com.zhidao.adas.client.bean.AutopilotState; +import com.zhidao.adas.client.bean.ErrorData; +import com.zhidao.adas.client.bean.GlobalPathResp; +import com.zhidao.adas.client.bean.GnssInfo; +import com.zhidao.adas.client.bean.RecordPanel; +import com.zhidao.adas.client.bean.TrackedObjects; +import com.zhidao.adas.client.bean.Trajectory; +import com.zhidao.adas.client.bean.VehicleState; +import com.zhidao.adas.client.bean.Warn; +import com.zhidao.adas.client.utils.MyLinearLayoutManager; +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.msg.ReportMessage; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author song kenan + * @des + * @date 2021/8/16 + */ +public class InfoFragment extends Fragment { + + private String title; + private final List data = new ArrayList<>(); + private DataShowAdapter adapter; + + public InfoFragment() { + } + + public InfoFragment(String title) { + this.title = title; + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_info, container, false); + initView(view); + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + EventBus.getDefault().register(this); + } + + private TextView tvTitle; + private RecyclerView rvInfo; + + private void initView(View view) { + tvTitle = view.findViewById(R.id.tv_title); + rvInfo = view.findViewById(R.id.rv_info); + + CupidLogUtils.w("InfoFragment===>" + title); + tvTitle.setText(title); + tvTitle.setGravity(Gravity.CENTER); + //创建默认的线性LayoutManager 横向的GridLayoutManager + MyLinearLayoutManager linearLayoutManager = new MyLinearLayoutManager(this.getContext()); + linearLayoutManager.setStackFromEnd(true);//列表再底部开始展示,反转后由上面开始展示 +// linearLayoutManager.setReverseLayout(true);//列表翻转 + rvInfo.setLayoutManager(linearLayoutManager); + //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 + rvInfo.setHasFixedSize(false); + rvInfo.setNestedScrollingEnabled(false); + adapter = new DataShowAdapter(); + adapter.setData(data); + rvInfo.setAdapter(adapter); + + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onWarnEvent(Warn info) { + if (title.equals(MainActivity.TITLE.RECEIVE_WARN)) { + if (data.size() > 9) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onRectEvent(TrackedObjects info) { + if (title.equals(MainActivity.TITLE.RECEIVE_TRACKED_OBJECTS)) { + if (data.size() > 4) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onErrorEvent(ErrorData info) { + if (title.equals(MainActivity.TITLE.RECEIVE_ERROR)) { + if (data.size() > 19) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + private void onTurnLightState(int turnLight, boolean brake_light) { + StringBuilder builder = new StringBuilder(MainActivity.TITLE.RECEIVE_VEHICLE_STATE + "\t"); + if (turnLight == 0) { + builder.append("左转:关"); + builder.append("右转:关"); + } else if (turnLight == 1) { + builder.append("左转:开"); + builder.append("右转:关"); + } else if (turnLight == 2) { + builder.append("左转:关"); + builder.append("右转:开"); + } + + builder.append(brake_light ? " 刹车:开" : " 刹车:关"); + tvTitle.setText(builder.toString()); + } + + /** + * 解析转向灯 + */ + private int turnLightTimes = 0; + private boolean isOnTurnLight = false; + private int turnLight = 0; + + public int setTurnLightState(int turn_light) { + if (turn_light == 0) { + if (isOnTurnLight) { + if (turnLightTimes >= 10) { + isOnTurnLight = false; + turnLight = 0; + } + turnLightTimes++; + } + } else if (turn_light == 1) { + turnLightTimes = 0; + isOnTurnLight = true; + turnLight = 1; + } else if (turn_light == 2) { + turnLightTimes = 0; + isOnTurnLight = true; + turnLight = 2; + } + return turnLight; + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onCarEvent(VehicleState info) { + if (title.equals(MainActivity.TITLE.RECEIVE_VEHICLE_STATE)) { + if (data.size() > 5) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + int light = info.bean.getLight().getNumber();//转向灯状态 0是正常 1是左转 2是右转 + onTurnLightState(setTurnLightState(light), info.bean.getBrakeLightStatus()); + } + } + + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onAutoEvent(GnssInfo info) { + if (title.equals(MainActivity.TITLE.RECEIVE_GNSS_INFO)) { + if (data.size() > 9) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onAutoEvent(AutopilotState info) { + if (title.equals(MainActivity.TITLE.RECEIVE_AUTOPILOT_STATE)) { + if (data.size() > 9) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onTrajectoryEvent(Trajectory info) { + if (title.equals(MainActivity.TITLE.RECEIVE_TRAJECTORY)) { + if (data.size() > 9) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onAutopilotWayArriveEvent(ArrivalNotification info) { + if (title.equals(MainActivity.TITLE.RECEIVE_ARRIVAL_NOTIFICATION)) { + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onAutopilotRouteEvent(GlobalPathResp info) { + if (title.equals(MainActivity.TITLE.RECEIVE_GLOBAL_PATH_RESP)) { + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onAutopilotRecordResultEvent(RecordPanel info) { + if (title.equals(MainActivity.TITLE.RECEIVE_RECORD_RESULT)) { + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onAutopilotGuardianInfoEvent(ReportMessage info) { + if (title.equals(MainActivity.TITLE.RECEIVE_REPORT_MESSAGE)) { + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + EventBus.getDefault().unregister(this); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java new file mode 100644 index 0000000000..136277a6d6 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/InfoTitleAdapter.java @@ -0,0 +1,65 @@ +package com.zhidao.adas.client.ui.mian; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.base.BaseViewHolder; + +import java.util.List; + +/** + * @author song kenan + * @des + * @date 2021/8/13 + */ +public class InfoTitleAdapter extends BaseAdapter { + private int selectedPosition = 0;//当前选中的下标 + private boolean isFragment = false; + + public void setSelectedPosition(int position) { + if (position != selectedPosition) { + notifyItemChanged(position); + notifyItemChanged(selectedPosition); + selectedPosition = position; + } + } + public InfoTitleAdapter(List data, boolean isFragment) { + super(data); + this.isFragment = isFragment; + } + + @Override + protected void onBindDataToItem(ViewHolder viewHolder, String data, int position) { + if (data == null) { + return; + } + if (isFragment){ + viewHolder.itemView.setSelected(selectedPosition == position); + } + viewHolder.title.setText(data); + + } + + @Override + protected View getItemViewResource(ViewGroup viewGroup) { + return LayoutInflater.from(mContext).inflate(R.layout.item_info, viewGroup, false); + } + + @Override + protected ViewHolder getViewHolder(View view) { + return new ViewHolder(view, this); + } + + class ViewHolder extends BaseViewHolder { + TextView title; + + public ViewHolder(View itemView, InfoTitleAdapter adapter) { + super(itemView, adapter); + title = itemView.findViewById(R.id.tv_info_title); + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java new file mode 100644 index 0000000000..b49286cc5b --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/MainActivity.java @@ -0,0 +1,995 @@ +package com.zhidao.adas.client.ui.mian; + +import static com.mogo.telematic.MogoProtocolMsg.NORMAL_DATA; + +import android.content.Context; +import android.content.res.Configuration; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.WindowManager; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.Switch; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.AppCompatButton; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + +import com.google.gson.Gson; +import com.mogo.telematic.MogoProtocolMsg; +import com.mogo.telematic.NSDNettyManager; +import com.mogo.telematic.client.listener.NettyClientListener; +import com.mogo.telematic.client.status.ConnectState; +import com.mogo.telematic.server.netty.NettyServerListener; +import com.zhidao.adas.client.BuildConfig; +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.base.BaseAdapter; +import com.zhidao.adas.client.bean.ArrivalNotification; +import com.zhidao.adas.client.bean.AutopilotState; +import com.zhidao.adas.client.bean.BasicInfoReq; +import com.zhidao.adas.client.bean.CarConfigResp; +import com.zhidao.adas.client.bean.ErrorData; +import com.zhidao.adas.client.bean.GlobalPathResp; +import com.zhidao.adas.client.bean.GnssInfo; +import com.zhidao.adas.client.bean.MogoReportMessage; +import com.zhidao.adas.client.bean.RecordPanel; +import com.zhidao.adas.client.bean.TrackedObjects; +import com.zhidao.adas.client.bean.Trajectory; +import com.zhidao.adas.client.bean.VehicleState; +import com.zhidao.adas.client.bean.Warn; +import com.zhidao.adas.client.utils.Constants; +import com.zhidao.support.adas.high.AdasManager; +import com.zhidao.support.adas.high.AdasOptions; +import com.zhidao.support.adas.high.OnAdasListener; +import com.zhidao.support.adas.high.OnAdasConnectStatusListener; +import com.zhidao.support.adas.high.OnMultiDeviceListener; + +import com.zhidao.support.adas.high.bean.IPCUpgradeStateInfo; +import com.zhidao.support.adas.high.bean.SSHResult; + +import com.zhidao.support.adas.high.common.CupidLogUtils; +import com.zhidao.support.adas.high.common.ProtocolStatus; +import com.zhidao.support.recorder.RecordDataManager; + +import org.greenrobot.eventbus.EventBus; +import org.json.JSONException; +import org.json.JSONObject; + +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; + +import chassis.VehicleStateOuterClass; +import io.netty.channel.Channel; +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; +import record_cache.RecordPanelOuterClass; + +public class MainActivity extends AppCompatActivity implements OnAdasListener, OnAdasConnectStatusListener, BaseAdapter.OnItemClickListener { + private final static String TAG = MainActivity.class.getSimpleName(); + private EditText etIp; + private TextView role; + private TextView tvIp; + private TextView title; + private TextView ipcIp; + private TextView localIp; + private View line; + private RadioGroup connectionType; + private AppCompatButton connect; + private AppCompatButton disconnect; + private RadioButton fixation; + private RadioButton assign; + private Switch switchLog; + private RecyclerView infoBtn; + private RecyclerView infoFragment; + private TextView tvConnectState; + private ScheduledExecutorService mExecutorServiceConfigTimer; + private Gson gson; + + + private final List titleFragmentData = new ArrayList<>(); + private final List titleBtnData = 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 UpgradeFragment upgradeFragment; + private InfoFragment badcseFragment; + private InfoFragment errorFragment; + private InfoFragment reportMessageFragment; + private VersionFragment versionFragment; + private FragmentManager manager; + private FragmentTransaction transaction; + private String ftpTime; + private boolean isPad; + private long recordKey; + private String recordFileName; + private int connectStatus; + + + public interface TITLE { + String RECEIVE_TRAJECTORY = "车前引导线"; + String RECEIVE_TRACKED_OBJECTS = "障碍物信息"; + String RECEIVE_GNSS_INFO = "惯导信息"; + String RECEIVE_VEHICLE_STATE = "底盘信息"; + String RECEIVE_AUTOPILOT_STATE = "自动驾驶状态"; + String RECEIVE_REPORT_MESSAGE = "监控事件"; + // String RECEIVE_BASIC_INFO_REQ = "自动驾驶设备基础信息请求"; + String RECEIVE_CAR_CONFIG_RESP = "信息与配置"; + String RECEIVE_RECORD_RESULT = "数据采集结果"; + String RECEIVE_GLOBAL_PATH_RESP = "自动驾驶路径"; + String RECEIVE_WARN = "预警数据"; + String RECEIVE_ARRIVAL_NOTIFICATION = "到站提醒"; + String RECEIVE_IPC_UPGRADE_STATUS = "升级状态"; + String RECEIVE_ERROR = "错误数据"; + + + String SEND_BASIC_INFO_RESP = "自动驾驶设备基础信息应答"; + String SEND_SET_AUTOPILOT_MODE_REQ = "设置自动驾驶模式 启动自动驾驶"; + String SEND_SET_DEMO_MODE_REQ = "设置演示模式"; + String SEND_CAR_CONFIG_REQ = "车机基础信息请求"; + String SEND_RECORD_CAUSE = "记录人工接管原因"; + String SEND_RECORD_DATA = "数据采集请求"; + String SEND_SET_AUTOPILOT_SPEED_REQ = "设置自动驾驶最大速度"; + String SEND_GLOBAL_PATH_REQ = "自动驾驶路径请求"; + String SEND_TRAFFIC_LIGHT_DATA = "发送红绿灯数据到工控机"; + + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + isPad = isPad(this); + if (!isPad) + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + initView(); + firstFragment(); + gson = new Gson(); + initAdas(); + connectStatus = AdasManager.getInstance().getIpcConnectionStatus(); + onUpdateConnectStateView(); + showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); + } + + + private void connect(boolean isConnect) { + if (isConnect) { + switch (Constants.getIpcConnectionMode(this)) { + case AdasOptions.IPC_CONNECTION_MODE.FIXATION: + AdasManager.getInstance().getAdasOptions().setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(this)); + break; + case AdasOptions.IPC_CONNECTION_MODE.ASSIGN: + String ip = etIp.getText().toString().trim(); + if (TextUtils.isEmpty(ip)) { + Toast.makeText(this, "请输入指定IP", Toast.LENGTH_SHORT).show(); + return; + } + AdasManager.getInstance().getAdasOptions().setIpcAssignIP(ip); + break; + } + AdasManager.getInstance().getAdasOptions().setIpcConnectionMode(Constants.getIpcConnectionMode(this)); + AdasManager.getInstance().connect(); + } else + AdasManager.getInstance().disconnect(); + } + + + private void initView() { + etIp = findViewById(R.id.et_ip); + role = findViewById(R.id.role); + line = findViewById(R.id.line); + connectionType = findViewById(R.id.connection_type); + tvIp = findViewById(R.id.tv_ip); + connect = findViewById(R.id.connect); + disconnect = findViewById(R.id.disconnect); + fixation = findViewById(R.id.fixation); + assign = findViewById(R.id.assign); + switchLog = findViewById(R.id.switch_log); + title = findViewById(R.id.title); + infoBtn = findViewById(R.id.info_btn); + infoFragment = findViewById(R.id.info_fragment); + tvConnectState = findViewById(R.id.tv_connect_state); + ipcIp = findViewById(R.id.ipc_ip); + localIp = findViewById(R.id.local_ip); + + + role.setText(BuildConfig.IS_CLIENT ? "乘客" : "司机"); + if (BuildConfig.IS_CLIENT) { + line.setVisibility(View.GONE); + connectionType.setVisibility(View.GONE); + etIp.setVisibility(View.GONE); + tvIp.setVisibility(View.GONE); + line.setVisibility(View.GONE); + connect.setVisibility(View.GONE); + disconnect.setVisibility(View.GONE); + } + connect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + connect(true); + } + }); + disconnect.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + connect(false); + } + }); + initListData(); + initBtnRecyclerView(); + initFragmentRecyclerView(); + switch (Constants.getIpcConnectionMode(this)) { + case 0: + fixation.setChecked(true); + break; + case 1: + assign.setChecked(true); + break; + + } + String ip = Constants.getIPCIp(this); + if (!TextUtils.isEmpty(ip)) + etIp.setText(ip); +// infoTitleList.add("录音测试"); + //初始化fragment + manager = getSupportFragmentManager(); + transaction = manager.beginTransaction(); + + + switchLog.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + if (b) { + AdasManager.getInstance().setEnableLog(true); + switchLog.setText("日志:开"); + + } else { + AdasManager.getInstance().setEnableLog(false); + switchLog.setText("日志:关"); + } + } + }); + connectionType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(RadioGroup group, int checkedId) { + int type; + switch (checkedId) { + default: + + case R.id.assign: + type = AdasOptions.IPC_CONNECTION_MODE.ASSIGN; + break; + case R.id.fixation: + type = AdasOptions.IPC_CONNECTION_MODE.FIXATION; + break; + } + Constants.setIpcConnectionMode(MainActivity.this, type); + } + }); + etIp.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if (TextUtils.isEmpty(s)) { + Constants.delIPCIp(MainActivity.this); + } else { + Constants.setIPCIp(MainActivity.this, s.toString()); + } + + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + showLocalIP(); + title.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showLocalIP(); + } + }); + } + + private void initListData() { + titleFragmentData.add(TITLE.RECEIVE_GNSS_INFO); + titleFragmentData.add(TITLE.RECEIVE_TRAJECTORY); + titleFragmentData.add(TITLE.RECEIVE_TRACKED_OBJECTS); + titleFragmentData.add(TITLE.RECEIVE_VEHICLE_STATE); + titleFragmentData.add(TITLE.RECEIVE_AUTOPILOT_STATE); + titleFragmentData.add(TITLE.RECEIVE_REPORT_MESSAGE); + titleFragmentData.add(TITLE.RECEIVE_CAR_CONFIG_RESP); + titleFragmentData.add(TITLE.RECEIVE_RECORD_RESULT); + titleFragmentData.add(TITLE.RECEIVE_GLOBAL_PATH_RESP); + titleFragmentData.add(TITLE.RECEIVE_WARN); + titleFragmentData.add(TITLE.RECEIVE_ARRIVAL_NOTIFICATION); + titleFragmentData.add(TITLE.RECEIVE_IPC_UPGRADE_STATUS); + titleFragmentData.add(TITLE.RECEIVE_ERROR); + + + titleBtnData.add("下发站点1"); + titleBtnData.add("下发站点2"); + titleBtnData.add("自动驾驶路径查询"); + titleBtnData.add("下发SN"); + titleBtnData.add("数据采集5秒"); + titleBtnData.add("数据采集start"); + titleBtnData.add("数据采集end"); + titleBtnData.add("发送信号灯"); + titleBtnData.add("速度设置"); + titleBtnData.add("重启Docker"); + titleBtnData.add("重启IPC"); + titleBtnData.add("关机"); + titleBtnData.add("采集类型"); + titleBtnData.add("打开演示模式"); + titleBtnData.add("关闭演示模式"); + } + + private void initBtnRecyclerView() { + //初始info-recycle + GridLayoutManager nodLinearLayoutManage = new GridLayoutManager(this, 2); + nodLinearLayoutManage.setOrientation(LinearLayoutManager.HORIZONTAL); + infoBtn.setLayoutManager(nodLinearLayoutManage); + //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 + infoBtn.setHasFixedSize(true); + //解决局部刷新闪屏问题 + SimpleItemAnimator animatorInfo = (SimpleItemAnimator) infoBtn.getItemAnimator(); + if (animatorInfo != null) + animatorInfo.setSupportsChangeAnimations(false); + //创建并设置Adapter + btnAdapter = new InfoTitleAdapter(titleBtnData, false); + infoBtn.setAdapter(btnAdapter); + btnAdapter.setOnItemClickListener(this); + } + + private void initFragmentRecyclerView() { + //创建默认的线性LayoutManager 横向的GridLayoutManager + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + infoFragment.setLayoutManager(linearLayoutManager); + //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 + infoFragment.setHasFixedSize(true); + //解决局部刷新闪屏问题 + SimpleItemAnimator animator = (SimpleItemAnimator) infoFragment.getItemAnimator(); + if (animator != null) + animator.setSupportsChangeAnimations(false); + //创建并设置Adapter + fragmentAdapter = new InfoTitleAdapter(titleFragmentData, true); + infoFragment.setAdapter(fragmentAdapter); + fragmentAdapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() { + + @Override + public void onItemClick(int position, String data) { + fragmentAdapter.setSelectedPosition(position); + manager = getSupportFragmentManager(); + transaction = manager.beginTransaction(); + CupidLogUtils.w(TAG, "TitleAdapter===>name:" + data); + switch (data) { + case TITLE.RECEIVE_GNSS_INFO: + firstFragment(); + break; + case 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 TITLE.RECEIVE_TRACKED_OBJECTS: + if (viewFragment == null) + viewFragment = new InfoFragment(data); + if (!viewFragment.isVisible()) { + transaction.replace(R.id.fl_info, viewFragment); + transaction.commit(); + } + break; + case 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 TITLE.RECEIVE_WARN: + if (warnFragment == null) + warnFragment = new InfoFragment(data); + if (!warnFragment.isVisible()) { + transaction.replace(R.id.fl_info, warnFragment); + transaction.commit(); + } + break; + case TITLE.RECEIVE_TRAJECTORY: + if (trajectoryFragment == null) + trajectoryFragment = new InfoFragment(data); + if (!trajectoryFragment.isVisible()) { + transaction.replace(R.id.fl_info, trajectoryFragment); + transaction.commit(); + } + break; + case 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 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 TITLE.RECEIVE_IPC_UPGRADE_STATUS: + if (upgradeFragment == null) + upgradeFragment = new UpgradeFragment(data); + if (!upgradeFragment.isVisible()) { + transaction.replace(R.id.fl_info, upgradeFragment); + transaction.commit(); + } + break; + case 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 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 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 TITLE.RECEIVE_ERROR: + if (errorFragment == null) + errorFragment = new InfoFragment(data); + if (!errorFragment.isVisible()) { + transaction.replace(R.id.fl_info, errorFragment); + transaction.commit(); + } + break; + } + } + }); + } + + public void showIPCIP(final String ip, final int port) { + runOnUiThread(new Runnable() { + @Override + public void run() { + if (!BuildConfig.IS_CLIENT) { + String temp = ""; + ipcIp.setVisibility(View.VISIBLE); + if (!TextUtils.isEmpty(ip)) { + temp = "IPC IP:" + ip + ":" + port; + } + ipcIp.setText(temp); + } else { + ipcIp.setVisibility(View.GONE); + } + } + }); + } + + + private void onUpdateConnectStateView() { + String status; + int color; + switch (connectStatus) { + case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED: + status = "已连接"; + color = R.color.connect_status_connected; + break; + default: + case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED: + status = "未连接"; + color = R.color.connect_status_disconnected; + break; + case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTING: + status = "连接中"; + color = R.color.connect_status_connecting; + break; + + case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.SEARCH_ADDRESS: + status = "搜索IP"; + color = R.color.connect_status_search_address; + break; + case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.NOT_FOUND_ADDRESS: + status = "未找到"; + color = R.color.connect_status_disconnecting; + break; + } + CupidLogUtils.i(TAG, "connectStatus=" + status); + runOnUiThread(new Runnable() { + @Override + public void run() { + tvConnectState.setText(status); + tvConnectState.setTextColor(getResources().getColor(color)); + } + }); + } + + + private void updateText(final TextView tv, final String text) { + runOnUiThread(new Runnable() { + @Override + public void run() { + tv.setText(text); + } + }); + + } + + + @Override + public void onSSHResult(final SSHResult info) { + runOnUiThread(new Runnable() { + @Override + public void run() { + showToastCenter("IPC命令下发结果:" + info.code + " 命令:" + info.cmd + " 信息:" + info.msg); + } + }); + CupidLogUtils.w(TAG, "IPC命令下发结果:" + info.code + " 命令:" + info.cmd + " 信息:" + info.msg); + } + + @Override + public void onError(ProtocolStatus status, byte[] bytes) { + EventBus.getDefault().postSticky(new ErrorData(status, bytes)); + } + + @Override + public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) { + EventBus.getDefault().postSticky(new Trajectory(header, trajectory)); + } + + @Override + public void onTrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects trackedObjects) { + EventBus.getDefault().postSticky(new TrackedObjects(header, trackedObjects)); + } + + @Override + public void onGnssInfo(MessagePad.Header header, MessagePad.GnssInfo gnssInfo) { + EventBus.getDefault().postSticky(new GnssInfo(header, gnssInfo)); + } + + @Override + public void onVehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState vehicleState) { + EventBus.getDefault().postSticky(new VehicleState(header, vehicleState)); + } + + @Override + public void onAutopilotState(MessagePad.Header header, MessagePad.AutopilotState autopilotState) { + EventBus.getDefault().postSticky(new AutopilotState(header, autopilotState)); + } + + @Override + public void onReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage mogoReportMessage) { + EventBus.getDefault().postSticky(new MogoReportMessage(header, mogoReportMessage)); + } + + @Override + public void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq) { + BasicInfoReq info = new BasicInfoReq(header, basicInfoReq); + AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); + runOnUiThread(new Runnable() { + @Override + public void run() { + toastMsg("收到车机基础信息请求:" + info.toString()); + } + }); +// EventBus.getDefault().postSticky(new BasicInfoReq(header, basicInfoReq)); + } + + @Override + public void onCarConfigResp(MessagePad.Header header, MessagePad.CarConfigResp carConfigResp) { + EventBus.getDefault().postSticky(new CarConfigResp(header, carConfigResp)); + } + + @Override + public void onRecordResult(MessagePad.Header header, RecordPanelOuterClass.RecordPanel recordPanel) { + recordKey = recordPanel.getKey(); + recordFileName = recordPanel.getFilename(); + EventBus.getDefault().postSticky(new RecordPanel(header, recordPanel)); + } + + @Override + public void onGlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp globalPathResp) { + EventBus.getDefault().postSticky(new GlobalPathResp(header, globalPathResp)); + } + + @Override + public void onWarn(MessagePad.Header header, MessagePad.Warn warn) { + EventBus.getDefault().postSticky(new Warn(header, warn)); + } + + @Override + public void onArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification arrivalNotification) { + EventBus.getDefault().postSticky(new ArrivalNotification(header, arrivalNotification)); + } + + @Override + public void onUpgradeStateInfo(final IPCUpgradeStateInfo info) { + EventBus.getDefault().postSticky(info); + } + + + private Toast toast; + + public void showToastCenter(String msg) { + if (toast != null) { + toast.cancel(); + toast = null; + } + toast = Toast.makeText(this, "", Toast.LENGTH_SHORT); //如果有居中显示需求 + toast.setGravity(Gravity.CENTER, 0, 0); + toast.setText(msg); + toast.show(); + } + + + private void initAdas() { + CupidLogUtils.e(TAG, "--->初始化"); + AdasOptions options; + if (BuildConfig.IS_CLIENT) { + /*—————————————作为乘客端———————————*/ + options = new AdasOptions.Builder().setClient(true).build(); + NSDNettyManager.getInstance().searchAndConnectServer(this, "1234", new NettyClientListener() { + + + @Override + public void onMessageResponseClient(MogoProtocolMsg msg, String sign) { + AdasManager.getInstance().parseIPCData(msg.getBody()); + } + + @Override + public void onClientStatusConnectChanged(int statusCode, String sign) { + if (statusCode == ConnectState.STATUS_CONNECT_SUCCESS) { + connectStatus = com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED; + } else { + connectStatus = com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED; + } + runOnUiThread(new Runnable() { + @Override + public void run() { + ipcIp.setVisibility(View.VISIBLE); + ipcIp.setText("司机IP:" + NSDNettyManager.getInstance().getConnServerIp()); + } + }); + onUpdateConnectStateView(); + } + }); + } else { + /*—————————————作为司机端———————————*/ + int mode = Constants.getIpcConnectionMode(this); + switch (mode) { + default: + case AdasOptions.IPC_CONNECTION_MODE.FIXATION: + options = new AdasOptions.Builder().setClient(false).setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(this)).setIpcConnectionMode(mode).build(); + break; + case AdasOptions.IPC_CONNECTION_MODE.ASSIGN: + options = new AdasOptions.Builder().setClient(false).setIpcAssignIP(Constants.getIPCIp(this)).setIpcConnectionMode(mode).build(); + break; + } + + NSDNettyManager.getInstance().startNSDNettyServerWithSN(this, new NettyServerListener() { + @Override + public void onMessageResponseServer(MogoProtocolMsg msg, Channel channel) { + } + + @Override + public void onStartServer() { + + } + + @Override + public void onStopServer() { + + } + + @Override + public void onChannelConnect(Channel channel) { + Log.i(TAG,"onChannelConnect channel="+channel.id()); + } + + @Override + public void onChannelDisConnect(Channel channel) { + Log.i(TAG,"onChannelDisConnect channel="+channel.id()); + } + },"1234567"); + + + } + AdasManager.getInstance().create(options, this); + + AdasManager.getInstance().setOnAdasListener(this); +// AdasManager.getInstance().setOnAdasConnectStatusListener(this); + if (BuildConfig.IS_CLIENT) { + /*—————————————作为乘客端———————————*/ + + } else { + /*—————————————作为司機端———————————*/ + AdasManager.getInstance().setOnMultiDeviceListener(new OnMultiDeviceListener() { + @Override + public void onForwardingIPCMessage(byte[] bytes) { + // 发送数据给乘客端 + if (NSDNettyManager.getInstance().isServerStart()) { + NSDNettyManager.getInstance().sendMsgToAllClients(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes)); + } else { + Log.d("dddd", "司机端Server未启动!"); + } + + } + }); + + + } + } + + + @Override + protected void onPause() { + super.onPause(); +// AdasManager.getInstance().pause(); + } + + @Override + protected void onResume() { + super.onResume(); +// AdasManager.getInstance().resume(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + AdasManager.getInstance().setOnAdasListener(null); + AdasManager.getInstance().disconnect(); + if (mExecutorServiceConfigTimer != null) { + mExecutorServiceConfigTimer.shutdownNow(); + } + } + + + @Override + public void onConnectionIPCStatus(int ipcConnectionStatus, String failedMsg) { + connectStatus = ipcConnectionStatus; + onUpdateConnectStateView(); + if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED) { + CupidLogUtils.w(TAG, "===>MainActivity onWebSocketConnectSuccess"); + showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); + } else if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { + toastMsg("连接失败:" + failedMsg); + CupidLogUtils.w(TAG, "===>MainActivity onWebSocketConnectFailed"); + showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); + } + } + + + public void toastMsg(final String msg) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show(); + } + }); + } + + private void showLocalIP() { + localIp.setText("本机IP:" + getIpAddressString()); + } + + private String getIpAddressString() { + try { + for (Enumeration enNetI = NetworkInterface + .getNetworkInterfaces(); enNetI.hasMoreElements(); ) { + NetworkInterface netI = enNetI.nextElement(); + for (Enumeration enumIpAddr = netI + .getInetAddresses(); enumIpAddr.hasMoreElements(); ) { + InetAddress inetAddress = enumIpAddr.nextElement(); + if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) { + return inetAddress.getHostAddress(); + } + } + } + } catch (SocketException e) { + e.printStackTrace(); + } + return "127.0.0.1"; + } + + /** + * 判断当前设备是手机还是平板,代码来自 Google I/O App for Android + * + * @param context + * @return 平板返回 True,手机返回 False + */ + public static boolean isPad(Context context) { + return (context.getResources().getConfiguration().screenLayout + & Configuration.SCREENLAYOUT_SIZE_MASK) + >= Configuration.SCREENLAYOUT_SIZE_LARGE; + } + + private void firstFragment() { + if (carFragment == null) + carFragment = new InfoFragment(TITLE.RECEIVE_GNSS_INFO); + if (!carFragment.isVisible()) { + transaction.replace(R.id.fl_info, carFragment); + transaction.commit(); + } + } + + @Override + public void onItemClick(int position, String data) { + CupidLogUtils.w(TAG, "TitleAdapter===>name:" + data); + if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { + toastMsg("IPC 未连接"); + return; + } + switch (data) { + case "下发站点1": + MessagePad.Location startLocation = MessagePad.Location.newBuilder() + .setLatitude(26.820319143036112) + .setLongitude(112.57770688564666) + .build(); + MessagePad.Location endLocation = MessagePad.Location.newBuilder() + .setLatitude(26.82355278566775) + .setLongitude(112.57001723522112) + .build(); + MessagePad.RouteInfo info = MessagePad.RouteInfo.newBuilder() + .setStartLocation(startLocation) + .setStartName("KXCNMZ") + .setEndLocation(endLocation) + .setEndName("SDYJKXCXMBZ") +// .addAllWayPoints(null) + .setSpeedLimit(0.0) + .setVehicleType(9) + .setIsSpeakVoice(true) + .build(); + AdasManager.getInstance().sendAutoPilotModeReq(1, 0, info); + //"{\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.82355278566775,\"lon\":112.57001723522112},\"endName\":\"SDYJKXCXMBZ\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.820319143036112,\"lon\":112.57770688564666},\"startName\":\"KXCNMZ\",\"vehicleType\":9,\"wayLatLons\":null}}" +// " {\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.819811964643154,\"lon\":112.57732459897345},\"endName\":\"KXCNMDM\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.823347858814472,\"lon\":112.56994205894226},\"startName\":\"SDYJKXCXMBDM\",\"vehicleType\":9,\"wayLatLons\":null}}" + break; + case "下发站点2": + MessagePad.Location startLocation2 = MessagePad.Location.newBuilder() + .setLatitude(26.823347858814472) + .setLongitude(112.56994205894226) + .build(); + MessagePad.Location endLocation2 = MessagePad.Location.newBuilder() + .setLatitude(26.819811964643154) + .setLongitude(112.57732459897345) + .build(); + MessagePad.RouteInfo info2 = MessagePad.RouteInfo.newBuilder() + .setStartLocation(startLocation2) + .setStartName("SDYJKXCXMBDM") + .setEndLocation(endLocation2) + .setEndName("KXCNMDM") +// .addAllWayPoints(null) + .setSpeedLimit(0.0) + .setVehicleType(9) + .setIsSpeakVoice(true) + .build(); + AdasManager.getInstance().sendAutoPilotModeReq(1, 0, info2); +// "{\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.82355278566775,\"lon\":112.57001723522112},\"endName\":\"SDYJKXCXMBZ\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.820319143036112,\"lon\":112.57770688564666},\"startName\":\"KXCNMZ\",\"vehicleType\":9,\"wayLatLons\":null}}" + //" {\"action\":\"aiCloudToStartAutopilot\",\"result\":{\"endLatLon\":{\"lat\":26.819811964643154,\"lon\":112.57732459897345},\"endName\":\"KXCNMDM\",\"isSpeakVoice\":true,\"speedLimit\":0.0,\"startLatLon\":{\"lat\":26.823347858814472,\"lon\":112.56994205894226},\"startName\":\"SDYJKXCXMBDM\",\"vehicleType\":9,\"wayLatLons\":null}}" + break; + case "自动驾驶路径查询": + AdasManager.getInstance().sendGlobalPathReq(); + break; + case "下发SN": + //发送sn + AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); + break; + case "数据采集5秒": + boolean b = AdasManager.getInstance().startRecordPackage(1, 5, 1); + CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + b); + break; + case "数据采集start": + boolean bStart = AdasManager.getInstance().startRecordPackage(1, 1); + CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + bStart); + break; + case "数据采集end": + boolean bEnd = AdasManager.getInstance().stopRecordPackage(1, 1); + CupidLogUtils.w(TAG, "AutopilotRecord===>send:" + bEnd); + break; + case "录音测试": + CupidLogUtils.w(TAG, "录音测试"); + RecordDataManager.getInstance().init(MainActivity.this, "1234567", "", 22, "", ""); + RecordDataManager.getInstance().record(); + break; + case "发送信号灯": + MessagePad.TrafficLightStatus left = MessagePad.TrafficLightStatus.newBuilder() + .setPhaseNo("1") + .setColor("R") + .setRemain(249) + .build(); + MessagePad.TrafficLightStatus mid = MessagePad.TrafficLightStatus.newBuilder() + .setPhaseNo("2") + .setColor("G") + .setRemain(199) + .build(); + MessagePad.TrafficLightStatus right = MessagePad.TrafficLightStatus.newBuilder() + .setPhaseNo("3") + .setColor("G") + .setRemain(199) + .build(); + MessagePad.TrafficLightDetail detail = MessagePad.TrafficLightDetail.newBuilder() + .setLeft(left) + .setMid(mid) + .setRight(right) + .build(); + AdasManager.getInstance().sendTrafficLightData("10038", 26.848153, 112.574883, "180.0", "SN", 100413, -4, 201, 0, detail); + break; + case "速度设置": + AdasManager.getInstance().sendAutopilotSpeedReq(30); + break; + case "重启Docker": + AdasManager.getInstance().rebootAPDocker(); + break; + case "重启IPC": + AdasManager.getInstance().rebootIPC(); + break; + case "关机": + AdasManager.getInstance().shutdownIPC(); + break; + case "采集类型": + AdasManager.getInstance().sendRecordCause(recordKey, recordFileName, "1", "变道有干扰"); + break; + case "打开演示模式": + AdasManager.getInstance().sendDemoModeReq(1); + break; + case "关闭演示模式": + AdasManager.getInstance().sendDemoModeReq(0); + break; + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java new file mode 100644 index 0000000000..c3194b65e4 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/UpgradeFragment.java @@ -0,0 +1,119 @@ +package com.zhidao.adas.client.ui.mian; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + +import com.zhidao.adas.client.R; +import com.zhidao.support.adas.high.AdasManager; +import com.zhidao.support.adas.high.bean.IPCUpgradeInfo; +import com.zhidao.support.adas.high.bean.IPCUpgradeStateInfo; +import com.zhidao.support.adas.high.common.CupidLogUtils; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.Random; + +/** + * @des 升级页面 + */ +public class UpgradeFragment extends Fragment { + private final int[] colors = {Color.parseColor("#FA8072"), Color.parseColor("#FF00FF"), Color.parseColor("#228B22"), Color.parseColor("#871f78")}; + private final Random random = new Random(); + + private String title; + + public UpgradeFragment() { + } + + public UpgradeFragment(String title) { + this.title = title; + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_upgrade, container, false); + initView(view); + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + EventBus.getDefault().register(this); + } + + private TextView tvTitle; + private TextView text2; + private Button btn1; + private Button btn2; + + private void initView(View view) { + tvTitle = view.findViewById(R.id.tv_title); + text2 = view.findViewById(R.id.text2); + btn1 = view.findViewById(R.id.btn1); + btn2 = view.findViewById(R.id.btn2); + CupidLogUtils.w("InfoFragment===>" + title); + tvTitle.setText(title); + tvTitle.setGravity(Gravity.CENTER); + + btn1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AdasManager.getInstance().sendBaseInfo(IPCUpgradeInfo.affirm()); + } + }); + + btn2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AdasManager.getInstance().sendBaseInfo(IPCUpgradeInfo.cancel()); + } + }); + } + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void onIPCUpgradeStateInfo(IPCUpgradeStateInfo info) { + text2.setTextColor(colors[random.nextInt(4)]); + text2.setText("IPC升级 \nUpgradeStatus:" + IPCUpgradeStateInfo.UpgradeStatus.getStatus(info.getUpgradeStatus()) + + "\nDownloadStatus:" + IPCUpgradeStateInfo.DownloadStatus.getStatus(info.getDownloadStatus()) + + "\nUpgradeMode:" + IPCUpgradeStateInfo.UpgradeMode.getStatus(info.getUpgradeMode()) + + "\nProgress:" + info.getProgress() + + "\nImages:" + info.getImages()); + } + + + @Override + public void onDestroyView() { + super.onDestroyView(); + EventBus.getDefault().unregister(this); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java new file mode 100644 index 0000000000..66df8cc7cf --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/mian/VersionFragment.java @@ -0,0 +1,211 @@ +package com.zhidao.adas.client.ui.mian; + +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + +import com.zhidao.adas.client.BuildConfig; +import com.zhidao.adas.client.R; +import com.zhidao.adas.client.bean.CarConfigResp; +import com.zhidao.adas.client.bean.Config; +import com.zhidao.support.adas.high.AdasManager; +import com.zhidao.support.adas.high.common.CupidLogUtils; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +/** + * @des 升级页面 + */ +public class VersionFragment extends Fragment { + + + private String title; + private ConfigAdapter adapter; + + public VersionFragment() { + } + + public VersionFragment(String title) { + this.title = title; + } + + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_version, container, false); + initView(view); + return view; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + EventBus.getDefault().register(this); + showIps(); + } + + + private void showIps() { + HashSet ips = AdasManager.getInstance().getIPCFixationIPList(getActivity()); + if (ips != null && !ips.isEmpty()) { + StringBuilder builder = new StringBuilder(); + int i = 0; + for (String ip : ips) { + i++; + builder.append(ip); + if (i % 2 == 0) { + builder.append("\n"); + } else { + builder.append("\t\t\t\t"); + } + } + ipsView.setText(builder.toString()); + } + + } + + private TextView tvTitle; + + private TextView ipsView; + private Button btn1; + private Button btn2; + private EditText ipView; + private RecyclerView recyclerView; + + private void initView(View view) { + tvTitle = view.findViewById(R.id.tv_title); + btn1 = view.findViewById(R.id.btn1); + ipView = view.findViewById(R.id.ip); + btn2 = view.findViewById(R.id.btn2); + ipsView = view.findViewById(R.id.ips_view); + recyclerView = view.findViewById(R.id.config_list); + initFragmentRecyclerView(); + CupidLogUtils.w("InfoFragment===>" + title); + tvTitle.setText(title); + tvTitle.setGravity(Gravity.CENTER); + + btn1.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String ip = ipView.getText().toString().trim(); + if (TextUtils.isEmpty(ip)) { + Toast.makeText(getContext(), "请输入IP", Toast.LENGTH_SHORT).show(); + return; + } + if (AdasManager.getInstance().addIPCFixationIP(getContext(), ip)) { + ipView.setText(""); + showIps(); + } else { + Toast.makeText(getContext(), "IP已存在", Toast.LENGTH_SHORT).show(); + } + } + }); + btn2.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String ip = ipView.getText().toString().trim(); + if (TextUtils.isEmpty(ip)) { + Toast.makeText(getContext(), "请输入IP", Toast.LENGTH_SHORT).show(); + return; + } + if (AdasManager.getInstance().delIPCFixationIP(getContext(), ip)) { + ipView.setText(""); + showIps(); + } else { + Toast.makeText(getContext(), "IP不存在", Toast.LENGTH_SHORT).show(); + } + } + }); + if (BuildConfig.IS_CLIENT) { + view.findViewById(R.id.ipc_ip_config).setVisibility(View.GONE); + view.findViewById(R.id.line1).setVisibility(View.GONE); + tvTitle.setText("版本"); + } +// if (AdasManager.getInstance().getIpcConnectionStatus() != Constants.IPC_CONNECTION_STATUS.CONNECTED) + showVersion(null); + + } + + + @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + public void showVersion(CarConfigResp adasConfig) { + List list = new ArrayList<>(); + if (!BuildConfig.IS_CLIENT) { + String ip = AdasManager.getInstance().getIpcConnectedIp(); + String temp = ""; + if (!TextUtils.isEmpty(ip)) { + temp = ip + ":" + AdasManager.getInstance().getIpcConnectedPort(); + } + list.add(new Config("工控机IP:", temp)); + list.add(new Config("工控机版本:", adasConfig == null ? null : adasConfig.bean.getDockVersion())); + list.add(new Config("车牌号:", adasConfig == null ? null : adasConfig.bean.getPlateNumber())); + list.add(new Config("MAC地址:", adasConfig == null ? null : adasConfig.bean.getMacAddress())); + list.add(new Config("自动驾驶限速:", adasConfig == null ? null : adasConfig.bean.getSpeedLimit() + "m/s")); + list.add(new Config("最大自动驾驶限速:", adasConfig == null ? null : adasConfig.bean.getMaxSpeedLimit() + "m/s")); + list.add(new Config("最小加速度:", adasConfig == null ? null : adasConfig.bean.getMinAcceleration() + "m/s²")); + list.add(new Config("最大加速度:", adasConfig == null ? null : adasConfig.bean.getMaxAcceleration() + "m/s²")); + list.add(new Config("IPC通信协议版本:", adasConfig == null ? null : String.valueOf(adasConfig.bean.getProtocolVersion().getNumber()))); + list.add(new Config("APP通信协议版本:", String.valueOf(AdasManager.getInstance().getProtocolVersion()))); + } + list.add(new Config("ADAS LIB版本:", AdasManager.getInstance().getAdasVersion())); + adapter.setData(list); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + EventBus.getDefault().unregister(this); + } + + private void initFragmentRecyclerView() { + //创建默认的线性LayoutManager 横向的GridLayoutManager + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + recyclerView.setLayoutManager(linearLayoutManager); + //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能 + recyclerView.setHasFixedSize(true); + //解决局部刷新闪屏问题 + SimpleItemAnimator animator = (SimpleItemAnimator) recyclerView.getItemAnimator(); + if (animator != null) + animator.setSupportsChangeAnimations(false); + //创建并设置Adapter + adapter = new ConfigAdapter(); + recyclerView.setAdapter(adapter); + } + + @Override + public void onDestroy() { + super.onDestroy(); + } +} 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 new file mode 100644 index 0000000000..7764de93a4 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java @@ -0,0 +1,44 @@ +package com.zhidao.adas.client.utils; + +import android.content.Context; + +/** + * @author song kenan + * @des + * @date 2021/10/8 + */ +public class Constants { + public static final String ALL_PATH = "all_path";//所有路线 + public static final String SEL_PATH = "sel_path";//选择的路线 + + /***********************是否使用固定IP******************/ + // 0:固定IP 1:指定 2:UDP + private static final String IPC_CONNECTION_MODE = "ipc_connection_mode"; + + public static void setIpcConnectionMode(Context context, int type) { + PreferencesUtils.putInt(context, IPC_CONNECTION_MODE, type); + } + + public static int getIpcConnectionMode(Context context) { + return PreferencesUtils.getInt(context, IPC_CONNECTION_MODE, 0); + } + + public static boolean delIpcConnectionMode(Context context) { + return PreferencesUtils.delete(context, IPC_CONNECTION_MODE); + } + + /***********************保存IP******************/ + private static final String IPC_IP = "ipc_ip"; + + public static void setIPCIp(Context context, String ip) { + PreferencesUtils.putString(context, IPC_IP, ip); + } + + public static String getIPCIp(Context context) { + return PreferencesUtils.getString(context, IPC_IP, null); + } + + public static boolean delIPCIp(Context context) { + return PreferencesUtils.delete(context, IPC_IP); + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/FileUtils.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/FileUtils.java new file mode 100644 index 0000000000..5fbc347909 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/FileUtils.java @@ -0,0 +1,39 @@ +package com.zhidao.adas.client.utils; + +import android.content.Context; + +import java.io.File; +import java.io.FileWriter; +import java.io.Writer; + +/** + * @author nie yunlong + * @des + * @date 2021/2/5 + */ +class FileUtils { + + /** + * 创建文件 + * + * @param data + * @param name + */ + public static void createFile(Context context, String data, String name) { + try { + File file = new File(context.getExternalFilesDir(null) + "/" + name); + if (!file.exists()) { + file.createNewFile(); + } + Writer out = new FileWriter(file,true); + out.write(data); + out.append("\n"); + out.flush(); + out.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/MyLinearLayoutManager.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/MyLinearLayoutManager.java new file mode 100644 index 0000000000..b4e06c2a6c --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/MyLinearLayoutManager.java @@ -0,0 +1,36 @@ +package com.zhidao.adas.client.utils; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +public class MyLinearLayoutManager extends LinearLayoutManager { + public MyLinearLayoutManager(Context context) { + super(context); + } + + public MyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) { + super(context, orientation, reverseLayout); + } + + public MyLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + public boolean supportsPredictiveItemAnimations() { + return false; + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + //override this method and implement code as below + try { + super.onLayoutChildren(recycler, state); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/PreferencesUtils.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/PreferencesUtils.java new file mode 100644 index 0000000000..f9a8006feb --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/PreferencesUtils.java @@ -0,0 +1,286 @@ +package com.zhidao.adas.client.utils; + +import android.content.Context; +import android.content.SharedPreferences; + +public class PreferencesUtils { + + public static String PREFERENCE_NAME = "control"; + + public static boolean hasString(Context context, String key) { + if (context == null) return false; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.contains(key); + } + + /** + * put string preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent + * storage. + */ + public static boolean putString(Context context, String key, String value) { + + if (context == null) return false; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putString(key, value); + return editor.commit(); + } + + /** + * get string preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or null. Throws + * ClassCastException if there is a preference with this name that + * is not a string + * @see #getString(Context, String, String) + */ + public static String getString(Context context, String key) { + if (context == null) return null; + return getString(context, key, null); + } + + /** + * get string preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws + * ClassCastException if there is a preference with this name that + * is not a string + */ + public static String getString(Context context, String key, + String defaultValue) { + + if (context == null) return defaultValue; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getString(key, defaultValue); + } + + /** + * put int preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent + * storage. + */ + public static boolean putInt(Context context, String key, int value) { + + if (context == null) return false; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putInt(key, value); + return editor.commit(); + } + + /** + * get int preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or -1. Throws + * ClassCastException if there is a preference with this name that + * is not a int + * @see #getInt(Context, String, int) + */ + public static int getInt(Context context, String key) { + + if (context == null) return -1; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + return getInt(context, key, -1); + } + + /** + * get int preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws + * ClassCastException if there is a preference with this name that + * is not a int + */ + public static int getInt(Context context, String key, int defaultValue) { + if (context == null) return defaultValue; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getInt(key, defaultValue); + } + + /** + * put long preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent + * storage. + */ + public static boolean putLong(Context context, String key, long value) { + if (context == null) return false; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putLong(key, value); + return editor.commit(); + } + + /** + * get long preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or -1. Throws + * ClassCastException if there is a preference with this name that + * is not a long + * @see #getLong(Context, String, long) + */ + public static long getLong(Context context, String key) { + if (context == null) return -1; + return getLong(context, key, -1); + } + + /** + * get long preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws + * ClassCastException if there is a preference with this name that + * is not a long + */ + public static long getLong(Context context, String key, long defaultValue) { + if (context == null) return defaultValue; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + + return settings.getLong(key, defaultValue); + } + + /** + * put float preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent + * storage. + */ + public static boolean putFloat(Context context, String key, float value) { + if (context == null) return false; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putFloat(key, value); + return editor.commit(); + } + + /** + * get float preferences + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or -1. Throws + * ClassCastException if there is a preference with this name that + * is not a float + * @see #getFloat(Context, String, float) + */ + public static float getFloat(Context context, String key) { + if (context == null) return -1; + return getFloat(context, key, -1); + } + + /** + * get float preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws + * ClassCastException if there is a preference with this name that + * is not a float + */ + public static float getFloat(Context context, String key, float defaultValue) { + if (context == null) return defaultValue; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getFloat(key, defaultValue); + } + + /** + * put boolean preferences + * + * @param context + * @param key The name of the preference to modify + * @param value The new value for the preference + * @return True if the new values were successfully written to persistent + * storage. + */ + public static boolean putBoolean(Context context, String key, boolean value) { + if (context == null) return false; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.putBoolean(key, value); + return editor.commit(); + } + + /** + * get boolean preferences, default is false + * + * @param context + * @param key The name of the preference to retrieve + * @return The preference value if it exists, or false. Throws + * ClassCastException if there is a preference with this name that + * is not a boolean + * @see #getBoolean(Context, String, boolean) + */ + public static boolean getBoolean(Context context, String key) { + if (context == null) return false; + return getBoolean(context, key, false); + } + + /** + * get boolean preferences + * + * @param context + * @param key The name of the preference to retrieve + * @param defaultValue Value to return if this preference does not exist + * @return The preference value if it exists, or defValue. Throws + * ClassCastException if there is a preference with this name that + * is not a boolean + */ + public static boolean getBoolean(Context context, String key, + boolean defaultValue) { + if (context == null) return defaultValue; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + return settings.getBoolean(key, defaultValue); + } + + + public static boolean delete(Context context, String key) { + if (context == null) return false; + SharedPreferences settings = context.getSharedPreferences( + PREFERENCE_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = settings.edit(); + editor.remove(key); + return editor.commit(); + } + +} diff --git a/app_ipc_monitoring/src/main/res/drawable/border_title.png b/app_ipc_monitoring/src/main/res/drawable/border_title.png new file mode 100644 index 0000000000..9bc911f3dc Binary files /dev/null and b/app_ipc_monitoring/src/main/res/drawable/border_title.png differ diff --git a/app_ipc_monitoring/src/main/res/drawable/btn_bg.xml b/app_ipc_monitoring/src/main/res/drawable/btn_bg.xml new file mode 100644 index 0000000000..ba61bf76b4 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/btn_bg.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_border_green.xml b/app_ipc_monitoring/src/main/res/drawable/ic_border_green.xml new file mode 100644 index 0000000000..9646ed9e7c --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_border_green.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_border_red.xml b/app_ipc_monitoring/src/main/res/drawable/ic_border_red.xml new file mode 100644 index 0000000000..6733c29059 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_border_red.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/ic_border_yellow.xml b/app_ipc_monitoring/src/main/res/drawable/ic_border_yellow.xml new file mode 100644 index 0000000000..d5cc348db9 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/ic_border_yellow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/icon.xml b/app_ipc_monitoring/src/main/res/drawable/icon.xml new file mode 100644 index 0000000000..0e2c205a40 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/icon.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app_ipc_monitoring/src/main/res/drawable/item_bg.xml b/app_ipc_monitoring/src/main/res/drawable/item_bg.xml new file mode 100644 index 0000000000..3476874a12 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/item_bg.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/drawable/item_text_color.xml b/app_ipc_monitoring/src/main/res/drawable/item_text_color.xml new file mode 100644 index 0000000000..4b611429b1 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/drawable/item_text_color.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml b/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml new file mode 100644 index 0000000000..131a197495 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/layout/activity_autopilot_cloud_config.xml @@ -0,0 +1,529 @@ + + + + + +