AP_Compass: implement device IDs for compass drivers

This commit is contained in:
Andrew Tridgell 2016-11-04 20:24:53 +11:00
parent 64a5d3938c
commit de7913e8e9
9 changed files with 99 additions and 33 deletions

View File

@ -16,11 +16,9 @@
#define AP_COMPASS_TYPE_UNKNOWN 0x00 #define AP_COMPASS_TYPE_UNKNOWN 0x00
#define AP_COMPASS_TYPE_HIL 0x01 #define AP_COMPASS_TYPE_HIL 0x01
#define AP_COMPASS_TYPE_HMC5843 0x02 #define AP_COMPASS_TYPE_HMC5843 0x02
#define AP_COMPASS_TYPE_HMC5883L 0x03
#define AP_COMPASS_TYPE_PX4 0x04 #define AP_COMPASS_TYPE_PX4 0x04
#define AP_COMPASS_TYPE_VRBRAIN 0x05 #define AP_COMPASS_TYPE_VRBRAIN 0x05
#define AP_COMPASS_TYPE_AK8963_MPU9250 0x06 #define AP_COMPASS_TYPE_AK8963 0x06
#define AP_COMPASS_TYPE_AK8963_I2C 0x07
#define AP_COMPASS_TYPE_LSM303D 0x08 #define AP_COMPASS_TYPE_LSM303D 0x08
#define AP_COMPASS_TYPE_LSM9DS1 0x09 #define AP_COMPASS_TYPE_LSM9DS1 0x09
#define AP_COMPASS_TYPE_BMM150 0x0A #define AP_COMPASS_TYPE_BMM150 0x0A

View File

@ -52,11 +52,9 @@ struct PACKED sample_regs {
extern const AP_HAL::HAL &hal; extern const AP_HAL::HAL &hal;
AP_Compass_AK8963::AP_Compass_AK8963(Compass &compass, AP_AK8963_BusDriver *bus, AP_Compass_AK8963::AP_Compass_AK8963(Compass &compass, AP_AK8963_BusDriver *bus)
uint32_t dev_id)
: AP_Compass_Backend(compass) : AP_Compass_Backend(compass)
, _bus(bus) , _bus(bus)
, _dev_id(dev_id)
{ {
} }
@ -73,7 +71,7 @@ AP_Compass_Backend *AP_Compass_AK8963::probe(Compass &compass,
return nullptr; return nullptr;
} }
AP_Compass_AK8963 *sensor = new AP_Compass_AK8963(compass, bus, AP_COMPASS_TYPE_AK8963_I2C); AP_Compass_AK8963 *sensor = new AP_Compass_AK8963(compass, bus);
if (!sensor || !sensor->init()) { if (!sensor || !sensor->init()) {
delete sensor; delete sensor;
return nullptr; return nullptr;
@ -103,7 +101,7 @@ AP_Compass_Backend *AP_Compass_AK8963::probe_mpu9250(Compass &compass, uint8_t m
return nullptr; return nullptr;
} }
AP_Compass_AK8963 *sensor = new AP_Compass_AK8963(compass, bus, AP_COMPASS_TYPE_AK8963_MPU9250); AP_Compass_AK8963 *sensor = new AP_Compass_AK8963(compass, bus);
if (!sensor || !sensor->init()) { if (!sensor || !sensor->init()) {
delete sensor; delete sensor;
return nullptr; return nullptr;
@ -150,7 +148,9 @@ bool AP_Compass_AK8963::init()
/* register the compass instance in the frontend */ /* register the compass instance in the frontend */
_compass_instance = register_compass(); _compass_instance = register_compass();
set_dev_id(_compass_instance, _dev_id);
_bus->set_device_type(AP_COMPASS_TYPE_AK8963);
set_dev_id(_compass_instance, _bus->get_bus_id());
bus_sem->give(); bus_sem->give();
@ -431,3 +431,14 @@ AP_HAL::Device::PeriodicHandle AP_AK8963_BusDriver_Auxiliary::register_periodic_
return _bus->register_periodic_callback(period_usec, cb); return _bus->register_periodic_callback(period_usec, cb);
} }
// set device type within a device class
void AP_AK8963_BusDriver_Auxiliary::set_device_type(uint8_t devtype)
{
_bus->set_device_type(devtype);
}
// return 24 bit bus identifier
uint32_t AP_AK8963_BusDriver_Auxiliary::get_bus_id(void) const
{
return _bus->get_bus_id();
}

View File

@ -36,8 +36,7 @@ public:
void read() override; void read() override;
private: private:
AP_Compass_AK8963(Compass &compass, AP_AK8963_BusDriver *bus, AP_Compass_AK8963(Compass &compass, AP_AK8963_BusDriver *bus);
uint32_t dev_id);
void _make_factory_sensitivity_adjustment(Vector3f &field) const; void _make_factory_sensitivity_adjustment(Vector3f &field) const;
void _make_adc_sensitivity_adjustment(Vector3f &field) const; void _make_adc_sensitivity_adjustment(Vector3f &field) const;
@ -58,7 +57,6 @@ private:
float _mag_z_accum; float _mag_z_accum;
uint32_t _accum_count; uint32_t _accum_count;
uint32_t _last_update_timestamp; uint32_t _last_update_timestamp;
uint32_t _dev_id;
uint8_t _compass_instance; uint8_t _compass_instance;
bool _initialized; bool _initialized;
@ -79,6 +77,12 @@ public:
virtual bool configure() { return true; } virtual bool configure() { return true; }
virtual bool start_measurements() { return true; } virtual bool start_measurements() { return true; }
virtual AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t, AP_HAL::Device::PeriodicCb) = 0; virtual AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t, AP_HAL::Device::PeriodicCb) = 0;
// set device type within a device class
virtual void set_device_type(uint8_t devtype) = 0;
// return 24 bit bus identifier
virtual uint32_t get_bus_id(void) const = 0;
}; };
class AP_AK8963_BusDriver_HALDevice: public AP_AK8963_BusDriver class AP_AK8963_BusDriver_HALDevice: public AP_AK8963_BusDriver
@ -93,6 +97,16 @@ public:
virtual AP_HAL::Semaphore *get_semaphore() override; virtual AP_HAL::Semaphore *get_semaphore() override;
AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb) override; AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb) override;
// set device type within a device class
void set_device_type(uint8_t devtype) override {
_dev->set_device_type(devtype);
}
// return 24 bit bus identifier
uint32_t get_bus_id(void) const override {
return _dev->get_bus_id();
}
private: private:
AP_HAL::OwnPtr<AP_HAL::I2CDevice> _dev; AP_HAL::OwnPtr<AP_HAL::I2CDevice> _dev;
}; };
@ -115,6 +129,12 @@ public:
bool configure(); bool configure();
bool start_measurements(); bool start_measurements();
// set device type within a device class
void set_device_type(uint8_t devtype) override;
// return 24 bit bus identifier
uint32_t get_bus_id(void) const override;
private: private:
AuxiliaryBus *_bus; AuxiliaryBus *_bus;
AuxiliaryBusSlave *_slave; AuxiliaryBusSlave *_slave;

View File

@ -182,7 +182,9 @@ bool AP_Compass_BMM150::init()
/* register the compass instance in the frontend */ /* register the compass instance in the frontend */
_compass_instance = register_compass(); _compass_instance = register_compass();
set_dev_id(_compass_instance, AP_COMPASS_TYPE_BMM150);
_dev->set_device_type(AP_COMPASS_TYPE_BMM150);
set_dev_id(_compass_instance, _dev->get_bus_id());
_dev->register_periodic_callback(MEASURE_TIME_USEC, _dev->register_periodic_callback(MEASURE_TIME_USEC,
FUNCTOR_BIND_MEMBER(&AP_Compass_BMM150::_update, bool)); FUNCTOR_BIND_MEMBER(&AP_Compass_BMM150::_update, bool));

View File

@ -180,7 +180,9 @@ bool AP_Compass_HMC5843::init()
read(); read();
_compass_instance = register_compass(); _compass_instance = register_compass();
set_dev_id(_compass_instance, _product_id);
_bus->set_device_type(AP_COMPASS_TYPE_HMC5843);
set_dev_id(_compass_instance, _bus->get_bus_id());
if (_force_external) { if (_force_external) {
set_external(_compass_instance, true); set_external(_compass_instance, true);
@ -221,8 +223,7 @@ bool AP_Compass_HMC5843::_timer()
raw_field *= _gain_scale; raw_field *= _gain_scale;
// rotate to the desired orientation // rotate to the desired orientation
if (is_external(_compass_instance) && if (is_external(_compass_instance) && _is_hmc5883L) {
_product_id == AP_COMPASS_TYPE_HMC5883L) {
raw_field.rotate(ROTATION_YAW_90); raw_field.rotate(ROTATION_YAW_90);
} }
@ -246,7 +247,6 @@ bool AP_Compass_HMC5843::_timer()
_mag_z_accum /= 2; _mag_z_accum /= 2;
_accum_count = 7; _accum_count = 7;
} }
_last_accum_time = tnow;
_sem->give(); _sem->give();
} }
@ -325,7 +325,7 @@ bool AP_Compass_HMC5843::_read_sample()
ry = be16toh(val.ry); ry = be16toh(val.ry);
rz = be16toh(val.rz); rz = be16toh(val.rz);
if (_product_id == AP_COMPASS_TYPE_HMC5883L) { if (_is_hmc5883L) {
std::swap(ry, rz); std::swap(ry, rz);
} }
@ -355,11 +355,11 @@ bool AP_Compass_HMC5843::_detect_version()
if (_base_config == try_config) { if (_base_config == try_config) {
/* a 5883L supports the sample averaging config */ /* a 5883L supports the sample averaging config */
_product_id = AP_COMPASS_TYPE_HMC5883L; _is_hmc5883L = true;
_gain_config = HMC5883L_GAIN_1_30_GA; _gain_config = HMC5883L_GAIN_1_30_GA;
_gain_scale = (1.0f / 1090) * 1000; _gain_scale = (1.0f / 1090) * 1000;
} else if (_base_config == (HMC5843_OPMODE_NORMAL | HMC5843_OSR_75HZ)) { } else if (_base_config == (HMC5843_OPMODE_NORMAL | HMC5843_OSR_75HZ)) {
_product_id = AP_COMPASS_TYPE_HMC5843; _is_hmc5883L = false;
_gain_config = HMC5843_GAIN_1_00_GA; _gain_config = HMC5843_GAIN_1_00_GA;
_gain_scale = (1.0f / 1300) * 1000; _gain_scale = (1.0f / 1300) * 1000;
} else { } else {
@ -378,7 +378,7 @@ bool AP_Compass_HMC5843::_calibrate()
int numAttempts = 0, good_count = 0; int numAttempts = 0, good_count = 0;
bool success = false; bool success = false;
if (_product_id == AP_COMPASS_TYPE_HMC5883L) { if (_is_hmc5883L) {
calibration_gain = HMC5883L_GAIN_2_50_GA; calibration_gain = HMC5883L_GAIN_2_50_GA;
/* /*
* note that the HMC5883 datasheet gives the x and y expected * note that the HMC5883 datasheet gives the x and y expected
@ -589,4 +589,16 @@ AP_HAL::Device::PeriodicHandle AP_HMC5843_BusDriver_Auxiliary::register_periodic
return _bus->register_periodic_callback(period_usec, cb); return _bus->register_periodic_callback(period_usec, cb);
} }
// set device type within a device class
void AP_HMC5843_BusDriver_Auxiliary::set_device_type(uint8_t devtype)
{
_bus->set_device_type(devtype);
}
// return 24 bit bus identifier
uint32_t AP_HMC5843_BusDriver_Auxiliary::get_bus_id(void) const
{
return _bus->get_bus_id();
}
#endif #endif

View File

@ -46,7 +46,6 @@ private:
float _scaling[3]; float _scaling[3];
float _gain_scale; float _gain_scale;
uint32_t _last_accum_time;
// when unhealthy the millis() value to retry at // when unhealthy the millis() value to retry at
uint32_t _retry_time; uint32_t _retry_time;
@ -62,10 +61,10 @@ private:
uint8_t _base_config; uint8_t _base_config;
uint8_t _compass_instance; uint8_t _compass_instance;
uint8_t _gain_config; uint8_t _gain_config;
uint8_t _product_id;
bool _initialised; bool _is_hmc5883L:1;
bool _force_external; bool _initialised:1;
bool _force_external:1;
}; };
class AP_HMC5843_BusDriver class AP_HMC5843_BusDriver
@ -83,6 +82,12 @@ public:
virtual bool start_measurements() { return true; } virtual bool start_measurements() { return true; }
virtual AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t, AP_HAL::Device::PeriodicCb) = 0; virtual AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t, AP_HAL::Device::PeriodicCb) = 0;
// set device type within a device class
virtual void set_device_type(uint8_t devtype) = 0;
// return 24 bit bus identifier
virtual uint32_t get_bus_id(void) const = 0;
}; };
class AP_HMC5843_BusDriver_HALDevice : public AP_HMC5843_BusDriver class AP_HMC5843_BusDriver_HALDevice : public AP_HMC5843_BusDriver
@ -98,6 +103,16 @@ public:
AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb) override; AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb) override;
// set device type within a device class
void set_device_type(uint8_t devtype) override {
_dev->set_device_type(devtype);
}
// return 24 bit bus identifier
uint32_t get_bus_id(void) const override {
return _dev->get_bus_id();
}
private: private:
AP_HAL::OwnPtr<AP_HAL::Device> _dev; AP_HAL::OwnPtr<AP_HAL::Device> _dev;
}; };
@ -120,6 +135,12 @@ public:
AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb) override; AP_HAL::Device::PeriodicHandle register_periodic_callback(uint32_t period_usec, AP_HAL::Device::PeriodicCb) override;
// set device type within a device class
void set_device_type(uint8_t devtype) override;
// return 24 bit bus identifier
uint32_t get_bus_id(void) const override;
private: private:
AuxiliaryBus *_bus; AuxiliaryBus *_bus;
AuxiliaryBusSlave *_slave; AuxiliaryBusSlave *_slave;

View File

@ -268,7 +268,9 @@ bool AP_Compass_LSM303D::init()
/* register the compass instance in the frontend */ /* register the compass instance in the frontend */
_compass_instance = register_compass(); _compass_instance = register_compass();
set_dev_id(_compass_instance, AP_COMPASS_TYPE_LSM303D);
_dev->set_device_type(AP_COMPASS_TYPE_LSM303D);
set_dev_id(_compass_instance, _dev->get_bus_id());
#if CONFIG_HAL_BOARD == HAL_BOARD_LINUX && CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_RASPILOT #if CONFIG_HAL_BOARD == HAL_BOARD_LINUX && CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_RASPILOT
// FIXME: wrong way to force internal compass // FIXME: wrong way to force internal compass

View File

@ -60,7 +60,7 @@ extern const AP_HAL::HAL &hal;
AP_Compass_Backend *AP_Compass_LSM9DS1::probe(Compass &compass, AP_Compass_Backend *AP_Compass_LSM9DS1::probe(Compass &compass,
AP_HAL::OwnPtr<AP_HAL::Device> dev) AP_HAL::OwnPtr<AP_HAL::Device> dev)
{ {
AP_Compass_LSM9DS1 *sensor = new AP_Compass_LSM9DS1(compass, std::move(dev), AP_COMPASS_TYPE_LSM9DS1); AP_Compass_LSM9DS1 *sensor = new AP_Compass_LSM9DS1(compass, std::move(dev));
if (!sensor || !sensor->init()) { if (!sensor || !sensor->init()) {
delete sensor; delete sensor;
return nullptr; return nullptr;
@ -94,7 +94,9 @@ bool AP_Compass_LSM9DS1::init()
} }
_compass_instance = register_compass(); _compass_instance = register_compass();
set_dev_id(_compass_instance, _dev_id);
_dev->set_device_type(AP_COMPASS_TYPE_LSM9DS1);
set_dev_id(_compass_instance, _dev->get_bus_id());
_dev->register_periodic_callback(10000, FUNCTOR_BIND_MEMBER(&AP_Compass_LSM9DS1::_update, bool)); _dev->register_periodic_callback(10000, FUNCTOR_BIND_MEMBER(&AP_Compass_LSM9DS1::_update, bool));
@ -230,10 +232,9 @@ bool AP_Compass_LSM9DS1::_set_scale(void)
return true; return true;
} }
AP_Compass_LSM9DS1::AP_Compass_LSM9DS1(Compass &compass, AP_HAL::OwnPtr<AP_HAL::Device> dev, uint32_t dev_id) AP_Compass_LSM9DS1::AP_Compass_LSM9DS1(Compass &compass, AP_HAL::OwnPtr<AP_HAL::Device> dev)
: AP_Compass_Backend(compass) : AP_Compass_Backend(compass)
, _dev(std::move(dev)) , _dev(std::move(dev))
, _dev_id(dev_id)
{ {
} }

View File

@ -22,7 +22,7 @@ public:
virtual ~AP_Compass_LSM9DS1() {} virtual ~AP_Compass_LSM9DS1() {}
private: private:
AP_Compass_LSM9DS1(Compass &compass, AP_HAL::OwnPtr<AP_HAL::Device> dev, uint32_t dev_id); AP_Compass_LSM9DS1(Compass &compass, AP_HAL::OwnPtr<AP_HAL::Device> dev);
bool _check_id(void); bool _check_id(void);
bool _configure(void); bool _configure(void);
bool _set_scale(void); bool _set_scale(void);
@ -35,7 +35,6 @@ private:
void _dump_registers(); void _dump_registers();
AP_HAL::OwnPtr<AP_HAL::Device> _dev; AP_HAL::OwnPtr<AP_HAL::Device> _dev;
uint32_t _dev_id;
uint8_t _compass_instance; uint8_t _compass_instance;
float _scaling; float _scaling;
float _mag_x_accum; float _mag_x_accum;