ardupilot/libraries/AP_RangeFinder/AP_RangeFinder_RDS02UF.h

103 lines
3.1 KiB
C++

/*
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "AP_RangeFinder_config.h"
#if AP_RANGEFINDER_RDS02UF_ENABLED
#include "AP_RangeFinder.h"
#include "AP_RangeFinder_Backend_Serial.h"
#define RDS02_BUFFER_SIZE 50
#define RDS02UF_DIST_MAX_CM 2000
#define RDS02UF_DIST_MIN_CM 150
#define RDS02UF_DATA_LEN 10
class AP_RangeFinder_RDS02UF : public AP_RangeFinder_Backend_Serial
{
public:
static AP_RangeFinder_Backend_Serial *create(
RangeFinder::RangeFinder_State &_state,
AP_RangeFinder_Params &_params) {
return NEW_NOTHROW AP_RangeFinder_RDS02UF(_state, _params);
}
protected:
MAV_DISTANCE_SENSOR _get_mav_distance_sensor_type() const override {
return MAV_DISTANCE_SENSOR_RADAR;
}
private:
using AP_RangeFinder_Backend_Serial::AP_RangeFinder_Backend_Serial;
// find a RDS02UF message in the buffer, starting at
// initial_offset. If found, that message (or partial message) will
// be moved to the start of the buffer.
void move_header_in_buffer(uint8_t initial_offset);
// get a distance reading
bool get_reading(float &reading_m) override;
uint16_t read_timeout_ms() const override { return 500; }
// make sure readings go out-of-range when necessary
int16_t max_distance_cm()const override { return MIN(params.max_distance_cm, RDS02UF_DIST_MAX_CM); }
int16_t min_distance_cm() const override { return MAX(params.min_distance_cm, RDS02UF_DIST_MIN_CM); }
// Data Format for Benewake Rds02UF
// ===============================
// 21 bytes total per message:
// 1) 0x55
// 2) 0x55
// 3) address
// 4) error_code
// 5) FC_CODE_L (low 8bit)
// 6) FC_CODE_H (high 8bit)
// 7) LENGTH_L (low 8bit)
// 8) LENGTH_H (high 8bit)
// 9) REAL_DATA (10Byte)
// 10) CRC8
// 11) END_1 0xAA
// 12) END_2 0xAA
struct PACKED RDS02UFPacket {
uint8_t headermagic1;
uint8_t headermagic2;
uint8_t address;
uint8_t error_code;
uint8_t fc_low;
uint8_t fc_high;
uint8_t length_l;
uint8_t length_h;
uint8_t data[RDS02UF_DATA_LEN];
uint8_t checksum;
uint8_t footermagic1;
uint8_t footermagic2;
};
union RDS02UF_Union {
uint8_t parse_buffer[21];
struct RDS02UFPacket packet;
};
RDS02UF_Union u;
// number of bytes currently in the buffer
uint8_t body_length;
};
#endif // AP_RANGEFINDER_RDS02UF_ENABLED