Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Committer:
masahikofukasawa
Date:
Thu May 26 21:56:45 2016 +0000
Revision:
7:e269411568c9
Parent:
0:7a00359e701e
Child:
9:6fa3e7b17c27
5/26/2016 Japan Demo Version; Modified For: SPI

Who changed what in which revision?

UserRevisionLine numberNew 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 7:e269411568c9 32 AK099XX* ak099xx;
masahikofukasawa 7:e269411568c9 33 AK8963* ak8963;
masahikofukasawa 0:7a00359e701e 34
masahikofukasawa 0:7a00359e701e 35 if(primaryId == AKM_PRIMARY_ID_AKD_I2C){
masahikofukasawa 0:7a00359e701e 36
masahikofukasawa 7:e269411568c9 37 drdy = new InterruptIn(I2C_DRDY);
masahikofukasawa 7:e269411568c9 38 drdy->rise(0);
masahikofukasawa 7:e269411568c9 39
masahikofukasawa 0:7a00359e701e 40 I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
masahikofukasawa 0:7a00359e701e 41 i2c->frequency(I2C_SPEED_100KHZ);
masahikofukasawa 0:7a00359e701e 42
masahikofukasawa 0:7a00359e701e 43 switch(subid){
masahikofukasawa 0:7a00359e701e 44 case AkmAkd::SUB_ID_AK8963N:
masahikofukasawa 0:7a00359e701e 45 case AkmAkd::SUB_ID_AK8963C:
masahikofukasawa 0:7a00359e701e 46 type = AkmECompass::AK8963;
masahikofukasawa 0:7a00359e701e 47 ak8963 = new AK8963();
masahikofukasawa 0:7a00359e701e 48 compass = ak8963;
masahikofukasawa 0:7a00359e701e 49 AkmAkd::sensorName = "AK8963";
masahikofukasawa 0:7a00359e701e 50 break;
masahikofukasawa 0:7a00359e701e 51 case AkmAkd::SUB_ID_AK09911:
masahikofukasawa 0:7a00359e701e 52 type = AkmECompass::AK09911;
masahikofukasawa 0:7a00359e701e 53 ak099xx = new AK099XX();
masahikofukasawa 0:7a00359e701e 54 compass = ak099xx;
masahikofukasawa 0:7a00359e701e 55 AkmAkd::sensorName = "AK09911";
masahikofukasawa 0:7a00359e701e 56 break;
masahikofukasawa 0:7a00359e701e 57 case AkmAkd::SUB_ID_AK09912:
masahikofukasawa 0:7a00359e701e 58 type = AkmECompass::AK09912;
masahikofukasawa 0:7a00359e701e 59 ak099xx = new AK099XX();
masahikofukasawa 0:7a00359e701e 60 compass = ak099xx;
masahikofukasawa 0:7a00359e701e 61 AkmAkd::sensorName = "AK09912";
masahikofukasawa 0:7a00359e701e 62 break;
masahikofukasawa 0:7a00359e701e 63 case AkmAkd::SUB_ID_AK09915:
masahikofukasawa 0:7a00359e701e 64 type = AkmECompass::AK09915;
masahikofukasawa 0:7a00359e701e 65 ak099xx = new AK099XX();
masahikofukasawa 0:7a00359e701e 66 compass = ak099xx;
masahikofukasawa 0:7a00359e701e 67 AkmAkd::sensorName = "AK09915";
masahikofukasawa 0:7a00359e701e 68 break;
masahikofukasawa 0:7a00359e701e 69 case AkmAkd::SUB_ID_AK09916C:
masahikofukasawa 0:7a00359e701e 70 type = AkmECompass::AK09916C;
masahikofukasawa 0:7a00359e701e 71 ak099xx = new AK099XX();
masahikofukasawa 0:7a00359e701e 72 compass = ak099xx;
masahikofukasawa 0:7a00359e701e 73 AkmAkd::sensorName = "AK09916C";
masahikofukasawa 0:7a00359e701e 74 break;
masahikofukasawa 0:7a00359e701e 75 default:
masahikofukasawa 0:7a00359e701e 76 return AkmSensor::ERROR;
masahikofukasawa 0:7a00359e701e 77 // break;
masahikofukasawa 0:7a00359e701e 78 }
masahikofukasawa 0:7a00359e701e 79
masahikofukasawa 0:7a00359e701e 80 bool foundSensor = false;
masahikofukasawa 0:7a00359e701e 81
masahikofukasawa 0:7a00359e701e 82 AkmECompass::SlaveAddress slaveAddr[]
masahikofukasawa 0:7a00359e701e 83 = { AkmECompass::SLAVE_ADDR_1,
masahikofukasawa 0:7a00359e701e 84 AkmECompass::SLAVE_ADDR_2,
masahikofukasawa 0:7a00359e701e 85 AkmECompass::SLAVE_ADDR_3,
masahikofukasawa 0:7a00359e701e 86 AkmECompass::SLAVE_ADDR_4};
masahikofukasawa 0:7a00359e701e 87
masahikofukasawa 0:7a00359e701e 88 for(int i=0; i<sizeof(slaveAddr); i++)
masahikofukasawa 0:7a00359e701e 89 {
masahikofukasawa 0:7a00359e701e 90 compass->init(i2c, slaveAddr[i], type);
masahikofukasawa 0:7a00359e701e 91 // Checks connectivity
masahikofukasawa 0:7a00359e701e 92 if(compass->checkConnection() == AkmECompass::SUCCESS) {
masahikofukasawa 0:7a00359e701e 93 // found
masahikofukasawa 0:7a00359e701e 94 foundSensor = true;
masahikofukasawa 0:7a00359e701e 95 break;
masahikofukasawa 0:7a00359e701e 96 }
masahikofukasawa 0:7a00359e701e 97 }
masahikofukasawa 7:e269411568c9 98 if(foundSensor != true){
masahikofukasawa 7:e269411568c9 99 return AkmSensor::ERROR;
masahikofukasawa 7:e269411568c9 100 }
masahikofukasawa 0:7a00359e701e 101
masahikofukasawa 0:7a00359e701e 102 // read a data to reset DRDY
masahikofukasawa 0:7a00359e701e 103 AkmECompass::MagneticVector mag;
masahikofukasawa 0:7a00359e701e 104 compass->getMagneticVector(&mag);
masahikofukasawa 0:7a00359e701e 105
masahikofukasawa 0:7a00359e701e 106 }else if(primaryId == AKM_PRIMARY_ID_AKD_SPI){
masahikofukasawa 7:e269411568c9 107
masahikofukasawa 7:e269411568c9 108 drdy = new InterruptIn(SPI_DRDY);
masahikofukasawa 7:e269411568c9 109 drdy->rise(0);
masahikofukasawa 0:7a00359e701e 110
masahikofukasawa 7:e269411568c9 111 SPI* spi = new SPI(SPI_MOSI, SPI_MISO, SPI_SCK);
masahikofukasawa 7:e269411568c9 112 spi->format(8,3); // 8bit, Mode=3
masahikofukasawa 7:e269411568c9 113 spi->frequency(1000000);
masahikofukasawa 7:e269411568c9 114
masahikofukasawa 7:e269411568c9 115 DigitalOut* cs = new DigitalOut(SPI_CS);
masahikofukasawa 7:e269411568c9 116
masahikofukasawa 7:e269411568c9 117 switch(subid){
masahikofukasawa 7:e269411568c9 118 case AkmAkd::SUB_ID_AK8963N:
masahikofukasawa 7:e269411568c9 119 case AkmAkd::SUB_ID_AK8963C:
masahikofukasawa 7:e269411568c9 120 type = AkmECompass::AK8963;
masahikofukasawa 7:e269411568c9 121 ak8963 = new AK8963();
masahikofukasawa 7:e269411568c9 122 compass = ak8963;
masahikofukasawa 7:e269411568c9 123 AkmAkd::sensorName = "AK8963";
masahikofukasawa 7:e269411568c9 124 break;
masahikofukasawa 7:e269411568c9 125 case AkmAkd::SUB_ID_AK09911:
masahikofukasawa 7:e269411568c9 126 type = AkmECompass::AK09911;
masahikofukasawa 7:e269411568c9 127 AkmAkd::sensorName = "AK09911";
masahikofukasawa 7:e269411568c9 128 return AkmSensor::ERROR;
masahikofukasawa 7:e269411568c9 129 case AkmAkd::SUB_ID_AK09912:
masahikofukasawa 7:e269411568c9 130 type = AkmECompass::AK09912;
masahikofukasawa 7:e269411568c9 131 ak099xx = new AK099XX();
masahikofukasawa 7:e269411568c9 132 compass = ak099xx;
masahikofukasawa 7:e269411568c9 133 AkmAkd::sensorName = "AK09912";
masahikofukasawa 7:e269411568c9 134 break;
masahikofukasawa 7:e269411568c9 135 case AkmAkd::SUB_ID_AK09915:
masahikofukasawa 7:e269411568c9 136 type = AkmECompass::AK09915;
masahikofukasawa 7:e269411568c9 137 ak099xx = new AK099XX();
masahikofukasawa 7:e269411568c9 138 compass = ak099xx;
masahikofukasawa 7:e269411568c9 139 AkmAkd::sensorName = "AK09915";
masahikofukasawa 7:e269411568c9 140 break;
masahikofukasawa 7:e269411568c9 141 case AkmAkd::SUB_ID_AK09916C:
masahikofukasawa 7:e269411568c9 142 type = AkmECompass::AK09916C;
masahikofukasawa 7:e269411568c9 143 AkmAkd::sensorName = "AK09916C";
masahikofukasawa 7:e269411568c9 144 // doesn't support SPI
masahikofukasawa 7:e269411568c9 145 return AkmSensor::ERROR;
masahikofukasawa 7:e269411568c9 146 default:
masahikofukasawa 7:e269411568c9 147 return AkmSensor::ERROR;
masahikofukasawa 7:e269411568c9 148 // break;
masahikofukasawa 7:e269411568c9 149 }
masahikofukasawa 7:e269411568c9 150
masahikofukasawa 7:e269411568c9 151 bool foundSensor = false;
masahikofukasawa 7:e269411568c9 152 compass->init(spi, cs, type);
masahikofukasawa 7:e269411568c9 153 if(compass->checkConnection() == AkmECompass::SUCCESS) {
masahikofukasawa 7:e269411568c9 154 foundSensor = true;
masahikofukasawa 7:e269411568c9 155 }
masahikofukasawa 7:e269411568c9 156 if(foundSensor != true){
masahikofukasawa 7:e269411568c9 157 MSG("#failed checkConnetion(SPI). %s\n",AkmAkd::sensorName);
masahikofukasawa 7:e269411568c9 158 return AkmSensor::ERROR;
masahikofukasawa 7:e269411568c9 159 }
masahikofukasawa 7:e269411568c9 160 // read a data to reset DRDY
masahikofukasawa 7:e269411568c9 161 AkmECompass::MagneticVector mag;
masahikofukasawa 7:e269411568c9 162 compass->getMagneticVector(&mag);
masahikofukasawa 0:7a00359e701e 163 }
masahikofukasawa 0:7a00359e701e 164
masahikofukasawa 0:7a00359e701e 165 MSG("#%s detected.\n", AkmAkd::sensorName);
masahikofukasawa 0:7a00359e701e 166 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 167 }
masahikofukasawa 0:7a00359e701e 168
masahikofukasawa 0:7a00359e701e 169
masahikofukasawa 0:7a00359e701e 170 void AkmAkd::checkDRDY(){
masahikofukasawa 0:7a00359e701e 171 AkmECompass::Status status = compass->isDataReady();
masahikofukasawa 0:7a00359e701e 172 if( status == AkmECompass::DATA_READY ||
masahikofukasawa 0:7a00359e701e 173 status == AkmECompass::DATA_OVER_RUN ) event = true;
masahikofukasawa 0:7a00359e701e 174 }
masahikofukasawa 0:7a00359e701e 175
masahikofukasawa 0:7a00359e701e 176 void AkmAkd::detectDRDY(){
masahikofukasawa 0:7a00359e701e 177 event = true;
masahikofukasawa 0:7a00359e701e 178 }
masahikofukasawa 0:7a00359e701e 179
masahikofukasawa 0:7a00359e701e 180 bool AkmAkd::isEvent(){
masahikofukasawa 0:7a00359e701e 181 return event;
masahikofukasawa 0:7a00359e701e 182 }
masahikofukasawa 0:7a00359e701e 183
masahikofukasawa 0:7a00359e701e 184 AkmSensor::Status AkmAkd::startSensor(){
masahikofukasawa 0:7a00359e701e 185 // Puts the device into continuous measurement mode.
masahikofukasawa 0:7a00359e701e 186 if(compass->setOperationMode((AkmECompass::OperationMode)0x02) != AkmECompass::SUCCESS) {
masahikofukasawa 0:7a00359e701e 187 return AkmSensor::ERROR;
masahikofukasawa 0:7a00359e701e 188 }
masahikofukasawa 0:7a00359e701e 189
masahikofukasawa 7:e269411568c9 190 // DRDY interrupt enable for AK8963/AK09912/AK09915 with I2C interface
masahikofukasawa 7:e269411568c9 191 if(primaryId == AKM_PRIMARY_ID_AKD_I2C &&
masahikofukasawa 7:e269411568c9 192 (compass->getSensorType() == AkmECompass::AK8963 ||
masahikofukasawa 7:e269411568c9 193 compass->getSensorType() == AkmECompass::AK09912 ||
masahikofukasawa 7:e269411568c9 194 compass->getSensorType() == AkmECompass::AK09915) ){
masahikofukasawa 0:7a00359e701e 195 drdy->rise(this, &AkmAkd::detectDRDY);
masahikofukasawa 0:7a00359e701e 196 }
masahikofukasawa 0:7a00359e701e 197 else{
masahikofukasawa 0:7a00359e701e 198 ticker.attach(this, &AkmAkd::checkDRDY, 0.01); // 100Hz
masahikofukasawa 0:7a00359e701e 199 }
masahikofukasawa 0:7a00359e701e 200 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 201 }
masahikofukasawa 0:7a00359e701e 202
masahikofukasawa 0:7a00359e701e 203 AkmSensor::Status AkmAkd::startSensor(const float sec){
masahikofukasawa 0:7a00359e701e 204 return AkmSensor::ERROR; // doesn't support
masahikofukasawa 0:7a00359e701e 205 }
masahikofukasawa 0:7a00359e701e 206
masahikofukasawa 0:7a00359e701e 207 AkmSensor::Status AkmAkd::stopSensor(){
masahikofukasawa 0:7a00359e701e 208 ticker.detach();
masahikofukasawa 0:7a00359e701e 209
masahikofukasawa 0:7a00359e701e 210 // Puts the device into power down mode.
masahikofukasawa 0:7a00359e701e 211 if(compass->setOperationMode(AkmECompass::MODE_POWER_DOWN) != AkmECompass::SUCCESS) {
masahikofukasawa 0:7a00359e701e 212 return AkmSensor::ERROR;
masahikofukasawa 0:7a00359e701e 213 }
masahikofukasawa 0:7a00359e701e 214 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 215 }
masahikofukasawa 0:7a00359e701e 216
masahikofukasawa 0:7a00359e701e 217 AkmSensor::Status AkmAkd::readSensorData(Message* msg){
masahikofukasawa 0:7a00359e701e 218 event = false;
masahikofukasawa 0:7a00359e701e 219
masahikofukasawa 0:7a00359e701e 220 AkmECompass::MagneticVector mag;
masahikofukasawa 0:7a00359e701e 221 AkmECompass::Status status = compass->getMagneticVector(&mag);
masahikofukasawa 0:7a00359e701e 222 if( status != AkmECompass::SUCCESS){
masahikofukasawa 0:7a00359e701e 223 return AkmSensor::ERROR;
masahikofukasawa 0:7a00359e701e 224 }
masahikofukasawa 0:7a00359e701e 225 msg->setCommand(Message::CMD_START_MEASUREMENT);
masahikofukasawa 0:7a00359e701e 226 msg->setArgument( 0, (mag.isOverflow ? 1 : 0) );
masahikofukasawa 0:7a00359e701e 227 msg->setArgument( 1,(char)((int32_t)(mag.mx/0.15) >> 8));
masahikofukasawa 0:7a00359e701e 228 msg->setArgument( 2, (char)((int32_t)(mag.mx/0.15) & 0x00FF) );
masahikofukasawa 0:7a00359e701e 229 msg->setArgument( 3, (char)((int32_t)(mag.my/0.15) >> 8) );
masahikofukasawa 0:7a00359e701e 230 msg->setArgument( 4, (char)((int32_t)(mag.my/0.15) & 0x00FF) );
masahikofukasawa 0:7a00359e701e 231 msg->setArgument( 5, (char)((int32_t)(mag.mz/0.15) >> 8) );
masahikofukasawa 0:7a00359e701e 232 msg->setArgument( 6, (char)((int32_t)(mag.mz/0.15) & 0x00FF) );
masahikofukasawa 0:7a00359e701e 233 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 234 }
masahikofukasawa 0:7a00359e701e 235
masahikofukasawa 0:7a00359e701e 236 AkmSensor::Status AkmAkd::requestCommand(Message* in, Message* out){
masahikofukasawa 0:7a00359e701e 237 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 238 }
masahikofukasawa 0:7a00359e701e 239
masahikofukasawa 0:7a00359e701e 240 char* AkmAkd::getSensorName(){
masahikofukasawa 0:7a00359e701e 241 return sensorName;
masahikofukasawa 0:7a00359e701e 242 }