PX4 Firmware
PX4 Autopilot Software http://px4.io
qmc5883.cpp File Reference

Driver for the QMC5883 magnetometer connected via I2C or SPI. More...

#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/defines.h>
#include <drivers/device/i2c.h>
#include <sys/types.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdbool.h>
#include <semaphore.h>
#include <string.h>
#include <fcntl.h>
#include <poll.h>
#include <errno.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <nuttx/arch.h>
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
#include <nuttx/clock.h>
#include <board_config.h>
#include <perf/perf_counter.h>
#include <systemlib/err.h>
#include <drivers/drv_mag.h>
#include <drivers/drv_hrt.h>
#include <drivers/device/ringbuffer.h>
#include <drivers/drv_device.h>
#include <uORB/uORB.h>
#include <float.h>
#include <getopt.h>
#include <lib/conversion/rotation.h>
#include "qmc5883.h"
Include dependency graph for qmc5883.cpp:

Go to the source code of this file.

Classes

class  QMC5883
 
struct  QMC5883::_last_report
 used for info() More...
 
struct  qmc5883::qmc5883_bus_option
 

Namespaces

 qmc5883
 Local functions in support of the shell command.
 

Macros

#define QMC5883_CONVERSION_INTERVAL   (1000000 / 150) /* microseconds */
 
#define QMC5883_MAX_COUNT   32767
 
#define QMC5883_ADDR_DATA_OUT_X_LSB   0x00
 
#define QMC5883_ADDR_DATA_OUT_X_MSB   0x01
 
#define QMC5883_ADDR_DATA_OUT_Y_LSB   0x02
 
#define QMC5883_ADDR_DATA_OUT_Y_MSB   0x03
 
#define QMC5883_ADDR_DATA_OUT_Z_LSB   0x04
 
#define QMC5883_ADDR_DATA_OUT_Z_MSB   0x05
 
#define QMC5883_ADDR_STATUS   0x06
 
#define QMC5883_ADDR_TEMP_OUT_LSB   0x07
 
#define QMC5883_ADDR_TEMP_OUT_MSB   0x08
 
#define QMC5883_ADDR_CONTROL_1   0x09
 
#define QMC5883_ADDR_CONTROL_2   0x0A
 
#define QMC5883_ADDR_SET_RESET   0x0B
 
#define QMC5883_STATUS_REG_DRDY   (1 << 0) /* Data Ready: "0": no new data, "1": new data is ready */
 
#define QMC5883_STATUS_REG_OVL   (1 << 1) /* Overflow Flag: "0": normal, "1": data overflow */
 
#define QMC5883_STATUS_REG_DOR   (1 << 2) /* Data Skip: "0": normal, "1": data skipped for reading */
 
#define QMC5883_MODE_REG_STANDBY   (0 << 0)
 
#define QMC5883_MODE_REG_CONTINOUS_MODE   (1 << 0)
 
#define QMC5883_OUTPUT_DATA_RATE_10   (0 << 2) /* Hz */
 
#define QMC5883_OUTPUT_DATA_RATE_50   (1 << 2)
 
#define QMC5883_OUTPUT_DATA_RATE_100   (2 << 2)
 
#define QMC5883_OUTPUT_DATA_RATE_200   (3 << 2)
 
#define QMC5883_OUTPUT_RANGE_2G   (0 << 4) /* +/- 2 gauss */
 
#define QMC5883_OUTPUT_RANGE_8G   (1 << 4) /* +/- 8 gauss */
 
#define QMC5883_OVERSAMPLE_512   (0 << 6) /* controls digital filter bw - larger OSR -> smaller bw */
 
#define QMC5883_OVERSAMPLE_256   (1 << 6)
 
#define QMC5883_OVERSAMPLE_128   (2 << 6)
 
#define QMC5883_OVERSAMPLE_64   (3 << 6)
 
#define QMC5883_INT_ENB   (1 << 0)
 
#define QMC5883_ROL_PNT   (1 << 6)
 
#define QMC5883_SOFT_RESET   (1 << 7)
 
#define QMC5883_SET_DEFAULT   (1 << 0)
 
#define QMC5883_TEMP_OFFSET   50 /* deg celsius */
 
#define NUM_BUS_OPTIONS   (sizeof(bus_options)/sizeof(bus_options[0]))
 

Enumerations

enum  QMC5883_BUS { QMC5883_BUS_ALL = 0, QMC5883_BUS_I2C_INTERNAL, QMC5883_BUS_I2C_EXTERNAL, QMC5883_BUS_SPI }
 

Functions

__EXPORT int qmc5883_main (int argc, char *argv[])
 
void qmc5883::start (enum QMC5883_BUS busid, enum Rotation rotation)
 Start the driver. More...
 
int qmc5883::stop ()
 Stop the driver. More...
 
bool qmc5883::start_bus (struct qmc5883_bus_option &bus, enum Rotation rotation)
 start driver for a specific bus option More...
 
struct qmc5883_bus_option & qmc5883::find_bus (enum QMC5883_BUS busid)
 find a bus structure for a busid More...
 
void qmc5883::test (enum QMC5883_BUS busid)
 Perform some basic functional tests on the driver; make sure we can collect data from the sensor in polled and automatic modes. More...
 
void qmc5883::reset (enum QMC5883_BUS busid)
 Reset the driver. More...
 
int qmc5883::info (enum QMC5883_BUS busid)
 Print a little info about the driver. More...
 
int qmc5883::temp_enable (QMC5883_BUS busid, bool enable)
 
void qmc5883::usage ()
 Prints info about the driver argument usage. More...
 

Variables

struct qmc5883::qmc5883_bus_option qmc5883::bus_options []
 

Detailed Description

Driver for the QMC5883 magnetometer connected via I2C or SPI.

Definition in file qmc5883.cpp.

Macro Definition Documentation

◆ NUM_BUS_OPTIONS

#define NUM_BUS_OPTIONS   (sizeof(bus_options)/sizeof(bus_options[0]))

Definition at line 830 of file qmc5883.cpp.

Referenced by qmc5883::find_bus(), qmc5883::start(), and qmc5883::stop().

◆ QMC5883_ADDR_CONTROL_1

#define QMC5883_ADDR_CONTROL_1   0x09

Definition at line 97 of file qmc5883.cpp.

Referenced by QMC5883::check_conf(), and QMC5883::reset().

◆ QMC5883_ADDR_CONTROL_2

#define QMC5883_ADDR_CONTROL_2   0x0A

Definition at line 98 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_ADDR_DATA_OUT_X_LSB

#define QMC5883_ADDR_DATA_OUT_X_LSB   0x00

Definition at line 88 of file qmc5883.cpp.

Referenced by QMC5883::collect(), and QMC5883::reset().

◆ QMC5883_ADDR_DATA_OUT_X_MSB

#define QMC5883_ADDR_DATA_OUT_X_MSB   0x01

Definition at line 89 of file qmc5883.cpp.

◆ QMC5883_ADDR_DATA_OUT_Y_LSB

#define QMC5883_ADDR_DATA_OUT_Y_LSB   0x02

Definition at line 90 of file qmc5883.cpp.

◆ QMC5883_ADDR_DATA_OUT_Y_MSB

#define QMC5883_ADDR_DATA_OUT_Y_MSB   0x03

Definition at line 91 of file qmc5883.cpp.

◆ QMC5883_ADDR_DATA_OUT_Z_LSB

#define QMC5883_ADDR_DATA_OUT_Z_LSB   0x04

Definition at line 92 of file qmc5883.cpp.

◆ QMC5883_ADDR_DATA_OUT_Z_MSB

#define QMC5883_ADDR_DATA_OUT_Z_MSB   0x05

Definition at line 93 of file qmc5883.cpp.

◆ QMC5883_ADDR_SET_RESET

#define QMC5883_ADDR_SET_RESET   0x0B

Definition at line 99 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_ADDR_STATUS

#define QMC5883_ADDR_STATUS   0x06

Definition at line 94 of file qmc5883.cpp.

◆ QMC5883_ADDR_TEMP_OUT_LSB

#define QMC5883_ADDR_TEMP_OUT_LSB   0x07

Definition at line 95 of file qmc5883.cpp.

Referenced by QMC5883::collect().

◆ QMC5883_ADDR_TEMP_OUT_MSB

#define QMC5883_ADDR_TEMP_OUT_MSB   0x08

Definition at line 96 of file qmc5883.cpp.

◆ QMC5883_CONVERSION_INTERVAL

#define QMC5883_CONVERSION_INTERVAL   (1000000 / 150) /* microseconds */

Definition at line 85 of file qmc5883.cpp.

Referenced by QMC5883::ioctl(), QMC5883::read(), and QMC5883::Run().

◆ QMC5883_INT_ENB

#define QMC5883_INT_ENB   (1 << 0)

Definition at line 121 of file qmc5883.cpp.

◆ QMC5883_MAX_COUNT

#define QMC5883_MAX_COUNT   32767

Definition at line 86 of file qmc5883.cpp.

Referenced by QMC5883::collect().

◆ QMC5883_MODE_REG_CONTINOUS_MODE

#define QMC5883_MODE_REG_CONTINOUS_MODE   (1 << 0)

Definition at line 108 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_MODE_REG_STANDBY

#define QMC5883_MODE_REG_STANDBY   (0 << 0)

Definition at line 107 of file qmc5883.cpp.

◆ QMC5883_OUTPUT_DATA_RATE_10

#define QMC5883_OUTPUT_DATA_RATE_10   (0 << 2) /* Hz */

Definition at line 109 of file qmc5883.cpp.

◆ QMC5883_OUTPUT_DATA_RATE_100

#define QMC5883_OUTPUT_DATA_RATE_100   (2 << 2)

Definition at line 111 of file qmc5883.cpp.

◆ QMC5883_OUTPUT_DATA_RATE_200

#define QMC5883_OUTPUT_DATA_RATE_200   (3 << 2)

Definition at line 112 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_OUTPUT_DATA_RATE_50

#define QMC5883_OUTPUT_DATA_RATE_50   (1 << 2)

Definition at line 110 of file qmc5883.cpp.

◆ QMC5883_OUTPUT_RANGE_2G

#define QMC5883_OUTPUT_RANGE_2G   (0 << 4) /* +/- 2 gauss */

Definition at line 113 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_OUTPUT_RANGE_8G

#define QMC5883_OUTPUT_RANGE_8G   (1 << 4) /* +/- 8 gauss */

Definition at line 114 of file qmc5883.cpp.

◆ QMC5883_OVERSAMPLE_128

#define QMC5883_OVERSAMPLE_128   (2 << 6)

Definition at line 117 of file qmc5883.cpp.

◆ QMC5883_OVERSAMPLE_256

#define QMC5883_OVERSAMPLE_256   (1 << 6)

Definition at line 116 of file qmc5883.cpp.

◆ QMC5883_OVERSAMPLE_512

#define QMC5883_OVERSAMPLE_512   (0 << 6) /* controls digital filter bw - larger OSR -> smaller bw */

Definition at line 115 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_OVERSAMPLE_64

#define QMC5883_OVERSAMPLE_64   (3 << 6)

Definition at line 118 of file qmc5883.cpp.

◆ QMC5883_ROL_PNT

#define QMC5883_ROL_PNT   (1 << 6)

Definition at line 122 of file qmc5883.cpp.

◆ QMC5883_SET_DEFAULT

#define QMC5883_SET_DEFAULT   (1 << 0)

Definition at line 126 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_SOFT_RESET

#define QMC5883_SOFT_RESET   (1 << 7)

Definition at line 123 of file qmc5883.cpp.

Referenced by QMC5883::reset().

◆ QMC5883_STATUS_REG_DOR

#define QMC5883_STATUS_REG_DOR   (1 << 2) /* Data Skip: "0": normal, "1": data skipped for reading */

Definition at line 104 of file qmc5883.cpp.

◆ QMC5883_STATUS_REG_DRDY

#define QMC5883_STATUS_REG_DRDY   (1 << 0) /* Data Ready: "0": no new data, "1": new data is ready */

Definition at line 102 of file qmc5883.cpp.

◆ QMC5883_STATUS_REG_OVL

#define QMC5883_STATUS_REG_OVL   (1 << 1) /* Overflow Flag: "0": normal, "1": data overflow */

Definition at line 103 of file qmc5883.cpp.

◆ QMC5883_TEMP_OFFSET

#define QMC5883_TEMP_OFFSET   50 /* deg celsius */

Definition at line 128 of file qmc5883.cpp.

Referenced by QMC5883::collect().

Enumeration Type Documentation

◆ QMC5883_BUS

Enumerator
QMC5883_BUS_ALL 
QMC5883_BUS_I2C_INTERNAL 
QMC5883_BUS_I2C_EXTERNAL 
QMC5883_BUS_SPI 

Definition at line 130 of file qmc5883.cpp.

Function Documentation

◆ qmc5883_main()

int qmc5883_main ( int  argc,
char *  argv[] 
)

Definition at line 1065 of file qmc5883.cpp.

References errx, qmc5883::info(), QMC5883_BUS_ALL, QMC5883_BUS_I2C_EXTERNAL, QMC5883_BUS_I2C_INTERNAL, QMC5883_BUS_SPI, qmc5883::reset(), ROTATION_NONE, qmc5883::start(), qmc5883::stop(), qmc5883::test(), and qmc5883::usage().

Here is the call graph for this function: