Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of AkmSensor by
akmakd.cpp@0:7a00359e701e, 2016-04-28 (annotated)
- Committer:
- masahikofukasawa
- Date:
- Thu Apr 28 21:12:04 2016 +0000
- Revision:
- 0:7a00359e701e
- Child:
- 7:e269411568c9
First commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masahikofukasawa | 0:7a00359e701e | 1 | #include "akmakd.h" |
masahikofukasawa | 0:7a00359e701e | 2 | #include "ak8963.h" |
masahikofukasawa | 0:7a00359e701e | 3 | #include "ak099xx.h" |
masahikofukasawa | 0:7a00359e701e | 4 | #include "debug.h" |
masahikofukasawa | 0:7a00359e701e | 5 | |
masahikofukasawa | 0:7a00359e701e | 6 | /** |
masahikofukasawa | 0:7a00359e701e | 7 | * Constructor. |
masahikofukasawa | 0:7a00359e701e | 8 | * |
masahikofukasawa | 0:7a00359e701e | 9 | */ |
masahikofukasawa | 0:7a00359e701e | 10 | AkmAkd::AkmAkd(){ |
masahikofukasawa | 0:7a00359e701e | 11 | event = false; |
masahikofukasawa | 0:7a00359e701e | 12 | compass = NULL; |
masahikofukasawa | 0:7a00359e701e | 13 | drdy = NULL; |
masahikofukasawa | 0:7a00359e701e | 14 | sensorName = ""; |
masahikofukasawa | 0:7a00359e701e | 15 | } |
masahikofukasawa | 0:7a00359e701e | 16 | |
masahikofukasawa | 0:7a00359e701e | 17 | /** |
masahikofukasawa | 0:7a00359e701e | 18 | * Destructor. |
masahikofukasawa | 0:7a00359e701e | 19 | * |
masahikofukasawa | 0:7a00359e701e | 20 | */ |
masahikofukasawa | 0:7a00359e701e | 21 | AkmAkd::~AkmAkd(){ |
masahikofukasawa | 0:7a00359e701e | 22 | drdy->rise(0); |
masahikofukasawa | 0:7a00359e701e | 23 | if (compass) delete compass; |
masahikofukasawa | 0:7a00359e701e | 24 | if (drdy) delete drdy; |
masahikofukasawa | 0:7a00359e701e | 25 | } |
masahikofukasawa | 0:7a00359e701e | 26 | |
masahikofukasawa | 0:7a00359e701e | 27 | AkmSensor::Status AkmAkd::init(const uint8_t id, const uint8_t subid){ |
masahikofukasawa | 0:7a00359e701e | 28 | primaryId = id; |
masahikofukasawa | 0:7a00359e701e | 29 | subId = subid; |
masahikofukasawa | 0:7a00359e701e | 30 | |
masahikofukasawa | 0:7a00359e701e | 31 | AkmECompass::SensorType type; |
masahikofukasawa | 0:7a00359e701e | 32 | |
masahikofukasawa | 0:7a00359e701e | 33 | drdy = new InterruptIn(DRDY); |
masahikofukasawa | 0:7a00359e701e | 34 | drdy->rise(0); |
masahikofukasawa | 0:7a00359e701e | 35 | |
masahikofukasawa | 0:7a00359e701e | 36 | if(primaryId == AKM_PRIMARY_ID_AKD_I2C){ |
masahikofukasawa | 0:7a00359e701e | 37 | |
masahikofukasawa | 0:7a00359e701e | 38 | I2C* i2c = new I2C(I2C_SDA,I2C_SCL); |
masahikofukasawa | 0:7a00359e701e | 39 | i2c->frequency(I2C_SPEED_100KHZ); |
masahikofukasawa | 0:7a00359e701e | 40 | |
masahikofukasawa | 0:7a00359e701e | 41 | AK099XX* ak099xx; |
masahikofukasawa | 0:7a00359e701e | 42 | AK8963* ak8963; |
masahikofukasawa | 0:7a00359e701e | 43 | |
masahikofukasawa | 0:7a00359e701e | 44 | switch(subid){ |
masahikofukasawa | 0:7a00359e701e | 45 | case AkmAkd::SUB_ID_AK8963N: |
masahikofukasawa | 0:7a00359e701e | 46 | case AkmAkd::SUB_ID_AK8963C: |
masahikofukasawa | 0:7a00359e701e | 47 | type = AkmECompass::AK8963; |
masahikofukasawa | 0:7a00359e701e | 48 | ak8963 = new AK8963(); |
masahikofukasawa | 0:7a00359e701e | 49 | compass = ak8963; |
masahikofukasawa | 0:7a00359e701e | 50 | AkmAkd::sensorName = "AK8963"; |
masahikofukasawa | 0:7a00359e701e | 51 | break; |
masahikofukasawa | 0:7a00359e701e | 52 | case AkmAkd::SUB_ID_AK09911: |
masahikofukasawa | 0:7a00359e701e | 53 | type = AkmECompass::AK09911; |
masahikofukasawa | 0:7a00359e701e | 54 | ak099xx = new AK099XX(); |
masahikofukasawa | 0:7a00359e701e | 55 | compass = ak099xx; |
masahikofukasawa | 0:7a00359e701e | 56 | AkmAkd::sensorName = "AK09911"; |
masahikofukasawa | 0:7a00359e701e | 57 | break; |
masahikofukasawa | 0:7a00359e701e | 58 | case AkmAkd::SUB_ID_AK09912: |
masahikofukasawa | 0:7a00359e701e | 59 | type = AkmECompass::AK09912; |
masahikofukasawa | 0:7a00359e701e | 60 | ak099xx = new AK099XX(); |
masahikofukasawa | 0:7a00359e701e | 61 | compass = ak099xx; |
masahikofukasawa | 0:7a00359e701e | 62 | AkmAkd::sensorName = "AK09912"; |
masahikofukasawa | 0:7a00359e701e | 63 | break; |
masahikofukasawa | 0:7a00359e701e | 64 | case AkmAkd::SUB_ID_AK09915: |
masahikofukasawa | 0:7a00359e701e | 65 | type = AkmECompass::AK09915; |
masahikofukasawa | 0:7a00359e701e | 66 | ak099xx = new AK099XX(); |
masahikofukasawa | 0:7a00359e701e | 67 | compass = ak099xx; |
masahikofukasawa | 0:7a00359e701e | 68 | AkmAkd::sensorName = "AK09915"; |
masahikofukasawa | 0:7a00359e701e | 69 | break; |
masahikofukasawa | 0:7a00359e701e | 70 | case AkmAkd::SUB_ID_AK09916C: |
masahikofukasawa | 0:7a00359e701e | 71 | type = AkmECompass::AK09916C; |
masahikofukasawa | 0:7a00359e701e | 72 | ak099xx = new AK099XX(); |
masahikofukasawa | 0:7a00359e701e | 73 | compass = ak099xx; |
masahikofukasawa | 0:7a00359e701e | 74 | AkmAkd::sensorName = "AK09916C"; |
masahikofukasawa | 0:7a00359e701e | 75 | break; |
masahikofukasawa | 0:7a00359e701e | 76 | default: |
masahikofukasawa | 0:7a00359e701e | 77 | return AkmSensor::ERROR; |
masahikofukasawa | 0:7a00359e701e | 78 | // break; |
masahikofukasawa | 0:7a00359e701e | 79 | } |
masahikofukasawa | 0:7a00359e701e | 80 | |
masahikofukasawa | 0:7a00359e701e | 81 | bool foundSensor = false; |
masahikofukasawa | 0:7a00359e701e | 82 | |
masahikofukasawa | 0:7a00359e701e | 83 | AkmECompass::SlaveAddress slaveAddr[] |
masahikofukasawa | 0:7a00359e701e | 84 | = { AkmECompass::SLAVE_ADDR_1, |
masahikofukasawa | 0:7a00359e701e | 85 | AkmECompass::SLAVE_ADDR_2, |
masahikofukasawa | 0:7a00359e701e | 86 | AkmECompass::SLAVE_ADDR_3, |
masahikofukasawa | 0:7a00359e701e | 87 | AkmECompass::SLAVE_ADDR_4}; |
masahikofukasawa | 0:7a00359e701e | 88 | |
masahikofukasawa | 0:7a00359e701e | 89 | for(int i=0; i<sizeof(slaveAddr); i++) |
masahikofukasawa | 0:7a00359e701e | 90 | { |
masahikofukasawa | 0:7a00359e701e | 91 | compass->init(i2c, slaveAddr[i], type); |
masahikofukasawa | 0:7a00359e701e | 92 | // Checks connectivity |
masahikofukasawa | 0:7a00359e701e | 93 | if(compass->checkConnection() == AkmECompass::SUCCESS) { |
masahikofukasawa | 0:7a00359e701e | 94 | // found |
masahikofukasawa | 0:7a00359e701e | 95 | foundSensor = true; |
masahikofukasawa | 0:7a00359e701e | 96 | break; |
masahikofukasawa | 0:7a00359e701e | 97 | } |
masahikofukasawa | 0:7a00359e701e | 98 | } |
masahikofukasawa | 0:7a00359e701e | 99 | if(foundSensor != true) return AkmSensor::ERROR; |
masahikofukasawa | 0:7a00359e701e | 100 | |
masahikofukasawa | 0:7a00359e701e | 101 | // read a data to reset DRDY |
masahikofukasawa | 0:7a00359e701e | 102 | AkmECompass::MagneticVector mag; |
masahikofukasawa | 0:7a00359e701e | 103 | compass->getMagneticVector(&mag); |
masahikofukasawa | 0:7a00359e701e | 104 | |
masahikofukasawa | 0:7a00359e701e | 105 | }else if(primaryId == AKM_PRIMARY_ID_AKD_SPI){ |
masahikofukasawa | 0:7a00359e701e | 106 | MSG("#Error: SPI doesn't support.\n"); |
masahikofukasawa | 0:7a00359e701e | 107 | |
masahikofukasawa | 0:7a00359e701e | 108 | return AkmSensor::ERROR_DOESNT_SUPPORT; |
masahikofukasawa | 0:7a00359e701e | 109 | // spi = new SPI(SPI_MOSI, SPI_MISO, SPI_SCK); |
masahikofukasawa | 0:7a00359e701e | 110 | // spi->format(8,3); // 8bit, Mode=3 |
masahikofukasawa | 0:7a00359e701e | 111 | // spi->frequency(100000); |
masahikofukasawa | 0:7a00359e701e | 112 | } |
masahikofukasawa | 0:7a00359e701e | 113 | |
masahikofukasawa | 0:7a00359e701e | 114 | MSG("#%s detected.\n", AkmAkd::sensorName); |
masahikofukasawa | 0:7a00359e701e | 115 | return AkmSensor::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 116 | } |
masahikofukasawa | 0:7a00359e701e | 117 | |
masahikofukasawa | 0:7a00359e701e | 118 | |
masahikofukasawa | 0:7a00359e701e | 119 | void AkmAkd::checkDRDY(){ |
masahikofukasawa | 0:7a00359e701e | 120 | AkmECompass::Status status = compass->isDataReady(); |
masahikofukasawa | 0:7a00359e701e | 121 | if( status == AkmECompass::DATA_READY || |
masahikofukasawa | 0:7a00359e701e | 122 | status == AkmECompass::DATA_OVER_RUN ) event = true; |
masahikofukasawa | 0:7a00359e701e | 123 | } |
masahikofukasawa | 0:7a00359e701e | 124 | |
masahikofukasawa | 0:7a00359e701e | 125 | void AkmAkd::detectDRDY(){ |
masahikofukasawa | 0:7a00359e701e | 126 | event = true; |
masahikofukasawa | 0:7a00359e701e | 127 | } |
masahikofukasawa | 0:7a00359e701e | 128 | |
masahikofukasawa | 0:7a00359e701e | 129 | bool AkmAkd::isEvent(){ |
masahikofukasawa | 0:7a00359e701e | 130 | return event; |
masahikofukasawa | 0:7a00359e701e | 131 | } |
masahikofukasawa | 0:7a00359e701e | 132 | |
masahikofukasawa | 0:7a00359e701e | 133 | AkmSensor::Status AkmAkd::startSensor(){ |
masahikofukasawa | 0:7a00359e701e | 134 | // Puts the device into continuous measurement mode. |
masahikofukasawa | 0:7a00359e701e | 135 | if(compass->setOperationMode((AkmECompass::OperationMode)0x02) != AkmECompass::SUCCESS) { |
masahikofukasawa | 0:7a00359e701e | 136 | return AkmSensor::ERROR; |
masahikofukasawa | 0:7a00359e701e | 137 | } |
masahikofukasawa | 0:7a00359e701e | 138 | |
masahikofukasawa | 0:7a00359e701e | 139 | // DRDY interrupt enable for AK8963/AK09912/AK09915 |
masahikofukasawa | 0:7a00359e701e | 140 | if(compass->getSensorType() == AkmECompass::AK8963 || |
masahikofukasawa | 0:7a00359e701e | 141 | compass->getSensorType() == AkmECompass::AK09912 || |
masahikofukasawa | 0:7a00359e701e | 142 | compass->getSensorType() == AkmECompass::AK09915 ){ |
masahikofukasawa | 0:7a00359e701e | 143 | drdy->rise(this, &AkmAkd::detectDRDY); |
masahikofukasawa | 0:7a00359e701e | 144 | } |
masahikofukasawa | 0:7a00359e701e | 145 | else{ |
masahikofukasawa | 0:7a00359e701e | 146 | ticker.attach(this, &AkmAkd::checkDRDY, 0.01); // 100Hz |
masahikofukasawa | 0:7a00359e701e | 147 | } |
masahikofukasawa | 0:7a00359e701e | 148 | return AkmSensor::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 149 | } |
masahikofukasawa | 0:7a00359e701e | 150 | |
masahikofukasawa | 0:7a00359e701e | 151 | AkmSensor::Status AkmAkd::startSensor(const float sec){ |
masahikofukasawa | 0:7a00359e701e | 152 | return AkmSensor::ERROR; // doesn't support |
masahikofukasawa | 0:7a00359e701e | 153 | } |
masahikofukasawa | 0:7a00359e701e | 154 | |
masahikofukasawa | 0:7a00359e701e | 155 | AkmSensor::Status AkmAkd::stopSensor(){ |
masahikofukasawa | 0:7a00359e701e | 156 | ticker.detach(); |
masahikofukasawa | 0:7a00359e701e | 157 | |
masahikofukasawa | 0:7a00359e701e | 158 | // Puts the device into power down mode. |
masahikofukasawa | 0:7a00359e701e | 159 | if(compass->setOperationMode(AkmECompass::MODE_POWER_DOWN) != AkmECompass::SUCCESS) { |
masahikofukasawa | 0:7a00359e701e | 160 | return AkmSensor::ERROR; |
masahikofukasawa | 0:7a00359e701e | 161 | } |
masahikofukasawa | 0:7a00359e701e | 162 | return AkmSensor::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 163 | } |
masahikofukasawa | 0:7a00359e701e | 164 | |
masahikofukasawa | 0:7a00359e701e | 165 | AkmSensor::Status AkmAkd::readSensorData(Message* msg){ |
masahikofukasawa | 0:7a00359e701e | 166 | event = false; |
masahikofukasawa | 0:7a00359e701e | 167 | |
masahikofukasawa | 0:7a00359e701e | 168 | AkmECompass::MagneticVector mag; |
masahikofukasawa | 0:7a00359e701e | 169 | AkmECompass::Status status = compass->getMagneticVector(&mag); |
masahikofukasawa | 0:7a00359e701e | 170 | if( status != AkmECompass::SUCCESS){ |
masahikofukasawa | 0:7a00359e701e | 171 | return AkmSensor::ERROR; |
masahikofukasawa | 0:7a00359e701e | 172 | } |
masahikofukasawa | 0:7a00359e701e | 173 | msg->setCommand(Message::CMD_START_MEASUREMENT); |
masahikofukasawa | 0:7a00359e701e | 174 | msg->setArgument( 0, (mag.isOverflow ? 1 : 0) ); |
masahikofukasawa | 0:7a00359e701e | 175 | msg->setArgument( 1,(char)((int32_t)(mag.mx/0.15) >> 8)); |
masahikofukasawa | 0:7a00359e701e | 176 | msg->setArgument( 2, (char)((int32_t)(mag.mx/0.15) & 0x00FF) ); |
masahikofukasawa | 0:7a00359e701e | 177 | msg->setArgument( 3, (char)((int32_t)(mag.my/0.15) >> 8) ); |
masahikofukasawa | 0:7a00359e701e | 178 | msg->setArgument( 4, (char)((int32_t)(mag.my/0.15) & 0x00FF) ); |
masahikofukasawa | 0:7a00359e701e | 179 | msg->setArgument( 5, (char)((int32_t)(mag.mz/0.15) >> 8) ); |
masahikofukasawa | 0:7a00359e701e | 180 | msg->setArgument( 6, (char)((int32_t)(mag.mz/0.15) & 0x00FF) ); |
masahikofukasawa | 0:7a00359e701e | 181 | return AkmSensor::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 182 | } |
masahikofukasawa | 0:7a00359e701e | 183 | |
masahikofukasawa | 0:7a00359e701e | 184 | AkmSensor::Status AkmAkd::requestCommand(Message* in, Message* out){ |
masahikofukasawa | 0:7a00359e701e | 185 | return AkmSensor::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 186 | } |
masahikofukasawa | 0:7a00359e701e | 187 | |
masahikofukasawa | 0:7a00359e701e | 188 | char* AkmAkd::getSensorName(){ |
masahikofukasawa | 0:7a00359e701e | 189 | return sensorName; |
masahikofukasawa | 0:7a00359e701e | 190 | } |