First draft HMC5883 magnetometer sensor using physical quantities, outputting via serial port using std::cout on mbed os 5

Committer:
skyscraper
Date:
Thu Mar 26 22:58:21 2020 +0000
Revision:
11:de7c9ae7ef65
Parent:
8:c5dc1ce10722
Changed to use threads

Who changed what in which revision?

UserRevisionLine numberNew contents of line
skyscraper 2:9ffb2f18756b 1
skyscraper 8:c5dc1ce10722 2 #ifndef SKYSCRAPER_MBED_HMC5883L_H_INCLUDED
skyscraper 8:c5dc1ce10722 3 #define SKYSCRAPER_MBED_HMC5883L_H_INCLUDED
skyscraper 2:9ffb2f18756b 4
skyscraper 8:c5dc1ce10722 5 #include "magnetometer.h"
skyscraper 8:c5dc1ce10722 6 #include "I2CBusDevice.h"
skyscraper 2:9ffb2f18756b 7
skyscraper 8:c5dc1ce10722 8 struct hmc5883L : I2CBusDevice{
skyscraper 8:c5dc1ce10722 9
skyscraper 8:c5dc1ce10722 10 hmc5883L(I2C& i2cIn,uint8_t addressIn);
skyscraper 2:9ffb2f18756b 11
skyscraper 8:c5dc1ce10722 12 bool detected(bool verbose)const;
skyscraper 8:c5dc1ce10722 13
skyscraper 8:c5dc1ce10722 14 bool data_ready()const;
skyscraper 8:c5dc1ce10722 15
skyscraper 8:c5dc1ce10722 16 // assume mag_data_ready has returned true before call
skyscraper 8:c5dc1ce10722 17 bool read(quan::three_d::vect<quan::magnetic_flux_density::uT> & v)const;
skyscraper 8:c5dc1ce10722 18
skyscraper 8:c5dc1ce10722 19 bool start_measurement()const;
skyscraper 8:c5dc1ce10722 20
skyscraper 8:c5dc1ce10722 21 private:
skyscraper 2:9ffb2f18756b 22
skyscraper 8:c5dc1ce10722 23 friend bool mag_init();
skyscraper 8:c5dc1ce10722 24
skyscraper 8:c5dc1ce10722 25 bool make_measurement(
skyscraper 8:c5dc1ce10722 26 quan::three_d::vect<
skyscraper 8:c5dc1ce10722 27 quan::magnetic_flux_density::uT
skyscraper 8:c5dc1ce10722 28 >& result
skyscraper 8:c5dc1ce10722 29 )const;
skyscraper 8:c5dc1ce10722 30 // bool write_reg(uint8_t idx, uint8_t val)const;
skyscraper 8:c5dc1ce10722 31 bool set_reg_idx(uint8_t idx_in)const;
skyscraper 8:c5dc1ce10722 32
skyscraper 8:c5dc1ce10722 33 // 00 Configuration Register A R/W
skyscraper 8:c5dc1ce10722 34 static constexpr char cfg_regA = 0;
skyscraper 8:c5dc1ce10722 35
skyscraper 8:c5dc1ce10722 36 //01 Configuration Register B R/W
skyscraper 8:c5dc1ce10722 37 static constexpr char cfg_regB = 1;
skyscraper 8:c5dc1ce10722 38
skyscraper 8:c5dc1ce10722 39 //02 Mode Register R/W
skyscraper 8:c5dc1ce10722 40 static constexpr char mode_reg = 2;
skyscraper 8:c5dc1ce10722 41
skyscraper 8:c5dc1ce10722 42 //03 Data Output X MSB Register R
skyscraper 8:c5dc1ce10722 43 static constexpr char dout_reg = 3;
skyscraper 8:c5dc1ce10722 44 //04 Data Output X LSB Register R
skyscraper 8:c5dc1ce10722 45 //05 Data Output Z MSB Register R
skyscraper 8:c5dc1ce10722 46 //06 Data Output Z LSB Register R
skyscraper 8:c5dc1ce10722 47 //07 Data Output Y MSB Register R
skyscraper 8:c5dc1ce10722 48 //08 Data Output Y LSB Register R
skyscraper 8:c5dc1ce10722 49
skyscraper 8:c5dc1ce10722 50 // 09 Status Register R
skyscraper 8:c5dc1ce10722 51 static constexpr char status_reg = 9;
skyscraper 8:c5dc1ce10722 52
skyscraper 8:c5dc1ce10722 53 // 10 Identification Register A R
skyscraper 8:c5dc1ce10722 54 static constexpr char id_regA = 10;
skyscraper 8:c5dc1ce10722 55 // 11 Identification Register B R
skyscraper 8:c5dc1ce10722 56 // 12 Identification Register C R
skyscraper 8:c5dc1ce10722 57
skyscraper 8:c5dc1ce10722 58 bool write_reg(uint8_t idx, uint8_t val)const;
skyscraper 8:c5dc1ce10722 59 bool get_reg(uint8_t idx_in, uint8_t& result)const;
skyscraper 8:c5dc1ce10722 60 bool modify_reg(uint8_t idx, uint8_t and_val, uint8_t or_val)const;
skyscraper 8:c5dc1ce10722 61 bool data_locked()const;
skyscraper 8:c5dc1ce10722 62 bool set_continuous_measurement_mode()const;
skyscraper 8:c5dc1ce10722 63 bool set_gain( quan::three_d::vect<double> const & gain);
skyscraper 8:c5dc1ce10722 64 bool set_offset(quan::three_d::vect<
skyscraper 8:c5dc1ce10722 65 quan::magnetic_flux_density::uT
skyscraper 8:c5dc1ce10722 66 > const & offset);
skyscraper 8:c5dc1ce10722 67
skyscraper 8:c5dc1ce10722 68 bool set_idle_mode()const;
skyscraper 8:c5dc1ce10722 69
skyscraper 8:c5dc1ce10722 70 // 1,2,4,8 available
skyscraper 8:c5dc1ce10722 71 bool set_samples_average(int n_samples)const;
skyscraper 8:c5dc1ce10722 72
skyscraper 8:c5dc1ce10722 73 // may change so that always one-shot
skyscraper 8:c5dc1ce10722 74 // ignore continousos mode
skyscraper 8:c5dc1ce10722 75 //data rate 0.75, 1.5, 3 ,7.5, 15 (Default) , 30, 75
skyscraper 8:c5dc1ce10722 76 template <int N, int D=1>
skyscraper 8:c5dc1ce10722 77 bool set_data_rate()const;
skyscraper 8:c5dc1ce10722 78
skyscraper 8:c5dc1ce10722 79 bool set_positive_bias()const;
skyscraper 8:c5dc1ce10722 80 bool set_negative_bias()const;
skyscraper 8:c5dc1ce10722 81 bool mag_clear_bias()const;
skyscraper 8:c5dc1ce10722 82 bool set_range(quan::magnetic_flux_density::uT const & range_in);
skyscraper 8:c5dc1ce10722 83
skyscraper 8:c5dc1ce10722 84 quan::magnetic_flux_density::uT
skyscraper 8:c5dc1ce10722 85 get_flux_density_range()const;
skyscraper 8:c5dc1ce10722 86 //------------
skyscraper 8:c5dc1ce10722 87 // per lsb defualt resolution
skyscraper 8:c5dc1ce10722 88 quan::magnetic_flux_density::uT mag_resolution;
skyscraper 8:c5dc1ce10722 89 // range before saturation
skyscraper 8:c5dc1ce10722 90 quan::magnetic_flux_density::uT mag_range;
skyscraper 8:c5dc1ce10722 91 quan::three_d::vect<double> mag_gain;
skyscraper 8:c5dc1ce10722 92 quan::three_d::vect<quan::magnetic_flux_density::uT> mag_offset;
skyscraper 8:c5dc1ce10722 93 };
skyscraper 2:9ffb2f18756b 94
skyscraper 2:9ffb2f18756b 95
skyscraper 8:c5dc1ce10722 96
skyscraper 2:9ffb2f18756b 97
skyscraper 2:9ffb2f18756b 98
skyscraper 8:c5dc1ce10722 99 #endif