Modified for compatibility with Rev.E. hardware
Fork of AkmSensor by
akmanalogsensor.cpp
- Committer:
- tkstreet
- Date:
- 2017-12-05
- Revision:
- 45:6af8fdde0ef3
- Parent:
- 44:0e251c736282
- Child:
- 49:c8f8946129b6
File content as of revision 45:6af8fdde0ef3:
#include "akmanalogsensor.h" #define WAIT_ADC_MS 1 /** * Constructor. * */ AkmAnalogSensor::AkmAnalogSensor() : AkmSensor(){ 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){ VERBOSE("#AkmAnalogSensor init()\r\n"); primaryId = id; subId = subid; if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ430L) sensorName = "EQ-430L"; else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ431L) sensorName = "EQ-431L"; else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ432L) sensorName = "EQ-432L"; else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ433L) sensorName = "EQ-433L"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3200) sensorName = "CQ-3200"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3201) sensorName = "CQ-3201"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3202) sensorName = "CQ-3202"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3203) sensorName = "CQ-3203"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3204) sensorName = "CQ-3204"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ320A) sensorName = "CQ-320A"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ320B) sensorName = "CQ-320B"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3300) sensorName = "CQ-3300"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3301) sensorName = "CQ-3301"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3302) sensorName = "CQ-3302"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3303) sensorName = "CQ-3303"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330A) sensorName = "CQ-330A"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330B) sensorName = "CQ-330B"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330E) sensorName = "CQ-330E"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330F) sensorName = "CQ-330F"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330G) sensorName = "CQ-330G"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330H) sensorName = "CQ-330H"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330J) sensorName = "CQ-330J"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CZ3813) sensorName = "CZ-3813"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CZ3814) sensorName = "CZ-3814"; else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CZ3815) sensorName = "CZ-3815"; else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_EM3242) sensorName = "EM3242"; else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_AK9710) sensorName = "AK9710"; else return AkmSensor::ERROR; MCP342X::AdcChannel channel = MCP342X::ADC_CH3; // 0-5.0V out as default if( ((primaryId == AKM_PRIMARY_ID_MISC_ANALOG) && (subId <= AKM_PRIMARY_ID_CURRENT_SENSOR_3V)) || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V){ channel = MCP342X::ADC_CH4; // 0-3.0V out } // 16bit ADC I2C* i2c = new I2C(I2C_SDA,I2C_SCL); i2c->frequency(I2C_SPEED); VERBOSE("#AkmAnalogSensor::init: I2C created at %d Hz\r\n", I2C_SPEED); // ADC setting mcp3428 = new MCP342X(i2c, MCP342X::SLAVE_ADDRESS_6EH); mcp3428->setChannel(channel); mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT); mcp3428->setConversionMode(MCP342X::CONTINUOUS); VERBOSE("#AkmAnalogSensor::init: MPC342X ADC created\r\n"); interval = SENSOR_SAMPLING_RATE; // 10Hz return AkmSensor::SUCCESS; } AkmSensor::Status AkmAnalogSensor::startSensor(){ ticker.attach(callback(this, &AkmSensor::setEvent), interval); MSG("#Start sensor: %s.\r\n",sensorName); return AkmSensor::SUCCESS; } AkmSensor::Status AkmAnalogSensor::startSensor(const float sec){ interval = sec; ticker.attach(callback(this, &AkmSensor::setEvent), interval); MSG("#Start sensor %s. Interval = %.2f\r\n", sensorName, interval); return AkmSensor::SUCCESS; } AkmSensor::Status AkmAnalogSensor::stopSensor(){ ticker.detach(); MSG("#Stop sensor %s.\r\n", sensorName); return AkmSensor::SUCCESS; } AkmSensor::Status AkmAnalogSensor::readSensorData(Message* msg){ VERBOSE("#AkmAnalogSensor: Reading sensor data\r\n"); AkmSensor::clearEvent(); msg->setCommand(Message::CMD_START_MEASUREMENT); if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || primaryId == AKM_PRIMARY_ID_MISC_ANALOG || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V ){ MCP342X::Data data; do { VERBOSE("#Waiting..\r\n"); 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); MSG("readSensorData Error\r\n"); return AkmSensor::ERROR; } return AkmSensor::SUCCESS; } AkmSensor::Status AkmAnalogSensor::requestCommand(Message* in, Message* out){ VERBOSE("#AkmAnalogSensor: requestCommand error\r\n"); return AkmSensor::ERROR; }