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
index a9e21f6c31..3973ba0938 100644
--- 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
@@ -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);
}
}
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 4054ac0572..099e762b5a 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
@@ -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未启动!");
}
}
diff --git a/app_ipc_monitoring/src/main/res/layout/dialog_timeout.xml b/app_ipc_monitoring/src/main/res/layout/dialog_timeout.xml
new file mode 100644
index 0000000000..086f1dd09c
--- /dev/null
+++ b/app_ipc_monitoring/src/main/res/layout/dialog_timeout.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
\ No newline at end of file
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 3a4a0aa9e1..eed323871b 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
@@ -475,7 +475,7 @@ class MoGoAutopilotProvider :
try {
msg?.let {
when (it.protocolType) {
- NORMAL_DATA -> AdasManager.getInstance().parseIPCData(it.body)
+ NORMAL_DATA -> AdasManager.getInstance().decoderRaw(it.body)
SYNC_MODE_STATUS -> {
FunctionBuildConfig.isDemoMode = when (it.body[0].toInt()) {
1 -> true
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 1f559f162b..be6c1515d7 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
@@ -5,7 +5,6 @@ import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_ALIAS_CODE_ADAS
import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_ALIAS_CODE_CONNECT_ADDRESS;
import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_ALIAS_CODE_INIT;
import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_ALIAS_CODE_STATUS_CHANGE_REASON;
-import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_ALIAS_CODE_WEB_SOCKET_MESSAGE_BYTE;
import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_LINK_ADAS;
import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_LINK_LOG_CONNECT_STATUS;
import static com.zhidao.support.adas.high.chain.AdasChain.CHAIN_LINK_LOG_WEB_SOCKET_AUTOPILOT;
@@ -18,15 +17,17 @@ import androidx.annotation.Nullable;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.TextFormat;
import com.zhidao.support.adas.high.bean.BaseInfo;
import com.zhidao.support.adas.high.bean.VersionCompatibility;
+import com.zhidao.support.adas.high.common.ByteUtil;
import com.zhidao.support.adas.high.common.Constants;
import com.zhidao.support.adas.high.common.CupidLogUtils;
import com.zhidao.support.adas.high.common.Define;
-import com.zhidao.support.adas.high.common.DigitalTrans;
import com.zhidao.support.adas.high.common.IPCFixationIPHelper;
import com.zhidao.support.adas.high.common.MessageType;
import com.zhidao.support.adas.high.common.ProtocolStatus;
+import com.zhidao.support.adas.high.common.ReceiveTimeoutManager;
import com.zhidao.support.adas.high.common.RegexUtils;
import com.zhidao.support.adas.high.msg.IMsg;
import com.zhidao.support.adas.high.msg.MyMessageFactory;
@@ -36,6 +37,7 @@ import com.zhidao.support.adas.high.protocol.RawUnpack;
import com.zhidao.support.adas.high.queue.WSByteQueueManager;
import com.zhidao.support.adas.high.queue.WebSocketQueueManager;
import com.zhidao.support.adas.high.socket.FpgaSocket;
+import com.zhidao.support.adas.high.thread.DispatchHandler;
import com.zhjt.service.chain.ChainLog;
import com.zhjt.service.chain.TracingConstants;
@@ -45,6 +47,7 @@ import java.util.HashSet;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
import mogo.telematics.pad.MessagePad;
import okio.ByteString;
@@ -61,12 +64,12 @@ import okio.ByteString;
* @UpdateRemark: 更新说明:
* @Version: 1.0
*/
-public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnectListener, IPCFixationIPHelper.IIPCFixationIPListener {
+public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnectListener, IPCFixationIPHelper.IIPCFixationIPListener, DispatchHandler.OnDispatchHandlerListener {
private static final String TAG = AdasChannel.class.getSimpleName();
-
private FpgaSocket mSocket;
- private RawUnpack rawUnpack;//数据拆包
+ private RawUnpack rawUnpack;//业务数据拆包
private RawPack rawPack;//数据打包
+ private DispatchHandler dispatchHandler;//分发
private Timer checkCompatibilityTimer;//检查版本兼容性定时器 连接成功后5秒内等待工控机发送配置信息
/**
* 与工控机链接状态
@@ -79,6 +82,10 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
*/
public static final boolean isUseQueue = false;
+ /**
+ * 本通道是否启用分发线程 收发和分发拆分成两个线程
+ */
+ public static final boolean ADAS_CHANNEL_IS_USE_DISPATCH_HANDLER = true;
/**
* 序列化rect
@@ -139,13 +146,13 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
*/
AdasChannel(AdasOptions options, OnAdasConnectStatusListener onAdasConnectStatusListener) {
this.adasConnectStatusListener = onAdasConnectStatusListener;
- initData();
//配置为null默认是乘客屏幕
if (options == null) {
this.adasOptions = new AdasOptions.Builder().setClient(true).build();
} else {
this.adasOptions = options;
}
+ initData();
if (!adasOptions.isClient()) {
initSocket();
}
@@ -157,7 +164,10 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
rawPack = new RawPack();
//消息工厂
myMessageFactory = new MyMessageFactory();
-
+ //司机端以及启用线程分发时
+ if (!adasOptions.isClient() && ADAS_CHANNEL_IS_USE_DISPATCH_HANDLER) {
+ dispatchHandler = new DispatchHandler(this);
+ }
}
/**
@@ -260,34 +270,78 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
* @param bytes 数据
*/
@Override
- public void parseIPCData(byte[] bytes) {
+ public void decoderRaw(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
return;
}
ByteString byteString = ByteString.of(bytes);
+ decoderRaw(byteString);
+ }
+
+
+ //数据解析以及调用分发
+ private void decoderRaw(ByteString byteString) {
+ //拆Header
try {
if (rawUnpack != null) {
RawData raw = rawUnpack.read(byteString);
if (raw.getProtocolStatus() == ProtocolStatus.SUCCEED) {
- MessagePad.Header header = MessagePad.Header.parseFrom(raw.getHeader());
- MessagePad.MessageType messageType = header.getMsgType();
+ MessagePad.Header header = MessagePad.Header.parser().parseFrom(byteString.toByteArray(), raw.getOutHeaderLength(), raw.getOffsetValue() - raw.getOutHeaderLength());
+ raw.setHeader(header);
+ //司机端刷新心跳
+ if (!adasOptions.isClient())
+ ReceiveTimeoutManager.getInstance().refreshLast(header.getTimestamp());
// CupidLogUtils.w("--->websocket byte read header = " + messageType.toString());
- IMsg iMsg = myMessageFactory.createMessage(messageType);
- if (iMsg == null) {
- callError(ProtocolStatus.MESSAGE_TYPE_UNKNOWN, bytes);
- return;
+ //判断是否是司机屏幕,是否切换分发线程
+ if (!adasOptions.isClient() && ADAS_CHANNEL_IS_USE_DISPATCH_HANDLER) {
+ if (dispatchHandler != null)
+ dispatchHandler.sendRawMessage(raw);
+ } else {
+ dispatchRaw(raw);
}
- iMsg.handlerMsg(header, raw.getPayload(), mAdasListener);
} else {
- callError(raw.getProtocolStatus(), bytes);
+ callError(raw.getProtocolStatus(), byteString.toByteArray());
}
}
} catch (Exception e) {
- callError(ProtocolStatus.BUSINESS_DATA_PARSE_FAILED, bytes);
- CupidLogUtils.e(TAG, "原始数据:" + DigitalTrans.byte2hex(bytes), e);
+ callError(ProtocolStatus.HEADER_DECODE_FAILED, byteString.toByteArray());
+ CupidLogUtils.e(TAG, "原始数据:" + ByteUtil.byteArrToHex(byteString.toByteArray()), e);
}
}
+
+ /**
+ * 分发和解析
+ *
+ * @param raw
+ */
+ private void dispatchRaw(RawData raw) {
+ try {
+ if (rawUnpack != null) {
+ if (raw.getProtocolStatus() == ProtocolStatus.SUCCEED) {
+ MessagePad.Header header = raw.getHeader();
+ MessagePad.MessageType messageType = header.getMsgType();
+ IMsg iMsg = myMessageFactory.createMessage(messageType);
+ if (iMsg == null) {
+ callError(ProtocolStatus.MESSAGE_TYPE_UNKNOWN, raw.originalData.toByteArray());
+ return;
+ }
+ iMsg.handlerMsg(raw, mAdasListener);
+ } else {
+ callError(raw.getProtocolStatus(), raw.originalData.toByteArray());
+ }
+ }
+ } catch (Exception e) {
+ callError(ProtocolStatus.BUSINESS_DATA_PARSE_FAILED, raw.originalData.toByteArray());
+ CupidLogUtils.e(TAG, "原始数据:" + ByteUtil.byteArrToHex(raw.originalData.toByteArray()), e);
+ }
+ }
+
+ @Override
+ public void onDispatchRaw(RawData raw) {
+ dispatchRaw(raw);
+ }
+
private void callError(ProtocolStatus status, byte[] bytes) {
if (mAdasListener != null) {
mAdasListener.onError(status, bytes);
@@ -318,7 +372,6 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
}
}
}
-
}
/**
@@ -339,14 +392,6 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
}
}
- private void handlerWSMsg(ByteString bytes) {
- byte[] bytes1 = bytes.toByteArray();
- parseIPCData(bytes1);
- if (!adasOptions.isClient() && onMultiDeviceListener != null) {
- onMultiDeviceListener.onForwardingIPCMessage(bytes1);
- }
- }
-
@Override
public void onConnecting(String msg) {
updateConnectStatus(Constants.IPC_CONNECTION_STATUS.CONNECTING, msg);
@@ -373,7 +418,11 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
@Override
public void onMessage(ByteString bytes) throws InvalidProtocolBufferException {
- handlerWSMsg(bytes);
+ decoderRaw(bytes);
+ //乘客屏数据分发
+ if (!adasOptions.isClient() && onMultiDeviceListener != null) {
+ onMultiDeviceListener.onForwardingIPCMessage(bytes.toByteArray());
+ }
}
private void notFoundAddress() {
@@ -429,7 +478,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
private final OnAdasConnectStatusListener adasConnectStatusListener;
/**
- * 更新连接状态
+ * 工控机连接状态更新
*
* @param status 状态
* @param reason 状态描述
@@ -447,10 +496,20 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
adasConnectStatusListener.onConnectionIPCStatus(ipcConnectionStatus.get(), reason);
}
if (status == Constants.IPC_CONNECTION_STATUS.CONNECTED) {
+ if (ADAS_CHANNEL_IS_USE_DISPATCH_HANDLER && dispatchHandler != null) {
+ dispatchHandler.start();
+ }
startCheckCompatibility();
} else {
stopCheckCompatibility();
}
+ if (status == Constants.IPC_CONNECTION_STATUS.DISCONNECTED) {
+ AdasManager.getInstance().setCarConfig(null);
+ if (ADAS_CHANNEL_IS_USE_DISPATCH_HANDLER && dispatchHandler != null) {
+ dispatchHandler.stop();
+ }
+ }
+ CupidLogUtils.i(TAG, "工控机连接状态 status=" + status + " reason=" + reason);
}
/**
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java
index f828e86ae6..ef42d6a321 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/AdasManager.java
@@ -8,6 +8,7 @@ import com.zhidao.support.adas.high.bean.BaseInfo;
import com.zhidao.support.adas.high.bean.VersionCompatibility;
import com.zhidao.support.adas.high.common.AppPreferenceHelper;
import com.zhidao.support.adas.high.common.Constants;
+import com.zhidao.support.adas.high.common.ReceiveTimeoutManager;
import java.util.HashSet;
@@ -204,9 +205,9 @@ public class AdasManager implements IAdasNetCommApi {
* @param bytes 数据
*/
@Override
- public void parseIPCData(byte[] bytes) {
+ public void decoderRaw(byte[] bytes) {
if (mChannel != null) {
- mChannel.parseIPCData(bytes);
+ mChannel.decoderRaw(bytes);
}
}
@@ -439,6 +440,44 @@ public class AdasManager implements IAdasNetCommApi {
AppPreferenceHelper.getInstance(context).delIPCFixationIP();
}
+ /**
+ * 设置是否启用超时检测
+ * 不会存储 下次启动恢复默认
+ *
+ * @param isEnable 是否启用
+ */
+ public void setEnableTimeoutDetection(boolean isEnable) {
+ ReceiveTimeoutManager.getInstance().setEnable(isEnable, getIpcConnectionStatus());
+ }
+
+ /**
+ * 获取超时检测是否启用
+ *
+ * @return 是否启用
+ */
+ public boolean isEnableTimeoutDetection() {
+ return ReceiveTimeoutManager.getInstance().isEnable();
+ }
+
+ /**
+ * 设置超时检测的超时时间
+ * 不会存储 下次启动恢复默认
+ *
+ * @param timeout 毫秒
+ */
+ public void setTimeoutDetectionTime(long timeout) {
+ ReceiveTimeoutManager.getInstance().setTimeout(timeout);
+ }
+
+ /**
+ * 获取超时检测的超时时间
+ *
+ * @return 毫秒
+ */
+ public long getTimeoutDetectionTime() {
+ return ReceiveTimeoutManager.getInstance().getTimeout();
+ }
+
/**
* 发送升级指令 TODO 将会被删除
*
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java
index 45e7eaa5d9..b66df06b40 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/IAdasNetCommApi.java
@@ -198,7 +198,7 @@ public interface IAdasNetCommApi {
*
* @param bytes 数据
*/
- void parseIPCData(byte[] bytes);
+ void decoderRaw(byte[] bytes);
/**
* Log是否开启打印
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ByteUtil.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ByteUtil.java
new file mode 100644
index 0000000000..794ba88e8e
--- /dev/null
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ByteUtil.java
@@ -0,0 +1,380 @@
+package com.zhidao.support.adas.high.common;
+
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class ByteUtil {
+ private static final String TAG = ByteUtil.class.getSimpleName();
+
+
+ public static byte[] set8bitUnsignedValue(int num) {
+ return new byte[]{(byte) (num)};
+ }
+
+ public static byte[] set16bitUnsignedValue(int num) {
+ byte[] bytes = new byte[2];
+ bytes[0] = (byte) (num >> 8);
+ bytes[1] = (byte) num;
+ return bytes;
+ }
+
+ public static byte[] set32bitUnsignedValue(long num) {
+ byte[] bytes = new byte[4];
+ bytes[0] = (byte) (num >> 24);
+ bytes[1] = (byte) (num >> 16);
+ bytes[2] = (byte) (num >> 8);
+ bytes[3] = (byte) num;
+ return bytes;
+ }
+
+ public static byte[] set64bitUnsignedValue(long num) {
+ byte[] bytes = new byte[8];
+ bytes[0] = (byte) (num >> 56);
+ bytes[1] = (byte) (num >> 48);
+ bytes[2] = (byte) (num >> 40);
+ bytes[3] = (byte) (num >> 32);
+ bytes[4] = (byte) (num >> 24);
+ bytes[5] = (byte) (num >> 16);
+ bytes[6] = (byte) (num >> 8);
+ bytes[7] = (byte) num;
+ return bytes;
+ }
+
+ /**
+ * 无符号
+ * 1 byte
+ * 使用后将 Index中的index移动到下一个数据的开始位
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+
+ public static int get8bitUnsignedValue(int index, byte[] data) {
+ int value = 0;
+ if (data.length > index) {
+ value = data[index] & 0xFF;
+ }
+ return value;
+ }
+
+ /**
+ * 无符号
+ * 合并 2 byte
+ * 使用后将 Index中的index移动到下一个数据的开始位
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+ public static int get16bitUnsignedValue(int index, byte[] data) {
+// String str = "byte[]= %02X %02X";
+// L.i("Index=" + index + String.format(str, data[index], data[index + 1]));
+ int value = 0;
+ if (data.length > index + 1) {
+ value = data[index++] & 0xFF;
+ value = value << 8;
+ value = value | (data[index] & 0xFF);
+ }
+ return value;
+ }
+
+ /**
+ * 无符号
+ * 合并 4 byte
+ * 使用后将 Index中的index移动到下一个数据的开始位
+ * *
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+ public static int get32bitUnsignedValue(int index, byte[] data) {
+ int value = 0;
+ if (data.length > index + 3) {
+ value = data[index++] & 0xFF;
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index] & 0xFF);
+ }
+ return value;
+ }
+
+ /**
+ * 无符号
+ * 合并 8 byte
+ * 使用后将 Index中的index移动到下一个数据的开始位
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+ /**
+ * 超过{@link Long#MAX_VALUE} 会产生有符号值,目前 Unit Mask 值未超过最大值
+ *
+ * @param index
+ * @param data
+ * @return
+ */
+ public static long get64bitUnsignedValue(int index, byte[] data) {
+
+ long value = 0;
+ if (data.length > index + 7) {
+ value = data[index++] & 0xFF;
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index++] & 0xFF);
+ value = value << 8;
+ value = value | (data[index] & 0xFF);
+ }
+ return value;
+ }
+
+ /**
+ * 合并 8 byte
+ * 使用后将 Index中的index移动到下一个数据的开始位
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+
+ private static final BigInteger TWO_COMPL_REF = BigInteger.ONE.shiftLeft(64);
+
+ public static String get64bitUnsignedString(int index, byte[] data) {
+ BigInteger bigInteger = null;
+ if (data.length > index + 7) {
+ byte[] bytes = new byte[8];
+ System.arraycopy(data, index, bytes, 0, 8);
+ bigInteger = new BigInteger(bytes);
+ if (bigInteger.compareTo(BigInteger.ZERO) < 0)
+ bigInteger = bigInteger.add(TWO_COMPL_REF);
+ }
+ return bigInteger == null ? null : bigInteger.toString();
+ }
+
+ /**
+ * 有符号
+ * 1 byte
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+
+ public static int get8bitSignedValue(int index, byte[] data) {
+ int value = 0;
+ if (data.length > index) {
+ value = data[index];
+ }
+ return value;
+ }
+
+ /**
+ * 有符号
+ * 合并 2 byte
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+ public static int get16bitSignedValue(int index, byte[] data) {
+ int value = 0;
+ if (data.length > index + 1) {
+ value = data[index++];
+ value = value << 8;
+ value = value | data[index];
+ }
+ return value;
+ }
+
+ /**
+ * 有符号
+ * 合并 4 byte
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+
+ public static long get32bitSignedValue(int index, byte[] data) {
+ long value = 0L;
+ if (data.length > index + 3) {
+ value = data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index];
+ }
+ return value;
+ }
+
+ /**
+ * 有符号
+ * 合并 8 byte
+ *
+ * @param index 开始下标
+ * @param data
+ * @return
+ */
+
+
+ public static long get64bitSignedValue(int index, byte[] data) {
+ long value = 0;
+ if (data.length > index + 7) {
+ value = data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index++];
+ value = value << 8;
+ value = value | data[index];
+ }
+ return value;
+ }
+
+
+ /**
+ * 判断奇数或偶数,位运算,最后一位是1则为奇数,为0是偶数
+ *
+ * @param num
+ * @return
+ */
+ public static int isOdd(int num) {
+ return num & 0x1;
+ }
+
+ /**
+ * Hex字符串转byte
+ *
+ * @param inHex
+ * @return
+ */
+ public static byte hexToByte(String inHex) {
+ return (byte) Integer.parseInt(inHex, 16);
+ }
+
+ /**
+ * 转hex字符串转字节数组
+ *
+ * @param inHex
+ * @return
+ */
+ public static byte[] hexToByteArr(String inHex) {
+ inHex = inHex.replaceAll(" ", "");
+ int hexlen = inHex.length();
+ byte[] result;
+ if (isOdd(hexlen) == 1) {//奇数
+ hexlen++;
+ result = new byte[(hexlen / 2)];
+ inHex = "0" + inHex;
+ } else {//偶数
+ result = new byte[(hexlen / 2)];
+ }
+ int j = 0;
+ for (int i = 0; i < hexlen; i += 2) {
+ result[j] = hexToByte(inHex.substring(i, i + 2));
+ j++;
+ }
+ return result;
+ }
+
+ /**
+ * 1字节转2个Hex字符 无符号 不足两位
+ *
+ * @param inByte
+ * @return
+ */
+ public static String byte2Hex(int inByte) {
+ String hex = Integer.toHexString(inByte & 0xFF).toUpperCase();
+ return (hex.length() == 1) ? "0" + hex : hex;
+ }
+
+ /**
+ * 字节数组转转hex字符串
+ *
+ * @param inBytArr
+ * @return
+ */
+ public static String byteArrToHex(byte[] inBytArr) {
+ return byteArrToHex(inBytArr, true);
+ }
+
+ public static String byteArrToHex(byte[] inBytArr, boolean isAddSpacing) {
+ if (inBytArr == null)
+ return null;
+ StringBuilder strBuilder = new StringBuilder();
+ for (byte b : inBytArr) {
+ strBuilder.append(byte2Hex(b));
+ if (isAddSpacing)
+ strBuilder.append(" ");
+ }
+ return strBuilder.toString().toUpperCase().trim();
+ }
+
+
+ /**
+ * 拼接两个byte[]
+ *
+ * @param
+ * @param
+ * @return
+ */
+ public static byte[] concatBytes(byte[] bt1, byte[] bt2) {
+ if (bt1 == null) {
+ return bt2;
+ }
+ if (bt2 == null) {
+ return bt1;
+ }
+ byte[] bt3 = new byte[bt1.length + bt2.length];
+ System.arraycopy(bt1, 0, bt3, 0, bt1.length);
+ System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);
+ return bt3;
+ }
+
+ //翻转
+ public static String byteToBit(byte b) {
+ return "" + (byte) ((b >> 0) & 0x1) +
+ (byte) ((b >> 1) & 0x1) +
+ (byte) ((b >> 2) & 0x1) +
+ (byte) ((b >> 3) & 0x1) +
+ (byte) ((b >> 4) & 0x1) +
+ (byte) ((b >> 5) & 0x1) +
+ (byte) ((b >> 6) & 0x1) +
+ (byte) ((b >> 7) & 0x1);
+ }
+}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/DigitalTrans.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/DigitalTrans.java
deleted file mode 100644
index bca5d7a9d2..0000000000
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/DigitalTrans.java
+++ /dev/null
@@ -1,607 +0,0 @@
-package com.zhidao.support.adas.high.common;
-
-public class DigitalTrans {
-
- /**
- * 数字字符串转ASCII码字符串
- *
- * @param content 字符串
- * @return ASCII字符串
- */
- public static String StringToAsciiString(String content) {
- String result = "";
- int max = content.length();
- for (int i = 0; i < max; i++) {
- char c = content.charAt(i);
- String b = Integer.toHexString(c);
- result = result + b;
- }
- return result;
- }
-
- /**
- * 十六进制转字符串
- *
- * @param hexString 十六进制字符串
- * @param encodeType 编码类型4:Unicode,2:普通编码
- * @return 字符串
- */
- public static String hexStringToString(String hexString, int encodeType) {
- String result = "";
- int max = hexString.length() / encodeType;
- for (int i = 0; i < max; i++) {
- char c = (char) DigitalTrans.hexStringToAlgorism(hexString
- .substring(i * encodeType, (i + 1) * encodeType));
- result += c;
- }
- return result;
- }
-
- /**
- * 十六进制字符串装十进制
- *
- * @param hex 十六进制字符串
- * @return 十进制数值
- */
- public static int hexStringToAlgorism(String hex) {
- hex = hex.toUpperCase();
- int max = hex.length();
- int result = 0;
- for (int i = max; i > 0; i--) {
- char c = hex.charAt(i - 1);
- int algorism = 0;
- if (c >= '0' && c <= '9') {
- algorism = c - '0';
- } else {
- algorism = c - 55;
- }
- result += Math.pow(16, max - i) * algorism;
- }
- return result;
- }
-
- /**
- * 十六转二进制
- *
- * @param hex 十六进制字符串
- * @return 二进制字符串
- */
- public static String hexStringToBinary(String hex) {
- hex = hex.toUpperCase();
- String result = "";
- int max = hex.length();
- for (int i = 0; i < max; i++) {
- char c = hex.charAt(i);
- switch (c) {
- case '0':
- result += "0000";
- break;
- case '1':
- result += "0001";
- break;
- case '2':
- result += "0010";
- break;
- case '3':
- result += "0011";
- break;
- case '4':
- result += "0100";
- break;
- case '5':
- result += "0101";
- break;
- case '6':
- result += "0110";
- break;
- case '7':
- result += "0111";
- break;
- case '8':
- result += "1000";
- break;
- case '9':
- result += "1001";
- break;
- case 'A':
- result += "1010";
- break;
- case 'B':
- result += "1011";
- break;
- case 'C':
- result += "1100";
- break;
- case 'D':
- result += "1101";
- break;
- case 'E':
- result += "1110";
- break;
- case 'F':
- result += "1111";
- break;
- }
- }
- return result;
- }
-
- /**
- * ASCII码字符串转数字字符串
- *
- * @param content ASCII字符串
- * @return 字符串
- */
- public static String AsciiStringToString(String content) {
- String result = "";
- int length = content.length() / 2;
- for (int i = 0; i < length; i++) {
- String c = content.substring(i * 2, i * 2 + 2);
- int a = hexStringToAlgorism(c);
- char b = (char) a;
- String d = String.valueOf(b);
- result += d;
- }
- return result;
- }
-
- /**
- * 将十进制转换为指定长度的十六进制字符串
- *
- * @param algorism int 十进制数字
- * @param maxLength int 转换后的十六进制字符串长度
- * @return String 转换后的十六进制字符串
- */
- public static String algorismToHEXString(int algorism, int maxLength) {
- String result = "";
- result = Integer.toHexString(algorism);
-
- if (result.length() % 2 == 1) {
- result = "0" + result;
- }
- return patchHexString(result.toUpperCase(), maxLength);
- }
-
- /**
- * 字节数组转为普通字符串(ASCII对应的字符)
- *
- * @param bytearray byte[]
- * @return String
- */
- public static String bytetoString(byte[] bytearray) {
- String result = "";
- char temp;
-
- int length = bytearray.length;
- for (int i = 0; i < length; i++) {
- temp = (char) bytearray[i];
- result += temp;
- }
- return result;
- }
-
- /**
- * 二进制字符串转十进制
- *
- * @param binary 二进制字符串
- * @return 十进制数值
- */
- public static int binaryToAlgorism(String binary) {
- int max = binary.length();
- int result = 0;
- for (int i = max; i > 0; i--) {
- char c = binary.charAt(i - 1);
- int algorism = c - '0';
- result += Math.pow(2, max - i) * algorism;
- }
- return result;
- }
-
- /**
- * 十进制转换为十六进制字符串
- *
- * @param algorism int 十进制的数字
- * @return String 对应的十六进制字符串
- */
- public static String algorismToHEXString(int algorism) {
- String result = "";
- result = Integer.toHexString(algorism);
-
- if (result.length() % 2 == 1) {
- result = "0" + result;
-
- }
- result = result.toUpperCase();
-
- return result;
- }
-
- /**
- * HEX字符串前补0,主要用于长度位数不足。
- *
- * @param str String 需要补充长度的十六进制字符串
- * @param maxLength int 补充后十六进制字符串的长度
- * @return 补充结果
- */
- static public String patchHexString(String str, int maxLength) {
- String temp = "";
- for (int i = 0; i < maxLength - str.length(); i++) {
- temp = "0" + temp;
- }
- str = (temp + str).substring(0, maxLength);
- return str;
- }
-
- /**
- * 将一个字符串转换为int
- *
- * @param s String 要转换的字符串
- * @param defaultInt int 如果出现异常,默认返回的数字
- * @param radix int 要转换的字符串是什么进制的,如16 8 10.
- * @return int 转换后的数字
- */
- public static int parseToInt(String s, int defaultInt, int radix) {
- int i = 0;
- try {
- i = Integer.parseInt(s, radix);
- } catch (NumberFormatException ex) {
- i = defaultInt;
- }
- return i;
- }
-
- /**
- * 将一个十进制形式的数字字符串转换为int
- *
- * @param s String 要转换的字符串
- * @param defaultInt int 如果出现异常,默认返回的数字
- * @return int 转换后的数字
- */
- public static int parseToInt(String s, int defaultInt) {
- int i = 0;
- try {
- i = Integer.parseInt(s);
- } catch (NumberFormatException ex) {
- i = defaultInt;
- }
- return i;
- }
-
- /**
- * 十六进制字符串转为Byte数组,每两个十六进制字符转为一个Byte
- *
- * @param hex 十六进制字符串
- * @return byte 转换结果
- */
- public static byte[] hexStringToByte(String hex) {
- int max = hex.length() / 2;
- byte[] bytes = new byte[max];
- String binarys = DigitalTrans.hexStringToBinary(hex);
- for (int i = 0; i < max; i++) {
- bytes[i] = (byte) DigitalTrans.binaryToAlgorism(binarys.substring(
- i * 8 + 1, (i + 1) * 8));
- if (binarys.charAt(8 * i) == '1') {
- bytes[i] = (byte) (0 - bytes[i]);
- }
- }
- return bytes;
- }
-
- /**
- * 十六进制串转化为byte数组
- *
- * @return the array of byte
- */
- public static final byte[] hex2byte(String hex)
- throws IllegalArgumentException {
- if (hex.length() % 2 != 0) {
- throw new IllegalArgumentException();
- }
- char[] arr = hex.toCharArray();
- byte[] b = new byte[hex.length() / 2];
- for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {
- String swap = "" + arr[i++] + arr[i];
- int byteint = Integer.parseInt(swap, 16) & 0xFF;
- b[j] = new Integer(byteint).byteValue();
- }
- return b;
- }
-
- /**
- * 字节数组转换为十六进制字符串
- *
- * @param b byte[] 需要转换的字节数组
- * @return String 十六进制字符串
- */
- public static final String byte2hex(byte b[]) {
- if (b == null) {
- return "";
- }
- String hs = "";
- String stmp = "";
- for (int n = 0; n < b.length; n++) {
- stmp = Integer.toHexString(b[n] & 0xff);
- if (stmp.length() == 1) {
- hs = hs + "0" + stmp;
- } else {
- hs = hs + stmp;
- }
- }
- return hs.toUpperCase();
- }
-
- /**
- * 字符串转换成十六进制字符串
- *
- * @param String str 待转换的ASCII字符串
- * @return String 每个Byte之间空格分隔,如: [61 6C 6B]
- */
- public static String str2HexStr(String str) {
-
- char[] chars = "0123456789ABCDEF".toCharArray();
- StringBuilder sb = new StringBuilder("");
- byte[] bs = str.getBytes();
- int bit;
-
- for (int i = 0; i < bs.length; i++) {
- bit = (bs[i] & 0x0f0) >> 4;
- sb.append(chars[bit]);
- bit = bs[i] & 0x0f;
- sb.append(chars[bit]);
- sb.append(' ');
- }
- return sb.toString().trim();
- }
-
- /**
- * 十六进制转换字符串
- *
- * @param String str Byte字符串(Byte之间无分隔符 如:[616C6B])
- * @return String 对应的字符串
- */
- public static String hexStr2Str(String hexStr) {
- String str = "0123456789ABCDEF";
- char[] hexs = hexStr.toCharArray();
- byte[] bytes = new byte[hexStr.length() / 2];
- int n;
-
- for (int i = 0; i < bytes.length; i++) {
- n = str.indexOf(hexs[2 * i]) * 16;
- n += str.indexOf(hexs[2 * i + 1]);
- bytes[i] = (byte) (n & 0xff);
- }
- return new String(bytes);
- }
-
- /**
- * bytes转换成十六进制字符串
- *
- * @param byte[] b byte数组
- * @return String 每个Byte值之间空格分隔
- */
- public static String byte2HexStr(byte[] b) {
- String stmp = "";
- StringBuilder sb = new StringBuilder("");
- for (int n = 0; n < b.length; n++) {
- stmp = Integer.toHexString(b[n] & 0xFF);
- sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
- sb.append(" ");
- }
- return sb.toString().toUpperCase().trim();
- }
-
- /**
- * bytes字符串转换为Byte值
- *
- * @param String src Byte字符串,每个Byte之间没有分隔符
- * @return byte[]
- */
- public static byte[] hexStr2Bytes(String src) {
- int m = 0, n = 0;
- int l = src.length() / 2;
- System.out.println(l);
- byte[] ret = new byte[l];
- for (int i = 0; i < l; i++) {
- m = i * 2 + 1;
- n = m + 1;
- ret[i] = Byte.decode("0x" + src.substring(i * 2, m) + src.substring(m, n));
- }
- return ret;
- }
-
- /**
- * String的字符串转换成unicode的String
- *
- * @param String strText 全角字符串
- * @return String 每个unicode之间无分隔符
- * @throws Exception
- */
- public static String strToUnicode(String strText)
- throws Exception {
- char c;
- StringBuilder str = new StringBuilder();
- int intAsc;
- String strHex;
- for (int i = 0; i < strText.length(); i++) {
- c = strText.charAt(i);
- intAsc = (int) c;
- strHex = Integer.toHexString(intAsc);
- if (intAsc > 128)
- str.append("\\u" + strHex);
- else // 低位在前面补00
- str.append("\\u00" + strHex);
- }
- return str.toString();
- }
-
- /**
- * unicode的String转换成String的字符串
- *
- * @param String hex 16进制值字符串 (一个unicode为2byte)
- * @return String 全角字符串
- */
- public static String unicodeToString(String hex) {
- int t = hex.length() / 6;
- StringBuilder str = new StringBuilder();
- for (int i = 0; i < t; i++) {
- String s = hex.substring(i * 6, (i + 1) * 6);
- // 高位需要补上00再转
- String s1 = s.substring(2, 4) + "00";
- // 低位直接转
- String s2 = s.substring(4);
- // 将16进制的string转为int
- int n = Integer.valueOf(s1, 16) + Integer.valueOf(s2, 16);
- // 将int转换为字符
- char[] chars = Character.toChars(n);
- str.append(new String(chars));
- }
- return str.toString();
- }
-
- /**
- * 整型数据拆分为长度为2的字节数组,低8位存放在序号小的元素,高8位存放在序号大的元素中(大端存储)
- *
- * @param data
- * @return
- */
- public static byte[] intTo2Byte(int data) {
- byte[] byteArray = new byte[2];
- byteArray[0] = (byte) (data >> 8);
- byteArray[1] = (byte) data;
- return byteArray;
- }
-
- /**
- * 将两个字节拼接还原成无符号的整型数据
- * 数据域中的数据都按小端存储,示例:数据0x1234,则Byte0为0x34,Byte1为0x12
- *
- * @param byte1
- * @param byte2
- * @return
- */
- public static int joint2ByteToInt(byte byte1, byte byte2) {
- int result = byte1 & 0xFF;
- result = (result << 8) | (0x00FF & byte2);
- return result;
- }
-
- /**
- * 拼接两个byte[]
- *
- * @param
- * @param
- * @return
- */
- public static byte[] concatBytes(byte[] bt1, byte[] bt2) {
- if (bt1 == null) {
- return bt2;
- }
- if (bt2 == null) {
- return bt1;
- }
- byte[] bt3 = new byte[bt1.length + bt2.length];
- System.arraycopy(bt1, 0, bt3, 0, bt1.length);
- System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);
- return bt3;
- }
-
- //获得本机cpu大小端
- public static boolean isBigendian() {
- short i = 0x1;
- boolean bRet = ((i >> 8) == 0x1);
- return bRet;
- }
-
-
- /**
- * 无符号
- * 1 byte
- *
- * @param data
- * @return
- */
-
-
- public static int get8bitUnsignedValue(byte[] data) {
- int value = 0;
- int index = 0;
- if (data.length > index) {
- value = data[index] & 0xFF;
- }
- return value;
- }
-
- /**
- * 无符号
- * 合并 2 byte
- *
- * @param data
- * @return
- */
- public static int get16bitUnsignedValue(byte[] data) {
- int value = 0;
- int index = 0;
- if (data.length > index + 1) {
- value = data[index++] & 0xFF;
- value = value << 8;
- value = value | (data[index] & 0xFF);
- }
- return value;
- }
-
- /**
- * 无符号
- * 合并 4 byte
- *
- * @param data
- * @return
- */
- public static long get32bitUnsignedValue(byte[] data) {
- long value = 0L;
- int index = 0;
- if (data.length > index + 3) {
- value = data[index++] & 0xFF;
- value = value << 8;
- value = value | (data[index++] & 0xFF);
- value = value << 8;
- value = value | (data[index++] & 0xFF);
- value = value << 8;
- value = value | (data[index] & 0xFF);
- }
- return value;
- }
-
- public static byte[] set8bitUnsignedValue(int num) {
- return new byte[]{(byte) (num)};
- }
-
- public static byte[] set16bitUnsignedValue(int num) {
- byte[] bytes = new byte[2];
- bytes[0] = (byte) (num >> 8);
- bytes[1] = (byte) num;
- return bytes;
- }
-
- public static byte[] set32bitUnsignedValue(long num) {
- byte[] bytes = new byte[4];
- bytes[0] = (byte) (num >> 24);
- bytes[1] = (byte) (num >> 16);
- bytes[2] = (byte) (num >> 8);
- bytes[3] = (byte) num;
- return bytes;
- }
-
- public static byte[] set64bitUnsignedValue(long num) {
- byte[] bytes = new byte[8];
- bytes[0] = (byte) (num >> 56);
- bytes[1] = (byte) (num >> 48);
- bytes[2] = (byte) (num >> 40);
- bytes[3] = (byte) (num >> 32);
- bytes[4] = (byte) (num >> 24);
- bytes[5] = (byte) (num >> 16);
- bytes[6] = (byte) (num >> 8);
- bytes[7] = (byte) num;
- return bytes;
- }
-
-}
\ No newline at end of file
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ProtocolStatus.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ProtocolStatus.java
index 52f6bb9168..2ed3a7e911 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ProtocolStatus.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ProtocolStatus.java
@@ -10,7 +10,8 @@ public enum ProtocolStatus {
MAGIC_CODE_CHECK_FAILED(0x01, "数据头校验失败"),
PACKAGE_LENGTH_CHECK_FAILED(0x02, "数据包长度校验失败"),
MESSAGE_TYPE_UNKNOWN(0x03, "MessageType未知"),
- BUSINESS_DATA_PARSE_FAILED(0x04, "业务数据解析失败");
+ HEADER_DECODE_FAILED(0x04, "Header解析失败"),
+ BUSINESS_DATA_PARSE_FAILED(0x05, "业务数据解析失败");
public final int code;
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java
index 1fefca07a8..92c8f4576a 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceiveTimeoutManager.java
@@ -11,10 +11,12 @@ import java.util.concurrent.atomic.AtomicBoolean;
*/
public class ReceiveTimeoutManager {
private static final String TAG = ReceiveTimeoutManager.class.getSimpleName();
+ private static final long DEFAULT_TIMEOUT = 4 * 1000L;//默认超时时间
private static volatile ReceiveTimeoutManager INSTANCE;
- private static final long DEFAULT_TIMEOUT = 3 * 1000L;//默认超时时间
private final AtomicBoolean isEnable = new AtomicBoolean(true);//是否启用超时检测
- private volatile long lastReceiveTime;
+ private long timeout = DEFAULT_TIMEOUT;//可配置超时时间
+ private double lastReceiveTime;//double 秒
+ private long timeoutPeriod;//超时时间,最后一次接收时间 + timeout
private OnTimeoutListener listener;
private volatile Timer timer;
@@ -53,7 +55,7 @@ public class ReceiveTimeoutManager {
public void setEnable(boolean isEnable, @Define.IPCConnectionStatus int ipcConnectionStatus) {
this.isEnable.set(isEnable);
//如果启动并且当前已连接
- if (isEnable) {
+ if (this.isEnable.get()) {
if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.CONNECTED)
start();
} else {
@@ -61,32 +63,54 @@ public class ReceiveTimeoutManager {
}
}
+ /**
+ * 超时时间
+ *
+ * @param timeout 毫秒
+ */
+ public void setTimeout(long timeout) {
+ //如果一启动 停止再启动 新timeout如果小于当前 老timeout将有可能出现时间差计算出错的情况
+ if (timeout < 1000L) {
+ timeout = 1000L;
+ }
+ this.timeout = timeout;
+ if (timer != null) {
+ stop();
+ start();
+ }
+ }
+
+ public long getTimeout() {
+ return timeout;
+ }
/**
* 刷新最后一次接收数据时间
*/
- public void refreshLast() {
+ public void refreshLast(double timestamp) {
if (isEnable.get())
- lastReceiveTime = System.currentTimeMillis();
+ lastReceiveTime = timestamp;
}
public synchronized void start() {
if (isEnable.get())
if (timer == null) {
- refreshLast();
+ refreshLast(System.currentTimeMillis() / 1000.0D);
+ timeoutPeriod = ((long) lastReceiveTime * 1000) + timeout;
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
- long difference = System.currentTimeMillis() - lastReceiveTime;
+ long difference = timeoutPeriod - ((long) lastReceiveTime * 1000);
+ timeoutPeriod = ((long) lastReceiveTime * 1000) + timeout;
CupidLogUtils.e(TAG, "最后一次接收工控机数据时间与当前时间差=" + (difference / 1000.0) + "秒");
- if (difference >= DEFAULT_TIMEOUT) {
+ if (difference >= timeout) {
if (listener != null) {
listener.onTimeout(difference / 1000.0);
}
}
}
- }, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT);//延时
+ }, timeout, timeout);//延时
}
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java
index 6ae4dbb70e..0dcee71873 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ArrivalNotificationMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -16,14 +17,12 @@ public class ArrivalNotificationMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.ArrivalNotification arrivalNotification = MessagePad.ArrivalNotification.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.ArrivalNotification arrivalNotification = MessagePad.ArrivalNotification.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onArrivalNotification(header, arrivalNotification);
-
+ adasListener.onArrivalNotification(raw.getHeader(), arrivalNotification);
}
// CupidLogUtils.e("到站提醒--->" + arrivalNotification.toString());
}
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java
index e1250bf431..7d60f7fc5e 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/AutopilotStateMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -16,13 +17,11 @@ public class AutopilotStateMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.AutopilotState autopilotState = MessagePad.AutopilotState.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.AutopilotState autopilotState = MessagePad.AutopilotState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onAutopilotState(header, autopilotState);
+ adasListener.onAutopilotState(raw.getHeader(), autopilotState);
}
// CupidLogUtils.e("自动驾驶状态--->" + autopilotState.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/BasicInfoReqMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/BasicInfoReqMessage.java
index 62e6836e96..8cfea8ec08 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/BasicInfoReqMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/BasicInfoReqMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -16,13 +17,11 @@ public class BasicInfoReqMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.BasicInfoReq autopilotState = MessagePad.BasicInfoReq.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.BasicInfoReq autopilotState = MessagePad.BasicInfoReq.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onBasicInfoReq(header, autopilotState);
+ adasListener.onBasicInfoReq(raw.getHeader(), autopilotState);
}
// CupidLogUtils.e("自动驾驶设备基础信息请求--->" + autopilotState.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java
index 0d1387222c..2a257ab4d2 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/CarConfigRespMessage.java
@@ -5,6 +5,7 @@ import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.AdasManager;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.common.CupidLogUtils;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -18,14 +19,12 @@ public class CarConfigRespMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.CarConfigResp carConfigResp = MessagePad.CarConfigResp.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.CarConfigResp carConfigResp = MessagePad.CarConfigResp.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
AdasManager.getInstance().setCarConfig(carConfigResp);
if (adasListener != null) {
- adasListener.onCarConfigResp(header, carConfigResp);
+ adasListener.onCarConfigResp(raw.getHeader(), carConfigResp);
}
CupidLogUtils.e("车机基础信息应答--->" + carConfigResp.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GlobalPathRespMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GlobalPathRespMessage.java
index 82d9c0940a..d1b57917b5 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GlobalPathRespMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GlobalPathRespMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -16,13 +17,11 @@ public class GlobalPathRespMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.GlobalPathResp globalPathResp = MessagePad.GlobalPathResp.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.GlobalPathResp globalPathResp = MessagePad.GlobalPathResp.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onGlobalPathResp(header, globalPathResp);
+ adasListener.onGlobalPathResp(raw.getHeader(), globalPathResp);
}
// CupidLogUtils.e("自动驾驶路径应答--->" + globalPathResp.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GnssInfoMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GnssInfoMessage.java
index 2a027e6078..cd5b3a0290 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GnssInfoMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/GnssInfoMessage.java
@@ -1,9 +1,10 @@
package com.zhidao.support.adas.high.msg;
+
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
-import com.zhidao.support.adas.high.common.ReceiveTimeoutManager;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -17,14 +18,11 @@ public class GnssInfoMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- ReceiveTimeoutManager.getInstance().refreshLast();
- MessagePad.GnssInfo trajectory = MessagePad.GnssInfo.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.GnssInfo trajectory = MessagePad.GnssInfo.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onGnssInfo(header, trajectory);
+ adasListener.onGnssInfo(raw.getHeader(), trajectory);
}
// CupidLogUtils.e("惯导信息--->" + trajectory.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/IMsg.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/IMsg.java
index afe897f90c..ccfc5f7e5b 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/IMsg.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/IMsg.java
@@ -3,8 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
-
-import mogo.telematics.pad.MessagePad;
+import com.zhidao.support.adas.high.protocol.RawData;
/**
* @author nie yunlong
@@ -19,6 +18,13 @@ public interface IMsg {
*/
void handlerMsg(Gson gson, OnAdasListener adasListener, String msg);
- void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException;
+ /**
+ * 分发处理
+ *
+ * @param raw 原始数据
+ * @param adasListener 监听
+ * @throws InvalidProtocolBufferException
+ */
+ void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException;
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/NuImplMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/NuImplMessage.java
index 3b884dc5d6..cfdd35333d 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/NuImplMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/NuImplMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -19,7 +20,7 @@ public class NuImplMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionObstaclesMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionObstaclesMessage.java
index 9e31d08ec5..b4473fe964 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionObstaclesMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionObstaclesMessage.java
@@ -3,8 +3,8 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
-import mogo.telematics.pad.MessagePad;
import perception.ObjectOuterClass;
/**
@@ -17,12 +17,10 @@ public class PerceptionObstaclesMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- ObjectOuterClass.TrackedObjects trackedObjects = ObjectOuterClass.TrackedObjects.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ ObjectOuterClass.TrackedObjects trackedObjects = ObjectOuterClass.TrackedObjects.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onTrackedObjects(header, trackedObjects);
+ adasListener.onTrackedObjects(raw.getHeader(), trackedObjects);
}
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java
index c3c6a37828..8842d5928b 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PerceptionTrafficLightMessage.java
@@ -3,8 +3,8 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
-import mogo.telematics.pad.MessagePad;
import perception.TrafficLightOuterClass;
/**
@@ -17,12 +17,10 @@ public class PerceptionTrafficLightMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- TrafficLightOuterClass.TrafficLights trafficLights = TrafficLightOuterClass.TrafficLights.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ TrafficLightOuterClass.TrafficLights trafficLights = TrafficLightOuterClass.TrafficLights.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onPerceptionTrafficLight(header, trafficLights);
+ adasListener.onPerceptionTrafficLight(raw.getHeader(), trafficLights);
}
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PointCloudMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PointCloudMessage.java
index 75abf34b1e..0dce9aa4fd 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PointCloudMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PointCloudMessage.java
@@ -3,8 +3,8 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
-import mogo.telematics.pad.MessagePad;
import rule_segement.PointCloud;
/**
@@ -17,12 +17,10 @@ public class PointCloudMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- PointCloud.LidarPointCloud pointCloud = PointCloud.LidarPointCloud.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ PointCloud.LidarPointCloud pointCloud = PointCloud.LidarPointCloud.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onPointCloud(header, pointCloud);
+ adasListener.onPointCloud(raw.getHeader(), pointCloud);
}
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PredictionObstacleTrajectoryMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PredictionObstacleTrajectoryMessage.java
index 3872f73c0b..cadd4debe6 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PredictionObstacleTrajectoryMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/PredictionObstacleTrajectoryMessage.java
@@ -3,8 +3,8 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
-import mogo.telematics.pad.MessagePad;
import prediction.Prediction;
/**
@@ -17,12 +17,10 @@ public class PredictionObstacleTrajectoryMessage extends MyAbstractMessageHandle
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- Prediction.mPredictionObjects objects = Prediction.mPredictionObjects.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ Prediction.mPredictionObjects objects = Prediction.mPredictionObjects.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onPredictionObstacleTrajectory(header, objects);
+ adasListener.onPredictionObstacleTrajectory(raw.getHeader(), objects);
}
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/RecordResultMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/RecordResultMessage.java
index 6cb1ac1fbb..5541108711 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/RecordResultMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/RecordResultMessage.java
@@ -3,8 +3,8 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
-import mogo.telematics.pad.MessagePad;
import record_cache.RecordPanelOuterClass;
/**
@@ -17,13 +17,11 @@ public class RecordResultMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- RecordPanelOuterClass.RecordPanel recordPanel = RecordPanelOuterClass.RecordPanel.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ RecordPanelOuterClass.RecordPanel recordPanel = RecordPanelOuterClass.RecordPanel.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onRecordResult(header, recordPanel);
+ adasListener.onRecordResult(raw.getHeader(), recordPanel);
}
-// CupidLogUtils.e("数据采集结果--->" + recordPanel.toString());
+// CupidLogUtils.e("数据采集结果--->" + recordPanel.toString());;
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java
index a0635df079..9d9ffac66f 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/ReportMessage.java
@@ -3,8 +3,8 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
-import mogo.telematics.pad.MessagePad;
import mogo_msg.MogoReportMsg;
/**
@@ -17,12 +17,10 @@ public class ReportMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MogoReportMsg.MogoReportMessage mogoReportMessage = MogoReportMsg.MogoReportMessage.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MogoReportMsg.MogoReportMessage mogoReportMessage = MogoReportMsg.MogoReportMessage.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onReportMessage(header, mogoReportMessage);
+ adasListener.onReportMessage(raw.getHeader(), mogoReportMessage);
}
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrackedObjectsMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrackedObjectsMessage.java
index 56ebaf5d86..021e81e0ba 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrackedObjectsMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrackedObjectsMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -19,13 +20,11 @@ public class TrackedObjectsMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.TrackedObjects trackedObjects = MessagePad.TrackedObjects.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.TrackedObjects trackedObjects = MessagePad.TrackedObjects.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onTrackedObjects(header, trackedObjects);
+ adasListener.onTrackedObjects(raw.getHeader(), trackedObjects);
}
// CupidLogUtils.e("障碍物信息--->" + trackedObjects.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrajectoryMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrajectoryMessage.java
index f4b2d5c19a..a90a1dc1f8 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrajectoryMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/TrajectoryMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -16,13 +17,11 @@ public class TrajectoryMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.Trajectory trajectory = MessagePad.Trajectory.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.Trajectory trajectory = MessagePad.Trajectory.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onTrajectory(header, trajectory);
+ adasListener.onTrajectory(raw.getHeader(), trajectory);
}
// CupidLogUtils.e("车前引导线--->" + trajectory.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java
index 77f0d979b8..bcbc2a4aa5 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/VehicleStateMessage.java
@@ -3,9 +3,9 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import chassis.VehicleStateOuterClass;
-import mogo.telematics.pad.MessagePad;
/**
* 底盘信息, 透传底盘状态,pb参考底盘
@@ -17,13 +17,11 @@ public class VehicleStateMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- VehicleStateOuterClass.VehicleState vehicleState = VehicleStateOuterClass.VehicleState.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ VehicleStateOuterClass.VehicleState vehicleState = VehicleStateOuterClass.VehicleState.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onVehicleState(header, vehicleState);
+ adasListener.onVehicleState(raw.getHeader(), vehicleState);
}
// CupidLogUtils.e("底盘信息--->" + vehicleState.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WarnMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WarnMessage.java
index 84395505dc..ccf234da45 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WarnMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WarnMessage.java
@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high.msg;
import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
+import com.zhidao.support.adas.high.protocol.RawData;
import mogo.telematics.pad.MessagePad;
@@ -17,13 +18,11 @@ public class WarnMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
- MessagePad.Warn warn = MessagePad.Warn.parseFrom(msg);
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ MessagePad.Warn warn = MessagePad.Warn.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
if (adasListener != null) {
- adasListener.onWarn(header, warn);
+ adasListener.onWarn(raw.getHeader(), warn);
}
// CupidLogUtils.e("预警数据--->" + warn.toString());
}
-
-
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WsAutopilotUpgradeStatusMessage.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WsAutopilotUpgradeStatusMessage.java
index 4ca798716f..0f91658f42 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WsAutopilotUpgradeStatusMessage.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/msg/WsAutopilotUpgradeStatusMessage.java
@@ -4,8 +4,7 @@ import com.google.gson.Gson;
import com.google.protobuf.InvalidProtocolBufferException;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.bean.IPCUpgradeStateInfo;
-
-import mogo.telematics.pad.MessagePad;
+import com.zhidao.support.adas.high.protocol.RawData;
/**
* @des 工控机升级状态 之后版本会被替换成PB格式
@@ -24,7 +23,7 @@ public class WsAutopilotUpgradeStatusMessage extends MyAbstractMessageHandler {
}
@Override
- public void handlerMsg(MessagePad.Header header, byte[] msg, OnAdasListener adasListener) throws InvalidProtocolBufferException {
+ public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/DefaultMessageProtocol.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/DefaultMessageProtocol.java
index cbc4d9f041..1a77194b72 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/DefaultMessageProtocol.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/DefaultMessageProtocol.java
@@ -42,7 +42,7 @@ public class DefaultMessageProtocol implements IMessageProtocol {
* @return
*/
@Override
- public int getOutHeader() {
+ public int getOutHeaderLength() {
return getMagicCodeLength() + getPackageLength() + getOffsetLength();
}
@@ -58,7 +58,7 @@ public class DefaultMessageProtocol implements IMessageProtocol {
if (offsetValue == 0) {
return offsetValue;
}
- return offsetValue - getOutHeader();
+ return offsetValue - getOutHeaderLength();
}
/**
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/IMessageProtocol.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/IMessageProtocol.java
index 0e81ca2ce4..78b5557b1a 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/IMessageProtocol.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/IMessageProtocol.java
@@ -21,7 +21,7 @@ public interface IMessageProtocol {
*/
int getPackageLength();
- int getOutHeader();
+ int getOutHeaderLength();
/**
* 获取header数据长度
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawData.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawData.java
index b8abc9134e..8fdb1f577d 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawData.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawData.java
@@ -1,8 +1,11 @@
package com.zhidao.support.adas.high.protocol;
-import com.zhidao.support.adas.high.common.DigitalTrans;
+import com.zhidao.support.adas.high.common.ByteUtil;
import com.zhidao.support.adas.high.common.ProtocolStatus;
+import mogo.telematics.pad.MessagePad;
+import okio.ByteString;
+
/**
* 原始数据协议
*
@@ -12,9 +15,12 @@ import com.zhidao.support.adas.high.common.ProtocolStatus;
* 原始数据格式:MagicCode(2字节 6d67) 偏移量(2字节 从原始数据头开始一直到Body头) 数据包总长度(4字节) Header Body
*/
public class RawData {
-
/**
- * 数据拆包是否成功
+ * 原始数据
+ */
+ public final ByteString originalData;
+ /**
+ * 数据拆包状态
*/
private ProtocolStatus protocolStatus;
@@ -23,7 +29,10 @@ public class RawData {
* mg=0x6d67
*/
private byte[] magicCode;
-
+ /**
+ * MG长度+数据包长度+偏移量长度
+ */
+ private int outHeaderLength;
/**
* 偏移量,用于计算header长度
*/
@@ -39,20 +48,17 @@ public class RawData {
/**
* 包长度
*/
- private long packageLengthValue;
+ private int packageLengthValue;
/**
* 头部消息,装载消息类型等
* 长度=offset-out_header.length
*/
- private byte[] header;
+ private MessagePad.Header header;
- /**
- * 负载数据:真实上报的数据
- */
- private byte[] payload;
- public RawData() {
+ public RawData(ByteString originalData) {
+ this.originalData = originalData;
}
/**
@@ -61,8 +67,8 @@ public class RawData {
* 固定8个字节,否则出错。
*/
public byte[] getOutHeaderBytes() {
- byte[] bytes = DigitalTrans.concatBytes(getMagicCode(), getOffset());
- byte[] outHeader = DigitalTrans.concatBytes(bytes, getPackageLength());
+ byte[] bytes = ByteUtil.concatBytes(getMagicCode(), getOffset());
+ byte[] outHeader = ByteUtil.concatBytes(bytes, getPackageLength());
return outHeader;
}
@@ -75,6 +81,13 @@ public class RawData {
this.magicCode = magicCode;
}
+ public int getOutHeaderLength() {
+ return outHeaderLength;
+ }
+
+ public void setOutHeaderLength(int outHeaderLength) {
+ this.outHeaderLength = outHeaderLength;
+ }
public byte[] getOffset() {
return offset;
@@ -89,33 +102,24 @@ public class RawData {
return packageLength;
}
- public void setPackageLength(byte[] packageLength, long packageLengthValue) {
+ public void setPackageLength(byte[] packageLength, int packageLengthValue) {
this.packageLength = packageLength;
this.packageLengthValue = packageLengthValue;
}
- public byte[] getHeader() {
+ public MessagePad.Header getHeader() {
return header;
}
- public void setHeader(byte[] header) {
+ public void setHeader(MessagePad.Header header) {
this.header = header;
}
- public byte[] getPayload() {
- return payload;
- }
-
- public void setPayload(byte[] payload) {
- this.payload = payload;
- }
-
-
public int getOffsetValue() {
return offsetValue;
}
- public long getPackageLengthValue() {
+ public int getPackageLengthValue() {
return packageLengthValue;
}
@@ -133,8 +137,7 @@ public class RawData {
offset = null;
offsetValue = 0;
packageLength = null;
- packageLengthValue = 0L;
+ packageLengthValue = 0;
header = null;
- payload = null;
}
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java
index 293b392338..e39b2e3f7e 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawPack.java
@@ -1,7 +1,7 @@
package com.zhidao.support.adas.high.protocol;
+import com.zhidao.support.adas.high.common.ByteUtil;
import com.zhidao.support.adas.high.common.Constants;
-import com.zhidao.support.adas.high.common.DigitalTrans;
import java.util.concurrent.atomic.AtomicLong;
@@ -37,7 +37,7 @@ public class RawPack {
headerBuilder.setTimestamp(time);
headerBuilder.setSourceTimestamp(time);
MessagePad.Header headerPb = headerBuilder.build();
- int lengthValue = messageProtocol.getOutHeader() + headerPb.getSerializedSize();//数据总长度
+ int lengthValue = messageProtocol.getOutHeaderLength() + headerPb.getSerializedSize();//数据总长度
byte[] offset = getOffset(lengthValue);
if (data != null && data.length > 0) {
lengthValue += data.length;
@@ -52,10 +52,10 @@ public class RawPack {
//添加数据包长度
System.arraycopy(length, 0, msg, messageProtocol.getMagicCodeLength() + messageProtocol.getOffsetLength(), messageProtocol.getPackageLength());
//添加Header
- System.arraycopy(header, 0, msg, messageProtocol.getOutHeader(), header.length);
+ System.arraycopy(header, 0, msg, messageProtocol.getOutHeaderLength(), header.length);
//添加数据
if (data != null && data.length > 0) {
- System.arraycopy(data, 0, msg, messageProtocol.getOutHeader() + header.length, data.length);
+ System.arraycopy(data, 0, msg, messageProtocol.getOutHeaderLength() + header.length, data.length);
}
return ByteString.of(msg);
@@ -67,7 +67,7 @@ public class RawPack {
* @return
*/
private byte[] getOffset(int offsetValue) {
- return DigitalTrans.set16bitUnsignedValue(offsetValue);
+ return ByteUtil.set16bitUnsignedValue(offsetValue);
}
/**
@@ -76,6 +76,6 @@ public class RawPack {
* @return
*/
private byte[] getPackageLength(long lengthValue) {
- return DigitalTrans.set32bitUnsignedValue(lengthValue);
+ return ByteUtil.set32bitUnsignedValue(lengthValue);
}
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawUnpack.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawUnpack.java
index 3f375ef424..e198a01d69 100644
--- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawUnpack.java
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/protocol/RawUnpack.java
@@ -1,7 +1,7 @@
package com.zhidao.support.adas.high.protocol;
+import com.zhidao.support.adas.high.common.ByteUtil;
import com.zhidao.support.adas.high.common.Constants;
-import com.zhidao.support.adas.high.common.DigitalTrans;
import com.zhidao.support.adas.high.common.ProtocolStatus;
import java.util.Arrays;
@@ -18,21 +18,19 @@ import okio.ByteString;
public class RawUnpack {
private static final String TAG = RawUnpack.class.getSimpleName();
private final DefaultMessageProtocol messageProtocol;
- private RawData originalData;
public RawUnpack() {
messageProtocol = new DefaultMessageProtocol();
}
public RawData read(ByteString bytes) {
- if (originalData == null)
- originalData = new RawData();
+ RawData originalData = new RawData(bytes);
unpack(bytes, originalData);
return originalData;
}
- private synchronized void unpack(ByteString bytes, RawData raw) {
+ private void unpack(ByteString bytes, RawData raw) {
// CupidLogUtils.w(TAG, "WS 原始数据=" + bytes.hex());
//读取magicCode
ByteString magicCode;
@@ -46,14 +44,15 @@ public class RawUnpack {
// CupidLogUtils.w(TAG, "WS MagicCode=" + magicCode.hex());
if (Arrays.equals(magicCode.toByteArray(), Constants.RAW_MG)) {
int offsetLength = messageProtocol.getOffsetLength();
- int outHeader = messageProtocol.getOutHeader();
+ int outHeaderLength = messageProtocol.getOutHeaderLength();
+ raw.setOutHeaderLength(outHeaderLength);
//读取offset
ByteString offset = bytes.substring(magicCodeLength, magicCodeLength + offsetLength);
byte[] offsetB = offset.toByteArray();
raw.setOffset(offsetB, getOffsetValue(offsetB));
// CupidLogUtils.w(TAG, "WS 偏移量 bytes=" + offset.hex() + " 偏移量=" + raw.getOffsetValue());
//读取packageLength
- ByteString packageLength = bytes.substring(magicCodeLength + offsetLength, outHeader);
+ ByteString packageLength = bytes.substring(magicCodeLength + offsetLength, outHeaderLength);
byte[] packageLengthB = packageLength.toByteArray();
raw.setPackageLength(packageLengthB, getPackageLengthValue(packageLengthB));
if (bytes.size() != raw.getPackageLengthValue()) {
@@ -61,14 +60,8 @@ public class RawUnpack {
raw.clear();
return;
}
-// CupidLogUtils.w(TAG, "WS 数据包从长度 bytes=" + packageLength.hex() + " 数据包从长度=" + raw.getPackageLengthValue());
//读取header
- ByteString header = bytes.substring(outHeader, raw.getOffsetValue());
- raw.setHeader(header.toByteArray());
-// CupidLogUtils.w(TAG, "WS Header=" + header.hex());
//读取payload
- ByteString payload = bytes.substring(raw.getOffsetValue());
- raw.setPayload(payload.toByteArray());
raw.setProtocolStatus(ProtocolStatus.SUCCEED);
// CupidLogUtils.w(TAG, "WS IPC数据=" + payload.hex() + " IPC数据长度=" + messageProtocol.getPayloadLength(raw.getPackageLengthValue(), raw.getOffsetValue()));
} else {
@@ -87,7 +80,7 @@ public class RawUnpack {
if (offset == null || offset.length != 2) {
return 0;
}
- return DigitalTrans.get16bitUnsignedValue(offset);
+ return ByteUtil.get16bitUnsignedValue(0, offset);
}
/**
@@ -95,10 +88,10 @@ public class RawUnpack {
*
* @return
*/
- private long getPackageLengthValue(byte[] length) {
+ private int getPackageLengthValue(byte[] length) {
if (length == null || length.length != 4) {
return 0;
}
- return DigitalTrans.get32bitUnsignedValue(length);
+ return ByteUtil.get32bitUnsignedValue(0, length);
}
}
diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/thread/DispatchHandler.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/thread/DispatchHandler.java
new file mode 100644
index 0000000000..dd173d2fb7
--- /dev/null
+++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/thread/DispatchHandler.java
@@ -0,0 +1,126 @@
+package com.zhidao.support.adas.high.thread;
+
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
+
+import androidx.annotation.NonNull;
+
+import com.zhidao.support.adas.high.protocol.RawData;
+
+import java.lang.ref.WeakReference;
+
+import okio.ByteString;
+
+/**
+ * 将WebSocket线程分发到工作线程
+ */
+public class DispatchHandler {
+ public static final int WHAT_DISPATCH_RAW = 0x01;//分发消息 what
+
+
+ private HandlerThread mThread;
+ private BaseHandler mBaseHandler;
+ private OnDispatchHandlerListener listener;
+
+ public interface OnDispatchHandlerListener {
+ void onDispatchRaw(RawData raw);
+ }
+
+ public DispatchHandler(@NonNull OnDispatchHandlerListener listener) {
+ this.listener = listener;
+
+ }
+
+ public void start() {
+ if (mThread == null) {
+ mThread = new HandlerThread("IPCEventDispatchHandler");
+ mThread.start();
+ initHandler(mThread.getLooper());
+ }
+ }
+
+ public void stop() {
+ if (mBaseHandler != null) {
+ mBaseHandler.removeCallbacksAndMessages(null);
+ mBaseHandler = null;
+ }
+ if (mThread != null) {
+ mThread.quit();
+ mThread = null;
+ }
+ }
+
+ public void sendRawMessage(RawData raw) {
+ if (mBaseHandler != null) {
+ Message msg = Message.obtain();
+ msg.what = WHAT_DISPATCH_RAW;
+ msg.obj = raw;
+ mBaseHandler.sendMessage(msg);
+ }
+ }
+
+
+ /**
+ * 同Handler 的 handleMessage,
+ * getHandler.sendMessage,发送的Message在此接收
+ * 在此之前确定已经调用initHandler()
+ *
+ * @param msg
+ */
+ protected void handleMessage(Message msg) {
+ if (msg.what == WHAT_DISPATCH_RAW) {
+ if (listener != null) {
+ listener.onDispatchRaw((RawData) msg.obj);
+ }
+ }
+ }
+
+ /**
+ * 初始化一个Handler,如果需要使用Handler,先调用此方法,
+ * 然后可以使用postRunnable(Runnable runnable),
+ * sendMessage在handleMessage(Message msg)中接收msg
+ */
+ private void initHandler(@NonNull Looper looper) {
+ mBaseHandler = new BaseHandler(looper, this);
+ }
+
+
+ /**
+ * 同Handler的postRunnable
+ * 在此之前确定已经调用initHandler()
+ */
+ public void postRunnable(Runnable runnable) {
+ postRunnableDelayed(runnable, 0);
+ }
+
+ /**
+ * 同Handler的postRunnableDelayed
+ * 在此之前确定已经调用initHandler()
+ */
+ public void postRunnableDelayed(Runnable runnable, long delayMillis) {
+ if (mBaseHandler != null)
+ mBaseHandler.postDelayed(runnable, delayMillis);
+ }
+
+
+ protected static class BaseHandler extends Handler {
+ private final WeakReference mObjects;
+
+ public BaseHandler(@NonNull Looper looper, DispatchHandler mPresenter) {
+ super(looper);
+ mObjects = new WeakReference(mPresenter);
+ }
+
+
+ @Override
+ public void handleMessage(Message msg) {
+ DispatchHandler mPresenter = mObjects.get();
+ if (mPresenter != null)
+ mPresenter.handleMessage(msg);
+ }
+ }
+
+
+}