mirror of https://github.com/ArduPilot/ardupilot
AP_RangeFinder: Add error codes rejection for TeraRanger sensors
This commit is contained in:
parent
21782835c4
commit
cfd13d4e83
|
@ -82,7 +82,7 @@ bool AP_RangeFinder_TeraRangerI2C::init(void)
|
||||||
whoami != TR_WHOAMI_VALUE) {
|
whoami != TR_WHOAMI_VALUE) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!measure()) {
|
if (!measure()) {
|
||||||
dev->get_semaphore()->give();
|
dev->get_semaphore()->give();
|
||||||
return false;
|
return false;
|
||||||
|
@ -92,7 +92,7 @@ bool AP_RangeFinder_TeraRangerI2C::init(void)
|
||||||
hal.scheduler->delay(70);
|
hal.scheduler->delay(70);
|
||||||
|
|
||||||
uint16_t _distance_cm;
|
uint16_t _distance_cm;
|
||||||
if (!collect(_distance_cm)) {
|
if (!collect_raw(_distance_cm)) {
|
||||||
dev->get_semaphore()->give();
|
dev->get_semaphore()->give();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -115,23 +115,43 @@ bool AP_RangeFinder_TeraRangerI2C::measure()
|
||||||
}
|
}
|
||||||
|
|
||||||
// collect - return last value measured by sensor
|
// collect - return last value measured by sensor
|
||||||
bool AP_RangeFinder_TeraRangerI2C::collect(uint16_t &_distance_cm)
|
bool AP_RangeFinder_TeraRangerI2C::collect_raw(uint16_t &raw_distance)
|
||||||
{
|
{
|
||||||
uint8_t d[3];
|
uint8_t d[3];
|
||||||
|
uint16_t distance = 0;
|
||||||
|
|
||||||
// take range reading and read back results
|
// Take range reading
|
||||||
if (!dev->transfer(nullptr, 0, d, sizeof(d))) {
|
if (!dev->transfer(nullptr, 0, d, sizeof(d))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for CRC
|
||||||
if (d[2] != crc_crc8(d, 2)) {
|
if (d[2] != crc_crc8(d, 2)) {
|
||||||
// bad CRC
|
|
||||||
return false;
|
return false;
|
||||||
|
} else {
|
||||||
|
raw_distance = ((uint16_t(d[0]) << 8) | d[1]);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
_distance_cm = ((uint16_t(d[0]) << 8) | d[1]) / 10;
|
|
||||||
|
|
||||||
return true;
|
// Checks for error code and if correct converts to cm
|
||||||
|
bool AP_RangeFinder_TeraRangerI2C::check_measure(uint16_t raw_distance, uint16_t &output_distance_cm)
|
||||||
|
{
|
||||||
|
// Check for error codes
|
||||||
|
if (raw_distance == 0xFFFF) {
|
||||||
|
// too far away
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (raw_distance == 0x0000) {
|
||||||
|
// too close
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (raw_distance == 0x0001) {
|
||||||
|
// Unable to measure
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
output_distance_cm = raw_distance/10;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -139,19 +159,21 @@ bool AP_RangeFinder_TeraRangerI2C::collect(uint16_t &_distance_cm)
|
||||||
*/
|
*/
|
||||||
void AP_RangeFinder_TeraRangerI2C::timer(void)
|
void AP_RangeFinder_TeraRangerI2C::timer(void)
|
||||||
{
|
{
|
||||||
// take a reading
|
// Take a reading
|
||||||
uint16_t _distance_cm;
|
uint16_t _raw_distance = 0;
|
||||||
if (collect(_distance_cm) && _sem->take(HAL_SEMAPHORE_BLOCK_FOREVER)) {
|
uint16_t _distance_cm = 0;
|
||||||
accum.sum += _distance_cm;
|
|
||||||
accum.count++;
|
if (collect_raw(_raw_distance) && _sem->take(HAL_SEMAPHORE_BLOCK_FOREVER)) {
|
||||||
|
if(check_measure(_raw_distance, _distance_cm)){
|
||||||
|
accum.sum += _distance_cm;
|
||||||
|
accum.count++;
|
||||||
|
}
|
||||||
_sem->give();
|
_sem->give();
|
||||||
}
|
}
|
||||||
|
|
||||||
// and immediately ask for a new reading
|
// and immediately ask for a new reading
|
||||||
measure();
|
measure();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
update the state of the sensor
|
update the state of the sensor
|
||||||
*/
|
*/
|
||||||
|
@ -166,6 +188,6 @@ void AP_RangeFinder_TeraRangerI2C::update(void)
|
||||||
} else {
|
} else {
|
||||||
set_status(RangeFinder::RangeFinder_NoData);
|
set_status(RangeFinder::RangeFinder_NoData);
|
||||||
}
|
}
|
||||||
_sem->give();
|
_sem->give();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,10 @@ private:
|
||||||
AP_HAL::OwnPtr<AP_HAL::I2CDevice> i2c_dev);
|
AP_HAL::OwnPtr<AP_HAL::I2CDevice> i2c_dev);
|
||||||
|
|
||||||
bool measure(void);
|
bool measure(void);
|
||||||
bool collect(uint16_t &distance_cm);
|
bool collect_raw(uint16_t &raw_distance);
|
||||||
|
bool check_measure(uint16_t raw_distance, uint16_t &distance_cm);
|
||||||
bool init(void);
|
|
||||||
|
bool init(void);
|
||||||
void timer(void);
|
void timer(void);
|
||||||
AP_HAL::OwnPtr<AP_HAL::I2CDevice> dev;
|
AP_HAL::OwnPtr<AP_HAL::I2CDevice> dev;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue