Browse Source

AP_Airspeed: allow for an AIRSPEED list in hwdef.dat

this saves a lot of flash by only including specific drivers
gps-1.3.1
Andrew Tridgell 3 years ago committed by Peter Barker
parent
commit
f65620f4f3
  1. 36
      libraries/AP_Airspeed/AP_Airspeed.cpp
  2. 2
      libraries/AP_Airspeed/AP_Airspeed.h
  3. 36
      libraries/AP_Airspeed/AP_Airspeed_DLVR.cpp
  4. 5
      libraries/AP_Airspeed/AP_Airspeed_DLVR.h

36
libraries/AP_Airspeed/AP_Airspeed.cpp

@ -294,6 +294,36 @@ AP_Airspeed::AP_Airspeed() @@ -294,6 +294,36 @@ AP_Airspeed::AP_Airspeed()
_singleton = this;
}
// macro for use by HAL_INS_PROBE_LIST
#define GET_I2C_DEVICE(bus, address) hal.i2c_mgr->get_device(bus, address)
bool AP_Airspeed::add_backend(AP_Airspeed_Backend *backend)
{
if (!backend) {
return false;
}
if (num_sensors >= AIRSPEED_MAX_SENSORS) {
AP_HAL::panic("Too many airspeed drivers");
}
const uint8_t i = num_sensors;
sensor[num_sensors++] = backend;
if (!sensor[i]->init()) {
GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Airspeed %u init failed", i+1);
delete sensor[i];
sensor[i] = nullptr;
}
return true;
}
/*
macro to add a backend with check for too many sensors
We don't try to start more than the maximum allowed
*/
#define ADD_BACKEND(backend) \
do { add_backend(backend); \
if (num_sensors == AIRSPEED_MAX_SENSORS) { return; } \
} while (0)
void AP_Airspeed::init()
{
if (sensor[0] != nullptr) {
@ -318,6 +348,11 @@ void AP_Airspeed::init() @@ -318,6 +348,11 @@ void AP_Airspeed::init()
}
#endif
#ifdef HAL_AIRSPEED_PROBE_LIST
// load sensors via a list from hwdef.dat
HAL_AIRSPEED_PROBE_LIST;
#else
// look for sensors based on type parameters
for (uint8_t i=0; i<AIRSPEED_MAX_SENSORS; i++) {
#if AP_AIRSPEED_AUTOCAL_ENABLE
state[i].calibration.init(param[i].ratio);
@ -404,6 +439,7 @@ void AP_Airspeed::init() @@ -404,6 +439,7 @@ void AP_Airspeed::init()
num_sensors = i+1;
}
}
#endif // HAL_AIRSPEED_PROBE_LIST
}
// read the airspeed sensor

2
libraries/AP_Airspeed/AP_Airspeed.h

@ -279,6 +279,8 @@ private: @@ -279,6 +279,8 @@ private:
AP_Airspeed_Backend *sensor[AIRSPEED_MAX_SENSORS];
void Log_Airspeed();
bool add_backend(AP_Airspeed_Backend *backend);
};
namespace AP {

36
libraries/AP_Airspeed/AP_Airspeed_DLVR.cpp

@ -36,13 +36,29 @@ AP_Airspeed_DLVR::AP_Airspeed_DLVR(AP_Airspeed &_frontend, uint8_t _instance, co @@ -36,13 +36,29 @@ AP_Airspeed_DLVR::AP_Airspeed_DLVR(AP_Airspeed &_frontend, uint8_t _instance, co
range_inH2O(_range_inH2O)
{}
// probe and initialise the sensor
bool AP_Airspeed_DLVR::init()
/*
probe for a sensor on a given i2c address
*/
AP_Airspeed_Backend *AP_Airspeed_DLVR::probe(AP_Airspeed &_frontend,
uint8_t _instance,
AP_HAL::OwnPtr<AP_HAL::I2CDevice> _dev,
const float _range_inH2O)
{
dev = hal.i2c_mgr->get_device(get_bus(), DLVR_I2C_ADDR);
if (!dev) {
return false;
if (!_dev) {
return nullptr;
}
AP_Airspeed_DLVR *sensor = new AP_Airspeed_DLVR(_frontend, _instance, _range_inH2O);
if (!sensor) {
return nullptr;
}
sensor->dev = std::move(_dev);
sensor->setup();
return sensor;
}
// initialise the sensor
void AP_Airspeed_DLVR::setup()
{
WITH_SEMAPHORE(dev->get_semaphore());
dev->set_speed(AP_HAL::Device::SPEED_LOW);
dev->set_retries(2);
@ -51,6 +67,16 @@ bool AP_Airspeed_DLVR::init() @@ -51,6 +67,16 @@ bool AP_Airspeed_DLVR::init()
dev->register_periodic_callback(1000000UL/50U,
FUNCTOR_BIND_MEMBER(&AP_Airspeed_DLVR::timer, void));
}
// probe and initialise the sensor
bool AP_Airspeed_DLVR::init()
{
dev = hal.i2c_mgr->get_device(get_bus(), DLVR_I2C_ADDR);
if (!dev) {
return false;
}
setup();
return true;
}

5
libraries/AP_Airspeed/AP_Airspeed_DLVR.h

@ -29,6 +29,8 @@ class AP_Airspeed_DLVR : public AP_Airspeed_Backend @@ -29,6 +29,8 @@ class AP_Airspeed_DLVR : public AP_Airspeed_Backend
public:
AP_Airspeed_DLVR(AP_Airspeed &frontend, uint8_t _instance, const float _range_inH2O);
static AP_Airspeed_Backend *probe(AP_Airspeed &frontend, uint8_t _instance, AP_HAL::OwnPtr<AP_HAL::I2CDevice> _dev, const float _range_inH2O);
~AP_Airspeed_DLVR(void) {}
// probe and initialise the sensor
@ -53,5 +55,8 @@ private: @@ -53,5 +55,8 @@ private:
uint32_t last_sample_time_ms;
const float range_inH2O;
// initialise the sensor
void setup();
AP_HAL::OwnPtr<AP_HAL::I2CDevice> dev;
};

Loading…
Cancel
Save