Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Revision:
49:c8f8946129b6
Parent:
45:6af8fdde0ef3
--- a/akmanalogsensor.cpp	Tue Dec 19 12:18:13 2017 -0800
+++ b/akmanalogsensor.cpp	Tue May 01 21:31:15 2018 +0000
@@ -1,29 +1,25 @@
 #include "akmanalogsensor.h"
 
+#define SCALING_CONSTANT_3V     0.5997202865
+#define SCALING_CONSTANT_5V     0.3603082852
 #define WAIT_ADC_MS 1
 
-/**
- * Constructor.
- *
- */
 AkmAnalogSensor::AkmAnalogSensor() : AkmSensor(){
     ain = NULL;
-    mcp3428 = NULL;
 }
 
-/**
- * Destructor.
- *
- */
+
 AkmAnalogSensor::~AkmAnalogSensor(){
     if(ain) delete ain;
-    if(mcp3428) delete mcp3428;
 }
 
-AkmSensor::Status AkmAnalogSensor::init(const uint8_t id, const uint8_t subid){
+
+AkmSensor::Status AkmAnalogSensor::init(const uint8_t p_id, const uint8_t s_id){
+    
     VERBOSE("#AkmAnalogSensor init()\r\n");
-    primaryId = id;
-    subId = subid;
+    
+    primaryId = p_id;
+    subId = s_id;
     
     if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ430L)             sensorName = "EQ-430L";
     else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ431L)        sensorName = "EQ-431L";
@@ -53,24 +49,17 @@
     else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_EM3242)          sensorName = "EM3242";
     else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_AK9710)          sensorName = "AK9710";
     else return AkmSensor::ERROR;
-
-    MCP342X::AdcChannel channel = MCP342X::ADC_CH3;    // 0-5.0V out as default
+    
     if( ((primaryId == AKM_PRIMARY_ID_MISC_ANALOG) && (subId <= AKM_PRIMARY_ID_CURRENT_SENSOR_3V))
        || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V){
-        channel = MCP342X::ADC_CH4;    // 0-3.0V out
+        
+        ain = new AnalogIn(ANALOG_IN_A0);
+        VERBOSE("#ADC Connected to 3V Channel\r\n");
     }
-    
-    // 16bit ADC
-    I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
-    i2c->frequency(I2C_SPEED);
-    VERBOSE("#AkmAnalogSensor::init: I2C created at %d Hz\r\n", I2C_SPEED);
-    
-    // ADC setting
-    mcp3428 = new MCP342X(i2c, MCP342X::SLAVE_ADDRESS_6EH);
-    mcp3428->setChannel(channel);
-    mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT);
-    mcp3428->setConversionMode(MCP342X::CONTINUOUS); 
-    VERBOSE("#AkmAnalogSensor::init: MPC342X ADC created\r\n");
+    else {
+        ain = new AnalogIn(ANALOG_IN_A0);;
+        VERBOSE("#ADC Connected to 5V Channel\r\n");
+    }
     
     interval = SENSOR_SAMPLING_RATE; // 10Hz
 
@@ -97,27 +86,49 @@
 }
 
 AkmSensor::Status AkmAnalogSensor::readSensorData(Message* msg){
+    
+    uint16_t ain16 = 0;
+    int16_t ain16_sign = 0;
+    double ain_norm = 0;
+    double ain_scl = 0;
+    
     VERBOSE("#AkmAnalogSensor: Reading sensor data\r\n");
     AkmSensor::clearEvent();
     
     msg->setCommand(Message::CMD_START_MEASUREMENT);
 
-    if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || 
-            primaryId == AKM_PRIMARY_ID_MISC_ANALOG || 
-            primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V ||
-            primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V ){
-        MCP342X::Data data;
-        do {
-            VERBOSE("#Waiting..\r\n");
-            mcp3428->getData(&data);
-            wait_ms(WAIT_ADC_MS);
-        } while(data.st == MCP342X::DATA_NOT_UPDATED);
+    if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || primaryId == AKM_PRIMARY_ID_MISC_ANALOG || 
+       primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V )
+    {       
+        // Sample the ADC
+        ain_norm = ain->read();
+        ain_norm *= 1.97;
+
+        if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V){
+            ain_scl = ain_norm * 1.8 / SCALING_CONSTANT_3V;
+            VERBOSE("#3V scale = %.4f\r\n", ain_scl);
+        }
+        if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V){
+            ain_scl = ain_norm * 1.8 / SCALING_CONSTANT_5V;
+            VERBOSE("#5V scale = %.4f\r\n", ain_scl);
+        }
+
+        ain16 = (uint16_t)(65535 * ain_norm);
         
-        msg->setArgument( 0, (char)( (data.value&0xFF00) >> 8) );
-        msg->setArgument( 1, (char)( data.value & 0x00FF) );
-    }else{
-        msg->setArgument( 0, 0);
-        msg->setArgument( 1, 0);
+        //ain16_sign = (int16_t)ain16;
+        //ain16_sign = (int16_t)ain16 - 32768;
+        ain16_sign = (int16_t)ain_norm*48011.0 - 32768;
+        
+        VERBOSE("#ain_norm = %.4f\r\n", ain_norm);
+        VERBOSE("#ain16 = %d\r\n", ain16);  
+        VERBOSE("#ain16_sign = %d\r\n", ain16_sign);
+        
+        msg->setArgument(0, (char)((ain16_sign & 0xFF00) >> 8));
+        msg->setArgument(1, (char)(ain16_sign & 0x00FF));    
+    }
+    else{
+        msg->setArgument(0, 0);
+        msg->setArgument(1, 0);
         MSG("readSensorData Error\r\n");
         return AkmSensor::ERROR;
     }