[630][adas] 修改回执消息,增加数据解析失败状态

This commit is contained in:
xinfengkun
2024-03-04 11:49:41 +08:00
parent dadd787908
commit beaf7c537c
3 changed files with 80 additions and 35 deletions

View File

@@ -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) {

View File

@@ -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)) +
'}';

View File

@@ -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);
}