handler_normalnode.cpp
Go to the documentation of this file.
1 /*
2  * Slamtec LIDAR SDK
3  *
4  * Copyright (c) 2014 - 2023 Shanghai Slamtec Co., Ltd.
5  * http://www.slamtec.com
6  *
7  */
8 
9  /*
10  * Sample Data Unpacker System
11  * Normal Sample Node Handler
12  */
13 
14  /*
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions are met:
17  *
18  * 1. Redistributions of source code must retain the above copyright notice,
19  * this list of conditions and the following disclaimer.
20  *
21  * 2. Redistributions in binary form must reproduce the above copyright notice,
22  * this list of conditions and the following disclaimer in the documentation
23  * and/or other materials provided with the distribution.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
29  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
32  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
33  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
34  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
35  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  */
38 
39 #include "../dataunnpacker_commondef.h"
40 #include "../dataunpacker.h"
41 #include "../dataunnpacker_internal.h"
42 
43 
44 #include "handler_normalnode.h"
45 
47 
48 namespace unpacker{
49 
50 
51 static _u64 _getSampleDelayOffsetInLegacyMode(const SlamtecLidarTimingDesc& timing)
52 {
53  // guess channel baudrate by LIDAR model ....
54  const _u64 channelBaudRate = timing.native_baudrate? timing.native_baudrate:115200;
55 
56  _u64 tranmissionDelay = 1000000ULL * sizeof(rplidar_response_measurement_node_t) * 10 / channelBaudRate;
57 
58  if (timing.native_interface_type == LIDARInterfaceType::LIDAR_INTERFACE_ETHERNET)
59  {
60  tranmissionDelay = 100; //dummy value
61  }
62 
63  // center of the sample duration
64  const _u64 sampleDelay = (timing.sample_duration_uS >> 1);
65  const _u64 sampleFilterDelay = timing.sample_duration_uS;
66 
67  return sampleFilterDelay + sampleDelay + tranmissionDelay + timing.linkage_delay_uS;
68 }
69 
70 UnpackerHandler_NormalNode::UnpackerHandler_NormalNode()
71  : _cached_scan_node_buf_pos(0)
72 {
74  memset(&_cachedTimingDesc, 0, sizeof(_cachedTimingDesc));
75 ;}
76 
78 {
79 
80 }
81 
83 {
85 }
86 
88 {
89  for (size_t pos = 0; pos < cnt; ++pos) {
90  _u8 current_data = data[pos];
91  switch (_cached_scan_node_buf_pos) {
92  case 0: // expect the sync bit and its reverse in this byte
93  {
94  _u8 tmp = (current_data >> 1);
95  if ((tmp ^ current_data) & 0x1) {
96  // pass
97  }
98  else {
99  continue;
100  }
101 
102  }
103  break;
104  case 1: // expect the highest bit to be 1
105  {
106  if (current_data & RPLIDAR_RESP_MEASUREMENT_CHECKBIT) {
107  // pass
108  }
109  else {
111  continue;
112  }
113  }
114  break;
115  case sizeof(rplidar_response_measurement_node_t) - 1: // new data ready
116  {
119 
121 #ifdef _CPU_ENDIAN_BIG
122  node->angle_q6_checkbit = le16_to_cpu(node->angle_q6_checkbit);
123  node->distance_q2 = le16_to_cpu(node->distance_q2);
124 #endif
125  //cast node to rplidar_response_measurement_node_hq_t
127  hqNode.angle_z_q14 = (((node->angle_q6_checkbit) >> RPLIDAR_RESP_MEASUREMENT_ANGLE_SHIFT) << 8) / 90; //transfer to q14 Z-angle
128  hqNode.dist_mm_q2 = node->distance_q2;
129  hqNode.flag = (node->sync_quality & RPLIDAR_RESP_MEASUREMENT_SYNCBIT); // trasfer syncbit to HQ flag field
130  hqNode.quality = (node->sync_quality >> RPLIDAR_RESP_MEASUREMENT_QUALITY_SHIFT) << RPLIDAR_RESP_MEASUREMENT_QUALITY_SHIFT; //remove the last two bits and then make quality from 0-63 to 0-255
131 
132 
134  continue;
135 
136  }
137  break;
138  }
140  }
141 }
142 
143 
145 {
147  assert(size == sizeof(_cachedTimingDesc));
148  _cachedTimingDesc = *reinterpret_cast<const SlamtecLidarTimingDesc*>(data);
149  }
150 }
151 
153 {
155 }
156 }
157 
158 
LIDARSampleDataUnpackerInner
Definition: dataunnpacker_internal.h:44
sl_lidar_response_measurement_node_hq_t
Definition: sl_lidar_cmd.h:272
BEGIN_DATAUNPACKER_NS
#define BEGIN_DATAUNPACKER_NS()
Definition: dataupacker_namespace.h:4
type
sl_u32 type
Definition: sl_lidar_cmd.h:2
LIDARSampleDataUnpackerInner::publishHQNode
virtual void publishHQNode(_u64 timestamp_uS, const rplidar_response_measurement_node_hq_t *node)=0
_u8
uint8_t _u8
Definition: rptypes.h:63
LIDARSampleDataUnpackerInner::getCurrentTimestamp_uS
virtual _u64 getCurrentTimestamp_uS()=0
RPLIDAR_RESP_MEASUREMENT_ANGLE_SHIFT
#define RPLIDAR_RESP_MEASUREMENT_ANGLE_SHIFT
Definition: rplidar_cmd.h:133
RPLIDAR_ANS_TYPE_MEASUREMENT
#define RPLIDAR_ANS_TYPE_MEASUREMENT
Definition: rplidar_cmd.h:104
unpacker::UnpackerHandler_NormalNode::reset
virtual void reset()
Definition: handler_normalnode.cpp:152
rplidar_response_measurement_node_t
sl_lidar_response_measurement_node_t rplidar_response_measurement_node_t
Definition: rplidar_cmd.h:136
size
sl_u8 size
Definition: sl_lidar_protocol.h:4
sl_lidar_response_measurement_node_hq_t::quality
sl_u8 quality
Definition: sl_lidar_cmd.h:276
LIDARSampleDataUnpacker::UNPACKER_CONTEXT_TYPE_LIDAR_TIMING
@ UNPACKER_CONTEXT_TYPE_LIDAR_TIMING
Definition: dataunpacker.h:69
sl::LIDAR_INTERFACE_ETHERNET
@ LIDAR_INTERFACE_ETHERNET
Definition: sl_lidar_driver.h:148
sl_lidar_response_measurement_node_hq_t::dist_mm_q2
sl_u32 dist_mm_q2
Definition: sl_lidar_cmd.h:275
unpacker::UnpackerHandler_NormalNode::_cached_scan_node_buf_pos
int _cached_scan_node_buf_pos
Definition: handler_normalnode.h:56
handler_normalnode.h
LIDARSampleDataUnpacker::UnpackerContextType
UnpackerContextType
Definition: dataunpacker.h:67
sl_lidar_response_measurement_node_hq_t::angle_z_q14
sl_u16 angle_z_q14
Definition: sl_lidar_cmd.h:274
unpacker::_getSampleDelayOffsetInLegacyMode
static _u64 _getSampleDelayOffsetInLegacyMode(const SlamtecLidarTimingDesc &timing)
Definition: handler_normalnode.cpp:51
RPLIDAR_RESP_MEASUREMENT_QUALITY_SHIFT
#define RPLIDAR_RESP_MEASUREMENT_QUALITY_SHIFT
Definition: rplidar_cmd.h:130
RPLIDAR_RESP_MEASUREMENT_CHECKBIT
#define RPLIDAR_RESP_MEASUREMENT_CHECKBIT
Definition: rplidar_cmd.h:132
unpacker
Definition: handler_capsules.cpp:49
unpacker::UnpackerHandler_NormalNode::onUnpackerContextSet
virtual void onUnpackerContextSet(LIDARSampleDataUnpacker::UnpackerContextType type, const void *data, size_t size)
Definition: handler_normalnode.cpp:144
_u64
uint64_t _u64
Definition: rptypes.h:72
unpacker::UnpackerHandler_NormalNode::_cached_scan_node_buf
std::vector< _u8 > _cached_scan_node_buf
Definition: handler_normalnode.h:55
unpacker::UnpackerHandler_NormalNode::getSampleAnswerType
virtual _u8 getSampleAnswerType() const
Definition: handler_normalnode.cpp:82
sl_lidar_response_measurement_node_hq_t::flag
sl_u8 flag
Definition: sl_lidar_cmd.h:277
RPLIDAR_RESP_MEASUREMENT_SYNCBIT
#define RPLIDAR_RESP_MEASUREMENT_SYNCBIT
Definition: rplidar_cmd.h:129
data
sl_u8 data[0]
Definition: sl_lidar_protocol.h:5
END_DATAUNPACKER_NS
#define END_DATAUNPACKER_NS()
Definition: dataupacker_namespace.h:5
unpacker::UnpackerHandler_NormalNode::_cachedTimingDesc
SlamtecLidarTimingDesc _cachedTimingDesc
Definition: handler_normalnode.h:58
unpacker::UnpackerHandler_NormalNode::~UnpackerHandler_NormalNode
virtual ~UnpackerHandler_NormalNode()
Definition: handler_normalnode.cpp:77
unpacker::UnpackerHandler_NormalNode::onData
virtual void onData(LIDARSampleDataUnpackerInner *engine, const _u8 *data, size_t size)
Definition: handler_normalnode.cpp:87
le16_to_cpu
#define le16_to_cpu(x)
Definition: byteorder.h:46


rplidar_ros
Author(s):
autogenerated on Fri Aug 2 2024 08:42:14