Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Committer:
masahikofukasawa
Date:
Fri Jul 22 22:54:11 2016 +0000
Revision:
11:cef8dc1cf010
Child:
13:d008249f0359
RevD7_004

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masahikofukasawa 11:cef8dc1cf010 1 #include "akmanalogsensor.h"
masahikofukasawa 11:cef8dc1cf010 2 #include "debug.h"
masahikofukasawa 11:cef8dc1cf010 3
masahikofukasawa 11:cef8dc1cf010 4 #define WAIT_ADC_MS 1
masahikofukasawa 11:cef8dc1cf010 5
masahikofukasawa 11:cef8dc1cf010 6 /**
masahikofukasawa 11:cef8dc1cf010 7 * Constructor.
masahikofukasawa 11:cef8dc1cf010 8 *
masahikofukasawa 11:cef8dc1cf010 9 */
masahikofukasawa 11:cef8dc1cf010 10 AkmAnalogSensor::AkmAnalogSensor(){
masahikofukasawa 11:cef8dc1cf010 11 event = false;
masahikofukasawa 11:cef8dc1cf010 12 ain = NULL;
masahikofukasawa 11:cef8dc1cf010 13 mcp3428 = NULL;
masahikofukasawa 11:cef8dc1cf010 14 }
masahikofukasawa 11:cef8dc1cf010 15
masahikofukasawa 11:cef8dc1cf010 16 /**
masahikofukasawa 11:cef8dc1cf010 17 * Destructor.
masahikofukasawa 11:cef8dc1cf010 18 *
masahikofukasawa 11:cef8dc1cf010 19 */
masahikofukasawa 11:cef8dc1cf010 20 AkmAnalogSensor::~AkmAnalogSensor(){
masahikofukasawa 11:cef8dc1cf010 21 if(ain) delete ain;
masahikofukasawa 11:cef8dc1cf010 22 if(mcp3428) delete mcp3428;
masahikofukasawa 11:cef8dc1cf010 23 }
masahikofukasawa 11:cef8dc1cf010 24
masahikofukasawa 11:cef8dc1cf010 25 AkmSensor::Status AkmAnalogSensor::init(const uint8_t id, const uint8_t subid){
masahikofukasawa 11:cef8dc1cf010 26 primaryId = id;
masahikofukasawa 11:cef8dc1cf010 27 subId = subid;
masahikofukasawa 11:cef8dc1cf010 28
masahikofukasawa 11:cef8dc1cf010 29 if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY){
masahikofukasawa 11:cef8dc1cf010 30 // Internal ADC, Legacy
masahikofukasawa 11:cef8dc1cf010 31 ain = new AnalogIn(ANALOG_IN_PIN);
masahikofukasawa 11:cef8dc1cf010 32 }
masahikofukasawa 11:cef8dc1cf010 33 else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR ||
masahikofukasawa 11:cef8dc1cf010 34 primaryId == AKM_PRIMARY_ID_MISC_ANALOG ||
masahikofukasawa 11:cef8dc1cf010 35 primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR)
masahikofukasawa 11:cef8dc1cf010 36 {
masahikofukasawa 11:cef8dc1cf010 37 MCP342X::AdcChannel channel = MCP342X::ADC_CH3; // 0-5.0V out as default
masahikofukasawa 11:cef8dc1cf010 38
masahikofukasawa 11:cef8dc1cf010 39 if( (primaryId == AKM_PRIMARY_ID_MISC_ANALOG) && (subId < 0x08) ){
masahikofukasawa 11:cef8dc1cf010 40 channel = MCP342X::ADC_CH4; // 0-3.0V out
masahikofukasawa 11:cef8dc1cf010 41 }
masahikofukasawa 11:cef8dc1cf010 42
masahikofukasawa 11:cef8dc1cf010 43 // 16bit ADC
masahikofukasawa 11:cef8dc1cf010 44 I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
masahikofukasawa 11:cef8dc1cf010 45 i2c->frequency(I2C_SPEED_100KHZ);
masahikofukasawa 11:cef8dc1cf010 46
masahikofukasawa 11:cef8dc1cf010 47 // ADC setting
masahikofukasawa 11:cef8dc1cf010 48 mcp3428 = new MCP342X(i2c, MCP342X::SLAVE_ADDRESS_6EH);
masahikofukasawa 11:cef8dc1cf010 49 mcp3428->setChannel(channel);
masahikofukasawa 11:cef8dc1cf010 50 mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT);
masahikofukasawa 11:cef8dc1cf010 51 mcp3428->setConversionMode(MCP342X::CONTINUOUS);
masahikofukasawa 11:cef8dc1cf010 52 }
masahikofukasawa 11:cef8dc1cf010 53 else{
masahikofukasawa 11:cef8dc1cf010 54 return AkmSensor::ERROR;
masahikofukasawa 11:cef8dc1cf010 55 }
masahikofukasawa 11:cef8dc1cf010 56
masahikofukasawa 11:cef8dc1cf010 57 interval = SENSOR_SAMPLING_RATE; // 10Hz
masahikofukasawa 11:cef8dc1cf010 58
masahikofukasawa 11:cef8dc1cf010 59 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 60 }
masahikofukasawa 11:cef8dc1cf010 61
masahikofukasawa 11:cef8dc1cf010 62 void AkmAnalogSensor::eventCallback(){
masahikofukasawa 11:cef8dc1cf010 63 event = true;
masahikofukasawa 11:cef8dc1cf010 64 }
masahikofukasawa 11:cef8dc1cf010 65
masahikofukasawa 11:cef8dc1cf010 66 bool AkmAnalogSensor::isEvent(){
masahikofukasawa 11:cef8dc1cf010 67 return event;
masahikofukasawa 11:cef8dc1cf010 68 }
masahikofukasawa 11:cef8dc1cf010 69
masahikofukasawa 11:cef8dc1cf010 70 AkmSensor::Status AkmAnalogSensor::startSensor(){
masahikofukasawa 11:cef8dc1cf010 71 ticker.attach(this, &AkmAnalogSensor::eventCallback, interval);
masahikofukasawa 11:cef8dc1cf010 72 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 73 }
masahikofukasawa 11:cef8dc1cf010 74
masahikofukasawa 11:cef8dc1cf010 75 AkmSensor::Status AkmAnalogSensor::startSensor(const float sec){
masahikofukasawa 11:cef8dc1cf010 76 interval = sec;
masahikofukasawa 11:cef8dc1cf010 77 ticker.attach(this, &AkmAnalogSensor::eventCallback, interval);
masahikofukasawa 11:cef8dc1cf010 78 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 79 }
masahikofukasawa 11:cef8dc1cf010 80
masahikofukasawa 11:cef8dc1cf010 81 AkmSensor::Status AkmAnalogSensor::stopSensor(){
masahikofukasawa 11:cef8dc1cf010 82 ticker.detach();
masahikofukasawa 11:cef8dc1cf010 83 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 84 }
masahikofukasawa 11:cef8dc1cf010 85
masahikofukasawa 11:cef8dc1cf010 86 AkmSensor::Status AkmAnalogSensor::readSensorData(Message* msg){
masahikofukasawa 11:cef8dc1cf010 87 event = false;
masahikofukasawa 11:cef8dc1cf010 88
masahikofukasawa 11:cef8dc1cf010 89 msg->setCommand(Message::CMD_START_MEASUREMENT);
masahikofukasawa 11:cef8dc1cf010 90
masahikofukasawa 11:cef8dc1cf010 91 if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY){
masahikofukasawa 11:cef8dc1cf010 92 uint16_t value;
masahikofukasawa 11:cef8dc1cf010 93 float s = *ain;
masahikofukasawa 11:cef8dc1cf010 94 value = s*1024;
masahikofukasawa 11:cef8dc1cf010 95 msg->setArgument( 0, (char)( value >> 8) );
masahikofukasawa 11:cef8dc1cf010 96 msg->setArgument( 1, (char)( value & 0x00FF) );
masahikofukasawa 11:cef8dc1cf010 97 }else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR ||
masahikofukasawa 11:cef8dc1cf010 98 primaryId == AKM_PRIMARY_ID_MISC_ANALOG ||
masahikofukasawa 11:cef8dc1cf010 99 primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR){
masahikofukasawa 11:cef8dc1cf010 100 MCP342X::Data data;
masahikofukasawa 11:cef8dc1cf010 101 do {
masahikofukasawa 11:cef8dc1cf010 102 mcp3428->getData(&data);
masahikofukasawa 11:cef8dc1cf010 103 wait_ms(WAIT_ADC_MS);
masahikofukasawa 11:cef8dc1cf010 104 } while(data.st == MCP342X::DATA_NOT_UPDATED);
masahikofukasawa 11:cef8dc1cf010 105
masahikofukasawa 11:cef8dc1cf010 106 msg->setArgument( 0, (char)( (data.value&0xFF00) >> 8) );
masahikofukasawa 11:cef8dc1cf010 107 msg->setArgument( 1, (char)( data.value & 0x00FF) );
masahikofukasawa 11:cef8dc1cf010 108 }else{
masahikofukasawa 11:cef8dc1cf010 109 msg->setArgument( 0, 0);
masahikofukasawa 11:cef8dc1cf010 110 msg->setArgument( 1, 0);
masahikofukasawa 11:cef8dc1cf010 111 return AkmSensor::ERROR;
masahikofukasawa 11:cef8dc1cf010 112 }
masahikofukasawa 11:cef8dc1cf010 113 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 114 }
masahikofukasawa 11:cef8dc1cf010 115
masahikofukasawa 11:cef8dc1cf010 116 AkmSensor::Status AkmAnalogSensor::requestCommand(Message* in, Message* out){
masahikofukasawa 11:cef8dc1cf010 117 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 118 }