aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/lsm303d/lsm303d.cpp
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2013-09-09 22:23:48 -0700
committerLorenz Meier <lm@inf.ethz.ch>2013-09-12 00:53:08 +0200
commitcefc7ac00e55ade983562a081c3ccda8030e95ce (patch)
treef2353bfb6714af357d509c3e99aa97588255f485 /src/drivers/lsm303d/lsm303d.cpp
parenta5821d29281243385363745d1725a6b3210f7f96 (diff)
downloadpx4-firmware-cefc7ac00e55ade983562a081c3ccda8030e95ce.tar.gz
px4-firmware-cefc7ac00e55ade983562a081c3ccda8030e95ce.tar.bz2
px4-firmware-cefc7ac00e55ade983562a081c3ccda8030e95ce.zip
Rework the ringbuffer class so that it's not templated, and refactor its clients so they aren't dancing around the linker anymore.
Diffstat (limited to 'src/drivers/lsm303d/lsm303d.cpp')
-rw-r--r--src/drivers/lsm303d/lsm303d.cpp85
1 files changed, 37 insertions, 48 deletions
diff --git a/src/drivers/lsm303d/lsm303d.cpp b/src/drivers/lsm303d/lsm303d.cpp
index 997b80fab..a90cd0a3d 100644
--- a/src/drivers/lsm303d/lsm303d.cpp
+++ b/src/drivers/lsm303d/lsm303d.cpp
@@ -219,19 +219,8 @@ private:
unsigned _call_accel_interval;
unsigned _call_mag_interval;
- /*
- these wrapper types are needed to avoid a linker error for
- RingBuffer instances which appear in two drivers.
- */
- struct _accel_report {
- struct accel_report r;
- };
- RingBuffer<struct _accel_report> *_accel_reports;
-
- struct _mag_report {
- struct mag_report r;
- };
- RingBuffer<struct _mag_report> *_mag_reports;
+ RingBuffer *_accel_reports;
+ RingBuffer *_mag_reports;
struct accel_scale _accel_scale;
unsigned _accel_range_m_s2;
@@ -499,7 +488,7 @@ LSM303D::init()
}
/* allocate basic report buffers */
- _accel_reports = new RingBuffer<struct _accel_report>(2);
+ _accel_reports = new RingBuffer(2, sizeof(accel_report));
if (_accel_reports == nullptr)
goto out;
@@ -509,7 +498,7 @@ LSM303D::init()
memset(&zero_report, 0, sizeof(zero_report));
_accel_topic = orb_advertise(ORB_ID(sensor_accel), &zero_report);
- _mag_reports = new RingBuffer<struct _mag_report>(2);
+ _mag_reports = new RingBuffer(2, sizeof(mag_report));
if (_mag_reports == nullptr)
goto out;
@@ -579,7 +568,7 @@ ssize_t
LSM303D::read(struct file *filp, char *buffer, size_t buflen)
{
unsigned count = buflen / sizeof(struct accel_report);
- struct _accel_report *arb = reinterpret_cast<struct _accel_report *>(buffer);
+ accel_report *arb = reinterpret_cast<accel_report *>(buffer);
int ret = 0;
/* buffer must be large enough */
@@ -592,7 +581,7 @@ LSM303D::read(struct file *filp, char *buffer, size_t buflen)
* While there is space in the caller's buffer, and reports, copy them.
*/
while (count--) {
- if (_accel_reports->get(*arb)) {
+ if (_accel_reports->get(arb)) {
ret += sizeof(*arb);
arb++;
}
@@ -606,7 +595,7 @@ LSM303D::read(struct file *filp, char *buffer, size_t buflen)
measure();
/* measurement will have generated a report, copy it out */
- if (_accel_reports->get(*arb))
+ if (_accel_reports->get(arb))
ret = sizeof(*arb);
return ret;
@@ -616,7 +605,7 @@ ssize_t
LSM303D::mag_read(struct file *filp, char *buffer, size_t buflen)
{
unsigned count = buflen / sizeof(struct mag_report);
- struct _mag_report *mrb = reinterpret_cast<struct _mag_report *>(buffer);
+ mag_report *mrb = reinterpret_cast<mag_report *>(buffer);
int ret = 0;
/* buffer must be large enough */
@@ -630,7 +619,7 @@ LSM303D::mag_read(struct file *filp, char *buffer, size_t buflen)
* While there is space in the caller's buffer, and reports, copy them.
*/
while (count--) {
- if (_mag_reports->get(*mrb)) {
+ if (_mag_reports->get(mrb)) {
ret += sizeof(*mrb);
mrb++;
}
@@ -645,7 +634,7 @@ LSM303D::mag_read(struct file *filp, char *buffer, size_t buflen)
measure();
/* measurement will have generated a report, copy it out */
- if (_mag_reports->get(*mrb))
+ if (_mag_reports->get(mrb))
ret = sizeof(*mrb);
return ret;
@@ -1237,7 +1226,7 @@ LSM303D::measure()
} raw_accel_report;
#pragma pack(pop)
- struct _accel_report accel_report;
+ accel_report accel_report;
/* start the performance counter */
perf_begin(_accel_sample_perf);
@@ -1262,30 +1251,30 @@ LSM303D::measure()
*/
- accel_report.r.timestamp = hrt_absolute_time();
+ accel_report.timestamp = hrt_absolute_time();
- accel_report.r.x_raw = raw_accel_report.x;
- accel_report.r.y_raw = raw_accel_report.y;
- accel_report.r.z_raw = raw_accel_report.z;
+ accel_report.x_raw = raw_accel_report.x;
+ accel_report.y_raw = raw_accel_report.y;
+ accel_report.z_raw = raw_accel_report.z;
- float x_in_new = ((accel_report.r.x_raw * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale;
- float y_in_new = ((accel_report.r.y_raw * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale;
- float z_in_new = ((accel_report.r.z_raw * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale;
+ float x_in_new = ((accel_report.x_raw * _accel_range_scale) - _accel_scale.x_offset) * _accel_scale.x_scale;
+ float y_in_new = ((accel_report.y_raw * _accel_range_scale) - _accel_scale.y_offset) * _accel_scale.y_scale;
+ float z_in_new = ((accel_report.z_raw * _accel_range_scale) - _accel_scale.z_offset) * _accel_scale.z_scale;
- accel_report.r.x = _accel_filter_x.apply(x_in_new);
- accel_report.r.y = _accel_filter_y.apply(y_in_new);
- accel_report.r.z = _accel_filter_z.apply(z_in_new);
+ accel_report.x = _accel_filter_x.apply(x_in_new);
+ accel_report.y = _accel_filter_y.apply(y_in_new);
+ accel_report.z = _accel_filter_z.apply(z_in_new);
- accel_report.r.scaling = _accel_range_scale;
- accel_report.r.range_m_s2 = _accel_range_m_s2;
+ accel_report.scaling = _accel_range_scale;
+ accel_report.range_m_s2 = _accel_range_m_s2;
- _accel_reports->force(accel_report);
+ _accel_reports->force(&accel_report);
/* notify anyone waiting for data */
poll_notify(POLLIN);
/* publish for subscribers */
- orb_publish(ORB_ID(sensor_accel), _accel_topic, &accel_report.r);
+ orb_publish(ORB_ID(sensor_accel), _accel_topic, &accel_report);
_accel_read++;
@@ -1307,7 +1296,7 @@ LSM303D::mag_measure()
} raw_mag_report;
#pragma pack(pop)
- struct _mag_report mag_report;
+ mag_report mag_report;
/* start the performance counter */
perf_begin(_mag_sample_perf);
@@ -1332,25 +1321,25 @@ LSM303D::mag_measure()
*/
- mag_report.r.timestamp = hrt_absolute_time();
+ mag_report.timestamp = hrt_absolute_time();
- mag_report.r.x_raw = raw_mag_report.x;
- mag_report.r.y_raw = raw_mag_report.y;
- mag_report.r.z_raw = raw_mag_report.z;
- mag_report.r.x = ((mag_report.r.x_raw * _mag_range_scale) - _mag_scale.x_offset) * _mag_scale.x_scale;
- mag_report.r.y = ((mag_report.r.y_raw * _mag_range_scale) - _mag_scale.y_offset) * _mag_scale.y_scale;
- mag_report.r.z = ((mag_report.r.z_raw * _mag_range_scale) - _mag_scale.z_offset) * _mag_scale.z_scale;
- mag_report.r.scaling = _mag_range_scale;
- mag_report.r.range_ga = (float)_mag_range_ga;
+ mag_report.x_raw = raw_mag_report.x;
+ mag_report.y_raw = raw_mag_report.y;
+ mag_report.z_raw = raw_mag_report.z;
+ mag_report.x = ((mag_report.x_raw * _mag_range_scale) - _mag_scale.x_offset) * _mag_scale.x_scale;
+ mag_report.y = ((mag_report.y_raw * _mag_range_scale) - _mag_scale.y_offset) * _mag_scale.y_scale;
+ mag_report.z = ((mag_report.z_raw * _mag_range_scale) - _mag_scale.z_offset) * _mag_scale.z_scale;
+ mag_report.scaling = _mag_range_scale;
+ mag_report.range_ga = (float)_mag_range_ga;
- _mag_reports->force(mag_report);
+ _mag_reports->force(&mag_report);
/* XXX please check this poll_notify, is it the right one? */
/* notify anyone waiting for data */
poll_notify(POLLIN);
/* publish for subscribers */
- orb_publish(ORB_ID(sensor_mag), _mag_topic, &mag_report.r);
+ orb_publish(ORB_ID(sensor_mag), _mag_topic, &mag_report);
_mag_read++;