Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Revision:
10:5c69b067d88a
Parent:
9:6fa3e7b17c27
Child:
11:cef8dc1cf010
--- a/akmsensormanager.cpp	Thu Jun 16 18:36:26 2016 +0000
+++ b/akmsensormanager.cpp	Fri Jul 08 22:26:26 2016 +0000
@@ -4,7 +4,10 @@
 #include "akmhallswitch.h"
 #include "akmlinearsensor.h"
 #include "akmcurrentsensor.h"
-#include "akmirsensor.h"
+#include "ak09970ctrl.h"
+#include "ak9750ctrl.h"
+#include "ak9752ctrl.h"
+#include "ak7401ctrl.h"
 #include "akmakd.h"
 #include "debug.h"
 #include "Message.h"
@@ -20,7 +23,7 @@
 #define CONV16I(high,low)  ((int16_t)(((high) << 8) | (low)))
 
 
-static char* AKM_PRIMARY_ID_STR[] = {
+const char* AKM_PRIMARY_ID_STR[] = {
                                     "AKD Daughter Cards(SPI)",
                                     "Switch, Unipolar",
                                     "Switch, Onmipolar",
@@ -36,7 +39,7 @@
                                     "TBD3",
                                     "IR Sensor",
                                     "Angle Sensor(SPI)",
-                                    "AKD Daughter Cards(I2C)",
+                                    "AKD Daughter Cards(I2C)"
                                      };
                                      
 AkmSensorManager::AkmSensorManager(SerialNano* com, UARTService* service)
@@ -50,8 +53,10 @@
     eventDisconnected = false;
 }
 
-AkmSensorManager::Status AkmSensorManager::init()
+AkmSensorManager::Status AkmSensorManager::init(uint8_t id, uint8_t subid)
 {
+    primaryId = id;
+    subId = subid;
     sensor = AkmSensorManager::getAkmSensor();
     if(sensor == NULL) return AkmSensorManager::ERROR;  
     return AkmSensorManager::SUCCESS;
@@ -72,88 +77,131 @@
     AkmSensor* sensor = NULL;
     
     // primary id check
-    id = AkmSensorManager::getId(ANALOG_SENSOR_ID,4);
+//    id = AkmSensorManager::getId(ANALOG_SENSOR_ID,4);
+//    subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4);    // 4bit sub id
     
-    switch(id){
+    switch(primaryId){
         case AkmSensor::AKM_PRIMARY_ID_AKD_SPI:
         case AkmSensor::AKM_PRIMARY_ID_AKD_I2C:
-            subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,5);    // 5bit sub id
-            AkmAkd* akd;
-            akd = new AkmAkd();
-            sensor = akd;
-                        
-
+        {
+/*            
 #ifdef REV_D
-    {
-        const int TIME_FOR_OE_MS = 100;
-        const TCA9554A::Port PORT_OE_LVS2 = TCA9554A::PORT_6;
-        I2C i2c(I2C_SDA, I2C_SCL);
-        TCA9554A tca9554a(&i2c, TCA9554A::SLAVE_ADDRESS_38H);
-        // Makes sure that the OE is low first.
-        tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::LOW);
-        wait_ms(TIME_FOR_OE_MS);
-    }
+            {
+                // Power on reset
+                // RSV low to high for resetting(RSTN) AKD daughter card
+                const int TIME_FOR_OE_MS = 100;
+                const TCA9554A::Port PORT_RSV_RSTN = TCA9554A::PORT_0;
+                I2C i2c(I2C_SDA, I2C_SCL);
+                TCA9554A tca9554a(&i2c, TCA9554A::SLAVE_ADDRESS_38H);
+                tca9554a.configurePort(PORT_RSV_RSTN, TCA9554A::DIR_OUTPUT);
+                tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::LOW);
+                wait_ms(TIME_FOR_OE_MS);
+                tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::HIGH);
+            }
+#endif
+*/
+
+//            subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,5);    // Update subId for 5bit ID
+
+            if(subId != Ak09970Ctrl::SUB_ID_AK09970){
+                AkmAkd* akd = new AkmAkd();
+                sensor = akd;
+            }
+            else{
+                Ak09970Ctrl* ak09970 = new Ak09970Ctrl();
+                sensor = ak09970;
+            }
+/*
+#ifdef REV_D
+            {
+                // Disable the level shifter of ADC
+                const int TIME_FOR_OE_MS = 100;
+                const TCA9554A::Port PORT_OE_LVS2 = TCA9554A::PORT_6;
+                I2C i2c(I2C_SDA, I2C_SCL);
+                TCA9554A tca9554a(&i2c, TCA9554A::SLAVE_ADDRESS_38H);
+                // Makes sure that the OE is low first.
+                tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::LOW);
+                wait_ms(TIME_FOR_OE_MS);
+            }
 #endif    
-
+*/
             break;
-            
+        }    
         case AkmSensor::AKM_PRIMARY_ID_ANGLE_SENSOR:
-            subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4);    // 4bit sub id
-            AkmAngleSensor* angleSensor;
-            angleSensor = new AkmAngleSensor();
-            sensor = angleSensor;
+        {
+            if(subId == AkmAngleSensor::SUB_ID_AK7451){
+                AkmAngleSensor* angleSensor = new AkmAngleSensor();
+                sensor = angleSensor;
+                break;
+            }
+            else if(subId == Ak7401Ctrl::SUB_ID_AK7401){
+                Ak7401Ctrl* ak7401ctrl = new Ak7401Ctrl();
+                sensor = ak7401ctrl;
+                break;
+            }
             break;
-            
+        }    
         case AkmSensor::AKM_PRIMARY_ID_UNIPOLAR:
         case AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR:
         case AkmSensor::AKM_PRIMARY_ID_LATCH:
         case AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT:
         case AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER:
-            subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4);    // 4bit sub id
-            AkmHallSwitch* hallswitch;
-            hallswitch = new AkmHallSwitch();
+        {
+            AkmHallSwitch* hallswitch = new AkmHallSwitch();
             sensor = hallswitch;
             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();
+        {
+            AkmLinearSensor* linearsensor = new AkmLinearSensor();
+            sensor = linearsensor;
+            break;
+        }
+        case AkmSensor::AKM_PRIMARY_ID_CURRENT_SENSOR:
+        {
+            AkmCurrentSensor* currentsensor = new AkmCurrentSensor();
+            sensor = currentsensor;
+            break;
+        }
+        case AkmSensor::AKM_PRIMARY_ID_MISC_ANALOG:
+        {
+            AkmLinearSensor* linearsensor = new AkmLinearSensor();
             sensor = linearsensor;
             break;
-        
-        case AkmSensor::AKM_PRIMARY_ID_CURRENT_SENSOR:
-            subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4);    // 4bit sub id
-            AkmCurrentSensor* currentsensor;
-            currentsensor = new AkmCurrentSensor();
-            sensor = currentsensor;
-            break;
-        
+        }
         case AkmSensor::AKM_PRIMARY_ID_IR_SENSOR:
-            subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4);    // 4bit sub id
-            AkmIrSensor* irsensor;
-            irsensor = new AkmIrSensor();
-            sensor = irsensor;
+        {
+            if(subId == Ak9750Ctrl::SUB_ID_AK9750){
+                Ak9750Ctrl* ak9750ctrl = new Ak9750Ctrl();
+                sensor = ak9750ctrl;
+            }else if(subId == Ak9752Ctrl::SUB_ID_AK9752){
+                Ak9752Ctrl* ak9752ctrl = new Ak9752Ctrl();
+                sensor = ak9752ctrl;
+            }else{
+                return NULL;    // couldn't find
+            }
+            
             break;
-        
+        }
         default:
-            subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4);    // 4bit sub id
-            MSG("#Can't find ID=%d SubID=%d %s\r\n", id, subId, AKM_PRIMARY_ID_STR[id]);    
+        {
+            MSG("#Can't find ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]);    
             return NULL;    // couldn't find
+        }
     }
-
+/*
 #ifdef REV_D
    // I2C turn off 
     releaseTWI();
 #endif  
-    
-    if(sensor->init(id, subId) != AkmSensor::SUCCESS){
-        MSG("#sensor->init failed. ID=%d SubID=%d %s\r\n", id, subId, AKM_PRIMARY_ID_STR[id]);    
+*/  
+    if(sensor->init(primaryId, subId) != AkmSensor::SUCCESS){
+        MSG("#sensor->init failed. ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]);    
         return NULL;    // couldn't find
     }
 
-    MSG("#ID=%d SubID=%d %s\r\n", id, subId, AKM_PRIMARY_ID_STR[id]);    
+    MSG("#ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]);    
     return sensor;
 }
 
@@ -161,9 +209,8 @@
     // Construct message
     Status status = SUCCESS;
     
-    Message::Status st;
-    if ((st=Message::parse(&msg, buf)) != Message::SUCCESS) {
-        MSG("#Failed to parse message. status = %02x. %s\n", st, buf);
+    if ((Message::parse(&msg, buf)) != Message::SUCCESS) {
+        MSG("#Failed to parse message. %s\n", buf);
         status = ERROR;
         eventCommandReceived = false;
     }
@@ -238,7 +285,6 @@
 void AkmSensorManager::processCommand()
 {
     AkmSensorManager::Status status = AkmSensorManager::SUCCESS;
-//    MSG("#processCommand.\n");
     
     // Gets command in the message
     Message::Command cmd = msg.getCommand();
@@ -272,7 +318,7 @@
             break;
 
         case Message::CMD_GET_ID:                       // return Primary ID and Sub ID
-            resMsg.setArgument(0, id);
+            resMsg.setArgument(0, primaryId);
             resMsg.setArgument(1, subId);
             throwMessage(&resMsg);
             wait(0.4);  // wait for App initialization            
@@ -290,11 +336,11 @@
             MSG("#Start measurement.\n");
             sensor->startSensor();
             // get initial sensor state for switch type sensors
-            if( id == AkmSensor::AKM_PRIMARY_ID_UNIPOLAR ||
-                id == AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR ||
-                id == AkmSensor::AKM_PRIMARY_ID_LATCH ||
-                id == AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT ||
-                id == AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER ){                
+            if( primaryId == AkmSensor::AKM_PRIMARY_ID_UNIPOLAR ||
+                primaryId == AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR ||
+                primaryId == AkmSensor::AKM_PRIMARY_ID_LATCH ||
+                primaryId == AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT ||
+                primaryId == AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER ){                
                 Message temp;
                 sensor->readSensorData(&temp);
                 throwMessage(&temp);
@@ -361,7 +407,6 @@
 
     if(eventConnected)     // BLE connected. Start sensor.
     {
-//        if( sensor->startSensor() != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR;
         eventConnected = false;   
     }
     if(eventDisconnected)  // BLE dis-connected. Stop sensor.
@@ -400,26 +445,16 @@
     buf[tIdx] = '\0';
         
     // Send to the BLE buffer
-//    Hardware *hw = Hardware::getInstance();
-//    hw->uartService->writeString(buf);
     if(isEnabledBle) uartService->writeString(buf);            
     if(isEnabledUsb) serial->printf(buf);
     
-//    MSG("#A message thrown: \"%s\"\n", buf);
-    
     return SUCCESS;   
 }
-
+/*
 void AkmSensorManager::releaseTWI(){
     NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
     NRF_TWI0->POWER  = 0;
     NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
     NRF_TWI1->POWER  = 0;
 }
-
-/*
-void AkmSensorManager::dataOut(char* str){
-    if(isBleMode) uartService->writeString(str);            
-    if(isSerialMode) serial->printf(str);
-}
 */
\ No newline at end of file