Modified for compatibility with Rev.E. hardware
Fork of AkmSensor by
akmanalogsensor.cpp
- Committer:
- masahikofukasawa
- Date:
- 2016-07-22
- Revision:
- 11:cef8dc1cf010
- Child:
- 13:d008249f0359
File content as of revision 11:cef8dc1cf010:
#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; }