diff --git a/apps/drivers/device/i2c.h b/apps/drivers/device/i2c.h index 66c34dd7c4..7daba31be8 100644 --- a/apps/drivers/device/i2c.h +++ b/apps/drivers/device/i2c.h @@ -60,6 +60,11 @@ protected: */ unsigned _retries; + /** + * The I2C bus number the device is attached to. + */ + int _bus; + /** * @ Constructor * @@ -123,7 +128,6 @@ protected: } private: - int _bus; uint16_t _address; uint32_t _frequency; struct i2c_dev_s *_dev; diff --git a/src/drivers/hmc5883/hmc5883.cpp b/src/drivers/hmc5883/hmc5883.cpp index 8ab5682821..d71f469e9d 100644 --- a/src/drivers/hmc5883/hmc5883.cpp +++ b/src/drivers/hmc5883/hmc5883.cpp @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (C) 2012 PX4 Development Team. All rights reserved. + * Copyright (c) 2012, 2013 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -75,7 +75,6 @@ * HMC5883 internal constants and data structures. */ -#define HMC5883L_BUS PX4_I2C_BUS_ONBOARD #define HMC5883L_ADDRESS PX4_I2C_OBDEV_HMC5883 /* Max measurement rate is 160Hz */ @@ -842,12 +841,21 @@ HMC5883::collect() * 74 from all measurements centers them around zero. */ - /* to align the sensor axes with the board, x and y need to be flipped */ - _reports[_next_report].x = ((report.y * _range_scale) - _scale.x_offset) * _scale.x_scale; - /* flip axes and negate value for y */ - _reports[_next_report].y = ((((report.x == -32768) ? 32767 : -report.x) * _range_scale) - _scale.y_offset) * _scale.y_scale; - /* z remains z */ - _reports[_next_report].z = ((report.z * _range_scale) - _scale.z_offset) * _scale.z_scale; + if (_bus == PX4_I2C_BUS_ONBOARD) { + /* to align the sensor axes with the board, x and y need to be flipped */ + _reports[_next_report].x = ((report.y * _range_scale) - _scale.x_offset) * _scale.x_scale; + /* flip axes and negate value for y */ + _reports[_next_report].y = ((((report.x == -32768) ? 32767 : -report.x) * _range_scale) - _scale.y_offset) * _scale.y_scale; + /* z remains z */ + _reports[_next_report].z = ((report.z * _range_scale) - _scale.z_offset) * _scale.z_scale; + } else { + /* XXX axis assignment of external sensor is yet unknown */ + _reports[_next_report].x = ((report.y * _range_scale) - _scale.x_offset) * _scale.x_scale; + /* flip axes and negate value for y */ + _reports[_next_report].y = ((((report.x == -32768) ? 32767 : -report.x) * _range_scale) - _scale.y_offset) * _scale.y_scale; + /* z remains z */ + _reports[_next_report].z = ((report.z * _range_scale) - _scale.z_offset) * _scale.z_scale; + } /* publish it */ orb_publish(ORB_ID(sensor_mag), _mag_topic, &_reports[_next_report]); @@ -1211,8 +1219,14 @@ start() if (g_dev != nullptr) errx(1, "already started"); - /* create the driver */ - g_dev = new HMC5883(HMC5883L_BUS); + /* create the driver, attempt expansion bus first */ + g_dev = new HMC5883(PX4_I2C_BUS_EXPANSION); + +#ifdef PX4_I2C_BUS_ONBOARD + /* if this failed, attempt onboard sensor */ + if (g_dev == nullptr) + g_dev = new HMC5883(PX4_I2C_BUS_ONBOARD); +#endif if (g_dev == nullptr) goto fail; diff --git a/src/modules/multirotor_att_control/module.mk b/src/modules/multirotor_att_control/module.mk index 2fd52c162e..7569e1c7ee 100755 --- a/src/modules/multirotor_att_control/module.mk +++ b/src/modules/multirotor_att_control/module.mk @@ -32,7 +32,7 @@ ############################################################################ # -# Makefile to build the multirotor attitude controller +# Build multirotor attitude controller # MODULE_COMMAND = multirotor_att_control