Modified for compatibility with Rev.E. hardware
Fork of AkmSensor by
akmanalogsensor.cpp@49:c8f8946129b6, 2018-05-01 (annotated)
- Committer:
- tkstreet
- Date:
- Tue May 01 21:31:15 2018 +0000
- Revision:
- 49:c8f8946129b6
- Parent:
- 45:6af8fdde0ef3
Modified for Rev.E. compatibility.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masahikofukasawa | 11:cef8dc1cf010 | 1 | #include "akmanalogsensor.h" |
masahikofukasawa | 11:cef8dc1cf010 | 2 | |
tkstreet | 49:c8f8946129b6 | 3 | #define SCALING_CONSTANT_3V 0.5997202865 |
tkstreet | 49:c8f8946129b6 | 4 | #define SCALING_CONSTANT_5V 0.3603082852 |
masahikofukasawa | 11:cef8dc1cf010 | 5 | #define WAIT_ADC_MS 1 |
masahikofukasawa | 11:cef8dc1cf010 | 6 | |
masahikofukasawa | 27:41aa9fb23a2f | 7 | AkmAnalogSensor::AkmAnalogSensor() : AkmSensor(){ |
masahikofukasawa | 11:cef8dc1cf010 | 8 | ain = NULL; |
masahikofukasawa | 11:cef8dc1cf010 | 9 | } |
masahikofukasawa | 11:cef8dc1cf010 | 10 | |
tkstreet | 49:c8f8946129b6 | 11 | |
masahikofukasawa | 11:cef8dc1cf010 | 12 | AkmAnalogSensor::~AkmAnalogSensor(){ |
masahikofukasawa | 11:cef8dc1cf010 | 13 | if(ain) delete ain; |
masahikofukasawa | 11:cef8dc1cf010 | 14 | } |
masahikofukasawa | 11:cef8dc1cf010 | 15 | |
tkstreet | 49:c8f8946129b6 | 16 | |
tkstreet | 49:c8f8946129b6 | 17 | AkmSensor::Status AkmAnalogSensor::init(const uint8_t p_id, const uint8_t s_id){ |
tkstreet | 49:c8f8946129b6 | 18 | |
tkstreet | 45:6af8fdde0ef3 | 19 | VERBOSE("#AkmAnalogSensor init()\r\n"); |
tkstreet | 49:c8f8946129b6 | 20 | |
tkstreet | 49:c8f8946129b6 | 21 | primaryId = p_id; |
tkstreet | 49:c8f8946129b6 | 22 | subId = s_id; |
masahikofukasawa | 11:cef8dc1cf010 | 23 | |
masahikofukasawa | 37:c76d2edf3426 | 24 | if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ430L) sensorName = "EQ-430L"; |
masahikofukasawa | 37:c76d2edf3426 | 25 | else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ431L) sensorName = "EQ-431L"; |
masahikofukasawa | 37:c76d2edf3426 | 26 | else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ432L) sensorName = "EQ-432L"; |
masahikofukasawa | 37:c76d2edf3426 | 27 | else if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR && subId == AkmAnalogSensor::SUB_ID_EQ433L) sensorName = "EQ-433L"; |
masahikofukasawa | 37:c76d2edf3426 | 28 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3200) sensorName = "CQ-3200"; |
masahikofukasawa | 37:c76d2edf3426 | 29 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3201) sensorName = "CQ-3201"; |
masahikofukasawa | 37:c76d2edf3426 | 30 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3202) sensorName = "CQ-3202"; |
masahikofukasawa | 37:c76d2edf3426 | 31 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3203) sensorName = "CQ-3203"; |
masahikofukasawa | 37:c76d2edf3426 | 32 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ3204) sensorName = "CQ-3204"; |
masahikofukasawa | 37:c76d2edf3426 | 33 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ320A) sensorName = "CQ-320A"; |
masahikofukasawa | 37:c76d2edf3426 | 34 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V && subId == AkmAnalogSensor::SUB_ID_CQ320B) sensorName = "CQ-320B"; |
masahikofukasawa | 37:c76d2edf3426 | 35 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3300) sensorName = "CQ-3300"; |
masahikofukasawa | 37:c76d2edf3426 | 36 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3301) sensorName = "CQ-3301"; |
masahikofukasawa | 37:c76d2edf3426 | 37 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3302) sensorName = "CQ-3302"; |
masahikofukasawa | 37:c76d2edf3426 | 38 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ3303) sensorName = "CQ-3303"; |
masahikofukasawa | 37:c76d2edf3426 | 39 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330A) sensorName = "CQ-330A"; |
masahikofukasawa | 37:c76d2edf3426 | 40 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330B) sensorName = "CQ-330B"; |
masahikofukasawa | 37:c76d2edf3426 | 41 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330E) sensorName = "CQ-330E"; |
masahikofukasawa | 37:c76d2edf3426 | 42 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330F) sensorName = "CQ-330F"; |
masahikofukasawa | 37:c76d2edf3426 | 43 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330G) sensorName = "CQ-330G"; |
masahikofukasawa | 37:c76d2edf3426 | 44 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330H) sensorName = "CQ-330H"; |
masahikofukasawa | 37:c76d2edf3426 | 45 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CQ330J) sensorName = "CQ-330J"; |
masahikofukasawa | 37:c76d2edf3426 | 46 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CZ3813) sensorName = "CZ-3813"; |
masahikofukasawa | 37:c76d2edf3426 | 47 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CZ3814) sensorName = "CZ-3814"; |
masahikofukasawa | 37:c76d2edf3426 | 48 | else if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V && subId == AkmAnalogSensor::SUB_ID_CZ3815) sensorName = "CZ-3815"; |
masahikofukasawa | 37:c76d2edf3426 | 49 | else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_EM3242) sensorName = "EM3242"; |
masahikofukasawa | 37:c76d2edf3426 | 50 | else if(primaryId == AKM_PRIMARY_ID_MISC_ANALOG && subId == AkmAnalogSensor::SUB_ID_AK9710) sensorName = "AK9710"; |
masahikofukasawa | 37:c76d2edf3426 | 51 | else return AkmSensor::ERROR; |
tkstreet | 49:c8f8946129b6 | 52 | |
tkstreet | 45:6af8fdde0ef3 | 53 | if( ((primaryId == AKM_PRIMARY_ID_MISC_ANALOG) && (subId <= AKM_PRIMARY_ID_CURRENT_SENSOR_3V)) |
tkstreet | 45:6af8fdde0ef3 | 54 | || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V){ |
tkstreet | 49:c8f8946129b6 | 55 | |
tkstreet | 49:c8f8946129b6 | 56 | ain = new AnalogIn(ANALOG_IN_A0); |
tkstreet | 49:c8f8946129b6 | 57 | VERBOSE("#ADC Connected to 3V Channel\r\n"); |
masahikofukasawa | 37:c76d2edf3426 | 58 | } |
tkstreet | 49:c8f8946129b6 | 59 | else { |
tkstreet | 49:c8f8946129b6 | 60 | ain = new AnalogIn(ANALOG_IN_A0);; |
tkstreet | 49:c8f8946129b6 | 61 | VERBOSE("#ADC Connected to 5V Channel\r\n"); |
tkstreet | 49:c8f8946129b6 | 62 | } |
masahikofukasawa | 11:cef8dc1cf010 | 63 | |
masahikofukasawa | 11:cef8dc1cf010 | 64 | interval = SENSOR_SAMPLING_RATE; // 10Hz |
masahikofukasawa | 11:cef8dc1cf010 | 65 | |
masahikofukasawa | 11:cef8dc1cf010 | 66 | return AkmSensor::SUCCESS; |
masahikofukasawa | 11:cef8dc1cf010 | 67 | } |
masahikofukasawa | 11:cef8dc1cf010 | 68 | |
masahikofukasawa | 11:cef8dc1cf010 | 69 | AkmSensor::Status AkmAnalogSensor::startSensor(){ |
masahikofukasawa | 29:b488d2c89fba | 70 | ticker.attach(callback(this, &AkmSensor::setEvent), interval); |
tkstreet | 45:6af8fdde0ef3 | 71 | MSG("#Start sensor: %s.\r\n",sensorName); |
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; |
tkstreet | 45:6af8fdde0ef3 | 77 | ticker.attach(callback(this, &AkmSensor::setEvent), interval); |
tkstreet | 45:6af8fdde0ef3 | 78 | MSG("#Start sensor %s. Interval = %.2f\r\n", sensorName, interval); |
masahikofukasawa | 11:cef8dc1cf010 | 79 | return AkmSensor::SUCCESS; |
masahikofukasawa | 11:cef8dc1cf010 | 80 | } |
masahikofukasawa | 11:cef8dc1cf010 | 81 | |
masahikofukasawa | 11:cef8dc1cf010 | 82 | AkmSensor::Status AkmAnalogSensor::stopSensor(){ |
masahikofukasawa | 11:cef8dc1cf010 | 83 | ticker.detach(); |
tkstreet | 44:0e251c736282 | 84 | MSG("#Stop sensor %s.\r\n", sensorName); |
masahikofukasawa | 11:cef8dc1cf010 | 85 | return AkmSensor::SUCCESS; |
masahikofukasawa | 11:cef8dc1cf010 | 86 | } |
masahikofukasawa | 11:cef8dc1cf010 | 87 | |
masahikofukasawa | 11:cef8dc1cf010 | 88 | AkmSensor::Status AkmAnalogSensor::readSensorData(Message* msg){ |
tkstreet | 49:c8f8946129b6 | 89 | |
tkstreet | 49:c8f8946129b6 | 90 | uint16_t ain16 = 0; |
tkstreet | 49:c8f8946129b6 | 91 | int16_t ain16_sign = 0; |
tkstreet | 49:c8f8946129b6 | 92 | double ain_norm = 0; |
tkstreet | 49:c8f8946129b6 | 93 | double ain_scl = 0; |
tkstreet | 49:c8f8946129b6 | 94 | |
tkstreet | 45:6af8fdde0ef3 | 95 | VERBOSE("#AkmAnalogSensor: Reading sensor data\r\n"); |
masahikofukasawa | 29:b488d2c89fba | 96 | AkmSensor::clearEvent(); |
masahikofukasawa | 11:cef8dc1cf010 | 97 | |
masahikofukasawa | 11:cef8dc1cf010 | 98 | msg->setCommand(Message::CMD_START_MEASUREMENT); |
masahikofukasawa | 11:cef8dc1cf010 | 99 | |
tkstreet | 49:c8f8946129b6 | 100 | if(primaryId == AKM_PRIMARY_ID_LINEAR_SENSOR || primaryId == AKM_PRIMARY_ID_MISC_ANALOG || |
tkstreet | 49:c8f8946129b6 | 101 | primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V || primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V ) |
tkstreet | 49:c8f8946129b6 | 102 | { |
tkstreet | 49:c8f8946129b6 | 103 | // Sample the ADC |
tkstreet | 49:c8f8946129b6 | 104 | ain_norm = ain->read(); |
tkstreet | 49:c8f8946129b6 | 105 | ain_norm *= 1.97; |
tkstreet | 49:c8f8946129b6 | 106 | |
tkstreet | 49:c8f8946129b6 | 107 | if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_3V){ |
tkstreet | 49:c8f8946129b6 | 108 | ain_scl = ain_norm * 1.8 / SCALING_CONSTANT_3V; |
tkstreet | 49:c8f8946129b6 | 109 | VERBOSE("#3V scale = %.4f\r\n", ain_scl); |
tkstreet | 49:c8f8946129b6 | 110 | } |
tkstreet | 49:c8f8946129b6 | 111 | if(primaryId == AKM_PRIMARY_ID_CURRENT_SENSOR_5V){ |
tkstreet | 49:c8f8946129b6 | 112 | ain_scl = ain_norm * 1.8 / SCALING_CONSTANT_5V; |
tkstreet | 49:c8f8946129b6 | 113 | VERBOSE("#5V scale = %.4f\r\n", ain_scl); |
tkstreet | 49:c8f8946129b6 | 114 | } |
tkstreet | 49:c8f8946129b6 | 115 | |
tkstreet | 49:c8f8946129b6 | 116 | ain16 = (uint16_t)(65535 * ain_norm); |
masahikofukasawa | 11:cef8dc1cf010 | 117 | |
tkstreet | 49:c8f8946129b6 | 118 | //ain16_sign = (int16_t)ain16; |
tkstreet | 49:c8f8946129b6 | 119 | //ain16_sign = (int16_t)ain16 - 32768; |
tkstreet | 49:c8f8946129b6 | 120 | ain16_sign = (int16_t)ain_norm*48011.0 - 32768; |
tkstreet | 49:c8f8946129b6 | 121 | |
tkstreet | 49:c8f8946129b6 | 122 | VERBOSE("#ain_norm = %.4f\r\n", ain_norm); |
tkstreet | 49:c8f8946129b6 | 123 | VERBOSE("#ain16 = %d\r\n", ain16); |
tkstreet | 49:c8f8946129b6 | 124 | VERBOSE("#ain16_sign = %d\r\n", ain16_sign); |
tkstreet | 49:c8f8946129b6 | 125 | |
tkstreet | 49:c8f8946129b6 | 126 | msg->setArgument(0, (char)((ain16_sign & 0xFF00) >> 8)); |
tkstreet | 49:c8f8946129b6 | 127 | msg->setArgument(1, (char)(ain16_sign & 0x00FF)); |
tkstreet | 49:c8f8946129b6 | 128 | } |
tkstreet | 49:c8f8946129b6 | 129 | else{ |
tkstreet | 49:c8f8946129b6 | 130 | msg->setArgument(0, 0); |
tkstreet | 49:c8f8946129b6 | 131 | msg->setArgument(1, 0); |
tkstreet | 45:6af8fdde0ef3 | 132 | MSG("readSensorData Error\r\n"); |
masahikofukasawa | 11:cef8dc1cf010 | 133 | return AkmSensor::ERROR; |
masahikofukasawa | 11:cef8dc1cf010 | 134 | } |
masahikofukasawa | 11:cef8dc1cf010 | 135 | return AkmSensor::SUCCESS; |
masahikofukasawa | 11:cef8dc1cf010 | 136 | } |
masahikofukasawa | 11:cef8dc1cf010 | 137 | |
masahikofukasawa | 11:cef8dc1cf010 | 138 | AkmSensor::Status AkmAnalogSensor::requestCommand(Message* in, Message* out){ |
tkstreet | 45:6af8fdde0ef3 | 139 | VERBOSE("#AkmAnalogSensor: requestCommand error\r\n"); |
masahikofukasawa | 15:1238993fd75f | 140 | return AkmSensor::ERROR; |
masahikofukasawa | 11:cef8dc1cf010 | 141 | } |