51 #if defined(__cplusplus) && __cplusplus >= 201103L 52 #ifndef _GXX_NULLPTR_T 53 #define _GXX_NULLPTR_T 54 typedef decltype(
nullptr) nullptr_t;
61 fprintf(stderr,
"*WARN* YOU ARE USING DEPRECATED API: %s, PLEASE MOVE TO %s\n", fn, replacement);
81 static const sl_u32 VBS_SCALED_BASE[] = {
89 static const sl_u32 VBS_SCALED_LVL[] = {
97 static const sl_u32 VBS_TARGET_BASE[] = {
105 for (
size_t i = 0; i <
_countof(VBS_SCALED_BASE); ++i) {
106 int remain = ((int)scaled - (
int)VBS_SCALED_BASE[i]);
108 scaleLevel = VBS_SCALED_LVL[i];
109 return VBS_TARGET_BASE[i] + (remain << scaleLevel);
115 static inline float getAngle(
const sl_lidar_response_measurement_node_t& node)
120 static inline void setAngle(sl_lidar_response_measurement_node_t& node,
float v)
136 static inline sl_u16
getDistanceQ2(
const sl_lidar_response_measurement_node_t& node)
138 return node.distance_q2;
146 template <
class TNode>
152 template <
class TNode >
155 float inc_origin_angle = 360.f / count;
159 for (i = 0; i < count; i++) {
166 float expect_angle =
getAngle(nodebuffer[i + 1]) - inc_origin_angle;
167 if (expect_angle < 0.0
f) expect_angle = 0.0f;
168 setAngle(nodebuffer[i], expect_angle);
178 for (i = count - 1; i >= 0; i--) {
183 while (i != (count - 1)) {
185 float expect_angle =
getAngle(nodebuffer[i - 1]) + inc_origin_angle;
186 if (expect_angle > 360.0
f) expect_angle -= 360.0f;
187 setAngle(nodebuffer[i], expect_angle);
194 float frontAngle =
getAngle(nodebuffer[0]);
195 for (i = 1; i < count; i++) {
197 float expect_angle = frontAngle + i * inc_origin_angle;
198 if (expect_angle > 360.0
f) expect_angle -= 360.0f;
199 setAngle(nodebuffer[i], expect_angle);
204 std::sort(nodebuffer, nodebuffer + count, &angleLessThan<TNode>);
289 bool confProtocolSupported =
false;
293 if (confProtocolSupported) {
297 if (!ans)
return ans;
299 for (sl_u16 i = 0; i < modeCount; i++) {
301 memset(&scanModeInfoTmp, 0,
sizeof(scanModeInfoTmp));
302 scanModeInfoTmp.
id = i;
304 if (!ans)
return ans;
306 if (!ans)
return ans;
308 if (!ans)
return ans;
310 if (!ans)
return ans;
311 outModes.push_back(scanModeInfoTmp);
323 std::vector<sl_u8> answer;
324 bool lidarSupportConfigCmds =
false;
326 if (!ans)
return ans;
328 if (lidarSupportConfigCmds) {
330 if (!ans)
return ans;
331 if (answer.size() <
sizeof(sl_u16)) {
334 const sl_u16 *p_answer =
reinterpret_cast<const sl_u16*
>(&answer[0]);
350 bool ifSupportLidarConf =
false;
353 if (!ans)
return ans;
357 if (!ans)
return ans;
364 if (ifSupportLidarConf) {
365 if (outUsedScanMode) {
368 if (!ans)
return ans;
369 ans =
getMaxDistance(outUsedScanMode->max_distance, outUsedScanMode->id);
370 if (!ans)
return ans;
372 if (!ans)
return ans;
373 ans =
getScanModeName(outUsedScanMode->scan_mode, outUsedScanMode->id);
374 if (!ans)
return ans;
392 if (!ans)
return ans;
396 if (!ans)
return ans;
404 if (header_size <
sizeof(sl_lidar_response_measurement_node_t)) {
423 bool ifSupportLidarConf =
false;
428 if (outUsedScanMode) {
429 outUsedScanMode->id = scanMode;
430 if (ifSupportLidarConf) {
434 ans =
getMaxDistance(outUsedScanMode->max_distance, outUsedScanMode->id);
440 ans =
getScanModeName(outUsedScanMode->scan_mode, outUsedScanMode->id);
450 if (ifSupportLidarConf) {
458 return startScan(force,
false, 0, outUsedScanMode);
465 sl_lidar_payload_express_scan_t scanReq;
466 memset(&scanReq, 0,
sizeof(scanReq));
467 if (!ifSupportLidarConf){
469 scanReq.working_mode = sl_u8(scanMode);
471 scanReq.working_mode = sl_u8(scanMode);
473 scanReq.working_flags = options;
486 if (!ans)
return ans;
489 if (response_header.
type != scanAnsType) {
496 if (header_size <
sizeof(sl_lidar_response_capsule_measurement_nodes_t)) {
504 if (header_size <
sizeof(sl_lidar_response_capsule_measurement_nodes_t)) {
512 if (header_size <
sizeof(sl_lidar_response_hq_capsule_measurement_nodes_t)) {
519 if (header_size <
sizeof(sl_lidar_response_ultra_capsule_measurement_nodes_t)) {
542 if (!ans)
return ans;
568 count = size_to_copy;
587 if (!ans)
return ans;
598 sl_lidar_response_device_info_t devInfo;
600 if (!ans)
return ans;
601 sl_u8 majorId = devInfo.model >> 4;
609 sl_lidar_payload_acc_board_flag_t
flag;
612 if (!ans)
return ans;
614 sl_lidar_response_acc_board_flag_t acc_board_flag;
630 frequency = 1000000.0f / (count * sample_duration);
652 if (!ans)
return ans;
665 std::vector<sl_u8> answer;
667 if (!ans)
return ans;
669 int len = answer.size();
671 memcpy(macAddrArray, &answer[0], len);
677 return ascendScanData_<sl_lidar_response_measurement_node_hq_t>(nodebuffer, count);
682 size_t size_to_copy = 0;
693 count = size_to_copy;
702 sl_lidar_response_desired_rot_speed_t desired_speed;
704 if (!ans)
return ans;
706 speed = desired_speed.pwm_ref;
708 speed = desired_speed.rpm;
715 sl_lidar_payload_motor_pwm_t motor_pwm;
716 motor_pwm.pwm_value = speed;
718 if (!ans)
return ans;
721 sl_lidar_payload_motor_pwm_t motor_rpm;
722 motor_rpm.pwm_value = speed;
724 if (!ans)
return ans;
735 std::vector<sl_u8> answer;
738 if (!ans)
return ans;
740 const sl_u16 *min_answer =
reinterpret_cast<const sl_u16*
>(&answer[0]);
745 if (!ans)
return ans;
747 const sl_u16 *max_answer =
reinterpret_cast<const sl_u16*
>(&answer[0]);
750 sl_lidar_response_desired_rot_speed_t desired_speed;
752 if (!ans)
return ans;
771 std::vector<sl_u8> answer;
774 if (!ans)
return ans;
776 const sl_lidar_response_desired_rot_speed_t *p_answer =
reinterpret_cast<const sl_lidar_response_desired_rot_speed_t*
>(&answer[0]);
777 motorSpeed = *p_answer;
784 sl_lidar_response_device_info_t devinfo;
786 if (!ans)
return ans;
799 std::vector<sl_u8> answer;
802 if (!ans)
return ans;
804 const sl_u16 *p_answer =
reinterpret_cast<const sl_u16*
>(&answer[0]);
805 modeCount = *p_answer;
811 if (type < 0x00010000 || type >0x0001FFFF)
813 std::vector<sl_u8> requestPkt;
814 requestPkt.resize(
sizeof(sl_lidar_payload_set_scan_conf_t) + payloadSize);
815 if (!payload) payloadSize = 0;
816 sl_lidar_payload_set_scan_conf_t* query =
reinterpret_cast<sl_lidar_payload_set_scan_conf_t*
>(&requestPkt[0]);
821 memcpy(&query[1], payload, payloadSize);
840 if (header_size <
sizeof(type)) {
852 _channel->
read(reinterpret_cast<sl_u8*>(&answer), header_size);
853 return answer.result;
861 sl_lidar_payload_get_scan_conf_t query;
863 int sizeVec = reserve.size();
865 int maxLen =
sizeof(query.reserved) /
sizeof(query.reserved[0]);
866 if (sizeVec > maxLen) sizeVec = maxLen;
869 memcpy(query.reserved, &reserve[0], reserve.size());
875 if (!ans)
return ans;
888 if (header_size <
sizeof(type)) {
896 std::vector<sl_u8> dataBuf;
897 dataBuf.resize(header_size);
898 _channel->
read(reinterpret_cast<sl_u8 *>(&dataBuf[0]), header_size);
901 sl_u32 replyType = -1;
902 memcpy(&replyType, &dataBuf[0],
sizeof(type));
903 if (replyType != type) {
908 int payLoadLen = header_size -
sizeof(
type);
911 if (payLoadLen <= 0) {
915 outputBuf.resize(payLoadLen);
916 memcpy(&outputBuf[0], &dataBuf[0] +
sizeof(type), payLoadLen);
926 std::vector<sl_u8> reserve(2);
927 memcpy(&reserve[0], &scanModeID,
sizeof(scanModeID));
929 std::vector<sl_u8> answer;
932 if (!ans)
return ans;
934 if (answer.size() <
sizeof(sl_u32)){
937 const sl_u32 *
result =
reinterpret_cast<const sl_u32*
>(&answer[0]);
938 sampleDurationRes = (float)(*result >> 8);
945 std::vector<sl_u8> reserve(2);
946 memcpy(&reserve[0], &scanModeID,
sizeof(scanModeID));
948 std::vector<sl_u8> answer;
950 if (!ans)
return ans;
952 if (answer.size() <
sizeof(sl_u32)){
955 const sl_u32 *
result =
reinterpret_cast<const sl_u32*
>(&answer[0]);
956 maxDistance = (float)(*result >> 8);
963 std::vector<sl_u8> reserve(2);
964 memcpy(&reserve[0], &scanModeID,
sizeof(scanModeID));
966 std::vector<sl_u8> answer;
968 if (!ans)
return ans;
970 if (answer.size() <
sizeof(sl_u8)){
973 const sl_u8 *
result =
reinterpret_cast<const _u8*
>(&answer[0]);
982 std::vector<sl_u8> reserve(2);
983 memcpy(&reserve[0], &scanModeID,
sizeof(scanModeID));
985 std::vector<sl_u8> answer;
987 if (!ans)
return ans;
988 int len = answer.size();
990 memcpy(modeName, &answer[0], len);
1009 sl_u8 magicByteSeq[16];
1013 sl_u64 startTS =
getms();
1015 while (
getms() - startTS < 1500 )
1017 if (
_channel->
write(magicByteSeq,
sizeof(magicByteSeq)) < 0)
1022 size_t dataCountGot;
1031 _u32 bpsDetected = 0;
1032 size_t dataCountGot;
1036 if (baudRateDetected) *baudRateDetected = bpsDetected;
1040 sl_lidar_payload_new_bps_confirmation_t confirmation;
1041 confirmation.flag = 0x5F5F;
1042 confirmation.required_bps = requiredBaudRate;
1043 confirmation.param = 0;
1058 sl_u8 pkt_header[10];
1061 std::vector<sl_u8> cmd_packet;
1069 cmd_packet.push_back(cmd);
1072 std::vector<sl_u8> payloadMsg;
1075 checksum ^= (payloadsize & 0xFF);
1078 sl_u8 sizebyte = payloadsize;
1079 cmd_packet.push_back(sizebyte);
1081 for (
size_t pos = 0; pos < payloadsize; ++pos) {
1082 checksum ^= ((sl_u8 *)
payload)[pos];
1083 cmd_packet.push_back(((sl_u8 *)
payload)[pos]);
1085 cmd_packet.push_back(checksum);
1089 for (
int pos = 0; pos < cmd_packet.size(); pos++) {
1090 packet[pos] = cmd_packet[pos];
1100 sl_u32 startTs =
getms();
1102 sl_u8 *headerBuffer =
reinterpret_cast<sl_u8 *
>(header);
1105 while ((waitTime =
getms() - startTs) <= timeout) {
1112 if (recvSize > remainSize) recvSize = remainSize;
1116 for (
size_t pos = 0; pos < recvSize; ++pos) {
1117 sl_u8 currentByte = recvBuffer[pos];
1132 headerBuffer[recvPos++] = currentByte;
1143 template <
typename T>
1153 if (response_header.
type != ansType) {
1158 if (header_size <
sizeof(T)) {
1164 _channel->
read(reinterpret_cast<sl_u8 *>(&payload),
sizeof(T));
1175 #define MAX_SCAN_NODES (8192) 1179 sl_u32 startTs =
getms();
1180 sl_u8 recvBuffer[
sizeof(sl_lidar_response_measurement_node_t)];
1181 sl_u8 *nodeBuffer = (sl_u8*)node;
1184 while ((waitTime =
getms() - startTs) <= timeout) {
1185 size_t remainSize =
sizeof(sl_lidar_response_measurement_node_t) - recvPos;
1191 if (recvSize > remainSize) recvSize = remainSize;
1195 for (
size_t pos = 0; pos < recvSize; ++pos) {
1196 sl_u8 currentByte = recvBuffer[pos];
1200 sl_u8 tmp = (currentByte >> 1);
1201 if ((tmp ^ currentByte) & 0x1) {
1222 nodeBuffer[recvPos++] = currentByte;
1224 if (recvPos ==
sizeof(sl_lidar_response_measurement_node_t)) {
1240 size_t recvNodeCount = 0;
1241 sl_u32 startTs =
getms();
1245 while ((waitTime =
getms() - startTs) <= timeout && recvNodeCount < count) {
1246 sl_lidar_response_measurement_node_t node;
1247 ans =
_waitNode(&node, timeout - waitTime);
1248 if (!ans)
return ans;
1250 nodebuffer[recvNodeCount++] = node;
1254 count = recvNodeCount;
1261 sl_lidar_response_measurement_node_t local_buf[256];
1264 size_t scan_count = 0;
1266 memset(local_scan, 0,
sizeof(local_scan));
1280 for (
size_t pos = 0; pos < count; ++pos) {
1284 if ((local_scan[0].
flag & SL_LIDAR_RESP_MEASUREMENT_SYNCBIT)) {
1295 convert(local_buf[pos], nodeHq);
1296 local_scan[scan_count++] = nodeHq;
1297 if (scan_count ==
_countof(local_scan)) scan_count -= 1;
1316 int currentStartAngle_q8 = ((capsule.start_angle_sync_q6 & 0x7FFF) << 2);
1319 diffAngle_q8 = (currentStartAngle_q8)-(prevStartAngle_q8);
1320 if (prevStartAngle_q8 > currentStartAngle_q8) {
1321 diffAngle_q8 += (360 << 8);
1324 int angleInc_q16 = (diffAngle_q8 << 3) / 3;
1325 int currentAngle_raw_q16 = (prevStartAngle_q8 << 8);
1335 int dist_major = (combined_x3 & 0xFFF);
1340 int dist_predict1 = (((int)(combined_x3 << 10)) >> 22);
1341 int dist_predict2 = (((int)combined_x3) >> 22);
1345 sl_u32 scalelvl1, scalelvl2;
1349 dist_major2 = (capsule.ultra_cabins[0].combined_x3 & 0xFFF);
1360 int dist_base1 = dist_major;
1361 int dist_base2 = dist_major2;
1363 if ((!dist_major) && dist_major2) {
1364 dist_base1 = dist_major2;
1365 scalelvl1 = scalelvl2;
1369 dist_q2[0] = (dist_major << 2);
1370 if ((dist_predict1 == 0xFFFFFE00) || (dist_predict1 == 0x1FF)) {
1374 dist_predict1 = (dist_predict1 << scalelvl1);
1375 dist_q2[1] = (dist_predict1 + dist_base1) << 2;
1379 if ((dist_predict2 == 0xFFFFFE00) || (dist_predict2 == 0x1FF)) {
1383 dist_predict2 = (dist_predict2 << scalelvl2);
1384 dist_q2[2] = (dist_predict2 + dist_base2) << 2;
1388 for (
int cpos = 0; cpos < 3; ++cpos) {
1389 syncBit[cpos] = (((currentAngle_raw_q16 + angleInc_q16) % (360 << 16)) < angleInc_q16) ? 1 : 0;
1391 int offsetAngleMean_q16 = (int)(7.5 * 3.1415926535 * (1 << 16) / 180.0);
1393 if (dist_q2[cpos] >= (50 * 4))
1395 const int k1 = 98361;
1396 const int k2 = int(k1 / dist_q2[cpos]);
1398 offsetAngleMean_q16 = (int)(8 * 3.1415926535 * (1 << 16) / 180) - (k2 << 6) - (k2 * k2 * k2) / 98304;
1401 angle_q6[cpos] = ((currentAngle_raw_q16 - int(offsetAngleMean_q16 * 180 / 3.14159265)) >> 10);
1402 currentAngle_raw_q16 += angleInc_q16;
1404 if (angle_q6[cpos] < 0) angle_q6[cpos] += (360 << 6);
1405 if (angle_q6[cpos] >= (360 << 6)) angle_q6[cpos] -= (360 << 6);
1409 node.
flag = (syncBit[cpos] | ((!syncBit[cpos]) << 1));
1411 node.
angle_z_q14 = sl_u16((angle_q6[cpos] << 8) / 90);
1414 nodebuffer[nodeCount++] = node;
1427 sl_u32 startTs =
getms();
1428 sl_u8 recvBuffer[
sizeof(sl_lidar_response_capsule_measurement_nodes_t)];
1429 sl_u8 *nodeBuffer = (sl_u8*)&node;
1431 while ((waitTime =
getms() - startTs) <= timeout) {
1432 size_t remainSize =
sizeof(sl_lidar_response_capsule_measurement_nodes_t) - recvPos;
1437 if (recvSize > remainSize) recvSize = remainSize;
1440 for (
size_t pos = 0; pos < recvSize; ++pos) {
1441 sl_u8 currentByte = recvBuffer[pos];
1446 sl_u8 tmp = (currentByte >> 4);
1459 sl_u8 tmp = (currentByte >> 4);
1471 nodeBuffer[recvPos++] = currentByte;
1472 if (recvPos ==
sizeof(sl_lidar_response_capsule_measurement_nodes_t)) {
1475 sl_u8 recvChecksum = ((node.s_checksum_1 & 0xF) | (node.s_checksum_2 << 4));
1477 cpos <
sizeof(sl_lidar_response_capsule_measurement_nodes_t); ++cpos)
1479 checksum ^= nodeBuffer[cpos];
1481 if (recvChecksum == checksum) {
1504 int currentStartAngle_q8 = ((capsule.start_angle_sync_q6 & 0x7FFF) << 2);
1507 diffAngle_q8 = (currentStartAngle_q8)-(prevStartAngle_q8);
1508 if (prevStartAngle_q8 > currentStartAngle_q8) {
1509 diffAngle_q8 += (360 << 8);
1512 int angleInc_q16 = (diffAngle_q8 << 3);
1513 int currentAngle_raw_q16 = (prevStartAngle_q8 << 8);
1525 angle_q6[0] = ((currentAngle_raw_q16 - (angle_offset1_q3 << 13)) >> 10);
1526 syncBit[0] = (((currentAngle_raw_q16 + angleInc_q16) % (360 << 16)) < angleInc_q16) ? 1 : 0;
1527 currentAngle_raw_q16 += angleInc_q16;
1530 angle_q6[1] = ((currentAngle_raw_q16 - (angle_offset2_q3 << 13)) >> 10);
1531 syncBit[1] = (((currentAngle_raw_q16 + angleInc_q16) % (360 << 16)) < angleInc_q16) ? 1 : 0;
1532 currentAngle_raw_q16 += angleInc_q16;
1534 for (
int cpos = 0; cpos < 2; ++cpos) {
1536 if (angle_q6[cpos] < 0) angle_q6[cpos] += (360 << 6);
1537 if (angle_q6[cpos] >= (360 << 6)) angle_q6[cpos] -= (360 << 6);
1541 node.
angle_z_q14 = sl_u16((angle_q6[cpos] << 8) / 90);
1542 node.
flag = (syncBit[cpos] | ((!syncBit[cpos]) << 1));
1546 nodebuffer[nodeCount++] = node;
1558 static int lastNodeSyncBit = 0;
1559 const sl_lidar_response_dense_capsule_measurement_nodes_t *dense_capsule =
reinterpret_cast<const sl_lidar_response_dense_capsule_measurement_nodes_t*
>(&capsule);
1563 int currentStartAngle_q8 = ((dense_capsule->start_angle_sync_q6 & 0x7FFF) << 2);
1566 diffAngle_q8 = (currentStartAngle_q8)-(prevStartAngle_q8);
1567 if (prevStartAngle_q8 > currentStartAngle_q8) {
1568 diffAngle_q8 += (360 << 8);
1571 int angleInc_q16 = (diffAngle_q8 << 8) / 40;
1572 int currentAngle_raw_q16 = (prevStartAngle_q8 << 8);
1578 dist_q2 = dist << 2;
1579 angle_q6 = (currentAngle_raw_q16 >> 10);
1581 syncBit = (((currentAngle_raw_q16 + angleInc_q16) % (360 << 16)) < (angleInc_q16<<1)) ? 1 : 0;
1582 syncBit = (syncBit^ lastNodeSyncBit)&syncBit;
1587 currentAngle_raw_q16 += angleInc_q16;
1589 if (angle_q6 < 0) angle_q6 += (360 << 6);
1590 if (angle_q6 >= (360 << 6)) angle_q6 -= (360 << 6);
1596 node.
flag = (syncBit | ((!syncBit) << 1));
1600 nodebuffer[nodeCount++] = node;
1601 lastNodeSyncBit = syncBit;
1614 sl_lidar_response_capsule_measurement_nodes_t capsule_node;
1618 size_t scan_count = 0;
1620 memset(local_scan, 0,
sizeof(local_scan));
1646 for (
size_t pos = 0; pos < count; ++pos) {
1650 if ((local_scan[0].
flag & SL_LIDAR_RESP_MEASUREMENT_SYNCBIT)) {
1659 local_scan[scan_count++] = local_buf[pos];
1660 if (scan_count ==
_countof(local_scan)) scan_count -= 1;
1682 sl_u32 startTs =
getms();
1683 sl_u8 recvBuffer[
sizeof(sl_lidar_response_hq_capsule_measurement_nodes_t)];
1684 sl_u8 *nodeBuffer = (sl_u8*)&node;
1687 while ((waitTime =
getms() - startTs) <= timeout) {
1688 size_t remainSize =
sizeof(sl_lidar_response_hq_capsule_measurement_nodes_t) - recvPos;
1695 if (recvSize > remainSize) recvSize = remainSize;
1699 for (
size_t pos = 0; pos < recvSize; ++pos) {
1700 sl_u8 currentByte = recvBuffer[pos];
1704 sl_u8 tmp = (currentByte);
1715 case sizeof(sl_lidar_response_hq_capsule_measurement_nodes_t) - 1 - 4:
1720 case sizeof(sl_lidar_response_hq_capsule_measurement_nodes_t) - 1:
1726 nodeBuffer[recvPos++] = currentByte;
1727 if (recvPos ==
sizeof(sl_lidar_response_hq_capsule_measurement_nodes_t)) {
1728 sl_u32 crcCalc2 =
crc32::getResult(nodeBuffer,
sizeof(sl_lidar_response_hq_capsule_measurement_nodes_t) - 4);
1730 if (crcCalc2 == node.crc32) {
1751 nodebuffer[nodeCount++] = node_hq.node_hq[pos];
1761 sl_lidar_response_hq_capsule_measurement_nodes_t hq_node;
1765 size_t scan_count = 0;
1767 memset(local_scan, 0,
sizeof(local_scan));
1783 for (
size_t pos = 0; pos < count; ++pos){
1786 if ((local_scan[0].
flag & SL_LIDAR_RESP_MEASUREMENT_SYNCBIT)) {
1795 local_scan[scan_count++] = local_buf[pos];
1796 if (scan_count ==
_countof(local_scan)) scan_count -= 1;
1816 sl_u32 startTs =
getms();
1817 sl_u8 recvBuffer[
sizeof(sl_lidar_response_ultra_capsule_measurement_nodes_t)];
1818 sl_u8 *nodeBuffer = (sl_u8*)&node;
1821 while ((waitTime =
getms() - startTs) <= timeout) {
1822 size_t remainSize =
sizeof(sl_lidar_response_ultra_capsule_measurement_nodes_t) - recvPos;
1829 if (recvSize > remainSize) recvSize = remainSize;
1833 for (
size_t pos = 0; pos < recvSize; ++pos) {
1834 sl_u8 currentByte = recvBuffer[pos];
1838 sl_u8 tmp = (currentByte >> 4);
1850 sl_u8 tmp = (currentByte >> 4);
1862 nodeBuffer[recvPos++] = currentByte;
1863 if (recvPos ==
sizeof(sl_lidar_response_ultra_capsule_measurement_nodes_t)) {
1866 sl_u8 recvChecksum = ((node.s_checksum_1 & 0xF) | (node.s_checksum_2 << 4));
1869 cpos <
sizeof(sl_lidar_response_ultra_capsule_measurement_nodes_t); ++cpos)
1871 checksum ^= nodeBuffer[cpos];
1874 if (recvChecksum == checksum) {
1894 sl_lidar_response_ultra_capsule_measurement_nodes_t ultra_capsule_node;
1898 size_t scan_count = 0;
1900 memset(local_scan, 0,
sizeof(local_scan));
1919 for (
size_t pos = 0; pos < count; ++pos) {
1923 if ((local_scan[0].
flag & SL_LIDAR_RESP_MEASUREMENT_SYNCBIT)) {
1932 local_scan[scan_count++] = local_buf[pos];
1933 if (scan_count ==
_countof(local_scan)) scan_count -= 1;
#define offsetof(_structure, _field)
virtual void clearReadCache()=0
#define CLASS_THREAD(c, x)
#define SL_LIDAR_CMD_GET_DEVICE_HEALTH
#define SL_LIDAR_ANS_TYPE_GET_LIDAR_CONF
sl_result negotiateSerialBaudRate(sl_u32 requiredBaudRate, sl_u32 *baudRateDetected)
#define SL_LIDAR_CONF_SCAN_MODE_US_PER_SAMPLE
sl_result getScanModeAnsType(sl_u8 &ansType, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
#define SL_LIDAR_CMD_SCAN
sl_result connect(IChannel *channel)
#define SL_LIDAR_CMD_HQ_MOTOR_SPEED_CTRL
#define SL_LIDAR_VARBITSCALE_X16_SRC_BIT
sl_result _cacheUltraCapsuledScanData()
sl_result getLidarConf(sl_u32 type, std::vector< sl_u8 > &outputBuf, const std::vector< sl_u8 > &reserve=std::vector< sl_u8 >(), sl_u32 timeout=DEFAULT_TIMEOUT)
#define SL_LIDAR_RESP_MEASUREMENT_QUALITY_SHIFT
size_t _cached_scan_node_hq_count_for_interval_retrieve
sl_result reset(sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl_result getDeviceMacAddr(sl_u8 *macAddrArray, sl_u32 timeoutInMs)
void _capsuleToNormal(const sl_lidar_response_capsule_measurement_nodes_t &capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
sl_result getHealth(sl_lidar_response_device_health_t &health, sl_u32 timeout=DEFAULT_TIMEOUT)
static bool angleLessThan(const TNode &a, const TNode &b)
#define SL_LIDAR_CMD_SYNC_BYTE
sl_result _cacheCapsuledScanData()
#define SL_LIDAR_CMD_SET_LIDAR_CONF
sl_result getMotorInfo(LidarMotorInfo &motorInfo, sl_u32 timeoutInMs)
sl_result getTypicalScanMode(sl_u16 &outMode, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
Get typical scan mode of lidar.
#define SL_LIDAR_CMD_GET_DEVICE_INFO
rp::hal::Thread _cachethread
sl_lidar_response_measurement_node_hq_t _cached_scan_node_hq_buf[8192]
size_t _cached_scan_node_hq_count
bool _is_previous_HqdataRdy
#define SL_LIDAR_RESP_MEASUREMENT_EXP_SYNCBIT
#define SL_LIDAR_CMDFLAG_HAS_PAYLOAD
void _ultraCapsuleToNormal(const sl_lidar_response_ultra_capsule_measurement_nodes_t &capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
sl_result setMotorSpeed(sl_u16 speed=DEFAULT_MOTOR_SPEED)
#define SL_LIDAR_CMD_STOP
sl_result ascendScanData(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t count)
void _disableDataGrabbing()
sl_lidar_response_measurement_node_hq_t _cached_scan_node_hq_buf_for_interval_retrieve[8192]
sl_result _waitHqNode(sl_lidar_response_hq_capsule_measurement_nodes_t &node, sl_u32 timeout=DEFAULT_TIMEOUT)
sl_lidar_response_ultra_capsule_measurement_nodes_t _cached_previous_ultracapsuledata
sl_result checkMotorCtrlSupport(MotorCtrlSupport &support, sl_u32 timeout=DEFAULT_TIMEOUT)
bool _is_previous_capsuledataRdy
MotorCtrlSupport motorCtrlSupport
sl_result getMaxDistance(float &maxDistance, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
#define SL_LIDAR_VARBITSCALE_X2_SRC_BIT
#define SL_LIDAR_ANS_TYPE_MEASUREMENT_HQ
#define SL_LIDAR_ANS_TYPE_MEASUREMENT
#define SL_LIDAR_RESP_MEASUREMENT_EXP_SYNC_1
static void setAngle(sl_lidar_response_measurement_node_t &node, float v)
sl_result stop(sl_u32 timeout=DEFAULT_TIMEOUT)
sl_result setLidarIpConf(const sl_lidar_ip_conf_t &conf, sl_u32 timeout)
#define SL_LIDAR_RESP_ACC_BOARD_FLAG_MOTOR_CTRL_SUPPORT_MASK
virtual bool waitForData(size_t size, sl_u32 timeoutInMs=-1, size_t *actualReady=nullptr)=0
#define SL_LIDAR_CMD_EXPRESS_SCAN
#define SL_RESULT_ALREADY_DONE
int wait(unsigned long timeout=0xFFFFFFFF)
#define SL_LIDAR_RESP_MEASUREMENT_SYNCBIT
#define SL_LIDAR_RESP_MEASUREMENT_ANGLE_SHIFT
#define SL_LIDAR_ANS_TYPE_DEVINFO
static sl_result ascendScanData_(TNode *nodebuffer, size_t count)
sl_result setLidarConf(sl_u32 type, const void *payload, size_t payloadSize, sl_u32 timeout)
#define SL_LIDAR_VARBITSCALE_X8_SRC_BIT
void _HqToNormal(const sl_lidar_response_hq_capsule_measurement_nodes_t &node_hq, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
#define RPLIDAR_CONF_MAX_ROT_FREQ
Result< ILidarDriver * > createLidarDriver()
sl_result getScanModeName(char *modeName, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl_u16 _cached_sampleduration_std
#define SL_LIDAR_CONF_SCAN_COMMAND_EXPRESS
#define SL_LIDAR_ANS_HEADER_SIZE_MASK
#define DEFAULT_MOTOR_SPEED
#define SL_LIDAR_CMD_GET_ACC_BOARD_FLAG
#define SL_LIDAR_VARBITSCALE_X2_DEST_VAL
sl_result startScan(bool force, bool useTypicalScan, sl_u32 options=0, LidarScanMode *outUsedScanMode=nullptr)
#define SL_LIDAR_CONF_LIDAR_MAC_ADDR
sl_result _waitResponseHeader(sl_lidar_ans_header_t *header, sl_u32 timeout=DEFAULT_TIMEOUT)
#define SL_LIDAR_RESP_MEASUREMENT_EXP_SYNC_2
#define SL_LIDAR_ANS_TYPE_ACC_BOARD_FLAG
sl_result _cacheHqScanData()
sl_result _waitCapsuledNode(sl_lidar_response_capsule_measurement_nodes_t &node, sl_u32 timeout=DEFAULT_TIMEOUT)
void set(bool isSignal=true)
#define RESULT_OPERATION_TIMEOUT
sl_result getScanDataWithIntervalHq(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &count)
virtual int write(const void *data, size_t size)=0
#define SL_LIDAR_VARBITSCALE_X4_SRC_BIT
#define SL_LIDAR_ANS_SYNC_BYTE2
#define SL_LIDAR_VARBITSCALE_X16_DEST_VAL
sl_lidar_response_measurement_node_hq_t node_hq[96]
static void printDeprecationWarn(const char *fn, const char *replacement)
u_result join(unsigned long timeout=-1)
#define SL_LIDAR_ANS_TYPE_SET_LIDAR_CONF
#define SL_LIDAR_ANS_TYPE_DEVHEALTH
#define SL_LIDAR_CONF_SCAN_MODE_COUNT
sl_result getDesiredSpeed(sl_lidar_response_desired_rot_speed_t &motorSpeed, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
static float getAngle(const sl_lidar_response_measurement_node_t &node)
sl_result getLidarSampleDuration(float &sampleDurationRes, sl_u16 scanModeID, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
#define SL_LIDAR_CMD_SET_MOTOR_PWM
#define SL_LIDAR_CONF_SCAN_COMMAND_STD
#define SL_LIDAR_VARBITSCALE_X8_DEST_VAL
#define SL_LIDAR_ANS_TYPE_MEASUREMENT_DENSE_CAPSULED
sl_result startScanExpress(bool force, sl_u16 scanMode, sl_u32 options=0, LidarScanMode *outUsedScanMode=nullptr, sl_u32 timeout=DEFAULT_TIMEOUT)
MotorCtrlSupport _isSupportingMotorCtrl
void _dense_capsuleToNormal(const sl_lidar_response_capsule_measurement_nodes_t &capsule, sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &nodeCount)
static sl_u32 _varbitscale_decode(sl_u32 scaled, sl_u32 &scaleLevel)
Locker::LOCK_STATUS lock(unsigned long timeout=0xFFFFFFFF)
#define SL_LIDAR_CONF_SCAN_MODE_MAX_DISTANCE
sl_result getScanModeCount(sl_u16 &modeCount, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
sl_result getResult(sl_u8 *ptr, sl_u32 len)
sl_result startScanNormal(bool force, sl_u32 timeout=DEFAULT_TIMEOUT)
virtual int read(void *buffer, size_t size)=0
#define SL_LIDAR_RESP_MEASUREMENT_CHECKBIT
#define SL_LIDAR_RESP_MEASUREMENT_HQ_SYNC
#define SL_LIDAR_ANS_SYNC_BYTE1
sl_result _clearRxDataCache()
sl_result _waitResponse(T &payload, sl_u8 ansType, sl_u32 timeout=DEFAULT_TIMEOUT)
#define RPLIDAR_CMD_NEW_BAUDRATE_CONFIRM
sl_lidar_response_dense_capsule_measurement_nodes_t _cached_previous_dense_capsuledata
#define RPLIDAR_CONF_MIN_ROT_FREQ
#define SL_LIDAR_CONF_SCAN_MODE_TYPICAL
sl_u16 _cached_sampleduration_express
sl_lidar_response_capsule_measurement_nodes_t _cached_previous_capsuledata
sl_u8 _cached_capsule_flag
sl_result getAllSupportedScanModes(std::vector< LidarScanMode > &outModes, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
Get all scan modes that supported by lidar.
#define SL_RESULT_OPERATION_FAIL
sl_result getFrequency(const LidarScanMode &scanMode, const sl_lidar_response_measurement_node_hq_t *nodes, size_t count, float &frequency)
#define SL_LIDAR_CONF_DESIRED_ROT_FREQ
#define RESULT_OPERATION_FAIL
sl_result getDeviceInfo(sl_lidar_response_device_info_t &info, sl_u32 timeout=DEFAULT_TIMEOUT)
static void convert(const sl_lidar_response_measurement_node_t &from, sl_lidar_response_measurement_node_hq_t &to)
sl_result _sendCommand(sl_u16 cmd, const void *payload=NULL, size_t payloadsize=0)
#define SL_LIDAR_ANS_TYPE_MEASUREMENT_CAPSULED
#define SL_LIDAR_VARBITSCALE_X4_DEST_VAL
sl_result grabScanDataHq(sl_lidar_response_measurement_node_hq_t *nodebuffer, size_t &count, sl_u32 timeout=DEFAULT_TIMEOUT)
sl_result checkSupportConfigCommands(bool &outSupport, sl_u32 timeoutInMs=DEFAULT_TIMEOUT)
#define SL_LIDAR_CMD_RESET
#define SL_LIDAR_CONF_SCAN_MODE_ANS_TYPE
sl_result _cacheScanData()
sl_result _waitNode(sl_lidar_response_measurement_node_t *node, sl_u32 timeout=DEFAULT_TIMEOUT)
#define SL_LIDAR_CONF_SCAN_MODE_NAME
#define SL_LIDAR_CONF_LIDAR_STATIC_IP_ADDR
#define SL_RESULT_INVALID_DATA
#define SL_LIDAR_AUTOBAUD_MAGICBYTE
sl_result _waitUltraCapsuledNode(sl_lidar_response_ultra_capsule_measurement_nodes_t &node, sl_u32 timeout=DEFAULT_TIMEOUT)
static sl_u16 getDistanceQ2(const sl_lidar_response_measurement_node_t &node)
#define SL_LIDAR_CMD_FORCE_SCAN
#define SL_RESULT_OPERATION_TIMEOUT
sl_u16 start_angle_sync_q6
#define SL_LIDAR_CMD_GET_LIDAR_CONF
sl_result _waitScanData(sl_lidar_response_measurement_node_t *nodebuffer, size_t &count, sl_u32 timeout=DEFAULT_TIMEOUT)
sl_lidar_response_hq_capsule_measurement_nodes_t _cached_previous_Hqdata