Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Committer:
masahikofukasawa
Date:
Sat Mar 11 01:14:15 2017 +0000
Revision:
27:41aa9fb23a2f
Parent:
16:d85be9bafb80
Child:
29:b488d2c89fba
modified for multi sensor demo

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 27:41aa9fb23a2f 10 AkmAnalogSensor::AkmAnalogSensor() : AkmSensor(){
masahikofukasawa 11:cef8dc1cf010 11 ain = NULL;
masahikofukasawa 11:cef8dc1cf010 12 mcp3428 = NULL;
masahikofukasawa 11:cef8dc1cf010 13 }
masahikofukasawa 11:cef8dc1cf010 14
masahikofukasawa 11:cef8dc1cf010 15 /**
masahikofukasawa 11:cef8dc1cf010 16 * Destructor.
masahikofukasawa 11:cef8dc1cf010 17 *
masahikofukasawa 11:cef8dc1cf010 18 */
masahikofukasawa 11:cef8dc1cf010 19 AkmAnalogSensor::~AkmAnalogSensor(){
masahikofukasawa 11:cef8dc1cf010 20 if(ain) delete ain;
masahikofukasawa 11:cef8dc1cf010 21 if(mcp3428) delete mcp3428;
masahikofukasawa 11:cef8dc1cf010 22 }
masahikofukasawa 11:cef8dc1cf010 23
masahikofukasawa 11:cef8dc1cf010 24 AkmSensor::Status AkmAnalogSensor::init(const uint8_t id, const uint8_t subid){
masahikofukasawa 11:cef8dc1cf010 25 primaryId = id;
masahikofukasawa 11:cef8dc1cf010 26 subId = subid;
masahikofukasawa 11:cef8dc1cf010 27
masahikofukasawa 13:d008249f0359 28 if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ430L) sensorName = "EQ-430L";
masahikofukasawa 13:d008249f0359 29 else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ431L) sensorName = "EQ-431L";
masahikofukasawa 13:d008249f0359 30 else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ432L) sensorName = "EQ-432L";
masahikofukasawa 13:d008249f0359 31 else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ433L) sensorName = "EQ-433L";
masahikofukasawa 13:d008249f0359 32 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ3300) sensorName = "CQ-3300";
masahikofukasawa 13:d008249f0359 33 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ3301) sensorName = "CQ-3301";
masahikofukasawa 13:d008249f0359 34 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ3302) sensorName = "CQ-3302";
masahikofukasawa 13:d008249f0359 35 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ3303) sensorName = "CQ-3303";
masahikofukasawa 13:d008249f0359 36 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ330A) sensorName = "CQ-330A";
masahikofukasawa 13:d008249f0359 37 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ330B) sensorName = "CQ-330B";
masahikofukasawa 13:d008249f0359 38 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ330E) sensorName = "CQ-330E";
masahikofukasawa 13:d008249f0359 39 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ330F) sensorName = "CQ-330F";
masahikofukasawa 13:d008249f0359 40 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ330G) sensorName = "CQ-330G";
masahikofukasawa 13:d008249f0359 41 else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR && subId == AkmAnalogSensor::SUB_ID_CQ330H) sensorName = "CQ-330H";
masahikofukasawa 13:d008249f0359 42 else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_EM3242) sensorName = "EM3242";
masahikofukasawa 13:d008249f0359 43 else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_AK9710) sensorName = "AK9710";
masahikofukasawa 13:d008249f0359 44
masahikofukasawa 27:41aa9fb23a2f 45 // if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY){
masahikofukasawa 27:41aa9fb23a2f 46 // // Internal ADC, Legacy
masahikofukasawa 27:41aa9fb23a2f 47 // ain = new AnalogIn(ANALOG_IN_PIN);
masahikofukasawa 27:41aa9fb23a2f 48 // sensorName = "EQ43XL";
masahikofukasawa 27:41aa9fb23a2f 49 // }
masahikofukasawa 27:41aa9fb23a2f 50 if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR ||
masahikofukasawa 11:cef8dc1cf010 51 primaryId == AKM_PRIMARY_ID_MISC_ANALOG ||
masahikofukasawa 11:cef8dc1cf010 52 primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR)
masahikofukasawa 11:cef8dc1cf010 53 {
masahikofukasawa 11:cef8dc1cf010 54 MCP342X::AdcChannel channel = MCP342X::ADC_CH3; // 0-5.0V out as default
masahikofukasawa 11:cef8dc1cf010 55
masahikofukasawa 11:cef8dc1cf010 56 if( (primaryId == AKM_PRIMARY_ID_MISC_ANALOG) && (subId < 0x08) ){
masahikofukasawa 11:cef8dc1cf010 57 channel = MCP342X::ADC_CH4; // 0-3.0V out
masahikofukasawa 11:cef8dc1cf010 58 }
masahikofukasawa 11:cef8dc1cf010 59
masahikofukasawa 11:cef8dc1cf010 60 // 16bit ADC
masahikofukasawa 11:cef8dc1cf010 61 I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
masahikofukasawa 11:cef8dc1cf010 62 i2c->frequency(I2C_SPEED_100KHZ);
masahikofukasawa 11:cef8dc1cf010 63
masahikofukasawa 11:cef8dc1cf010 64 // ADC setting
masahikofukasawa 11:cef8dc1cf010 65 mcp3428 = new MCP342X(i2c, MCP342X::SLAVE_ADDRESS_6EH);
masahikofukasawa 11:cef8dc1cf010 66 mcp3428->setChannel(channel);
masahikofukasawa 11:cef8dc1cf010 67 mcp3428->setSampleSetting(MCP342X::SAMPLE_15HZ_16BIT);
masahikofukasawa 11:cef8dc1cf010 68 mcp3428->setConversionMode(MCP342X::CONTINUOUS);
masahikofukasawa 11:cef8dc1cf010 69 }
masahikofukasawa 11:cef8dc1cf010 70 else{
masahikofukasawa 11:cef8dc1cf010 71 return AkmSensor::ERROR;
masahikofukasawa 11:cef8dc1cf010 72 }
masahikofukasawa 11:cef8dc1cf010 73
masahikofukasawa 11:cef8dc1cf010 74 interval = SENSOR_SAMPLING_RATE; // 10Hz
masahikofukasawa 11:cef8dc1cf010 75
masahikofukasawa 11:cef8dc1cf010 76 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 77 }
masahikofukasawa 11:cef8dc1cf010 78
masahikofukasawa 11:cef8dc1cf010 79 void AkmAnalogSensor::eventCallback(){
masahikofukasawa 11:cef8dc1cf010 80 event = true;
masahikofukasawa 11:cef8dc1cf010 81 }
masahikofukasawa 11:cef8dc1cf010 82
masahikofukasawa 11:cef8dc1cf010 83 AkmSensor::Status AkmAnalogSensor::startSensor(){
masahikofukasawa 16:d85be9bafb80 84 ticker.attach(callback(this, &AkmAnalogSensor::eventCallback), interval);
masahikofukasawa 11:cef8dc1cf010 85 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 86 }
masahikofukasawa 11:cef8dc1cf010 87
masahikofukasawa 11:cef8dc1cf010 88 AkmSensor::Status AkmAnalogSensor::startSensor(const float sec){
masahikofukasawa 11:cef8dc1cf010 89 interval = sec;
masahikofukasawa 16:d85be9bafb80 90 ticker.attach(callback(this, &AkmAnalogSensor::eventCallback), interval);
masahikofukasawa 11:cef8dc1cf010 91 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 92 }
masahikofukasawa 11:cef8dc1cf010 93
masahikofukasawa 11:cef8dc1cf010 94 AkmSensor::Status AkmAnalogSensor::stopSensor(){
masahikofukasawa 11:cef8dc1cf010 95 ticker.detach();
masahikofukasawa 11:cef8dc1cf010 96 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 97 }
masahikofukasawa 11:cef8dc1cf010 98
masahikofukasawa 11:cef8dc1cf010 99 AkmSensor::Status AkmAnalogSensor::readSensorData(Message* msg){
masahikofukasawa 11:cef8dc1cf010 100 event = false;
masahikofukasawa 11:cef8dc1cf010 101
masahikofukasawa 11:cef8dc1cf010 102 msg->setCommand(Message::CMD_START_MEASUREMENT);
masahikofukasawa 11:cef8dc1cf010 103
masahikofukasawa 27:41aa9fb23a2f 104 // if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY){
masahikofukasawa 27:41aa9fb23a2f 105 // uint16_t value;
masahikofukasawa 27:41aa9fb23a2f 106 // float s = *ain;
masahikofukasawa 27:41aa9fb23a2f 107 // value = s*1024;
masahikofukasawa 27:41aa9fb23a2f 108 // msg->setArgument( 0, (char)( value >> 8) );
masahikofukasawa 27:41aa9fb23a2f 109 // msg->setArgument( 1, (char)( value & 0x00FF) );
masahikofukasawa 27:41aa9fb23a2f 110 if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR ||
masahikofukasawa 11:cef8dc1cf010 111 primaryId == AKM_PRIMARY_ID_MISC_ANALOG ||
masahikofukasawa 11:cef8dc1cf010 112 primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR){
masahikofukasawa 11:cef8dc1cf010 113 MCP342X::Data data;
masahikofukasawa 11:cef8dc1cf010 114 do {
masahikofukasawa 11:cef8dc1cf010 115 mcp3428->getData(&data);
masahikofukasawa 11:cef8dc1cf010 116 wait_ms(WAIT_ADC_MS);
masahikofukasawa 11:cef8dc1cf010 117 } while(data.st == MCP342X::DATA_NOT_UPDATED);
masahikofukasawa 11:cef8dc1cf010 118
masahikofukasawa 11:cef8dc1cf010 119 msg->setArgument( 0, (char)( (data.value&0xFF00) >> 8) );
masahikofukasawa 11:cef8dc1cf010 120 msg->setArgument( 1, (char)( data.value & 0x00FF) );
masahikofukasawa 11:cef8dc1cf010 121 }else{
masahikofukasawa 11:cef8dc1cf010 122 msg->setArgument( 0, 0);
masahikofukasawa 11:cef8dc1cf010 123 msg->setArgument( 1, 0);
masahikofukasawa 11:cef8dc1cf010 124 return AkmSensor::ERROR;
masahikofukasawa 11:cef8dc1cf010 125 }
masahikofukasawa 11:cef8dc1cf010 126 return AkmSensor::SUCCESS;
masahikofukasawa 11:cef8dc1cf010 127 }
masahikofukasawa 11:cef8dc1cf010 128
masahikofukasawa 11:cef8dc1cf010 129 AkmSensor::Status AkmAnalogSensor::requestCommand(Message* in, Message* out){
masahikofukasawa 15:1238993fd75f 130 return AkmSensor::ERROR;
masahikofukasawa 11:cef8dc1cf010 131 }