From dd001348c6c16ebbae6fd9fb0b2c7c581da84be8 Mon Sep 17 00:00:00 2001 From: tiger_zhou Date: Mon, 22 Jan 2024 16:35:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=B7=E8=BE=BE=E4=B8=8EVOBC=E5=8D=8F?= =?UTF-8?q?=E8=AE=AE=E8=A7=A3=E7=A0=81,=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- third_party/message/radar.go | 94 +++++++++++++++++------------------- 1 file changed, 44 insertions(+), 50 deletions(-) diff --git a/third_party/message/radar.go b/third_party/message/radar.go index 89da2b7..3add9a6 100644 --- a/third_party/message/radar.go +++ b/third_party/message/radar.go @@ -12,6 +12,7 @@ const ( radar_head2 byte = 0xFC ) +// 雷达与VOBC接口-雷达通讯协议 type Radar struct { AutoInc byte //自增计数器,每发送一次自增1.范围0-256 RealSpeed *RadarData //实际速度 @@ -23,11 +24,15 @@ type Radar struct { Tail byte } type RadarData struct { - sourceData byte + SourceData byte valRange byte } type RadarState struct { - State byte + SourceState byte + Model string + SyntheticalState string + DirState string + Dir string } func (r *Radar) Decode(data []byte) error { @@ -58,56 +63,45 @@ func (r *Radar) Decode(data []byte) error { if !r.checkTail() { return fmt.Errorf("数据解析完成,但协议效验不通过") } + state.parseState() return nil } 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 + // 10:DRS05_Single-Mode 40度,50度的天线或通道故障 + // 01:DRS05_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 -// 10:DRS05_Single-Mode 40度,50度的天线或通道故障 -// 01:DRS05_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 { bits := make([]byte, 8) for i := 0; i < 8; i++ { - bit := s.State >> uint(i) & 1 + bit := s.SourceState >> uint(i) & 1 bits[i] = bit } return bits @@ -121,7 +115,7 @@ func bitStateStr(data []byte) string { return build.String() } 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) } func readHeader(buf *bytes.Buffer) (byte, byte, error) { @@ -130,10 +124,10 @@ func readHeader(buf *bytes.Buffer) (byte, byte, error) { }*/ d1, _ := buf.ReadByte() d2, _ := buf.ReadByte() - if !(d1 == radar_head1 && d2 == radar_head2) { - return 0, 0, fmt.Errorf("雷达协议解析头部未找到对应的头部帧") + if d1 == radar_head1 && d2 == radar_head2 { + return d1, d2, nil } - return d1, d2, nil + return 0, 0, fmt.Errorf("雷达协议解析头部未找到对应的头部帧") } func readByteData(buf *bytes.Buffer) byte { @@ -149,7 +143,7 @@ func readSpeedOrCounter(buf *bytes.Buffer) *RadarData { }*/ ss, _ := buf.ReadByte() limit, _ := buf.ReadByte() - return &RadarData{sourceData: ss, valRange: limit} + return &RadarData{SourceData: ss, valRange: limit} } func readRadarInnerData(buf *bytes.Buffer) (byte, byte) { @@ -165,7 +159,7 @@ func readRadarState(buf *bytes.Buffer) *RadarState { return nil, fmt.Errorf("") }*/ state, _ := buf.ReadByte() - return &RadarState{State: state} + return &RadarState{SourceState: state} } func driftCounter(buf *bytes.Buffer) (uint16, error) {