1.心跳刷新时机更改成接收到任意数据时刷新
2.拆分工控机收发线程和业务处理线程
3.优化拆包解析PB
4.心跳刷新机制更改,使用telematic发送时间做校验,加入可配置超时时间方法以及是否启用超时检测方法
This commit is contained in:
xinfengkun
2022-05-17 19:05:08 +08:00
parent 7c01c637e4
commit 0ab8f2621f
36 changed files with 888 additions and 810 deletions

View File

@@ -1,6 +1,6 @@
package com.zhidao.adas.client.bean;
import com.zhidao.support.adas.high.common.DigitalTrans;
import com.zhidao.support.adas.high.common.ByteUtil;
import com.zhidao.support.adas.high.common.ProtocolStatus;
public class ErrorData extends BaseInfo {
@@ -15,6 +15,6 @@ public class ErrorData extends BaseInfo {
@Override
public String toString() {
return status + "\n原始数据" + DigitalTrans.byte2HexStr(bytes);
return status + "\n原始数据" + ByteUtil.byteArrToHex(bytes);
}
}

View File

@@ -78,15 +78,19 @@ 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.adas.high.common.ReceiveTimeoutManager;
import com.zhidao.support.adas.high.protocol.RawData;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import chassis.VehicleStateOuterClass;
import io.netty.channel.Channel;
@@ -249,7 +253,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
connect.setVisibility(View.GONE);
disconnect.setVisibility(View.GONE);
cb_timeout.setVisibility(View.GONE);
ReceiveTimeoutManager.getInstance().setEnable(false, AdasManager.getInstance().getIpcConnectionStatus());
AdasManager.getInstance().setEnableTimeoutDetection(false);
}
role.setOnClickListener(new View.OnClickListener() {
@Override
@@ -343,19 +347,46 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
}
});
boolean isEnable = Constants.getTimeoutEnable(this);
ReceiveTimeoutManager.getInstance().setEnable(isEnable, AdasManager.getInstance().getIpcConnectionStatus());
AdasManager.getInstance().setEnableTimeoutDetection(isEnable);
cb_timeout.setChecked(ReceiveTimeoutManager.getInstance().isEnable());
cb_timeout.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Constants.setTimeoutEnable(MainActivity.this, isChecked);
ReceiveTimeoutManager.getInstance().setEnable(isChecked, AdasManager.getInstance().getIpcConnectionStatus());
AdasManager.getInstance().setEnableTimeoutDetection(isChecked);
}
});
cb_timeout.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
showToastCenter("由于没有心跳机制,如果服务器端断网或其他非正常断开,客户端无法感知,所以需要进行数据接收超时检测", Toast.LENGTH_LONG);
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("超时时间配置");
View view = getLayoutInflater().inflate(R.layout.dialog_timeout, null);
final EditText et = view.findViewById(R.id.et);
String timeout = String.valueOf(AdasManager.getInstance().getTimeoutDetectionTime());
et.setText(timeout);
et.setSelection(timeout.length());
final TextView hint = view.findViewById(R.id.text_hint);
hint.setText("由于没有心跳机制,如果服务器端断网或其他非正常断开,客户端无法感知,所以需要进行数据接收超时检测");
builder.setView(view);//
builder.setCancelable(false);//
builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Editable editable = et.getText();
if (TextUtils.isEmpty(editable)) {
// 条件不成立不能关闭 AlertDialog 窗口
Toast.makeText(MainActivity.this, "请输入超时时间", Toast.LENGTH_SHORT).show();
return;
}
String temp = et.getText().toString().trim();
long t = Long.parseLong(temp);
AdasManager.getInstance().setTimeoutDetectionTime(t);
}
});
//设置反面按钮,并做事件处理
builder.setNegativeButton("取消", null);
builder.show();//显示Dialog对话框
return true;
}
});
@@ -585,7 +616,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
}
break;
case Constants.TITLE.RECEIVE_TRACKED_OBJECTS:
hintTrackedObjects(false);
// hintTrackedObjects(false);
if (viewFragment == null)
viewFragment = new InfoFragment(data);
if (!viewFragment.isVisible()) {
@@ -675,7 +706,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
}
break;
case Constants.TITLE.RECEIVE_PERCEPTION_OBSTACLES:
hintTrackedObjects(true);
// hintTrackedObjects(true);
if (perceptionObstaclesFragment == null)
perceptionObstaclesFragment = new InfoFragment(data);
if (!perceptionObstaclesFragment.isVisible()) {
@@ -783,6 +814,20 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
return status;
}
//计算耗时
// AtomicInteger integer = new AtomicInteger(0);
// AtomicLong atomicLong = new AtomicLong(0);
// AtomicLong timeLong = new AtomicLong(0);
//
// private void calculateTimeConsuming(RawData raw) {
// int num = integer.incrementAndGet();
// long time = timeLong.addAndGet(System.nanoTime() - raw.receiveTime);
// long size = atomicLong.addAndGet(raw.originalData.size());
// if (num % 1000 == 0) {
// double m = time / 1000000.0 / num;
// Log.i("优化后", num + "条数据,平均解析速度=" + m + "毫秒,共接收=" + size + "字节");
// }
// }
@Override
public void onError(ProtocolStatus status, byte[] bytes) {
@@ -850,6 +895,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
DataDistribution.getInstance().addData(base);
// String data = PointCloudDecoder.decode(header, pointCloud);
// Log.i("dddd", "data==" + data.length());
// Log.i("dddd", "data==" + data);
// LogSave.getInstance().saveLog("转换数据=" + data);
}
@@ -909,7 +955,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
@Override
public void onMessageResponseClient(MogoProtocolMsg msg, String sign, Channel channel) {
AdasManager.getInstance().parseIPCData(msg.getBody());
Log.i("ddd", "dddd" + sign);
AdasManager.getInstance().decoderRaw(msg.getBody());
}
@Override
@@ -979,7 +1026,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
if (NSDNettyManager.getInstance().isServerStart()) {
NSDNettyManager.getInstance().sendMsgToAllClients(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes));
} else {
Log.d("dddd", "司机端Server未启动");
// Log.d("dddd", "司机端Server未启动");
}
}

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical">
<EditText
android:id="@+id/et"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:digits="0123456789"
android:gravity="center"
android:hint="毫秒值(>=1000)"
android:imeOptions="flagNoExtractUi"
android:inputType="number"
android:maxLength="10"
android:maxLines="1"
android:minWidth="100dp"
android:textColor="#000"
android:textSize="16sp" />
<TextView
android:id="@+id/text_hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:textColor="#000"
android:textSize="16sp" />
</LinearLayout>