From 4eee19628464657379958fabd3da55426d446e81 Mon Sep 17 00:00:00 2001 From: xinfengkun Date: Fri, 1 Apr 2022 15:38:43 +0800 Subject: [PATCH] =?UTF-8?q?[add]=E5=B7=A5=E6=8E=A7=E6=9C=BA=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=A8=8B=E5=BA=8F=E5=8A=A0=E5=85=A5=E6=8A=93=E5=8F=96?= =?UTF-8?q?LOG=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_ipc_monitoring/build.gradle | 2 +- .../adas/client/adapter/InfoTitleAdapter.java | 22 +- .../adas/client/adapter/LineAdapter.java | 10 +- .../com/zhidao/adas/client/log/LogModel.java | 51 +++ .../com/zhidao/adas/client/log/LogSave.java | 167 ++++++++++ .../zhidao/adas/client/ui/MainActivity.java | 118 ++++--- .../src/main/res/layout/activity_main.xml | 4 +- .../src/main/res/layout/item_info.xml | 10 +- .../src/main/res/layout/item_info1.xml | 21 ++ .../src/main/res/layout/item_main.xml | 301 ++++++++++-------- 10 files changed, 520 insertions(+), 186 deletions(-) create mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogModel.java create mode 100644 app_ipc_monitoring/src/main/java/com/zhidao/adas/client/log/LogSave.java create mode 100644 app_ipc_monitoring/src/main/res/layout/item_info1.xml diff --git a/app_ipc_monitoring/build.gradle b/app_ipc_monitoring/build.gradle index e9e83e92b6..e024c8573b 100644 --- a/app_ipc_monitoring/build.gradle +++ b/app_ipc_monitoring/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId "com.zhidao.adas.client" minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 25 multiDexEnabled true versionCode 1 versionName "1.0" diff --git a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java index 354abc0b1d..d620f99132 100644 --- a/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java +++ b/app_ipc_monitoring/src/main/java/com/zhidao/adas/client/adapter/InfoTitleAdapter.java @@ -27,6 +27,7 @@ public class InfoTitleAdapter extends BaseAdapter data, boolean isFragment) { super(data); this.isFragment = isFragment; @@ -37,7 +38,7 @@ public class InfoTitleAdapter extends BaseAdapter 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 Future future; + + private LogSave() { + queue = new LinkedBlockingQueue<>(); + start(); + } + + public static LogSave getInstance() { + if (INSTANCE == null) { + synchronized (LogSave.class) { + if (INSTANCE == null) { + INSTANCE = new LogSave(); + } + } + } + return INSTANCE; + } + + + 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())) { + bl = true; + } + return bl; + } + + private void getFile() throws IOException { + if (isSdcardUse()) { + String time = FILE_SDF.format(new Date()); + String childPath = time.split("_")[0] + File.separator; + file = new File(ROOT_PATH + childPath + String.format(LOG_FILE_NAME, time)); + if (!file.exists()) { + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + file.createNewFile(); + } + FileWriter fw = new FileWriter(file, true); + buff = new BufferedWriter(fw); + } + } + + + public void saveLog(String action, String data) { + if (isLogSwitch) { + long nowTime = System.currentTimeMillis(); + String time = sdf.format(new Date(nowTime)); +// L.i(TAG, "time=" + time); + data = data.replace("\n", ""); + String builder = time + " [action]:" + action + " [data]:" + data; + queue.add(builder); + } + } + + public void start() { + if (future == null) { + future = ThreadPoolManager.getsInstance().submit(new WriteThread()); + } + } + + public void stop() { + queue.clear(); + if (future != null && !future.isCancelled()) { + future.cancel(true); + } + future = null; + closeBufferedWriter(); + } + + private void closeBufferedWriter() { + if (buff != null) { + try { + buff.flush(); + buff.close(); + } catch (IOException e) { + e.printStackTrace(); + } + buff = null; + } + + } + + private class WriteThread implements Runnable { + + @Override + public void run() { + synchronized (this) { + while (!Thread.currentThread().isInterrupted()) { + try { + long size = 0; + if (file != null) { + size = file.length(); + } + if (size > capacity || file == null || !file.exists() || buff == null) { + closeBufferedWriter(); + getFile(); + } + String data = queue.take(); + if (!TextUtils.isEmpty(data)) { + buff.write(data); + buff.newLine(); + buff.flush(); + } + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } + Log.i(TAG, "退出线程"); + } + } + } + +} \ No newline at end of file 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 f9fba66d23..a9e90474d3 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 @@ -14,6 +14,7 @@ import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.WindowManager; +import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.RadioButton; @@ -32,6 +33,9 @@ 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; @@ -82,6 +86,7 @@ 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; @@ -104,7 +109,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas private AppCompatButton disconnect; private RadioButton fixation; private RadioButton assign; - private Switch switchLog; + private CheckBox cb_print; + private CheckBox cb_save; private RecyclerView infoBtn; private RecyclerView infoFragment; private TextView tvConnectState; @@ -220,7 +226,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas disconnect = findViewById(R.id.disconnect); fixation = findViewById(R.id.fixation); assign = findViewById(R.id.assign); - switchLog = findViewById(R.id.switch_log); + cb_print = findViewById(R.id.cb_print); + cb_save = findViewById(R.id.cb_save); title = findViewById(R.id.title); infoBtn = findViewById(R.id.info_btn); infoFragment = findViewById(R.id.info_fragment); @@ -271,18 +278,22 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas manager = getSupportFragmentManager(); transaction = manager.beginTransaction(); - - switchLog.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + cb_print.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean b) { - if (b) { - AdasManager.getInstance().setEnableLog(true); - switchLog.setText("日志:开"); - + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + AdasManager.getInstance().setEnableLog(isChecked); + } + }); + cb_save.setChecked(LogSave.getInstance().isLogSwitch()); + cb_save.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + LogSave.getInstance().start(); } else { - AdasManager.getInstance().setEnableLog(false); - switchLog.setText("日志:关"); + LogSave.getInstance().stop(); } + LogSave.getInstance().setIsLogSwitch(isChecked); } }); connectionType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @@ -291,7 +302,6 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas int type; switch (checkedId) { default: - case R.id.assign: type = AdasOptions.IPC_CONNECTION_MODE.ASSIGN; break; @@ -537,29 +547,28 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas } - private void onUpdateConnectStateView() { + private String onUpdateConnectStateView() { String status; int color; switch (connectStatus) { - case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED: + case 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: + case IPC_CONNECTION_STATUS.DISCONNECTED: status = "未连接"; color = R.color.connect_status_disconnected; break; - case com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTING: + case 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: + case 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: + case IPC_CONNECTION_STATUS.NOT_FOUND_ADDRESS: status = "未找到"; color = R.color.connect_status_disconnecting; break; @@ -572,6 +581,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas tvConnectState.setTextColor(getResources().getColor(color)); } }); + return status; } @@ -588,6 +598,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onSSHResult(final SSHResult info) { + LogSave.getInstance().saveLog("接收", info.toString()); runOnUiThread(new Runnable() { @Override public void run() { @@ -599,47 +610,64 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onError(ProtocolStatus status, byte[] bytes) { - EventBus.getDefault().postSticky(new ErrorData(status, bytes)); + ErrorData base = new ErrorData(status, bytes); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onTrajectory(MessagePad.Header header, MessagePad.Trajectory trajectory) { - EventBus.getDefault().postSticky(new Trajectory(header, trajectory)); + Trajectory base = new Trajectory(header, trajectory); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onTrackedObjects(MessagePad.Header header, MessagePad.TrackedObjects trackedObjects) { - EventBus.getDefault().postSticky(new TrackedObjects(header, trackedObjects)); + TrackedObjects base = new TrackedObjects(header, trackedObjects); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onGnssInfo(MessagePad.Header header, MessagePad.GnssInfo gnssInfo) { - EventBus.getDefault().postSticky(new GnssInfo(header, gnssInfo)); + GnssInfo base = new GnssInfo(header, gnssInfo); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onVehicleState(MessagePad.Header header, VehicleStateOuterClass.VehicleState vehicleState) { - EventBus.getDefault().postSticky(new VehicleState(header, vehicleState)); + VehicleState base = new VehicleState(header, vehicleState); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onAutopilotState(MessagePad.Header header, MessagePad.AutopilotState autopilotState) { - EventBus.getDefault().postSticky(new AutopilotState(header, autopilotState)); + AutopilotState base = new AutopilotState(header, autopilotState); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onReportMessage(MessagePad.Header header, MogoReportMsg.MogoReportMessage mogoReportMessage) { - EventBus.getDefault().postSticky(new MogoReportMessage(header, mogoReportMessage)); + MogoReportMessage base = new MogoReportMessage(header, mogoReportMessage); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onPerceptionTrafficLight(MessagePad.Header header, TrafficLightOuterClass.TrafficLights trafficLights) { - EventBus.getDefault().postSticky(new PerceptionTrafficLight(header, trafficLights)); + PerceptionTrafficLight base = new PerceptionTrafficLight(header, trafficLights); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq) { BasicInfoReq info = new BasicInfoReq(header, basicInfoReq); + LogSave.getInstance().saveLog("接收", info.toString()); AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 1); runOnUiThread(new Runnable() { @Override @@ -652,33 +680,44 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onCarConfigResp(MessagePad.Header header, MessagePad.CarConfigResp carConfigResp) { - EventBus.getDefault().postSticky(new CarConfigResp(header, carConfigResp)); + CarConfigResp base = new CarConfigResp(header, carConfigResp); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onRecordResult(MessagePad.Header header, RecordPanelOuterClass.RecordPanel recordPanel) { + RecordPanel base = new RecordPanel(header, recordPanel); + LogSave.getInstance().saveLog("接收", base.toString()); recordKey = recordPanel.getKey(); recordFileName = recordPanel.getFilename(); - EventBus.getDefault().postSticky(new RecordPanel(header, recordPanel)); + EventBus.getDefault().postSticky(base); } @Override public void onGlobalPathResp(MessagePad.Header header, MessagePad.GlobalPathResp globalPathResp) { - EventBus.getDefault().postSticky(new GlobalPathResp(header, globalPathResp)); + GlobalPathResp base = new GlobalPathResp(header, globalPathResp); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onWarn(MessagePad.Header header, MessagePad.Warn warn) { - EventBus.getDefault().postSticky(new Warn(header, warn)); + Warn base = new Warn(header, warn); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onArrivalNotification(MessagePad.Header header, MessagePad.ArrivalNotification arrivalNotification) { - EventBus.getDefault().postSticky(new ArrivalNotification(header, arrivalNotification)); + ArrivalNotification base = new ArrivalNotification(header, arrivalNotification); + LogSave.getInstance().saveLog("接收", base.toString()); + EventBus.getDefault().postSticky(base); } @Override public void onUpgradeStateInfo(final IPCUpgradeStateInfo info) { + LogSave.getInstance().saveLog("接收", info.toString()); EventBus.getDefault().postSticky(info); } @@ -714,9 +753,9 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @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; + connectStatus = IPC_CONNECTION_STATUS.CONNECTED; } else { - connectStatus = com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED; + connectStatus = IPC_CONNECTION_STATUS.DISCONNECTED; } runOnUiThread(new Runnable() { @Override @@ -822,11 +861,13 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @Override public void onConnectionIPCStatus(int ipcConnectionStatus, String failedMsg) { connectStatus = ipcConnectionStatus; - onUpdateConnectStateView(); - if (connectStatus == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.CONNECTED) { + 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 == com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS.DISCONNECTED) { + } else if (connectStatus == IPC_CONNECTION_STATUS.DISCONNECTED) { toastMsg("连接失败:" + failedMsg); CupidLogUtils.w(TAG, "===>MainActivity onWebSocketConnectFailed"); showIPCIP(AdasManager.getInstance().getIpcConnectedIp(), AdasManager.getInstance().getIpcConnectedPort()); @@ -889,8 +930,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas @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) { +// if (connectStatus != IPC_CONNECTION_STATUS.CONNECTED) { // toastMsg("IPC 未连接"); // return; // } diff --git a/app_ipc_monitoring/src/main/res/layout/activity_main.xml b/app_ipc_monitoring/src/main/res/layout/activity_main.xml index fd6d4ce8fc..ad66fa0e54 100644 --- a/app_ipc_monitoring/src/main/res/layout/activity_main.xml +++ b/app_ipc_monitoring/src/main/res/layout/activity_main.xml @@ -4,6 +4,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F5F5F5" + android:focusable="true" + android:focusableInTouchMode="true" tools:context=".ui.MainActivity"> diff --git a/app_ipc_monitoring/src/main/res/layout/item_info.xml b/app_ipc_monitoring/src/main/res/layout/item_info.xml index dc4b1bcb42..517260aed3 100644 --- a/app_ipc_monitoring/src/main/res/layout/item_info.xml +++ b/app_ipc_monitoring/src/main/res/layout/item_info.xml @@ -1,10 +1,12 @@ + android:background="@drawable/item_bg" + android:gravity="center" + android:minHeight="50dp"> + android:textSize="16sp" /> \ No newline at end of file diff --git a/app_ipc_monitoring/src/main/res/layout/item_info1.xml b/app_ipc_monitoring/src/main/res/layout/item_info1.xml new file mode 100644 index 0000000000..7d636cfa79 --- /dev/null +++ b/app_ipc_monitoring/src/main/res/layout/item_info1.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file 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 778b6b83a0..20ab1227cb 100644 --- a/app_ipc_monitoring/src/main/res/layout/item_main.xml +++ b/app_ipc_monitoring/src/main/res/layout/item_main.xml @@ -56,145 +56,178 @@ android:textStyle="bold" android:visibility="gone" /> - - - - - + android:layout_marginStart="20dp" + android:layout_toEndOf="@id/local_ip" + android:layoutDirection="rtl"> - - - - - - - - - - - - - - + android:layout_height="match_parent"> - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file