Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

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?

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 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 }