Taylor Street / AkmSensor

Fork of AkmSensor by AKM Development Platform

Files at this revision

API Documentation at this revision

Comitter:
masahikofukasawa
Date:
Mon May 09 16:59:33 2016 +0000
Parent:
2:11fe67783c4c
Child:
5:4e92a85bbb52
Commit message:
Rev.D Masa

Changed in this revision

akmirsensor.cpp Show annotated file Show diff for this revision Revisions of this file
akmlinearsensor.cpp Show annotated file Show diff for this revision Revisions of this file
akmlinearsensor.h Show annotated file Show diff for this revision Revisions of this file
akmsensor.h Show annotated file Show diff for this revision Revisions of this file
akmsensormanager.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/akmirsensor.cpp	Thu May 05 21:11:23 2016 +0000
+++ b/akmirsensor.cpp	Mon May 09 16:59:33 2016 +0000
@@ -79,7 +79,7 @@
     }
     // Gets interrupt status from EEPROM
     AK9750::InterruptStatus intStatus;
-    if ((ak9750->getInterruptStatusFromEEPROM(&intStatus)) != AK9750::SUCCESS) {
+    if ((ak9750->getInterruptEnableFromEEPROM(&intStatus)) != AK9750::SUCCESS) {
         MSG("#Failed to get interrupts of AK9750 from EEPROM.\n");
     }
 
@@ -109,7 +109,7 @@
     
     // Sets interruput status from the red EEPROM values
     AK9750::Status status;
-    if ((status=ak9750->setInterruptStatus(&intStatus)) != AK9750::SUCCESS) {
+    if ((status=ak9750->setInterruptEnable(&intStatus)) != AK9750::SUCCESS) {
         MSG("#Failed to set interrupts of AK9750. Status = 0x%02X\n", status);
     }
     MSG("#Interrupt:(0x%02X,0x%02X,0x%02X,0x%02X,0x%02X)\n",intStatus.drdy,intStatus.ir13h,intStatus.ir13l,intStatus.ir24h,intStatus.ir24l);
@@ -260,7 +260,7 @@
         }
         case Message::CMD_IR_GET_INTERRUPT:
         {
-            if (ak9750->getInterruptStatus(&interrupt) != AK9750::SUCCESS) {
+            if (ak9750->getInterruptEnable(&interrupt) != AK9750::SUCCESS) {
                 status =  AkmSensor::ERROR;
                 MSG("#Failed to set hysteresis to AK9750.\n");
             }
@@ -278,7 +278,7 @@
             interrupt.ir13l = in->getArgument(2);
             interrupt.ir24h = in->getArgument(3);
             interrupt.ir24l = in->getArgument(4);
-            if (ak9750->setInterruptStatus(&interrupt) != AK9750::SUCCESS) {
+            if (ak9750->setInterruptEnable(&interrupt) != AK9750::SUCCESS) {
                 status =  AkmSensor::ERROR;
                 MSG("#Failed to set hysteresis to AK9750.\n");
             }
@@ -360,7 +360,7 @@
         }
         case Message::CMD_IR_GET_INTERRUPT_EEPROM:
         {
-            if (ak9750->getInterruptStatusFromEEPROM(&interrupt) != AK9750::SUCCESS) {
+            if (ak9750->getInterruptEnableFromEEPROM(&interrupt) != AK9750::SUCCESS) {
                 status =  AkmSensor::ERROR;
                 MSG("#Failed to set interrupt to AK9750(EEPROM).\n");
             }
@@ -378,7 +378,7 @@
             interrupt.ir13l = in->getArgument(2);
             interrupt.ir24h = in->getArgument(3);
             interrupt.ir24l = in->getArgument(4);
-            if (ak9750->setInterruptStatusToEEPROM(&interrupt) != AK9750::SUCCESS) {
+            if (ak9750->setInterruptEnableToEEPROM(&interrupt) != AK9750::SUCCESS) {
                 status =  AkmSensor::ERROR;
                 MSG("#Failed to set interrupt to AK9750(EEPROM).\n");
             }
--- a/akmlinearsensor.cpp	Thu May 05 21:11:23 2016 +0000
+++ b/akmlinearsensor.cpp	Mon May 09 16:59:33 2016 +0000
@@ -1,5 +1,8 @@
 #include "akmlinearsensor.h"
 #include "debug.h"
+
+#define WAIT_ADC_MS 1
+
 /**
  * Constructor.
  *
@@ -7,7 +10,7 @@
 AkmLinearSensor::AkmLinearSensor(){
     event = false;
     ain = NULL;
-    i2c = NULL;
+    mcp3428 = NULL;
 }
 
 /**
@@ -16,7 +19,7 @@
  */
 AkmLinearSensor::~AkmLinearSensor(){
     if(ain) delete ain;
-    if(i2c) delete i2c;
+    if(mcp3428) delete mcp3428;
 }
 
 AkmSensor::Status AkmLinearSensor::init(const uint8_t id, const uint8_t subid){
@@ -29,6 +32,14 @@
         
     }else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR){
         // 16bit ADC
+        I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
+        i2c->frequency(I2C_SPEED_100KHZ);
+        
+        // ADC setting
+        mcp3428 = new MCP342X(i2c, MCP342X::SLAVE_ADDRESS_6EH);
+        mcp3428->setChannel(MCP342X::ADC_CH4);
+        mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT);
+        mcp3428->setConversionMode(MCP342X::CONTINUOUS); 
     }
     else{
         return AkmSensor::ERROR;
@@ -61,24 +72,27 @@
 }
 
 AkmSensor::Status AkmLinearSensor::readSensorData(Message* msg){
-    uint16_t value;
     event = false;
     
     msg->setCommand(Message::CMD_START_MEASUREMENT);
 
     if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY){
+        uint16_t value;
         float s = *ain;
         value = s*1024;
-//        sprintf(str, "$B%X%04d\r\n",primaryId, value);
         msg->setArgument( 0, (char)( value >> 8) );
         msg->setArgument( 1, (char)( value & 0x00FF) );
     }else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR){
-        // 16bit ADC
-//        sprintf(str, "$B%X%04d\r\n",primaryId, value);
-        msg->setArgument( 0, (char)( value >> 8) );
-        msg->setArgument( 1, (char)( value & 0x00FF) );
+        MCP342X::Data data;
+        do {
+            mcp3428->getData(&data);
+            wait_ms(WAIT_ADC_MS);
+        } while(data.st == MCP342X::DATA_NOT_UPDATED);
+        MSG("#value=%d st=%d.\n",data.value,data.st);
+        
+        msg->setArgument( 0, (char)( (data.value&0xFF00) >> 8) );
+        msg->setArgument( 1, (char)( data.value & 0x00FF) );
     }else{
-//        sprintf(str, "$B%X%0000\r\n",primaryId);
         msg->setArgument( 0, 0);
         msg->setArgument( 1, 0);
         return AkmSensor::ERROR;
--- a/akmlinearsensor.h	Thu May 05 21:11:23 2016 +0000
+++ b/akmlinearsensor.h	Mon May 09 16:59:33 2016 +0000
@@ -4,6 +4,7 @@
 #include "mbed.h"
 #include "SerialNano.h"
 #include "akmsensor.h"
+#include "mcp342x.h"
 
 class AkmLinearSensor : public AkmSensor
 {
@@ -43,7 +44,7 @@
     
     Ticker          ticker;
     AnalogIn*       ain;
-    I2C*            i2c;
+    MCP342X*        mcp3428;
 };
 
 #endif
--- a/akmsensor.h	Thu May 05 21:11:23 2016 +0000
+++ b/akmsensor.h	Mon May 09 16:59:33 2016 +0000
@@ -8,7 +8,7 @@
 #define SPI_SCK                          P0_8       //SPI, SCK
 #define SPI_MISO                         P0_9       //SPI, MISO
 #define SPI_MOSI                         P0_10      //SPI, MOSI
-#define SPI_CS                           P0_4       //SPI, CS
+#define SPI_CS                           P0_11      //SPI, CS
 
 // I2C
 #define I2C_SCL                          P0_8       //I2C, SCL
@@ -51,8 +51,8 @@
         AKM_PRIMARY_ID_CURRENT_SENSOR       = 0x9,
         AKM_PRIMARY_ID_MISC_ANALOG          = 0xA,
         AKM_PRIMARY_ID_LINEAR_SENSOR        = 0xB,
-        AKM_PRIMARY_ID_IR_SENSOR                 = 0xC,
-        AKM_PRIMARY_ID_TBD3            = 0xD,
+        AKM_PRIMARY_ID_TBD3                 = 0xC,
+        AKM_PRIMARY_ID_IR_SENSOR            = 0xD,
         AKM_PRIMARY_ID_ANGLE_SENSOR         = 0xE,
         AKM_PRIMARY_ID_AKD_I2C              = 0xF,
     } SensorPrimaryId;
--- a/akmsensormanager.cpp	Thu May 05 21:11:23 2016 +0000
+++ b/akmsensormanager.cpp	Mon May 09 16:59:33 2016 +0000
@@ -30,8 +30,8 @@
                                     "Current Sensor",
                                     "MISC(Analog)",
                                     "Linear Sensor",
+                                    "TBD3",
                                     "IR Sensor",
-                                    "TBD3",
                                     "Angle Sensor(SPI)",        // Temporary
                                     "AKD Daughter Cards(I2C)",
                                      };
@@ -99,6 +99,7 @@
             break;
         
         case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY:
+        case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR:
             subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4);    // 4bit sub id
             AkmLinearSensor* linearsensor;
             linearsensor = new AkmLinearSensor();
@@ -171,7 +172,7 @@
     uint8_t value = (uint8_t)(s*pow(2.0,bits));
 #else
     /* Rev.D */
-    MSG("GetID\n");
+    MSG("#GetID\n");
     I2C i2c(I2C_SDA0, I2C_SCL0);
     // ADC
     MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_6EH);
@@ -189,7 +190,7 @@
     const int16_t VAL_MIN = -2048;       // Corresponds to 0V
     
     uint8_t value = (uint8_t)((val - VAL_MIN)/(float)(VAL_MAX - VAL_MIN) * (1 << bits));
-    MSG("ID = %d.", value);
+    MSG("#ID = %d.\n", value);
 #endif    
     return value;
 }