[630][adas] 修改回执消息,增加数据解析失败状态
This commit is contained in:
@@ -102,7 +102,7 @@ public enum MessageType {
|
||||
public final long timeoutMillis;
|
||||
|
||||
MessageType(MessagePad.MessageType typeCode, String desc) {
|
||||
this(typeCode, desc, 0);
|
||||
this(typeCode, desc, 0L);
|
||||
}
|
||||
|
||||
MessageType(MessagePad.MessageType typeCode, String desc, long timeoutMillis) {
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package com.zhjt.mogo.adas.data.bean;
|
||||
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.protobuf.TextFormat;
|
||||
import com.zhjt.mogo.adas.common.MessageType;
|
||||
import com.zhjt.mogo.adas.utils.ByteUtil;
|
||||
@@ -12,30 +15,61 @@ import mogo.telematics.pad.MessagePad;
|
||||
*/
|
||||
public class ReceivedAck {
|
||||
/**
|
||||
* 是否超时,如果超时 receiveTime和receivedAck不会被赋值
|
||||
* 超时时间定义在{@link MessageType}中,根据定义的超时时间实际返回的超时时间 ±1 秒内
|
||||
* 是否超时,如果超时
|
||||
*/
|
||||
private boolean isTimeout = false;
|
||||
@NonNull
|
||||
private Status status = Status.NORMAL;
|
||||
private final long sendTime;//数据发送时间
|
||||
private long receiveTime;//回执接收时间
|
||||
private final long msgId;//消息ID
|
||||
private final MessageType messageType;//具体消息
|
||||
private final byte[] sendData;//发送的数据
|
||||
private MessagePad.ReceivedAck receivedAck;//回执的数据
|
||||
private final long msgId;//PAD发送的消息ID
|
||||
@NonNull
|
||||
private final MessageType messageType;//PAD发送的具体消息类型
|
||||
@Nullable
|
||||
private final byte[] sendData;//PAD发送的数据
|
||||
@Nullable
|
||||
private MessagePad.ReceivedAck receivedAck;//PAD接收到回执的数据
|
||||
|
||||
public ReceivedAck(long sendTime, long msgId, MessageType messageType, byte[] sendData) {
|
||||
/**
|
||||
* 回执状态
|
||||
*/
|
||||
public enum Status {
|
||||
/**
|
||||
* 正常的
|
||||
* 所有字段均会被赋值
|
||||
*/
|
||||
NORMAL,
|
||||
/**
|
||||
* 接收域控回执数据超时
|
||||
* receiveTime和receivedAck不会被赋值
|
||||
* 超时时间定义在{@link MessageType}中,根据定义的超时时间实际返回的超时时间 ±1 秒内
|
||||
*/
|
||||
TIMEOUT,
|
||||
/**
|
||||
* 收到域控发送的回执消息,但是消息存在异常
|
||||
* sendTime和msgId和messageType和sendData不会被赋值
|
||||
*/
|
||||
RECEIVED_ACK_DATA_ERROR,
|
||||
/**
|
||||
* 收到域控发送的回执消息,但是本地发送命令的缓存列表中没有任何数据,无法确认收到的回执数据属于那条命令发出的
|
||||
* sendTime和msgId和messageType和sendData不会被赋值
|
||||
*/
|
||||
WAITING_RECEIVED_ACK_LIST_EMPTY;
|
||||
}
|
||||
|
||||
public ReceivedAck(long sendTime, long msgId, @NonNull MessageType messageType, @Nullable byte[] sendData) {
|
||||
this.sendTime = sendTime;
|
||||
this.msgId = msgId;
|
||||
this.messageType = messageType;
|
||||
this.sendData = sendData;
|
||||
}
|
||||
|
||||
public boolean isTimeout() {
|
||||
return isTimeout;
|
||||
@NonNull
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setTimeout(boolean timeout) {
|
||||
isTimeout = timeout;
|
||||
public void setStatus(@NonNull Status status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public long getSendTime() {
|
||||
@@ -54,30 +88,33 @@ public class ReceivedAck {
|
||||
return msgId;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public MessageType getMessageType() {
|
||||
return messageType;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public byte[] getSendData() {
|
||||
return sendData;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public MessagePad.ReceivedAck getReceivedAck() {
|
||||
return receivedAck;
|
||||
}
|
||||
|
||||
public void setReceivedAck(MessagePad.ReceivedAck receivedAck) {
|
||||
public void setReceivedAck(@Nullable MessagePad.ReceivedAck receivedAck) {
|
||||
this.receivedAck = receivedAck;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "{" +
|
||||
"是否超时=" + isTimeout +
|
||||
"状态=" + status +
|
||||
", 发送时间=" + sendTime +
|
||||
", 接收时间=" + receiveTime +
|
||||
", 消息ID=" + msgId +
|
||||
", 消息类型=" + messageType +
|
||||
", 回执接收时间=" + receiveTime +
|
||||
", 发送消息ID=" + msgId +
|
||||
", 发送类型=" + messageType +
|
||||
", 发送数据=" + (sendData == null ? null : ByteUtil.byteArrToHex(sendData)) +
|
||||
", 回执数据=" + (receivedAck == null ? null : TextFormat.printer().escapingNonAscii(false).printToString(receivedAck)) +
|
||||
'}';
|
||||
|
||||
@@ -79,22 +79,29 @@ public class ReceivedAckManager {
|
||||
*/
|
||||
public void receiveReceivedAck(long time, MessagePad.ReceivedAck receivedAck) {
|
||||
int count = receivedAck.getMsgidsCount();
|
||||
if (!list.isEmpty() && count > 0) {
|
||||
Iterator<ReceivedAck> iterator = list.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
ReceivedAck ack = iterator.next();
|
||||
for (int i = 0; i < count; i++) {
|
||||
long msgId = receivedAck.getMsgids(i);
|
||||
if (msgId == ack.getMsgId()) {
|
||||
iterator.remove();
|
||||
ack.setTimeout(false);
|
||||
ack.setReceiveTime(time);
|
||||
ack.setReceivedAck(receivedAck);
|
||||
if (listener != null) {
|
||||
listener.onReceiveReceivedAck(ack);
|
||||
}
|
||||
break;
|
||||
if (count == 0 || list.isEmpty()) {
|
||||
if (listener != null) {
|
||||
ReceivedAck ack = new ReceivedAck(0, 0, MessageType.TYPE_DEFAULT, null);
|
||||
ack.setStatus(count == 0 ? ReceivedAck.Status.RECEIVED_ACK_DATA_ERROR : ReceivedAck.Status.WAITING_RECEIVED_ACK_LIST_EMPTY);
|
||||
ack.setReceiveTime(time);
|
||||
ack.setReceivedAck(receivedAck);
|
||||
listener.onReceiveReceivedAck(ack);
|
||||
}
|
||||
return;
|
||||
}
|
||||
Iterator<ReceivedAck> iterator = list.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
ReceivedAck ack = iterator.next();
|
||||
for (int i = 0; i < count; i++) {
|
||||
long msgId = receivedAck.getMsgids(i);
|
||||
if (msgId == ack.getMsgId()) {
|
||||
iterator.remove();
|
||||
ack.setReceiveTime(time);
|
||||
ack.setReceivedAck(receivedAck);
|
||||
if (listener != null) {
|
||||
listener.onReceiveReceivedAck(ack);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -112,10 +119,11 @@ public class ReceivedAckManager {
|
||||
Iterator<ReceivedAck> iterator = list.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
ReceivedAck ack = iterator.next();
|
||||
if (time - ack.getSendTime() > ack.getMessageType().timeoutMillis) {
|
||||
long t = ack.getMessageType().timeoutMillis;
|
||||
if (t != 0L && time - ack.getSendTime() > t) {
|
||||
//超时
|
||||
iterator.remove();
|
||||
ack.setTimeout(true);
|
||||
ack.setStatus(ReceivedAck.Status.TIMEOUT);
|
||||
if (listener != null) {
|
||||
listener.onReceiveReceivedAck(ack);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user