diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java index 65e64c103e..b04a20f511 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/base/BaseActivity.java @@ -9,6 +9,14 @@ import java.lang.ref.WeakReference; public abstract class BaseActivity extends AppCompatActivity { private BaseHandler mBaseHandler; + + @Override + protected void onDestroy() { + super.onDestroy(); + if (getHandler() != null) + getHandler().removeCallbacksAndMessages(null); + } + /** * 初始化一个Handler,如果需要使用Handler,先调用此方法, * 然后可以使用postRunnable(Runnable runnable), diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/IPCConnectState.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/IPCConnectState.java new file mode 100644 index 0000000000..d5ee3b31e3 --- /dev/null +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/bean/IPCConnectState.java @@ -0,0 +1,14 @@ +package com.zhidao.adas.client.bean; + +import androidx.annotation.ColorRes; + +public class IPCConnectState { + public final String status; + @ColorRes + public final int color; + + public IPCConnectState(String status, @ColorRes int color) { + this.status = status; + this.color = color; + } +} diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java index fcd41203e6..016bfcacbc 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java @@ -4,25 +4,15 @@ import android.os.Environment; import android.text.TextUtils; import android.util.Log; - -import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.common.ThreadPoolManager; import java.io.BufferedWriter; import java.io.File; -import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; -import java.io.LineNumberReader; -import java.io.RandomAccessFile; -import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; import java.util.Date; -import java.util.List; import java.util.Locale; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; @@ -32,21 +22,18 @@ import java.util.concurrent.LinkedBlockingQueue; public class LogSave { private static final String TAG = LogSave.class.getSimpleName(); private static final String ROOT_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "IPCMonitoring" + File.separator;//程序外部存储跟目录 - private static final String LOG_FILE_NAME = "data%s.log";//文件名称 + private static final String LOG_FILE_NAME = "%s.log";//文件名称 private volatile static LogSave INSTANCE; - private static final long MAX_CAPACITY = 5 * 1024 * 1024L;//单文件最大存储容量 kb + private static final long MAX_CAPACITY = 20 * 1024 * 1024L;//单文件最大存储容量 kb private final LinkedBlockingQueue queue; private BufferedWriter buff = null; private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault()); - private final SimpleDateFormat FILE_SDF = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS", Locale.getDefault()); private File file; - private boolean isLogSwitch = false; - private long capacity = MAX_CAPACITY; + private volatile long capacity = MAX_CAPACITY; private Future future; private LogSave() { queue = new LinkedBlockingQueue<>(); - start(); } public static LogSave getInstance() { @@ -61,15 +48,6 @@ public class LogSave { } - public void setIsLogSwitch(boolean isLogSwitch) { - this.isLogSwitch = isLogSwitch; - } - - public boolean isLogSwitch() { - return isLogSwitch; - } - - public boolean isSdcardUse() { boolean bl = false; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { @@ -80,7 +58,8 @@ public class LogSave { private void getFile() throws IOException { if (isSdcardUse()) { - String time = FILE_SDF.format(new Date()); + String time = sdf.format(new Date()); + time = time.replace(" ", "_").replace(":", "-").replace(".", "-"); String childPath = time.split("_")[0] + File.separator; file = new File(ROOT_PATH + childPath + String.format(LOG_FILE_NAME, time)); if (!file.exists()) { @@ -96,12 +75,14 @@ public class LogSave { public void saveLog(String action, String data) { - if (isLogSwitch) { - long nowTime = System.currentTimeMillis(); - String time = sdf.format(new Date(nowTime)); - String builder = time + " [action]:" + action + " [data]:" + data; - queue.add(builder); - } + long nowTime = System.currentTimeMillis(); + String time = sdf.format(new Date(nowTime)); + String builder = time + " [action]:" + action + " [data]:" + data; + queue.add(builder); + } + + public boolean isStart() { + return future != null; } public void start() { diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java index 8ef6124f3c..5bf766e595 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/AutopilotConfigActivity.java @@ -153,8 +153,6 @@ public class AutopilotConfigActivity extends BaseActivity { protected void onDestroy() { super.onDestroy(); EventBus.getDefault().post(new UpdateDataEvent()); - if (getHandler() != null) - getHandler().removeCallbacksAndMessages(null); EventBus.getDefault().unregister(this); } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java index f2d4534cdf..c084a10332 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/InfoFragment.java @@ -103,9 +103,9 @@ public class InfoFragment extends Fragment { } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + @Subscribe(threadMode = ThreadMode.MAIN) public void onWarnEvent(Warn info) { - EventBus.getDefault().removeStickyEvent(info); + if (title.equals(MainActivity.TITLE.RECEIVE_WARN)) { if (data.size() > 9) { data.remove(0); @@ -115,9 +115,9 @@ public class InfoFragment extends Fragment { } } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + @Subscribe(threadMode = ThreadMode.MAIN) public void onRectEvent(TrackedObjects info) { - EventBus.getDefault().removeStickyEvent(info); + if (title.equals(MainActivity.TITLE.RECEIVE_TRACKED_OBJECTS)) { if (data.size() > 4) { data.remove(0); @@ -127,9 +127,9 @@ public class InfoFragment extends Fragment { } } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + @Subscribe(threadMode = ThreadMode.MAIN) public void onErrorEvent(ErrorData info) { - EventBus.getDefault().removeStickyEvent(info); + if (title.equals(MainActivity.TITLE.RECEIVE_ERROR)) { if (data.size() > 19) { data.remove(0); @@ -184,11 +184,10 @@ public class InfoFragment extends Fragment { return turnLight; } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onCarEvent(VehicleState info) { - EventBus.getDefault().removeStickyEvent(info); + @Subscribe(threadMode = ThreadMode.MAIN) + public void onVehicleStateEvent(VehicleState info) { if (title.equals(MainActivity.TITLE.RECEIVE_VEHICLE_STATE)) { - if (data.size() > 5) { + if (data.size() > 9) { data.remove(0); } data.add(info.toString()); @@ -199,9 +198,8 @@ public class InfoFragment extends Fragment { } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onAutoEvent(GnssInfo info) { - EventBus.getDefault().removeStickyEvent(info); + @Subscribe(threadMode = ThreadMode.MAIN) + public void onGnssInfoEvent(GnssInfo info) { if (title.equals(MainActivity.TITLE.RECEIVE_GNSS_INFO)) { if (data.size() > 9) { data.remove(0); @@ -211,9 +209,8 @@ public class InfoFragment extends Fragment { } } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onAutoEvent(AutopilotState info) { - EventBus.getDefault().removeStickyEvent(info); + @Subscribe(threadMode = ThreadMode.MAIN) + public void onAutopilotStateEvent(AutopilotState info) { if (title.equals(MainActivity.TITLE.RECEIVE_AUTOPILOT_STATE)) { if (data.size() > 9) { data.remove(0); @@ -224,10 +221,53 @@ public class InfoFragment extends Fragment { } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) + @Subscribe(threadMode = ThreadMode.MAIN) public void onTrajectoryEvent(Trajectory info) { - EventBus.getDefault().removeStickyEvent(info); if (title.equals(MainActivity.TITLE.RECEIVE_TRAJECTORY)) { + if (data.size() > 4) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onArrivalNotificationEvent(ArrivalNotification info) { + if (title.equals(MainActivity.TITLE.RECEIVE_ARRIVAL_NOTIFICATION)) { + if (data.size() > 9) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onGlobalPathEvent(GlobalPathResp info) { + if (title.equals(MainActivity.TITLE.RECEIVE_GLOBAL_PATH_RESP)) { + if (data.size() > 9) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRecordPanelEvent(RecordPanel info) { + if (title.equals(MainActivity.TITLE.RECEIVE_RECORD_RESULT)) { + if (data.size() > 9) { + data.remove(0); + } + data.add(info.toString()); + adapter.notifyDataSetChanged(); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onMogoReportMessageEvent(MogoReportMessage info) { + if (title.equals(MainActivity.TITLE.RECEIVE_REPORT_MESSAGE)) { if (data.size() > 9) { data.remove(0); } @@ -236,46 +276,12 @@ public class InfoFragment extends Fragment { } } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onAutopilotWayArriveEvent(ArrivalNotification info) { - EventBus.getDefault().removeStickyEvent(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) { - EventBus.getDefault().removeStickyEvent(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) { - EventBus.getDefault().removeStickyEvent(info); - if (title.equals(MainActivity.TITLE.RECEIVE_RECORD_RESULT)) { - data.add(info.toString()); - adapter.notifyDataSetChanged(); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onAutopilotGuardianInfoEvent(MogoReportMessage info) { - EventBus.getDefault().removeStickyEvent(info); - if (title.equals(MainActivity.TITLE.RECEIVE_REPORT_MESSAGE)) { - data.add(info.toString()); - adapter.notifyDataSetChanged(); - } - } - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onPerceptionTrafficLightEvent(PerceptionTrafficLight info) { - EventBus.getDefault().removeStickyEvent(info); if (title.equals(MainActivity.TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT)) { + if (data.size() > 9) { + data.remove(0); + } data.add(info.toString()); adapter.notifyDataSetChanged(); } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java index a9e90474d3..fbfb7d61ae 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/ui/MainActivity.java @@ -4,9 +4,9 @@ import static com.mogo.telematic.MogoProtocolMsg.NORMAL_DATA; import android.content.Context; import android.content.DialogInterface; -import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; +import android.os.Message; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -14,17 +14,19 @@ import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.WindowManager; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; +import android.widget.ListPopupWindow; +import android.widget.PopupWindow; import android.widget.RadioButton; import android.widget.RadioGroup; -import android.widget.Switch; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.AppCompatButton; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -33,10 +35,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; -import com.zhidao.adas.client.bean.Base; -import com.zhidao.adas.client.log.LogSave; -import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS; -import com.google.gson.Gson; import com.mogo.telematic.MogoProtocolMsg; import com.mogo.telematic.NSDNettyManager; import com.mogo.telematic.client.listener.NettyClientListener; @@ -48,13 +46,13 @@ import com.zhidao.adas.client.adapter.InfoTitleAdapter; import com.zhidao.adas.client.base.BaseActivity; import com.zhidao.adas.client.base.BaseAdapter; import com.zhidao.adas.client.bean.ArrivalNotification; -import com.zhidao.adas.client.bean.AutoPilotMode; 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.IPCConnectState; import com.zhidao.adas.client.bean.MogoReportMessage; import com.zhidao.adas.client.bean.PerceptionTrafficLight; import com.zhidao.adas.client.bean.RecordPanel; @@ -62,16 +60,16 @@ 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.log.LogSave; 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.OnAdasListener; 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.Constants.IPC_CONNECTION_STATUS; import com.zhidao.support.adas.high.common.CupidLogUtils; import com.zhidao.support.adas.high.common.ProtocolStatus; import com.zhidao.support.recorder.RecordDataManager; @@ -86,7 +84,6 @@ import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ThreadLocalRandom; import chassis.VehicleStateOuterClass; import io.netty.channel.Channel; @@ -97,6 +94,9 @@ import record_cache.RecordPanelOuterClass; public class MainActivity extends BaseActivity implements OnAdasListener, OnAdasConnectStatusListener, BaseAdapter.OnItemClickListener { private final static String TAG = MainActivity.class.getSimpleName(); + private static final int WHAT_IPC_IP = 0x00; + private static final int WHAT_DRIVER_IP = 0x01; + private static final int WHATIPC_CONNECT_STATE = 0x02; private EditText etIp; private TextView role; private TextView tvIp; @@ -145,6 +145,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas private String recordFileName; private int connectStatus; private AutoPilotModeDialog autoPilotModeDialog; + private ListPopupWindow listPopupWindow; public interface TITLE { String RECEIVE_TRAJECTORY = "车前引导线"; @@ -181,6 +182,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + initHandler(); isPad = isPad(this); if (!isPad) getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); @@ -190,7 +192,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas initAdas(); connectStatus = AdasManager.getInstance().getIpcConnectionStatus(); onUpdateConnectStateView(); - showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); + showIPCIP(); } @@ -236,7 +238,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas localIp = findViewById(R.id.local_ip); - role.setText(BuildConfig.IS_CLIENT ? "乘客" : "司机"); + role.setText(BuildConfig.IS_CLIENT ? "乘客端" : "司机端"); if (BuildConfig.IS_CLIENT) { line.setVisibility(View.GONE); connectionType.setVisibility(View.GONE); @@ -271,8 +273,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } String ip = Constants.getIPCIp(this); - if (!TextUtils.isEmpty(ip)) + if (!TextUtils.isEmpty(ip)) { etIp.setText(ip); + etIp.setSelection(ip.length()); + } + // infoTitleList.add("录音测试"); //初始化fragment manager = getSupportFragmentManager(); @@ -284,7 +289,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas AdasManager.getInstance().setEnableLog(isChecked); } }); - cb_save.setChecked(LogSave.getInstance().isLogSwitch()); + cb_save.setChecked(LogSave.getInstance().isStart()); cb_save.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { @@ -293,7 +298,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } else { LogSave.getInstance().stop(); } - LogSave.getInstance().setIsLogSwitch(isChecked); } }); connectionType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @@ -322,7 +326,13 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas if (TextUtils.isEmpty(s)) { Constants.delIPCIp(MainActivity.this); } else { - Constants.setIPCIp(MainActivity.this, s.toString()); + String str = s.toString(); + if (str.contains(":")) { + str = str.replace(":", ":"); + etIp.setText(str); + etIp.setSelection(str.length()); + } + Constants.setIPCIp(MainActivity.this, str); } } @@ -338,6 +348,45 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas showLocalIP(); } }); + + findViewById(R.id.tv_ip).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (listPopupWindow == null) + showListPopupWindow(); + else { + listPopupWindow.dismiss(); + listPopupWindow = null; + } + } + }); + } + + private void showListPopupWindow() { + List ips = Constants.getIpcUsedIps(this); + if (ips != null && !ips.isEmpty()) { + listPopupWindow = new ListPopupWindow(this); + listPopupWindow.setAdapter(new ArrayAdapter(this, R.layout.item_pop, ips)); + listPopupWindow.setAnchorView(etIp);//以哪个控件为基准,在该处以mEditText为基准 + listPopupWindow.setModal(true); + listPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { + @Override + public void onDismiss() { + listPopupWindow = null; + } + }); + listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int i, long l) { + String text = ips.get(i); + etIp.setText(text); + etIp.setSelection(text.length()); + listPopupWindow.dismiss(); + listPopupWindow = null; + } + }); + listPopupWindow.show(); + } } private void initListData() { @@ -528,22 +577,23 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas }); } - 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 String getIPCIP() { + final String ip = AdasManager.getInstance().getIpcConnectedIp(); + final int port = AdasManager.getInstance().getIpcConnectedPort(); + String temp = ""; + if (!TextUtils.isEmpty(ip)) { + temp = ip + ":" + port; + } + return temp; + } + + public void showIPCIP() { + if (!BuildConfig.IS_CLIENT) { + ipcIp.setVisibility(View.VISIBLE); + ipcIp.setText("IPC IP:" + getIPCIP()); + } else { + ipcIp.setVisibility(View.GONE); + } } @@ -573,38 +623,17 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas 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)); - } - }); + Message msg = Message.obtain(); + msg.obj = new IPCConnectState(status, color); + msg.what = WHATIPC_CONNECT_STATE; + getHandler().sendMessage(msg); return status; } - - 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) { LogSave.getInstance().saveLog("接收", info.toString()); - runOnUiThread(new Runnable() { - @Override - public void run() { - showToastCenter("IPC命令下发结果:" + info.code + " 命令:" + info.cmd + " 信息:" + info.msg); - } - }); + showToastCenter("IPC命令下发结果:" + info.code + " 命令:" + info.cmd + " 信息:" + info.msg); CupidLogUtils.w(TAG, "IPC命令下发结果:" + info.code + " 命令:" + info.cmd + " 信息:" + info.msg); } @@ -612,56 +641,56 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas public void onError(ProtocolStatus status, byte[] bytes) { ErrorData base = new ErrorData(status, bytes); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) { Trajectory base = new Trajectory(header, trajectory); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onTrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects trackedObjects) { TrackedObjects base = new TrackedObjects(header, trackedObjects); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onGnssInfo(MessagePad.Header header, MessagePad.GnssInfo gnssInfo) { GnssInfo base = new GnssInfo(header, gnssInfo); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onVehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState vehicleState) { VehicleState base = new VehicleState(header, vehicleState); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onAutopilotState(MessagePad.Header header, MessagePad.AutopilotState autopilotState) { AutopilotState base = new AutopilotState(header, autopilotState); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage mogoReportMessage) { MogoReportMessage base = new MogoReportMessage(header, mogoReportMessage); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onPerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights trafficLights) { PerceptionTrafficLight base = new PerceptionTrafficLight(header, trafficLights); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override @@ -669,13 +698,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas BasicInfoReq info = new BasicInfoReq(header, basicInfoReq); LogSave.getInstance().saveLog("接收", info.toString()); AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); - runOnUiThread(new Runnable() { - @Override - public void run() { - toastMsg("收到车机基础信息请求:" + info.toString()); - } - }); -// EventBus.getDefault().postSticky(new BasicInfoReq(header, basicInfoReq)); + showToastCenter("收到车机基础信息请求:" + info.toString()); +// EventBus.getDefault().post(new BasicInfoReq(header, basicInfoReq)); } @Override @@ -691,48 +715,53 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas LogSave.getInstance().saveLog("接收", base.toString()); recordKey = recordPanel.getKey(); recordFileName = recordPanel.getFilename(); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onGlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp globalPathResp) { GlobalPathResp base = new GlobalPathResp(header, globalPathResp); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onWarn(MessagePad.Header header, MessagePad.Warn warn) { Warn base = new Warn(header, warn); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification arrivalNotification) { ArrivalNotification base = new ArrivalNotification(header, arrivalNotification); LogSave.getInstance().saveLog("接收", base.toString()); - EventBus.getDefault().postSticky(base); + EventBus.getDefault().post(base); } @Override public void onUpgradeStateInfo(final IPCUpgradeStateInfo info) { LogSave.getInstance().saveLog("接收", info.toString()); - EventBus.getDefault().postSticky(info); + EventBus.getDefault().post(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(); + runOnUiThread(new Runnable() { + @Override + public void run() { + if (toast != null) { + toast.cancel(); + toast = null; + } + toast = Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT); //如果有居中显示需求 + toast.setGravity(Gravity.CENTER, 0, 0); + toast.setText(msg); + toast.show(); + } + }); } @@ -744,26 +773,19 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas options = new AdasOptions.Builder().setClient(true).build(); NSDNettyManager.getInstance().searchAndConnectServer(this, "1234", new NettyClientListener() { - @Override - public void onMessageResponseClient(MogoProtocolMsg msg, String sign) { + public void onMessageResponseClient(MogoProtocolMsg msg, String sign, Channel channel) { AdasManager.getInstance().parseIPCData(msg.getBody()); } @Override - public void onClientStatusConnectChanged(int statusCode, String sign) { + public void onClientStatusConnectChanged(int statusCode, String sign, Channel channel) { if (statusCode == ConnectState.STATUS_CONNECT_SUCCESS) { connectStatus = IPC_CONNECTION_STATUS.CONNECTED; } else { connectStatus = IPC_CONNECTION_STATUS.DISCONNECTED; } - runOnUiThread(new Runnable() { - @Override - public void run() { - ipcIp.setVisibility(View.VISIBLE); - ipcIp.setText("司机IP:" + NSDNettyManager.getInstance().getConnServerIp()); - } - }); + getHandler().sendEmptyMessage(WHAT_DRIVER_IP); onUpdateConnectStateView(); } }); @@ -862,29 +884,26 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas public void onConnectionIPCStatus(int ipcConnectionStatus, String failedMsg) { connectStatus = ipcConnectionStatus; String status = onUpdateConnectStateView(); - status += "failedMsg=" + failedMsg; - LogSave.getInstance().saveLog("连接状态", status); if (connectStatus == IPC_CONNECTION_STATUS.CONNECTED) { - CupidLogUtils.w(TAG, "===>MainActivity onWebSocketConnectSuccess"); - showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); - } else if (connectStatus == 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(); + getHandler().sendEmptyMessage(WHAT_IPC_IP); + String tem = getIPCIP(); + if (!TextUtils.isEmpty(tem)) { + List ips = Constants.getIpcUsedIps(this); + Constants.addIpcUsedIps(this, ips, tem); } - }); + } else if (connectStatus == IPC_CONNECTION_STATUS.DISCONNECTED) { + if (!TextUtils.isEmpty(failedMsg)) { + status += " failedMsg=" + failedMsg; + showToastCenter("连接失败:" + failedMsg); + } + getHandler().sendEmptyMessage(WHAT_IPC_IP); + } + LogSave.getInstance().saveLog("连接状态", status); + CupidLogUtils.i(TAG, "connectStatus=" + status); } private void showLocalIP() { + showToastCenter("已刷新本机IP"); localIp.setText("本机IP:" + getIpAddressString()); } @@ -930,10 +949,10 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onItemClick(int position, String data) { -// if (connectStatus != IPC_CONNECTION_STATUS.CONNECTED) { -// toastMsg("IPC 未连接"); -// return; -// } + if (connectStatus != IPC_CONNECTION_STATUS.CONNECTED) { + showToastCenter("IPC 未连接"); + return; + } switch (position) { case 0: if (autoPilotModeDialog == null) { @@ -1050,4 +1069,24 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas break; } } + + + @Override + protected void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { + case WHAT_IPC_IP: + showIPCIP(); + break; + case WHAT_DRIVER_IP: + ipcIp.setVisibility(View.VISIBLE); + ipcIp.setText("司机IP:" + NSDNettyManager.getInstance().getConnServerIp()); + break; + case WHATIPC_CONNECT_STATE: + IPCConnectState status = (IPCConnectState) msg.obj; + tvConnectState.setText(status.status); + tvConnectState.setTextColor(getResources().getColor(status.color)); + break; + } + } } diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java index a76e17f67a..709b4c590b 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/utils/Constants.java @@ -1,6 +1,7 @@ package com.zhidao.adas.client.utils; import android.content.Context; +import android.text.TextUtils; import com.google.gson.reflect.TypeToken; import com.zhidao.adas.client.bean.AutoPilotMode; @@ -85,4 +86,43 @@ public class Constants { public static boolean delIPCIp(Context context) { return PreferencesUtils.delete(context, IPC_IP); } + + + /***********************保存使用过的IP列表******************/ + + + private static final String IPC_USED_IP = "ipc_used_ip"; + + public static List getIpcUsedIps(Context context) { + String json = PreferencesUtils.getString(context, IPC_USED_IP, null); + if (TextUtils.isEmpty(json)) return null; + List list = JsonUtil.fromJson(json, new TypeToken>() { + }.getType()); + return list; + } + + public static boolean addIpcUsedIps(Context context, List list, String mode) { + if (list == null) + list = new ArrayList<>(); + list.remove(mode); + list.add(0, mode); + if (list.size() > 10) { + list.remove(list.size() - 1); + } + return PreferencesUtils.putString(context, IPC_USED_IP, JsonUtil.toJson(list)); + } + + public static boolean delIpcUsedIps(Context context, List list, String mode) { + if (list == null) { + return PreferencesUtils.delete(context, IPC_USED_IP); + } else { + if (list.contains(mode)) { + list.remove(mode); + return PreferencesUtils.putString(context, IPC_USED_IP, JsonUtil.toJson(list)); + } + } + return false; + } + + } diff --git a/app_ipc_monitoring/src/main/res/layout/item_main.xml b/app_ipc_monitoring/src/main/res/layout/item_main.xml index 6294e47e38..8876bd35b3 100644 --- a/app_ipc_monitoring/src/main/res/layout/item_main.xml +++ b/app_ipc_monitoring/src/main/res/layout/item_main.xml @@ -12,7 +12,7 @@ android:layout_height="match_parent" android:layout_marginStart="10dp" android:gravity="center_vertical" - android:text="工控机" + android:text="@string/app_name" android:textColor="@color/colorWhile" android:textSize="18dp" android:textStyle="bold" /> @@ -207,7 +207,7 @@ android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" - android:digits="0123456789.:" + android:digits="0123456789.::" android:gravity="right|center_vertical" android:hint="IP地址" android:imeOptions="flagNoExtractUi" @@ -215,9 +215,9 @@ android:layoutDirection="ltr" android:maxLength="21" android:maxLines="1" - android:minWidth="100dp" + android:minWidth="166dp" android:textColor="@color/colorWhile" - android:textSize="16dp" /> + android:textSize="16sp" /> + diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 0050376363..342ae8c492 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -167,7 +167,7 @@ class MoGoAutopilotProvider : // 监听ADAS-SDK获取到的工控机数据(乘客也需注册) AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl()) // 司机端监听 - if (FunctionBuildConfig.appIdentityMode == 0) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { AdasManager.getInstance().setOnMultiDeviceListener { bytes -> // 发送数据给乘客端 if (NSDNettyManager.getInstance().isServerStart) { @@ -338,7 +338,7 @@ class MoGoAutopilotProvider : AdasManager.getInstance().sendDemoModeReq(0) } // 同步给乘客端 - if (FunctionBuildConfig.appIdentityMode == 0) { + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { var byteArray = if (isEnable) byteArrayOf(1) else byteArrayOf(0) if (NSDNettyManager.getInstance().isServerStart) { NSDNettyManager.getInstance() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 8fc82cf6dd..76628e984a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -840,7 +840,9 @@ class MoGoHmiFragment : MvpFragment override fun showTurnLight(light: Int) { if (HmiBuildConfig.isShowTurnLightView) { ThreadUtils.runOnUiThread { - turnLightView.setTurnLight(light) + turnLightView?.let { + turnLightView.setTurnLight(light) + } } } } @@ -851,7 +853,9 @@ class MoGoHmiFragment : MvpFragment override fun showBrakeLight(light: Int) { if (HmiBuildConfig.isShowBrakeLightView) { ThreadUtils.runOnUiThread { - brakeView.setBrakeLight(light) + brakeView?.let { + brakeView.setBrakeLight(light) + } } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index 7c5be114e4..d582e9ae6e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -1345,16 +1345,17 @@ class DebugSettingView @JvmOverloads constructor( AppConfigInfo.isConnectNet = NetworkUtils.isConnected(context) AppConfigInfo.isConnectSocket = DebugConfig.isDownloadSnapshot() - when (FunctionBuildConfig.appIdentityMode) { - 0x00 -> {// 司机端 + when { + AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode) -> {// 司机端 AppConfigInfo.isDriver = true AppConfigInfo.isConnectedNetty = CallerTelematicManager.getServerStarted() } - else -> { + AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) -> { AppConfigInfo.isDriver = false AppConfigInfo.isConnectedNetty = CallerTelematicManager.getClientConnStatus() AppConfigInfo.serverIp = CallerTelematicManager.getServerIp() } + else -> {} } /** diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index 472ab73e41..daf126f9c7 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -51,6 +51,11 @@ class AutoPilotAndCheckView @JvmOverloads constructor( initView() } + companion object { + private var maxAcceleration: Double = 2.0 + private var speedLimit: Double = 0.0 + } + @SuppressLint("ClickableViewAccessibility") private fun initView() { background = ColorDrawable(Color.parseColor("#F0151D41")) @@ -124,6 +129,12 @@ class AutoPilotAndCheckView @JvmOverloads constructor( if (AppConfigInfo.isConnectAutopilot) { CallerAutoPilotManager.getCarConfig() } + if (maxAcceleration > 0) { + tvAcceleration.text = "加速度 $maxAcceleration m/s²" + } + if (speedLimit > 0) { + etInputSpeed.setText((speedLimit * 3.6).toInt().toString()) + } // // 比如需要设置默认速度 // val speed = "30" // etInputSpeed.setText(speed) @@ -204,6 +215,8 @@ class AutoPilotAndCheckView @JvmOverloads constructor( override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { UiThreadHandler.post { tvAcceleration?.let { + maxAcceleration = carConfigResp.maxAcceleration + speedLimit = carConfigResp.speedLimit tvAcceleration.text = "加速度 ${carConfigResp.maxAcceleration} m/s²" etInputSpeed.setText((carConfigResp.speedLimit * 3.6).toInt().toString()) } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index 4db5534755..cb55f1540f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -185,7 +185,6 @@ android:layout_height="wrap_content" android:layout_marginStart="123px" android:layout_marginTop="12px" - android:text="加速度 2 m/s²" android:textColor="#A7B6F0" android:textSize="32px" app:layout_constraintStart_toStartOf="parent" diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml index f343aae6b7..93c1278f69 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_limiting_speed_vr.xml @@ -7,8 +7,8 @@ val tileId = CallerMapUIServiceManager.getMapUIController()?.getTileId(it.longitude, it.latitude) ?: 0 trafficLightNetWorkModel.requestRoadID( diff --git a/core/mogo-core-res/src/main/function-hmi-res/drawable/bg_waring_limiting_velocity.xml b/core/mogo-core-res/src/main/function-hmi-res/drawable/bg_waring_limiting_velocity.xml index 482bbc800c..94f286340a 100644 --- a/core/mogo-core-res/src/main/function-hmi-res/drawable/bg_waring_limiting_velocity.xml +++ b/core/mogo-core-res/src/main/function-hmi-res/drawable/bg_waring_limiting_velocity.xml @@ -3,21 +3,20 @@ - + + android:width="120px" + android:height="120px" /> - diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java index 764b6c91e5..289021db91 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasChannel.java @@ -301,14 +301,6 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec } catch (Exception e) { e.printStackTrace(); } - // TODO 临时接续Json数据传递添加的Header 0x00表示PB数据 0x01表示Json数据 - if (!adasOptions.isClient() && onMultiDeviceListener != null) { - byte[] bytes = text.getBytes(StandardCharsets.UTF_8); - byte[] temp = new byte[bytes.length + 1]; - System.arraycopy(bytes, 0, temp, 1, bytes.length); - temp[0] = 0x01; - onMultiDeviceListener.onForwardingIPCMessage(temp); - } } /** @@ -321,19 +313,6 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec if (bytes == null || bytes.length == 0) { return; } - //TODO 临时将Json数据转发并解析 0x00表示PB数据 0x01表示Json数据 - if (adasOptions.isClient()) { - byte header = bytes[0]; - byte[] temp = new byte[bytes.length - 1]; - System.arraycopy(bytes, 1, temp, 0, temp.length); - bytes = temp; - if (header != 0x00) { - //Json 解析 - handlerWSMsg(new String(bytes, StandardCharsets.UTF_8)); - return; - } - } - //PB解析 ByteString byteString = ByteString.of(bytes); try { if (rawUnpack != null) { @@ -417,11 +396,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec byte[] bytes1 = bytes.toByteArray(); parseIPCData(bytes1); if (!adasOptions.isClient() && onMultiDeviceListener != null) { - // TODO 临时接续Json数据传递添加的Header 0x00表示PB数据 0x01表示Json数据 - byte[] temp = new byte[bytes1.length + 1]; - System.arraycopy(bytes1, 0, temp, 1, bytes1.length); - temp[0] = 0x00; - onMultiDeviceListener.onForwardingIPCMessage(temp); + onMultiDeviceListener.onForwardingIPCMessage(bytes1); } } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java index 9d26048fd7..c2d9dd96d2 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/OnAdasConnectStatusListener.java @@ -1,5 +1,7 @@ package com.zhidao.support.adas.high; +import androidx.annotation.Nullable; + import com.zhidao.support.adas.high.common.Constants; import com.zhidao.support.adas.high.common.Define; @@ -15,7 +17,8 @@ public interface OnAdasConnectStatusListener { * * @param ipcConnectionStatus {@link Constants.IPC_CONNECTION_STATUS} * @param failedMsg 连接异常信息 需要判null + * 如果ipcConnectionStatus==Constants.IPC_CONNECTION_STATUS.DISCONNECTED&&failedMsg==null 表示主动断开连接 */ - void onConnectionIPCStatus(@Define.IPCConnectionStatus int ipcConnectionStatus, String failedMsg); + void onConnectionIPCStatus(@Define.IPCConnectionStatus int ipcConnectionStatus, @Nullable String failedMsg); } diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/TimeoutManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/TimeoutManager.java new file mode 100644 index 0000000000..cb5fbd5176 --- /dev/null +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/TimeoutManager.java @@ -0,0 +1,82 @@ +package com.zhidao.support.adas.high.common; + +import android.util.Log; + +import java.util.concurrent.Future; + +/** + * 与工控机链接成功后,工控机断开连接超时监测管理器 + */ +public class TimeoutManager { + private static volatile TimeoutManager INSTANCE; + private volatile long lastReceiveTime; + private volatile Future future; + private OnTimeoutListener listener; + + public interface OnTimeoutListener { + void onTimeout(); + } + + public void setListener(OnTimeoutListener listener) { + this.listener = listener; + } + + private TimeoutManager() { + } + + public static TimeoutManager getInstance() { + if (INSTANCE == null) { + synchronized (TimeoutManager.class) { + if (INSTANCE == null) { + INSTANCE = new TimeoutManager(); + } + } + } + return INSTANCE; + } + + /** + * 刷新最后一次接收时间 + */ + public void refreshLase() { + lastReceiveTime = System.currentTimeMillis(); + Log.i("Fpga", "lastReceiveTime=" + lastReceiveTime); + } + + public void start() { + if (future == null) { + future = ThreadPoolManager.getsInstance().submit(new DetectionThread()); + } + } + + public synchronized void stop() { + if (future != null && !future.isCancelled()) { + future.cancel(true); + } + future = null; + } + + private class DetectionThread implements Runnable { + + @Override + public void run() { + synchronized (this) { + while (!Thread.currentThread().isInterrupted()) { + if (System.currentTimeMillis() - lastReceiveTime > 5 * 1000L) { + if (listener != null) { + listener.onTimeout(); + } + stop(); + } + try { + Thread.sleep(5 * 1000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + } + } + + +} diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java index a804b56ae9..4e857e76e7 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/socket/FpgaSocket.java @@ -57,6 +57,7 @@ public class FpgaSocket implements IWebSocket { private String wsHost; private String ipAddress; private int port; + /** * 是否是用户主动关闭socket */ @@ -76,9 +77,9 @@ public class FpgaSocket implements IWebSocket { } if (okBuilder == null) { okBuilder = new OkHttpClient.Builder(); - okBuilder.writeTimeout(5, TimeUnit.SECONDS); - okBuilder.readTimeout(5, TimeUnit.SECONDS); - okBuilder.connectTimeout(5, TimeUnit.SECONDS); + okBuilder.writeTimeout(5, TimeUnit.SECONDS) + .readTimeout(5, TimeUnit.SECONDS) + .connectTimeout(5, TimeUnit.SECONDS); } if (client == null) { client = okBuilder.build(); @@ -136,10 +137,9 @@ public class FpgaSocket implements IWebSocket { } isUserCloseWebSocket = true; if (mWebSocket != null) { - boolean isClose = mWebSocket.close(1000, null); - CupidLogUtils.i(TAG, "WebSocket 主动断开连接,是否成功= " + isClose); - mWebSocket.cancel(); - mWebSocket = null; + close(true, 1000); + } else { + onConnectFailed(null); } listener = null; client = null; @@ -259,6 +259,8 @@ public class FpgaSocket implements IWebSocket { public void onClosing(@NonNull WebSocket webSocket, int code, @NonNull String reason) { super.onClosing(webSocket, code, reason); CupidLogUtils.e(TAG, "WebSocket onClosing= " + reason); + if (TextUtils.isEmpty(reason)) + reason = "onClosing"; onClose(reason); } @@ -266,6 +268,8 @@ public class FpgaSocket implements IWebSocket { public void onClosed(@NonNull WebSocket webSocket, int code, @NonNull String reason) { super.onClosed(webSocket, code, reason); CupidLogUtils.e(TAG, "WebSocket onClosed= " + reason); + if (TextUtils.isEmpty(reason)) + reason = "onClosed"; onClose(reason); } @@ -273,30 +277,45 @@ public class FpgaSocket implements IWebSocket { public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, Response response) { super.onFailure(webSocket, t, response); CupidLogUtils.e(TAG, "WebSocket onFailure= " + t); + t.printStackTrace(); + String reason = t.toString(); + if (TextUtils.isEmpty(reason)) + reason = "onFailure"; if (mWebSocket != null) { - mWebSocket.close(1000, null); - mWebSocket.cancel(); - mWebSocket = null; + close(false, 1001); } - if (mWebSocketConnectListener != null) - mWebSocketConnectListener.onWebSocketConnectFailed(t.toString()); - reconnect(); - + onConnectFailed(reason); } } + private void onConnectFailed(String reason) { + if (mWebSocketConnectListener != null) { + if (isUserCloseWebSocket) + reason = null; + mWebSocketConnectListener.onWebSocketConnectFailed(reason); + } + reconnect(); + } + private void onClose(String reason) { if (mWebSocket != null) { - mWebSocket.close(1000, null); - mWebSocket.cancel(); - mWebSocket = null; + close(false, 1001); } else { - if (mWebSocketConnectListener != null) - mWebSocketConnectListener.onWebSocketConnectFailed(reason); - reconnect(); + onConnectFailed(reason); } } + /** + * @param isInitiative 是否是主动断开 + * @param code code + */ + private void close(boolean isInitiative, int code) { + boolean isClose = mWebSocket.close(code, null); + CupidLogUtils.i(TAG, "WebSocket " + (isInitiative ? "主动" : "被动") + "断开连接是否成功= " + isClose); + mWebSocket.cancel(); + mWebSocket = null; + } + public WebSocket getWebSocket() { return mWebSocket; }