diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java index 79e7cf309e..f51b9037b6 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/common/MessageType.java @@ -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) { diff --git a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java index f7201f5d46..a1cc36ea70 100644 --- a/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java +++ b/libraries/mogo-adas-data/src/main/java/com/zhjt/mogo/adas/data/bean/ReceivedAck.java @@ -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)) + '}'; diff --git a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java index aec7fc9893..2a2373b769 100644 --- a/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java +++ b/libraries/mogo-adas/src/main/java/com/zhidao/support/adas/high/common/ReceivedAckManager.java @@ -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 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 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 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); }