Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Revision:
20:2fca76521680
Parent:
19:8dcc4f323bdc
Child:
27:41aa9fb23a2f
--- a/akmakd.cpp	Wed Feb 22 18:47:01 2017 +0000
+++ b/akmakd.cpp	Wed Feb 22 21:56:05 2017 +0000
@@ -24,20 +24,20 @@
     if (drdy) delete drdy;
 }
 
-AkmSensor::Status AkmAkd::checkSensor( const uint8_t id, const uint8_t subid, AkmECompass::SensorType* type){
+AkmSensor::Status AkmAkd::checkSensor( const uint8_t primaryid, const uint8_t subid, AkmECompass::DeviceId* devid){
     AK099XX* ak099xx;
     AK8963* ak8963;
     
     switch(subid){
         case AkmAkd::SUB_ID_AK8963N:
         case AkmAkd::SUB_ID_AK8963C:
-            *type = AkmECompass::AK8963;
+            *devid = AkmECompass::AK8963;
             AkmAkd::sensorName = "AK8963";
             ak8963 = new AK8963();
             compass = ak8963;
             break;
         case AkmAkd::SUB_ID_AK09911C:
-            *type = AkmECompass::AK09911;
+            *devid = AkmECompass::AK09911;
             AkmAkd::sensorName = "AK09911C";
             if(primaryId == AKM_PRIMARY_ID_AKD_SPI) 
                 return AkmSensor::ERROR;    // No SPI support
@@ -45,25 +45,25 @@
             compass = ak099xx;
             break;
         case AkmAkd::SUB_ID_AK09912C:
-            *type = AkmECompass::AK09912;
+            *devid = AkmECompass::AK09912;
             AkmAkd::sensorName = "AK09912C";
             ak099xx = new AK099XX();
             compass = ak099xx;
             break;
         case AkmAkd::SUB_ID_AK09915C:
-            *type = AkmECompass::AK09915;
+            *devid = AkmECompass::AK09915;
             AkmAkd::sensorName = "AK09915C";
             ak099xx = new AK099XX();
             compass = ak099xx;
             break;
         case AkmAkd::SUB_ID_AK09915D:
-            *type = AkmECompass::AK09915;
+            *devid = AkmECompass::AK09915;
             AkmAkd::sensorName = "AK09915D";
             ak099xx = new AK099XX();
             compass = ak099xx;
             break;
         case AkmAkd::SUB_ID_AK09916C:
-            *type = AkmECompass::AK09916C;
+            *devid = AkmECompass::AK09916C;
             AkmAkd::sensorName = "AK09916C";
             if(primaryId == AKM_PRIMARY_ID_AKD_SPI) 
                 return AkmSensor::ERROR;    // No SPI support
@@ -71,7 +71,7 @@
             compass = ak099xx;
             break;
         case AkmAkd::SUB_ID_AK09916D:
-            *type = AkmECompass::AK09916D;
+            *devid = AkmECompass::AK09916D;
             AkmAkd::sensorName = "AK09916D";
             if(primaryId == AKM_PRIMARY_ID_AKD_SPI) 
                 return AkmSensor::ERROR;    // No SPI support
@@ -79,7 +79,7 @@
             compass = ak099xx;
             break;
         case AkmAkd::SUB_ID_AK09918:
-            *type = AkmECompass::AK09918;
+            *devid = AkmECompass::AK09918;
             AkmAkd::sensorName = "AK09918";
             if(primaryId == AKM_PRIMARY_ID_AKD_SPI) 
                 return AkmSensor::ERROR;    // No SPI support
@@ -92,11 +92,11 @@
     return AkmSensor::SUCCESS;    
 }
 
-AkmSensor::Status AkmAkd::init(const uint8_t id, const uint8_t subid){
-    primaryId = id;
+AkmSensor::Status AkmAkd::init(const uint8_t primaryid, const uint8_t subid){
+    primaryId = primaryid;
     subId = subid;
     
-    AkmECompass::SensorType type;
+    AkmECompass::DeviceId devid;
 
     mode = AkmECompass::MODE_POWER_DOWN;
     nsf = AkmECompass::NSF_DISABLE;
@@ -110,7 +110,7 @@
         I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
         i2c->frequency(I2C_SPEED_100KHZ);
 
-        if( checkSensor(id,subid,&type) != AkmSensor::SUCCESS ){
+        if( checkSensor(primaryId,subId,&devid) != AkmSensor::SUCCESS ){
             return AkmSensor::ERROR;
         }
         
@@ -122,7 +122,7 @@
 
         for(int i=0; i<sizeof(slaveAddr); i++)
         {
-            compass->init(i2c, slaveAddr[i], type);
+            compass->init(i2c, slaveAddr[i], devid);
             // Checks connectivity
             if(compass->checkConnection() == AkmECompass::SUCCESS) {
                 MSG("#%s detected.\r\n", AkmAkd::sensorName);
@@ -140,11 +140,11 @@
         
         DigitalOut* cs = new DigitalOut(SPI_CS);
 
-        if( checkSensor(id,subid,&type) != AkmSensor::SUCCESS ){
+        if( checkSensor(primaryId,subId,&devid) != AkmSensor::SUCCESS ){
             return AkmSensor::ERROR;
         }
         
-        compass->init(spi, cs, type);
+        compass->init(spi, cs, devid);
         if(compass->checkConnection() == AkmECompass::SUCCESS) {
             MSG("#%s detected.\r\n", AkmAkd::sensorName);
             return AkmSensor::SUCCESS;
@@ -190,7 +190,6 @@
     return ret;
 }
 
-
 AkmSensor::Status AkmAkd::startSensor(){
     // read one data to clear DRDY 
     AkmECompass::MagneticVector mag;
@@ -208,7 +207,7 @@
     }
     else{
         // No DRDY
-        ticker.attach(callback(this, &AkmAkd::checkDRDY), 0.005);  // 200Hz
+        ticker.attach(callback(this, &AkmAkd::checkDRDY), 1.0/AKDP_POLLING_FREQUENCY);
     }
     
     // set operation mode
@@ -255,11 +254,18 @@
     else{
         // No DRDY
     }
-    
+
     // Puts the device into power down mode.
-    if(compass->setOperationMode(AkmECompass::MODE_POWER_DOWN) != AkmECompass::SUCCESS) {
-        return AkmSensor::ERROR;
+    if( subId == AkmAkd::SUB_ID_AK09915C || subId == AkmAkd::SUB_ID_AK09915D ){
+        if(compass->setOperationMode(AkmECompass::MODE_POWER_DOWN,nsf,sdr) != AkmECompass::SUCCESS) {
+            return AkmSensor::ERROR;
+        }
+    }else{
+        if(compass->setOperationMode(AkmECompass::MODE_POWER_DOWN) != AkmECompass::SUCCESS) {
+            return AkmSensor::ERROR;
+        }        
     }
+    
     // read one data to clear DRDY 
     AkmECompass::MagneticVector mag;
     compass->getMagneticVector(&mag);
@@ -277,12 +283,12 @@
     }
     msg->setCommand(Message::CMD_START_MEASUREMENT);
     msg->setArgument( 0, (mag.isOverflow ? 1 : 0) );
-    msg->setArgument( 1,(char)((int32_t)(mag.mx/0.15) >> 8));
-    msg->setArgument( 2, (char)((int32_t)(mag.mx/0.15) & 0x00FF) );
-    msg->setArgument( 3, (char)((int32_t)(mag.my/0.15) >> 8) );
-    msg->setArgument( 4, (char)((int32_t)(mag.my/0.15) & 0x00FF) );
-    msg->setArgument( 5, (char)((int32_t)(mag.mz/0.15) >> 8) );
-    msg->setArgument( 6, (char)((int32_t)(mag.mz/0.15) & 0x00FF) );
+    msg->setArgument( 1,(char)((int32_t)(mag.mx/AKDP_MAG_SENSITIVITY) >> 8));
+    msg->setArgument( 2, (char)((int32_t)(mag.mx/AKDP_MAG_SENSITIVITY) & 0x00FF) );
+    msg->setArgument( 3, (char)((int32_t)(mag.my/AKDP_MAG_SENSITIVITY) >> 8) );
+    msg->setArgument( 4, (char)((int32_t)(mag.my/AKDP_MAG_SENSITIVITY) & 0x00FF) );
+    msg->setArgument( 5, (char)((int32_t)(mag.mz/AKDP_MAG_SENSITIVITY) >> 8) );
+    msg->setArgument( 6, (char)((int32_t)(mag.mz/AKDP_MAG_SENSITIVITY) & 0x00FF) );
     return AkmSensor::SUCCESS;
 }