Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Revision:
11:cef8dc1cf010
Child:
13:d008249f0359
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/akmanalogsensor.cpp	Fri Jul 22 22:54:11 2016 +0000
@@ -0,0 +1,118 @@
+#include "akmanalogsensor.h"
+#include "debug.h"
+
+#define WAIT_ADC_MS 1
+
+/**
+ * Constructor.
+ *
+ */
+AkmAnalogSensor::AkmAnalogSensor(){
+    event = false;
+    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){
+    primaryId = id;
+    subId = subid;
+    
+    if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY){
+        // Internal ADC, Legacy
+        ain = new AnalogIn(ANALOG_IN_PIN);    
+    }
+    else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || 
+            primaryId == AKM_PRIMARY_ID_MISC_ANALOG || 
+            primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR)
+    {
+        MCP342X::AdcChannel channel = MCP342X::ADC_CH3;    // 0-5.0V out as default
+        
+        if( (primaryId == AKM_PRIMARY_ID_MISC_ANALOG) && (subId < 0x08) ){
+            channel = MCP342X::ADC_CH4;    // 0-3.0V out
+        }
+        
+        // 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(channel);
+        mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT);
+        mcp3428->setConversionMode(MCP342X::CONTINUOUS); 
+    }
+    else{
+        return AkmSensor::ERROR;
+    }
+    
+    interval = SENSOR_SAMPLING_RATE; // 10Hz
+
+    return AkmSensor::SUCCESS;
+}
+
+void AkmAnalogSensor::eventCallback(){
+    event = true;
+}
+
+bool AkmAnalogSensor::isEvent(){
+    return event;
+}
+
+AkmSensor::Status AkmAnalogSensor::startSensor(){
+    ticker.attach(this, &AkmAnalogSensor::eventCallback, interval);
+    return AkmSensor::SUCCESS;
+}
+
+AkmSensor::Status AkmAnalogSensor::startSensor(const float sec){
+    interval = sec;
+    ticker.attach(this, &AkmAnalogSensor::eventCallback, interval);
+    return AkmSensor::SUCCESS;
+}
+
+AkmSensor::Status AkmAnalogSensor::stopSensor(){
+    ticker.detach();
+    return AkmSensor::SUCCESS;
+}
+
+AkmSensor::Status AkmAnalogSensor::readSensorData(Message* msg){
+    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;
+        msg->setArgument( 0, (char)( value >> 8) );
+        msg->setArgument( 1, (char)( value & 0x00FF) );
+    }else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || 
+            primaryId == AKM_PRIMARY_ID_MISC_ANALOG || 
+            primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR){
+        MCP342X::Data data;
+        do {
+            mcp3428->getData(&data);
+            wait_ms(WAIT_ADC_MS);
+        } while(data.st == MCP342X::DATA_NOT_UPDATED);
+        
+        msg->setArgument( 0, (char)( (data.value&0xFF00) >> 8) );
+        msg->setArgument( 1, (char)( data.value & 0x00FF) );
+    }else{
+        msg->setArgument( 0, 0);
+        msg->setArgument( 1, 0);
+        return AkmSensor::ERROR;
+    }
+    return AkmSensor::SUCCESS;
+}
+
+AkmSensor::Status AkmAnalogSensor::requestCommand(Message* in, Message* out){
+    return AkmSensor::SUCCESS;
+}