[670][adas][data-center] 新增冷启动状态查询以及响应接口;新增环形路线功能:启动自驾新增字段、新增启动自驾新字段查询以及响应接口、新增到站查询和响应接口;新增电源盒协议接口相关接口:

This commit is contained in:
xinfengkun
2024-09-18 16:29:48 +08:00
parent f6f6d8b306
commit 9dd1f61583
33 changed files with 2279 additions and 31 deletions

View File

@@ -88,6 +88,13 @@ public enum MessageType {
TYPE_RECEIVE_V2N_NIO_OTHER_RETROGRADE_EVENT(MessagePad.MessageType.MsgTypeV2nNioOtherRetrogradeEvent, "V2N NIO他车逆行路侧"),
TYPE_RECEIVE_V2N_NIO_CONGESTION_EVENT(MessagePad.MessageType.MsgTypeV2nNioCongestionEvent, "V2N NIO拥堵事件"),
TYPE_RECEIVE_LANE_MARKS_TRAN(MessagePad.MessageType.MsgTypeLaneMarksTran, "车道线"),
TYPE_SEND_COLLISION_REPORT(MessagePad.MessageType.MsgTypeCollisionReport, "碰撞上报"),
TYPE_SEND_POWER_UNIT(MessagePad.MessageType.MsgTypePowerUnit, "电源模块请求"),
TYPE_RECEIVE_POWER_UNIT(MessagePad.MessageType.MsgTypePowerUnit, "电源模块响应"),
TYPE_SEND_SSM_FUNC_MSG(MessagePad.MessageType.MsgTypeSSMFuncMsg, "SSM功能控制"),
TYPE_RECEIVE_SSM_FUNC_MSG(MessagePad.MessageType.MsgTypeSSMFuncMsg, "SSM功能响应"),
TYPE_SEND_SSM_FUNC_STATUS_QUERY(MessagePad.MessageType.MsgTypeSSMFuncStatusQuery, "SSM功能状态查询"),
TYPE_RECEIVE_SSM_FUNC_STATUS_QUERY(MessagePad.MessageType.MsgTypeSSMFuncStatusQuery, "SSM功能状态响应"),
//TODO 透传原始pb文件中不存在以下type。由于Java中无法强转,所以在mogo-adas-data/message_pad.proto中放开注释
TYPE_RECEIVE_PLANNING_DECISION_STATE(MessagePad.MessageType.MsgTypePlanningDecisionState, "Planning决策状态"),
TYPE_RECEIVE_SWEEPER_TASK_INDEX_DATA(MessagePad.MessageType.MsgTypeSweeperTaskIndexData, "清扫车指标数据"),

View File

@@ -0,0 +1,34 @@
package com.zhjt.mogo.adas.common.power;
/**
* 电源控制类型
*/
public enum PowerControlType {
UNKNOWN(-1),//未知
SINGLE_CHANNEL_CONTROL(0x0011),//单通道控制
SINGLE_CHANNEL_CONTROL_RESPONSE(0x0811),//单通道控制响应
MULTI_CHANNEL_CONTROL(0x00FF),//多通道控制
MULTI_CHANNEL_CONTROL_RESPONSE(0x08FF),//多通道控制响应
RESET_CONTROL(0x0044),//复位控制
RESET_CONTROL_RESPONSE(0x0844),//复位控制响应
;
public final int value;
PowerControlType(int value) {
this.value = value;
}
public static PowerControlType getPowerControlType(int value) {
PowerControlType[] data = PowerControlType.values();
for (PowerControlType type : data) {
if (type.value == value) {
return type;
}
}
return UNKNOWN;
}
}

View File

@@ -0,0 +1,55 @@
package com.zhjt.mogo.adas.common.power;
public enum PowerError {
UNKNOWN(-1, "未知"),
ERR0(0x00, "其它未识别异常"),
ERR1(0x01, "帧校验值验证失败或帧类型不支持"),
ERR2(0x02, "STS帧长度“不是12”异常"),
ERR3(0x03, "帧长度“小于16”异常"),
ERR4(0x04, "帧类型不支持(合并处理)"),
ERR5(0x05, "底层控制“CAN”中断异常"),
ERR6(0x06, "底层控制“未就绪”异常"),
ERR7(0x07, "CMD帧的“控制方式”不支持或未定义"),
ERR8(0x08, "CMD帧、单通道控制、通道索引号未注册使用"),
ERR9(0x09, "CMD帧、单通道控制、通道索引号超出范围"),
;
public final int value;
/**
* 描述
*/
public final String desc;
PowerError(int value, String desc) {
this.value = value;
this.desc = desc;
}
public static PowerError getPowerError(int value) {
if (value == ERR0.value) {
return ERR0;
} else if (value == ERR1.value) {
return ERR1;
} else if (value == ERR2.value) {
return ERR2;
} else if (value == ERR3.value) {
return ERR3;
} else if (value == ERR4.value) {
return ERR4;
} else if (value == ERR5.value) {
return ERR5;
} else if (value == ERR6.value) {
return ERR6;
} else if (value == ERR7.value) {
return ERR7;
} else {
return UNKNOWN;
}
}
@Override
public String toString() {
return desc;
}
}

View File

@@ -0,0 +1,39 @@
package com.zhjt.mogo.adas.common.power;
public enum PowerFrameType {
UNKNOWN(-1, "未知"),
STS_REQUEST(0x0040, "STS请求"),
STS_RESPONSE(0x0840, "STS响应"),
CMD_REQUEST(0x0044, "CMD请求"),
CMD_RESPONSE(0x0844, "CMD响应"),
ERROR_RESPONSE(0x0800, "服务器异常响应"),//客户端发送的数据服务端检测到异常
;
public final int type;
/**
* 描述
*/
public final String desc;
PowerFrameType(int type, String desc) {
this.type = type;
this.desc = desc;
}
public static PowerFrameType getPowerFrameType(int type) {
if (type == STS_REQUEST.type) {
return STS_REQUEST;
} else if (type == STS_RESPONSE.type) {
return STS_RESPONSE;
} else if (type == CMD_REQUEST.type) {
return CMD_REQUEST;
} else if (type == CMD_RESPONSE.type) {
return CMD_RESPONSE;
} else if (type == ERROR_RESPONSE.type) {
return ERROR_RESPONSE;
} else {
return UNKNOWN;
}
}
}

View File

@@ -0,0 +1,35 @@
package com.zhjt.mogo.adas.common.power;
/**
* 数据协议解析状态
*/
public enum PowerProtocolStatus {
SUCCEED(0x00, "数据解析成功"),
CHECK_FAILED_PACKAGE_LENGTH(0x01, "数据包长度校验失败"),
DATA_LENGTH_NOT_NOTE_OF4(0x02, "数据长度非4的倍数"),
XOR_CHECK_FAILED(0x03, "异域校验失败"),
DATA_PARSE_FAILED(0x04, "数据解析失败"),
CHECK_FAILED_FRAME_HEADER(0x05, "数据头校验失败"),
POWER_FRAME_TYPE_UNKNOWN(0x06, "帧类型未知"),
PAYLOAD_DATA_PARSE_FAILED(0x07, "负载数据解析失败"),
;
public final int code;
/**
* 描述
*/
public final String desc;
PowerProtocolStatus(int code, String desc) {
this.code = code;
this.desc = desc;
}
@Override
public String toString() {
return desc;
}
}

View File

@@ -0,0 +1,96 @@
package com.zhjt.mogo.adas.common.power;
/**
* 单元通道
*/
public enum PowerUnitChannel {
UNKNOWN(-1, null, -1, null),
AIO_PASSENGER_SCREEN(1, "OUT1", 15, "乘客屏一体机(含主控)"),
EB5_DEVICE(2, "OUT2", 15, "EB5主机工程样车"),
VERIFICATION_DEVICE(3, "OUT3", 5, "核销设备"),
DASHCAM(4, "OUT4", 5, "行车记录仪"),
VOICE_MODULE(5, "OUT5", 10, "语音模块"),
CALL_KEY(6, "OUT6", 10, "呼叫按键"),
FRONT_LED_SCREEN(7, "OUT7", 10, "前LED屏"),
BACK_LED_SCREEN(8, "OUT8", 10, "后LED屏"),
POWER_AMPLIFIER(9, "OUT9", 10, "功放"),
AIO_DRIVER_SCREEN(10, "OUT10", 10, "司机屏一体机"),
RTK(27, "OUT27", 5, "RTK定位设备"),
VTBOX(28, "OUT28", 5, "VTBOX"),
FRONT_MILLIMETER_WAVE_RADAR(29, "OUT29", 10, "前毫米波雷达"),
BACK_MILLIMETER_WAVE_RADAR(30, "OUT30", 10, "后毫米波雷达"),
LEFT_FRONT_MILLIMETER_WAVE_RADAR(31, "OUT31", 10, "左前毫米波雷达"),
RIGHT_FRONT_MILLIMETER_WAVE_RADAR(32, "OUT32", 10, "右前毫米波雷达"),
LEFT_BACK_MILLIMETER_WAVE_RADAR(33, "OUT33", 10, "左后毫米波雷达"),
RIGHT_BACK_MILLIMETER_WAVE_RADAR(34, "OUT34", 10, "右后毫米波雷达"),
FRONT_BLIND_LASER_RADAR(35, "OUT35", 5, "前补盲激光雷达"),
LEFT_BLIND_LASER_RADAR(36, "OUT36", 5, "左补盲激光雷达"),
RIGHT_BLIND_LASER_RADAR(37, "OUT37", 5, "右补盲激光雷达"),
BACK_BLIND_LASER_RADAR(38, "OUT38", 5, "后补盲激光雷达"),
FRONT_LASER_RADAR(39, "OUT39", 5, "前激光雷达"),
LEFT_LASER_RADAR(40, "OUT40", 5, "左激光雷达"),
RIGHT_LASER_RADAR(41, "OUT41", 5, "右激光雷达"),
BACK_LASER_RADAR(42, "OUT42", 5, "后激光雷达"),
SWITCH(43, "OUT43", 5, "交换机"),
ROUTER_5G(44, "OUT44", 5, "5G路由器"),
OBU(45, "OUT45", 5, "OBU"),
FRONT_RIGHT_CAMERA_120(52, "M-Video1", 0.6F, "120°前右摄像头(2M)"),
FRONT_CENTRE_CAMERA_60(53, "M-Video2", 0.6F, "60°前中摄像头(8M)"),
LEFT_FRONT_CAMERA_120(54, "M-Video3", 0.6F, "120°左前摄像头(2M)"),
LEFT_BACK_CAMERA_120(55, "M-Video4", 0.6F, "120°左后摄像头(2M)"),
RIGHT_FRONT_CAMERA_120(56, "M-Video5", 0.6F, "120°右前摄像头(2M)"),
RIGHT_BACK_CAMERA_120(57, "M-Video6", 0.6F, "120°右后摄像头(2M)"),
BACK_CAMERA_60(58, "M-Video7", 0.6F, "120°后摄像头(2M)"),
FRONT_SURROUND_VIEW_CAMERA(63, "S-Video4", 0.6F, "前环视摄像头(2M)"),
LEFT_SURROUND_VIEW_CAMERA(64, "S-Video5", 0.6F, "左环视摄像头(2M)"),
RIGHT_SURROUND_VIEW_CAMERA(65, "S-Video6", 0.6F, "右环视摄像头(2M)"),
BACK_SURROUND_VIEW_CAMERA(66, "S-Video7", 0.6F, "后环视摄像头(2M)"),
;
/**
* 通道编号
*/
public final int index;
/**
* 物理连接通道
*/
public final String physicalChannel;
/**
* 电流保护阈值 单位A
*/
public final float currentProtectionThreshold;
/**
* 驱动单元
*/
public final String driverElement;
PowerUnitChannel(int index, String physicalChannel, float currentProtectionThreshold, String driverElement) {
this.index = index;
this.physicalChannel = physicalChannel;
this.currentProtectionThreshold = currentProtectionThreshold;
this.driverElement = driverElement;
}
public static PowerUnitChannel getPowerUnitChannel(int index) {
PowerUnitChannel[] data = PowerUnitChannel.values();
for (PowerUnitChannel channel : data) {
if (channel.index == index) {
return channel;
}
}
return UNKNOWN;
}
@Override
public String toString() {
return "PowerUnitChannel{" +
"index=" + index +
", driverElement='" + driverElement + '\'' +
'}';
}
}

View File

@@ -0,0 +1,68 @@
package com.zhjt.mogo.adas.data.bean.power;
import com.zhjt.mogo.adas.common.power.PowerControlType;
import com.zhjt.mogo.adas.common.power.PowerUnitChannel;
/**
* 命令执行状态 包括:单通道控制;多通道控制;复位控制;
*/
public class PowerCommandExecuteState {
/**
* 控制方式
*/
public final PowerControlType controlType;
/**
* 命令是否执行成功
*/
public final boolean isSucceed;
/**
* 单元索引
* 单通道控制存在此字段
*/
public final PowerUnitChannel channel;
/**
* 下发命令的开关状态
* 单通道控制存在此字段
* 索引1~46表示通电状态 0关闭1打开
*/
public final int sendPowerState;
/**
* 实际开关状态
* 单通道控制存在此字段
* 索引1~46表示通电状态 0关闭1打开
*/
public final int actualPowerState;
/**
* 故障状态
* 单通道控制存在此字段
* 索引1~46表示故障状态 0无故障1对地短路2过流3故障
* 索引51~66表示故障状态 0无故障8过温4过流2过压1欠压可能出现多故障
* <p>
* 整体判断是否有无故障使用{@link PowerUnitState#isNoneFault()}}
* <p>
* 索引为51~66时调用 以下方法判断存在哪些故障
* {@link PowerUnitState#isTS()}}
* {@link PowerUnitState#isOC()}}
* {@link PowerUnitState#isOV()}}
* {@link PowerUnitState#isUV()}}
* 详情参见{@link PowerUnitState#getFaultState()}}
*/
public final int faultState;
public PowerCommandExecuteState(PowerControlType controlType, boolean isSucceed) {
this(controlType, isSucceed, null, -1, -1, -1);
}
public PowerCommandExecuteState(PowerControlType controlType, boolean isSucceed, PowerUnitChannel channel, int sendPowerState, int actualPowerState, int faultState) {
this.controlType = controlType;
this.isSucceed = isSucceed;
this.channel = channel;
this.sendPowerState = sendPowerState;
this.actualPowerState = actualPowerState;
this.faultState = faultState;
}
}

View File

@@ -0,0 +1,101 @@
package com.zhjt.mogo.adas.data.bean.power;
import com.zhjt.mogo.adas.common.power.PowerFrameType;
import com.zhjt.mogo.adas.common.power.PowerProtocolStatus;
import java.util.List;
/**
* 电源原始数据协议
*/
public class PowerData {
/**
* 原始数据
*/
public final byte[] originalData;
/**
* 数据拆包状态
*/
public final PowerProtocolStatus protocolStatus;
/**
* 帧头 用于检查数据是否为正确数据
* mg=0xAA55
*/
public final int frameHead;
/**
* 帧总长度
*/
public final int totalLength;
/**
* 帧类型
*/
public final PowerFrameType frameType;
/**
* 保留字节
*/
public final int reserved;
/**
* 负载数据
*/
public final byte[] dataBlocks;
/**
* 帧校验值
*/
public final int checkValue;
private List<PowerUnitState> powerUnitStates;
private PowerErrorData powerErrorData;
private PowerCommandExecuteState executeState;
/**
* 拆包失败的构造
*/
public static PowerData createError(byte[] originalData, PowerProtocolStatus protocolStatus) {
return new PowerData(originalData, protocolStatus, 0, 0, null, 0, null, 0);
}
/**
* 拆包成功的构造
*/
public static PowerData create(byte[] originalData, int frameHead, int totalLength, PowerFrameType frameType, int reserved, byte[] dataBlocks, int checkValue) {
return new PowerData(originalData, PowerProtocolStatus.SUCCEED, frameHead, totalLength, frameType, reserved, dataBlocks, checkValue);
}
private PowerData(byte[] originalData, PowerProtocolStatus protocolStatus, int frameHead, int totalLength, PowerFrameType frameType, int reserved, byte[] dataBlocks, int checkValue) {
this.originalData = originalData;
this.protocolStatus = protocolStatus;
this.frameHead = frameHead;
this.totalLength = totalLength;
this.frameType = frameType;
this.reserved = reserved;
this.dataBlocks = dataBlocks;
this.checkValue = checkValue;
}
public List<PowerUnitState> getPowerUnitStates() {
return powerUnitStates;
}
public void setPowerUnitStates(List<PowerUnitState> powerUnitStates) {
this.powerUnitStates = powerUnitStates;
}
public PowerErrorData getPowerErrorData() {
return powerErrorData;
}
public void setPowerErrorData(PowerErrorData powerErrorData) {
this.powerErrorData = powerErrorData;
}
public PowerCommandExecuteState getExecuteState() {
return executeState;
}
public void setExecuteState(PowerCommandExecuteState executeState) {
this.executeState = executeState;
}
}

View File

@@ -0,0 +1,29 @@
package com.zhjt.mogo.adas.data.bean.power;
import com.zhjt.mogo.adas.common.power.PowerError;
import com.zhjt.mogo.adas.common.power.PowerFrameType;
/**
* 服务端输出的异常信息 对应帧类型{@link PowerFrameType#ERROR_RESPONSE}
*/
public class PowerErrorData {
/**
* 客户端请求类型
*/
public final PowerFrameType frameType;
/**
* 异常信息
*/
public final PowerError error;
public PowerErrorData(PowerFrameType frameType, PowerError error) {
this.frameType = frameType;
this.error = error;
}
@Override
public String toString() {
return "异常响应,帧类型:" + frameType + " 错误代码:" + error;
}
}

View File

@@ -0,0 +1,171 @@
package com.zhjt.mogo.adas.data.bean.power;
import com.zhjt.mogo.adas.common.power.PowerUnitChannel;
import java.util.Objects;
/**
* 个单元电源状态
*/
public class PowerUnitState {
/**
* 单元索引
*/
private final PowerUnitChannel channel;
/**
* 单元状态
* 索引1~46表示通电状态 0关闭1打开2底边打开
* 索引51~66表示连接状态 0未连接1已连接
*/
private int powerState;
/**
* 故障状态
* 索引1~46表示故障状态 0无故障1对地短路2过流3故障
* 索引51~66表示故障状态 0无故障8过温4过流2过压1欠压可能出现多故障
* <p>
* 整体判断是否有无故障使用{@link PowerUnitState#isNoneFault()}}
* <p>
* 索引为51~66时调用 以下方法判断存在哪些故障
* {@link PowerUnitState#isTS()}}
* {@link PowerUnitState#isOC()}}
* {@link PowerUnitState#isOV()}}
* {@link PowerUnitState#isUV()}}
*/
private int faultState;
/**
* 索引1~46电流保护状态 null表示没有此参数
* ture电流保护false为保护
*/
private Boolean currentProtectionState;
/**
* 索引1~46电流值 null表示没有此参数
* 单位A
*/
private Float currentValue;
public PowerUnitState(PowerUnitChannel channel) {
this.channel = channel;
}
public PowerUnitChannel getChannel() {
return channel;
}
public int getPowerState() {
return powerState;
}
public void setPowerState(int powerState) {
this.powerState = powerState;
}
public int getFaultState() {
return faultState;
}
public void setFaultState(int faultState) {
this.faultState = faultState;
}
public Boolean getCurrentProtectionState() {
return currentProtectionState;
}
public void setCurrentProtectionState(Boolean currentProtectionState) {
this.currentProtectionState = currentProtectionState;
}
public Float getCurrentValue() {
return currentValue;
}
public void setCurrentValue(Float currentValue) {
this.currentValue = currentValue;
}
/**
* 是否打开
* 索引1~46表示通电状态 false:关闭ture打开或底边打开
* 索引51~66表示连接状态 false未连接ture已连接
*
* @return 状态
*/
public boolean isPowerOpen() {
return powerState != 0;
}
/**
* 是否无故障
* 索引1~46表示通电状态 true无故障false对地短路或过流或故障
* 索引51~66表示连接状态 true无故障false过温或过流或过压或欠压
*
* @return 有无故障
*/
public boolean isNoneFault() {
return faultState == 0;
}
/**
* 索引51~66是否过温故障
*
* @return 是否过温故障
*/
public boolean isTS() {
return (faultState & 8) == 8;
}
/**
* 索引51~66是否过流故障
*
* @return 是否过流故障
*/
public boolean isOC() {
return (faultState & 4) == 4;
}
/**
* 索引51~66是否过压故障
*
* @return 是否过压故障
*/
public boolean isOV() {
return (faultState & 2) == 2;
}
/**
* 索引51~66是否欠压故障
*
* @return 是否欠压故障
*/
public boolean isUV() {
return (faultState & 1) == 1;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PowerUnitState that = (PowerUnitState) o;
return channel == that.channel;
}
@Override
public int hashCode() {
return Objects.hashCode(channel);
}
@Override
public String toString() {
return "PowerUnitState{" +
"channel=" + channel +
", powerState=" + powerState +
", faultState=" + faultState +
", currentProtectionState=" + currentProtectionState +
", currentValue=" + currentValue +
'}';
}
}

View File

@@ -18,6 +18,13 @@ public class ByteUtil {
return bytes;
}
public static byte[] set16bitUnsignedValueLittleEndian(int num) {
byte[] bytes = new byte[2];
bytes[1] = (byte) (num >> 8);
bytes[0] = (byte) num;
return bytes;
}
public static byte[] set32bitUnsignedValue(long num) {
byte[] bytes = new byte[4];
bytes[0] = (byte) (num >> 24);
@@ -27,6 +34,15 @@ public class ByteUtil {
return bytes;
}
public static byte[] set32bitUnsignedValueValueLittleEndian(long num) {
byte[] bytes = new byte[4];
bytes[0] = (byte) num;
bytes[1] = (byte) (num >> 8);
bytes[2] = (byte) (num >> 16);
bytes[3] = (byte) (num >> 24);
return bytes;
}
public static byte[] set64bitUnsignedValue(long num) {
byte[] bytes = new byte[8];
bytes[0] = (byte) (num >> 56);
@@ -81,6 +97,25 @@ public class ByteUtil {
return value;
}
/**
* 无符号
* 合并 2 byte
* 使用后将 Index中的index移动到下一个数据的开始位
*
* @param data
* @return
*/
public static int get16bitUnsignedValueLittleEndian(byte[] data) {
int value = 0;
if (data.length > 1) {
value = data[1] & 0xFF;
value = value << 8;
value = value | (data[0] & 0xFF);
}
return value;
}
/**
* 无符号
* 合并 4 byte
@@ -106,6 +141,30 @@ public class ByteUtil {
return value;
}
/**
* 无符号
* 合并 4 byte
* 使用后将 Index中的index移动到下一个数据的开始位
* *
*
* @param data
* @return
*/
public static int get32bitUnsignedValueLittleEndian(byte[] data) {
int value = 0;
if (data.length > 3) {
value = data[3] & 0xFF;
value = value << 8;
value = value | (data[2] & 0xFF);
value = value << 8;
value = value | (data[1] & 0xFF);
value = value << 8;
value = value | (data[0] & 0xFF);
}
return value;
}
/**
* 无符号
* 合并 8 byte
@@ -374,4 +433,11 @@ public class ByteUtil {
(byte) ((b >> 6) & 0x1) +
(byte) ((b >> 7) & 0x1);
}
//b为传入的字节i为第几位范围0-7如要获取bit0则i=0
public static int getBit(byte b, int i) {
return (b >> i) & 0x1;
}
}