João Pedro Castilho
/
Lab4
lab 4
rplidar/rplidar.h@0:0d3a25d4697e, 2021-05-27 (annotated)
- Committer:
- ccpjboss
- Date:
- Thu May 27 08:53:19 2021 +0000
- Revision:
- 0:0d3a25d4697e
tet
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ccpjboss | 0:0d3a25d4697e | 1 | /* |
ccpjboss | 0:0d3a25d4697e | 2 | * RoboPeak RPLIDAR Driver for Arduino |
ccpjboss | 0:0d3a25d4697e | 3 | * RoboPeak.com |
ccpjboss | 0:0d3a25d4697e | 4 | * |
ccpjboss | 0:0d3a25d4697e | 5 | * Copyright (c) 2014, RoboPeak |
ccpjboss | 0:0d3a25d4697e | 6 | * All rights reserved. |
ccpjboss | 0:0d3a25d4697e | 7 | * |
ccpjboss | 0:0d3a25d4697e | 8 | * Redistribution and use in source and binary forms, with or without modification, |
ccpjboss | 0:0d3a25d4697e | 9 | * are permitted provided that the following conditions are met: |
ccpjboss | 0:0d3a25d4697e | 10 | * |
ccpjboss | 0:0d3a25d4697e | 11 | * 1. Redistributions of source code must retain the above copyright notice, |
ccpjboss | 0:0d3a25d4697e | 12 | * this list of conditions and the following disclaimer. |
ccpjboss | 0:0d3a25d4697e | 13 | * |
ccpjboss | 0:0d3a25d4697e | 14 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
ccpjboss | 0:0d3a25d4697e | 15 | * this list of conditions and the following disclaimer in the documentation |
ccpjboss | 0:0d3a25d4697e | 16 | * and/or other materials provided with the distribution. |
ccpjboss | 0:0d3a25d4697e | 17 | * |
ccpjboss | 0:0d3a25d4697e | 18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY |
ccpjboss | 0:0d3a25d4697e | 19 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
ccpjboss | 0:0d3a25d4697e | 20 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
ccpjboss | 0:0d3a25d4697e | 21 | * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
ccpjboss | 0:0d3a25d4697e | 22 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT |
ccpjboss | 0:0d3a25d4697e | 23 | * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
ccpjboss | 0:0d3a25d4697e | 24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR |
ccpjboss | 0:0d3a25d4697e | 25 | * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
ccpjboss | 0:0d3a25d4697e | 26 | * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
ccpjboss | 0:0d3a25d4697e | 27 | * |
ccpjboss | 0:0d3a25d4697e | 28 | */ |
ccpjboss | 0:0d3a25d4697e | 29 | |
ccpjboss | 0:0d3a25d4697e | 30 | #pragma once |
ccpjboss | 0:0d3a25d4697e | 31 | #include "mbed.h" |
ccpjboss | 0:0d3a25d4697e | 32 | #include "inc/rptypes.h" |
ccpjboss | 0:0d3a25d4697e | 33 | #include "inc/rplidar_cmd.h" |
ccpjboss | 0:0d3a25d4697e | 34 | #include <BufferedSerial.h> |
ccpjboss | 0:0d3a25d4697e | 35 | //#include "../BufferedSerial/BufferedSerial.h" |
ccpjboss | 0:0d3a25d4697e | 36 | struct RPLidarMeasurement |
ccpjboss | 0:0d3a25d4697e | 37 | { |
ccpjboss | 0:0d3a25d4697e | 38 | float distance; |
ccpjboss | 0:0d3a25d4697e | 39 | float angle; |
ccpjboss | 0:0d3a25d4697e | 40 | uint8_t quality; |
ccpjboss | 0:0d3a25d4697e | 41 | bool startBit; |
ccpjboss | 0:0d3a25d4697e | 42 | }; |
ccpjboss | 0:0d3a25d4697e | 43 | |
ccpjboss | 0:0d3a25d4697e | 44 | class RPLidar |
ccpjboss | 0:0d3a25d4697e | 45 | { |
ccpjboss | 0:0d3a25d4697e | 46 | public: |
ccpjboss | 0:0d3a25d4697e | 47 | enum { |
ccpjboss | 0:0d3a25d4697e | 48 | RPLIDAR_SERIAL_BAUDRATE = 115200, |
ccpjboss | 0:0d3a25d4697e | 49 | RPLIDAR_DEFAULT_TIMEOUT = 500, |
ccpjboss | 0:0d3a25d4697e | 50 | }; |
ccpjboss | 0:0d3a25d4697e | 51 | |
ccpjboss | 0:0d3a25d4697e | 52 | void Thread_readSensor(void); |
ccpjboss | 0:0d3a25d4697e | 53 | int32_t pollSensorData(struct RPLidarMeasurement *_data); |
ccpjboss | 0:0d3a25d4697e | 54 | RPLidar(Serial *_pc); |
ccpjboss | 0:0d3a25d4697e | 55 | RPLidar(); |
ccpjboss | 0:0d3a25d4697e | 56 | ~RPLidar(); |
ccpjboss | 0:0d3a25d4697e | 57 | |
ccpjboss | 0:0d3a25d4697e | 58 | // open the given serial interface and try to connect to the RPLIDAR |
ccpjboss | 0:0d3a25d4697e | 59 | //bool begin(BufferedSerial &serialobj); |
ccpjboss | 0:0d3a25d4697e | 60 | void begin(BufferedSerial &serialobj); |
ccpjboss | 0:0d3a25d4697e | 61 | // close the currently opened serial interface |
ccpjboss | 0:0d3a25d4697e | 62 | void end(); |
ccpjboss | 0:0d3a25d4697e | 63 | |
ccpjboss | 0:0d3a25d4697e | 64 | // check whether the serial interface is opened |
ccpjboss | 0:0d3a25d4697e | 65 | // bool isOpen(); |
ccpjboss | 0:0d3a25d4697e | 66 | |
ccpjboss | 0:0d3a25d4697e | 67 | // ask the RPLIDAR for its health info |
ccpjboss | 0:0d3a25d4697e | 68 | u_result getHealth(rplidar_response_device_health_t & healthinfo, _u32 timeout = RPLIDAR_DEFAULT_TIMEOUT); |
ccpjboss | 0:0d3a25d4697e | 69 | |
ccpjboss | 0:0d3a25d4697e | 70 | // ask the RPLIDAR for its device info like the serial number |
ccpjboss | 0:0d3a25d4697e | 71 | u_result getDeviceInfo(rplidar_response_device_info_t & info, _u32 timeout = RPLIDAR_DEFAULT_TIMEOUT); |
ccpjboss | 0:0d3a25d4697e | 72 | |
ccpjboss | 0:0d3a25d4697e | 73 | // stop the measurement operation |
ccpjboss | 0:0d3a25d4697e | 74 | u_result stop(); |
ccpjboss | 0:0d3a25d4697e | 75 | |
ccpjboss | 0:0d3a25d4697e | 76 | // start the measurement operation |
ccpjboss | 0:0d3a25d4697e | 77 | u_result startThreadScan(); |
ccpjboss | 0:0d3a25d4697e | 78 | u_result startScan(bool force = true, _u32 timeout = RPLIDAR_DEFAULT_TIMEOUT*2); |
ccpjboss | 0:0d3a25d4697e | 79 | |
ccpjboss | 0:0d3a25d4697e | 80 | |
ccpjboss | 0:0d3a25d4697e | 81 | // wait for one sample point to arrive |
ccpjboss | 0:0d3a25d4697e | 82 | u_result waitPoint(_u32 timeout = RPLIDAR_DEFAULT_TIMEOUT); |
ccpjboss | 0:0d3a25d4697e | 83 | |
ccpjboss | 0:0d3a25d4697e | 84 | u_result _sendCommand(_u8 cmd, const void * payload, size_t payloadsize); |
ccpjboss | 0:0d3a25d4697e | 85 | // retrieve currently received sample point |
ccpjboss | 0:0d3a25d4697e | 86 | int Data[360]; |
ccpjboss | 0:0d3a25d4697e | 87 | int ang,dis; |
ccpjboss | 0:0d3a25d4697e | 88 | int angMin,angMax; |
ccpjboss | 0:0d3a25d4697e | 89 | void setAngle(int min,int max); |
ccpjboss | 0:0d3a25d4697e | 90 | void get_lidar(); |
ccpjboss | 0:0d3a25d4697e | 91 | const RPLidarMeasurement & getCurrentPoint() |
ccpjboss | 0:0d3a25d4697e | 92 | { |
ccpjboss | 0:0d3a25d4697e | 93 | return _currentMeasurement; |
ccpjboss | 0:0d3a25d4697e | 94 | } |
ccpjboss | 0:0d3a25d4697e | 95 | |
ccpjboss | 0:0d3a25d4697e | 96 | private: |
ccpjboss | 0:0d3a25d4697e | 97 | _u8 recvPos_g; |
ccpjboss | 0:0d3a25d4697e | 98 | rplidar_response_measurement_node_t node_g; |
ccpjboss | 0:0d3a25d4697e | 99 | |
ccpjboss | 0:0d3a25d4697e | 100 | //Thread *thread_p; |
ccpjboss | 0:0d3a25d4697e | 101 | Thread thread; |
ccpjboss | 0:0d3a25d4697e | 102 | //Mail<struct RPLidarMeasurement, 100> mail_box; // |
ccpjboss | 0:0d3a25d4697e | 103 | Mutex mutex_measurements; |
ccpjboss | 0:0d3a25d4697e | 104 | bool useThread; |
ccpjboss | 0:0d3a25d4697e | 105 | |
ccpjboss | 0:0d3a25d4697e | 106 | struct RPLidarMeasurement currentMeasurement_fromThread; |
ccpjboss | 0:0d3a25d4697e | 107 | bool newMeasurement; |
ccpjboss | 0:0d3a25d4697e | 108 | |
ccpjboss | 0:0d3a25d4697e | 109 | u_result pollPoint(); |
ccpjboss | 0:0d3a25d4697e | 110 | //Serial *pc; |
ccpjboss | 0:0d3a25d4697e | 111 | protected: |
ccpjboss | 0:0d3a25d4697e | 112 | // u_result _sendCommand(_u8 cmd, const void * payload, size_t payloadsize); |
ccpjboss | 0:0d3a25d4697e | 113 | u_result _waitResponseHeader(rplidar_ans_header_t * header, _u32 timeout); |
ccpjboss | 0:0d3a25d4697e | 114 | |
ccpjboss | 0:0d3a25d4697e | 115 | protected: |
ccpjboss | 0:0d3a25d4697e | 116 | BufferedSerial * _bined_serialdev; |
ccpjboss | 0:0d3a25d4697e | 117 | RPLidarMeasurement _currentMeasurement; |
ccpjboss | 0:0d3a25d4697e | 118 | }; |