雷达与VOBC协议解码,调整

This commit is contained in:
tiger_zhou 2024-01-22 16:35:50 +08:00
parent 5e76894404
commit dd001348c6

View File

@ -12,6 +12,7 @@ const (
radar_head2 byte = 0xFC radar_head2 byte = 0xFC
) )
// 雷达与VOBC接口-雷达通讯协议
type Radar struct { type Radar struct {
AutoInc byte //自增计数器每发送一次自增1.范围0-256 AutoInc byte //自增计数器每发送一次自增1.范围0-256
RealSpeed *RadarData //实际速度 RealSpeed *RadarData //实际速度
@ -23,11 +24,15 @@ type Radar struct {
Tail byte Tail byte
} }
type RadarData struct { type RadarData struct {
sourceData byte SourceData byte
valRange byte valRange byte
} }
type RadarState struct { type RadarState struct {
State byte SourceState byte
Model string
SyntheticalState string
DirState string
Dir string
} }
func (r *Radar) Decode(data []byte) error { func (r *Radar) Decode(data []byte) error {
@ -58,56 +63,45 @@ func (r *Radar) Decode(data []byte) error {
if !r.checkTail() { if !r.checkTail() {
return fmt.Errorf("数据解析完成,但协议效验不通过") return fmt.Errorf("数据解析完成,但协议效验不通过")
} }
state.parseState()
return nil return nil
} }
func (rd *RadarData) getSumVal() byte { func (rd *RadarData) getSumVal() byte {
return rd.sourceData + rd.valRange return rd.SourceData + rd.valRange
}
func (s *RadarState) parseState() {
//第6位 == SW_Mode0, 第7位 == SW_Mode1
// 11:两个天线和双通道都OK
// 10DRS05_Single-Mode 40度,50度的天线或通道故障
// 01DRS05_Single-Mode 50度,40度的天线或通道故障
// 00错误模式 双侧天线或通道都故障
// 模式的工作差别工作在11.模式时效果最好。单模式10或01时可信度下降。
arr := s.getBitsStateArr()
s.Model = bitStateStr(arr[6:])
// 第3位=计算状态位,第4位=信号质量标志位,第5位=Black5out标志位
// 110计算状态高质量
// 地面信号反射良好,高精度的信号计算
// 100 计算状态,低质量
// 地面信号反射一般,信号计算可能会有缺陷
// 001 处于Blackout 状态
// 车辆行驶时无地面反射信号,无法进行信号计算
// 000 信号搜寻状态
// 在整个频率范围内搜寻多普勒信号,此时的速度和位移信息无效,当频率搜寻正确后,会转为计算模式。
s.SyntheticalState = bitStateStr(arr[3:6])
// 第1位 =方向状态
// 1行驶方向有效
// 0行驶方向无效
s.DirState = bitStateStr(arr[1:2])
// 第0位 =行驶方向
// 1前向
// 0反向
s.Dir = bitStateStr(arr[0:1])
} }
// GetModel 第6位 == SW_Mode0,第7位 == SW_Mode1
// 11:两个天线和双通道都OK
// 10DRS05_Single-Mode 40度,50度的天线或通道故障
// 01DRS05_Single-Mode 50度,40度的天线或通道故障
// 00错误模式 双侧天线或通道都故障
// 模式的工作差别工作在11.模式时效果最好。单模式10或01时可信度下降。
func (s *RadarState) GetModel() string {
arr := s.getBitsStateArr()
return bitStateStr(arr[6:])
}
// GetSyntheticalState 第3位=计算状态位,第4位=信号质量标志位,第5位=Black5out标志位
// 110计算状态高质量
// 地面信号反射良好,高精度的信号计算
// 100 计算状态,低质量
// 地面信号反射一般,信号计算可能会有缺陷
// 001 处于Blackout 状态
// 车辆行驶时无地面反射信号,无法进行信号计算
// 000 信号搜寻状态
// 在整个频率范围内搜寻多普勒信号,此时的速度和位移信息无效,当频率搜寻正确后,会转为计算模式。
func (s *RadarState) GetSyntheticalState() string {
arr := s.getBitsStateArr()
return bitStateStr(arr[3:6])
}
// GetDirState 第1位 =方向状态
// 1行驶方向有效
// 0行驶方向无效
func (s *RadarState) GetDirState() string {
arr := s.getBitsStateArr()
return bitStateStr(arr[1:2])
}
// GetDir 第0位 =行驶方向
// 1前向
// 0反向
func (s *RadarState) GetDir() string {
arr := s.getBitsStateArr()
return bitStateStr(arr[0:1])
}
func (s *RadarState) getBitsStateArr() []byte { func (s *RadarState) getBitsStateArr() []byte {
bits := make([]byte, 8) bits := make([]byte, 8)
for i := 0; i < 8; i++ { for i := 0; i < 8; i++ {
bit := s.State >> uint(i) & 1 bit := s.SourceState >> uint(i) & 1
bits[i] = bit bits[i] = bit
} }
return bits return bits
@ -121,7 +115,7 @@ func bitStateStr(data []byte) string {
return build.String() return build.String()
} }
func (r *Radar) checkTail() bool { func (r *Radar) checkTail() bool {
var sum = int(radar_head1) + int(radar_head2) + int(r.AutoInc+r.RealSpeed.getSumVal()+r.DriftCounterS1.getSumVal()+r.DriftCounterS2.getSumVal()+r.InnerCheck1+r.InnerCheck2+r.State.State) var sum = int(radar_head1) + int(radar_head2) + int(r.AutoInc+r.RealSpeed.getSumVal()+r.DriftCounterS1.getSumVal()+r.DriftCounterS2.getSumVal()+r.InnerCheck1+r.InnerCheck2+r.State.SourceState)
return r.Tail == byte(^sum+1) return r.Tail == byte(^sum+1)
} }
func readHeader(buf *bytes.Buffer) (byte, byte, error) { func readHeader(buf *bytes.Buffer) (byte, byte, error) {
@ -130,10 +124,10 @@ func readHeader(buf *bytes.Buffer) (byte, byte, error) {
}*/ }*/
d1, _ := buf.ReadByte() d1, _ := buf.ReadByte()
d2, _ := buf.ReadByte() d2, _ := buf.ReadByte()
if !(d1 == radar_head1 && d2 == radar_head2) { if d1 == radar_head1 && d2 == radar_head2 {
return 0, 0, fmt.Errorf("雷达协议解析头部未找到对应的头部帧") return d1, d2, nil
} }
return d1, d2, nil return 0, 0, fmt.Errorf("雷达协议解析头部未找到对应的头部帧")
} }
func readByteData(buf *bytes.Buffer) byte { func readByteData(buf *bytes.Buffer) byte {
@ -149,7 +143,7 @@ func readSpeedOrCounter(buf *bytes.Buffer) *RadarData {
}*/ }*/
ss, _ := buf.ReadByte() ss, _ := buf.ReadByte()
limit, _ := buf.ReadByte() limit, _ := buf.ReadByte()
return &RadarData{sourceData: ss, valRange: limit} return &RadarData{SourceData: ss, valRange: limit}
} }
func readRadarInnerData(buf *bytes.Buffer) (byte, byte) { func readRadarInnerData(buf *bytes.Buffer) (byte, byte) {
@ -165,7 +159,7 @@ func readRadarState(buf *bytes.Buffer) *RadarState {
return nil, fmt.Errorf("") return nil, fmt.Errorf("")
}*/ }*/
state, _ := buf.ReadByte() state, _ := buf.ReadByte()
return &RadarState{State: state} return &RadarState{SourceState: state}
} }
func driftCounter(buf *bytes.Buffer) (uint16, error) { func driftCounter(buf *bytes.Buffer) (uint16, error) {