Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

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?

UserRevisionLine numberNew 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 }