Modified for compatibility with Rev.E. hardware
Fork of AkmSensor by
Diff: akmsensormanager.cpp
- 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