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