Modified for compatibility with Rev.E. hardware
Fork of AkmSensor by
akmsensormanager.cpp@49:c8f8946129b6, 2018-05-01 (annotated)
- Committer:
- tkstreet
- Date:
- Tue May 01 21:31:15 2018 +0000
- Revision:
- 49:c8f8946129b6
- Parent:
- 48:427bdb7bf31b
Modified for Rev.E. compatibility.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masahikofukasawa | 0:7a00359e701e | 1 | #include "akmsensormanager.h" |
masahikofukasawa | 0:7a00359e701e | 2 | |
masahikofukasawa | 0:7a00359e701e | 3 | #define MAGNETOMETER_ID 0x0A |
masahikofukasawa | 0:7a00359e701e | 4 | #define CONV16I(high,low) ((int16_t)(((high) << 8) | (low))) |
masahikofukasawa | 0:7a00359e701e | 5 | |
masahikofukasawa | 10:5c69b067d88a | 6 | const char* AKM_PRIMARY_ID_STR[] = { |
masahikofukasawa | 7:e269411568c9 | 7 | "AKD Daughter Cards(SPI)", |
masahikofukasawa | 0:7a00359e701e | 8 | "Switch, Unipolar", |
masahikofukasawa | 0:7a00359e701e | 9 | "Switch, Onmipolar", |
masahikofukasawa | 0:7a00359e701e | 10 | "Latch, Bipolar", |
masahikofukasawa | 0:7a00359e701e | 11 | "Switch, Dual Output", |
masahikofukasawa | 0:7a00359e701e | 12 | "Onechip Encoder", |
masahikofukasawa | 0:7a00359e701e | 13 | "TBD1", |
masahikofukasawa | 37:c76d2edf3426 | 14 | "Current Sensor 3V", |
masahikofukasawa | 37:c76d2edf3426 | 15 | "Test", |
masahikofukasawa | 37:c76d2edf3426 | 16 | "Current Sensor 5V", |
masahikofukasawa | 0:7a00359e701e | 17 | "MISC(Analog)", |
masahikofukasawa | 0:7a00359e701e | 18 | "Linear Sensor", |
masahikofukasawa | 18:b7182d5ad8d5 | 19 | "Motor Drivers", |
masahikofukasawa | 1:b46b8653331f | 20 | "IR Sensor", |
masahikofukasawa | 7:e269411568c9 | 21 | "Angle Sensor(SPI)", |
masahikofukasawa | 10:5c69b067d88a | 22 | "AKD Daughter Cards(I2C)" |
masahikofukasawa | 0:7a00359e701e | 23 | }; |
masahikofukasawa | 0:7a00359e701e | 24 | |
masahikofukasawa | 13:d008249f0359 | 25 | AkmSensorManager::AkmSensorManager(SerialNano* com) |
masahikofukasawa | 0:7a00359e701e | 26 | { |
masahikofukasawa | 0:7a00359e701e | 27 | serial = com; |
tkstreet | 43:45225713cd58 | 28 | |
masahikofukasawa | 0:7a00359e701e | 29 | isEnabledUsb = true; |
masahikofukasawa | 41:a3ea80c594ec | 30 | isEnabledBle = false; |
masahikofukasawa | 0:7a00359e701e | 31 | eventCommandReceived = false; |
masahikofukasawa | 0:7a00359e701e | 32 | eventConnected = false; |
masahikofukasawa | 0:7a00359e701e | 33 | eventDisconnected = false; |
masahikofukasawa | 29:b488d2c89fba | 34 | interrupt = NULL; |
masahikofukasawa | 29:b488d2c89fba | 35 | sensorIndex = 0; |
masahikofukasawa | 29:b488d2c89fba | 36 | sensorNum = 0; |
masahikofukasawa | 29:b488d2c89fba | 37 | drdyType = AkmAkd::INTERRUPT_DISABLED; |
masahikofukasawa | 0:7a00359e701e | 38 | } |
masahikofukasawa | 0:7a00359e701e | 39 | |
masahikofukasawa | 10:5c69b067d88a | 40 | AkmSensorManager::Status AkmSensorManager::init(uint8_t id, uint8_t subid) |
masahikofukasawa | 0:7a00359e701e | 41 | { |
masahikofukasawa | 10:5c69b067d88a | 42 | primaryId = id; |
masahikofukasawa | 10:5c69b067d88a | 43 | subId = subid; |
masahikofukasawa | 29:b488d2c89fba | 44 | sensorIndex = 0; |
masahikofukasawa | 29:b488d2c89fba | 45 | sensorNum = 0; |
masahikofukasawa | 27:41aa9fb23a2f | 46 | if(AkmSensorManager::checkAkmSensor()!= true) return AkmSensorManager::ERROR; |
masahikofukasawa | 0:7a00359e701e | 47 | return AkmSensorManager::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 48 | } |
masahikofukasawa | 0:7a00359e701e | 49 | |
masahikofukasawa | 13:d008249f0359 | 50 | |
masahikofukasawa | 13:d008249f0359 | 51 | void AkmSensorManager::setBleUartService(UARTService* service) |
masahikofukasawa | 13:d008249f0359 | 52 | { |
masahikofukasawa | 13:d008249f0359 | 53 | uartService = service; |
masahikofukasawa | 13:d008249f0359 | 54 | isEnabledBle = true; |
masahikofukasawa | 13:d008249f0359 | 55 | } |
masahikofukasawa | 13:d008249f0359 | 56 | |
masahikofukasawa | 0:7a00359e701e | 57 | void AkmSensorManager::setEventConnected() |
masahikofukasawa | 0:7a00359e701e | 58 | { |
masahikofukasawa | 0:7a00359e701e | 59 | eventConnected = true; |
masahikofukasawa | 0:7a00359e701e | 60 | } |
masahikofukasawa | 0:7a00359e701e | 61 | |
masahikofukasawa | 0:7a00359e701e | 62 | void AkmSensorManager::setEventDisconnected() |
masahikofukasawa | 0:7a00359e701e | 63 | { |
masahikofukasawa | 0:7a00359e701e | 64 | eventDisconnected = true; |
masahikofukasawa | 0:7a00359e701e | 65 | } |
masahikofukasawa | 0:7a00359e701e | 66 | |
masahikofukasawa | 27:41aa9fb23a2f | 67 | bool AkmSensorManager::checkAkmSensor() |
masahikofukasawa | 29:b488d2c89fba | 68 | { |
masahikofukasawa | 29:b488d2c89fba | 69 | sensorNum = 0; |
masahikofukasawa | 29:b488d2c89fba | 70 | |
masahikofukasawa | 29:b488d2c89fba | 71 | // int i=0; |
masahikofukasawa | 29:b488d2c89fba | 72 | // while(sensor[i] != NULL){ |
masahikofukasawa | 29:b488d2c89fba | 73 | // delete(sensor[i]); |
masahikofukasawa | 29:b488d2c89fba | 74 | // i++; |
masahikofukasawa | 29:b488d2c89fba | 75 | // } |
masahikofukasawa | 39:3821886c902e | 76 | detachInterrupt(); |
masahikofukasawa | 29:b488d2c89fba | 77 | drdyType = AkmAkd::INTERRUPT_DISABLED; |
masahikofukasawa | 0:7a00359e701e | 78 | |
masahikofukasawa | 10:5c69b067d88a | 79 | switch(primaryId){ |
masahikofukasawa | 17:9abb7c28709c | 80 | |
masahikofukasawa | 7:e269411568c9 | 81 | case AkmSensor::AKM_PRIMARY_ID_AKD_SPI: |
masahikofukasawa | 29:b488d2c89fba | 82 | { |
masahikofukasawa | 29:b488d2c89fba | 83 | MSG("#SPI Interface.\r\n"); |
masahikofukasawa | 29:b488d2c89fba | 84 | } |
masahikofukasawa | 0:7a00359e701e | 85 | case AkmSensor::AKM_PRIMARY_ID_AKD_I2C: |
masahikofukasawa | 10:5c69b067d88a | 86 | { |
masahikofukasawa | 29:b488d2c89fba | 87 | if(subId == Ak09970Ctrl::SUB_ID_AK09970){ |
masahikofukasawa | 29:b488d2c89fba | 88 | drdyType = AkmAkd::INTERRUPT_ENABLED_PP; // Only support push-pull |
masahikofukasawa | 29:b488d2c89fba | 89 | Ak09970Ctrl* ak09970 = new Ak09970Ctrl(); |
masahikofukasawa | 29:b488d2c89fba | 90 | sensor[0] = ak09970; |
masahikofukasawa | 29:b488d2c89fba | 91 | sensorNum = 1; |
masahikofukasawa | 29:b488d2c89fba | 92 | MSG("#AK09970.\r\n"); |
masahikofukasawa | 10:5c69b067d88a | 93 | } |
masahikofukasawa | 10:5c69b067d88a | 94 | else{ |
masahikofukasawa | 29:b488d2c89fba | 95 | AkmAkd* akd = new AkmAkd(); |
masahikofukasawa | 29:b488d2c89fba | 96 | drdyType = akd->getInterrupt(primaryId, subId); |
masahikofukasawa | 29:b488d2c89fba | 97 | sensor[0] = akd; |
masahikofukasawa | 29:b488d2c89fba | 98 | sensorNum = 1; |
masahikofukasawa | 29:b488d2c89fba | 99 | MSG("#e-Compass.\r\n"); |
masahikofukasawa | 10:5c69b067d88a | 100 | } |
masahikofukasawa | 0:7a00359e701e | 101 | break; |
masahikofukasawa | 29:b488d2c89fba | 102 | } |
masahikofukasawa | 0:7a00359e701e | 103 | case AkmSensor::AKM_PRIMARY_ID_ANGLE_SENSOR: |
masahikofukasawa | 10:5c69b067d88a | 104 | { |
masahikofukasawa | 11:cef8dc1cf010 | 105 | if(subId == Ak7451Ctrl::SUB_ID_AK7451){ |
masahikofukasawa | 11:cef8dc1cf010 | 106 | Ak7451Ctrl* ak7451ctrl = new Ak7451Ctrl(); |
masahikofukasawa | 27:41aa9fb23a2f | 107 | sensor[0] = ak7451ctrl; |
masahikofukasawa | 29:b488d2c89fba | 108 | sensorNum = 1; |
masahikofukasawa | 10:5c69b067d88a | 109 | } |
masahikofukasawa | 10:5c69b067d88a | 110 | else if(subId == Ak7401Ctrl::SUB_ID_AK7401){ |
masahikofukasawa | 10:5c69b067d88a | 111 | Ak7401Ctrl* ak7401ctrl = new Ak7401Ctrl(); |
masahikofukasawa | 27:41aa9fb23a2f | 112 | sensor[0] = ak7401ctrl; |
masahikofukasawa | 29:b488d2c89fba | 113 | sensorNum = 1; |
masahikofukasawa | 10:5c69b067d88a | 114 | } |
masahikofukasawa | 0:7a00359e701e | 115 | break; |
masahikofukasawa | 29:b488d2c89fba | 116 | } |
masahikofukasawa | 17:9abb7c28709c | 117 | |
masahikofukasawa | 0:7a00359e701e | 118 | case AkmSensor::AKM_PRIMARY_ID_UNIPOLAR: |
masahikofukasawa | 0:7a00359e701e | 119 | case AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR: |
masahikofukasawa | 0:7a00359e701e | 120 | case AkmSensor::AKM_PRIMARY_ID_LATCH: |
masahikofukasawa | 0:7a00359e701e | 121 | case AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT: |
masahikofukasawa | 0:7a00359e701e | 122 | case AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER: |
masahikofukasawa | 10:5c69b067d88a | 123 | { |
masahikofukasawa | 10:5c69b067d88a | 124 | AkmHallSwitch* hallswitch = new AkmHallSwitch(); |
masahikofukasawa | 27:41aa9fb23a2f | 125 | sensor[0] = hallswitch; |
masahikofukasawa | 29:b488d2c89fba | 126 | sensorNum = 1; |
masahikofukasawa | 0:7a00359e701e | 127 | break; |
masahikofukasawa | 10:5c69b067d88a | 128 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 129 | /* |
masahikofukasawa | 27:41aa9fb23a2f | 130 | case AkmSensor::AKM_PRIMARY_ID_DEMO: |
masahikofukasawa | 27:41aa9fb23a2f | 131 | { |
masahikofukasawa | 29:b488d2c89fba | 132 | if(subId == 0x08){ |
masahikofukasawa | 29:b488d2c89fba | 133 | drdyType = AkmAkd::INTERRUPT_ENABLED_OD; // Only support open drain type DRDY |
masahikofukasawa | 29:b488d2c89fba | 134 | |
masahikofukasawa | 29:b488d2c89fba | 135 | Ak09970Ctrl* ak09970 = new Ak09970Ctrl(); |
masahikofukasawa | 29:b488d2c89fba | 136 | sensor[0] = ak09970; |
masahikofukasawa | 29:b488d2c89fba | 137 | if(sensor[0]->init(AkmSensor::AKM_PRIMARY_ID_AKD_I2C, Ak09970Ctrl::SUB_ID_AK09970) != AkmSensor::SUCCESS){ |
masahikofukasawa | 39:3821886c902e | 138 | MSG("#Error: sensor[0]->init failed.\r\n"); |
masahikofukasawa | 27:41aa9fb23a2f | 139 | return false; // couldn't find |
masahikofukasawa | 29:b488d2c89fba | 140 | } |
masahikofukasawa | 29:b488d2c89fba | 141 | |
masahikofukasawa | 29:b488d2c89fba | 142 | Ak9752Ctrl* ak9752ctrl = new Ak9752Ctrl(); |
masahikofukasawa | 29:b488d2c89fba | 143 | sensor[1] = ak9752ctrl; |
masahikofukasawa | 29:b488d2c89fba | 144 | if(sensor[1]->init(AkmSensor::AKM_PRIMARY_ID_IR_SENSOR, Ak9752Ctrl::SUB_ID_AK9752) != AkmSensor::SUCCESS){ |
masahikofukasawa | 39:3821886c902e | 145 | MSG("#Error: sensor[1]->init failed.\r\n"); |
masahikofukasawa | 27:41aa9fb23a2f | 146 | return false; // couldn't find |
masahikofukasawa | 29:b488d2c89fba | 147 | } |
masahikofukasawa | 29:b488d2c89fba | 148 | sensorNum = 2; |
masahikofukasawa | 27:41aa9fb23a2f | 149 | } |
masahikofukasawa | 29:b488d2c89fba | 150 | break; |
masahikofukasawa | 27:41aa9fb23a2f | 151 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 152 | */ |
masahikofukasawa | 4:af13b985c689 | 153 | case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR: |
masahikofukasawa | 37:c76d2edf3426 | 154 | case AkmSensor::AKM_PRIMARY_ID_CURRENT_SENSOR_3V: |
masahikofukasawa | 37:c76d2edf3426 | 155 | case AkmSensor::AKM_PRIMARY_ID_CURRENT_SENSOR_5V: |
masahikofukasawa | 10:5c69b067d88a | 156 | case AkmSensor::AKM_PRIMARY_ID_MISC_ANALOG: |
masahikofukasawa | 10:5c69b067d88a | 157 | { |
masahikofukasawa | 11:cef8dc1cf010 | 158 | AkmAnalogSensor* analogsensor = new AkmAnalogSensor(); |
masahikofukasawa | 27:41aa9fb23a2f | 159 | sensor[0] = analogsensor; |
masahikofukasawa | 29:b488d2c89fba | 160 | sensorNum = 1; |
masahikofukasawa | 0:7a00359e701e | 161 | break; |
masahikofukasawa | 10:5c69b067d88a | 162 | } |
masahikofukasawa | 17:9abb7c28709c | 163 | |
masahikofukasawa | 1:b46b8653331f | 164 | case AkmSensor::AKM_PRIMARY_ID_IR_SENSOR: |
masahikofukasawa | 10:5c69b067d88a | 165 | { |
masahikofukasawa | 29:b488d2c89fba | 166 | drdyType = AkmAkd::INTERRUPT_ENABLED_OD; |
masahikofukasawa | 29:b488d2c89fba | 167 | |
masahikofukasawa | 10:5c69b067d88a | 168 | if(subId == Ak9750Ctrl::SUB_ID_AK9750){ |
masahikofukasawa | 10:5c69b067d88a | 169 | Ak9750Ctrl* ak9750ctrl = new Ak9750Ctrl(); |
masahikofukasawa | 27:41aa9fb23a2f | 170 | sensor[0] = ak9750ctrl; |
masahikofukasawa | 29:b488d2c89fba | 171 | sensorNum = 1; |
masahikofukasawa | 15:1238993fd75f | 172 | }else if(subId == Ak9750Ctrl::SUB_ID_AK9753){ |
masahikofukasawa | 15:1238993fd75f | 173 | Ak9750Ctrl* ak9753ctrl = new Ak9750Ctrl(); |
masahikofukasawa | 27:41aa9fb23a2f | 174 | sensor[0] = ak9753ctrl; |
masahikofukasawa | 29:b488d2c89fba | 175 | sensorNum = 1; |
masahikofukasawa | 10:5c69b067d88a | 176 | }else if(subId == Ak9752Ctrl::SUB_ID_AK9752){ |
masahikofukasawa | 10:5c69b067d88a | 177 | Ak9752Ctrl* ak9752ctrl = new Ak9752Ctrl(); |
masahikofukasawa | 27:41aa9fb23a2f | 178 | sensor[0] = ak9752ctrl; |
masahikofukasawa | 29:b488d2c89fba | 179 | sensorNum = 1; |
masahikofukasawa | 10:5c69b067d88a | 180 | }else{ |
masahikofukasawa | 27:41aa9fb23a2f | 181 | return false; // couldn't find |
masahikofukasawa | 10:5c69b067d88a | 182 | } |
masahikofukasawa | 1:b46b8653331f | 183 | break; |
masahikofukasawa | 10:5c69b067d88a | 184 | } |
tkstreet | 33:d3e1e9eb2ef9 | 185 | case AkmSensor::AKM_PRIMARY_ID_MOTOR_DRIVER: |
tkstreet | 33:d3e1e9eb2ef9 | 186 | { // TODO: Other motor driver cases |
tkstreet | 33:d3e1e9eb2ef9 | 187 | if(subId == Ap1017Ctrl::SUB_ID_AP1017){ |
tkstreet | 33:d3e1e9eb2ef9 | 188 | Ap1017Ctrl* ap1017ctrl = new Ap1017Ctrl(); |
tkstreet | 34:1ea3357c8d9a | 189 | sensor[0] = ap1017ctrl; |
tkstreet | 34:1ea3357c8d9a | 190 | sensorNum = 1; |
tkstreet | 33:d3e1e9eb2ef9 | 191 | }else{ |
tkstreet | 33:d3e1e9eb2ef9 | 192 | return NULL; |
tkstreet | 33:d3e1e9eb2ef9 | 193 | } |
tkstreet | 33:d3e1e9eb2ef9 | 194 | break; |
tkstreet | 33:d3e1e9eb2ef9 | 195 | } |
masahikofukasawa | 0:7a00359e701e | 196 | default: |
masahikofukasawa | 10:5c69b067d88a | 197 | { |
masahikofukasawa | 39:3821886c902e | 198 | MSG("#Error: Can't find ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]); |
masahikofukasawa | 27:41aa9fb23a2f | 199 | return false; // couldn't find |
masahikofukasawa | 10:5c69b067d88a | 200 | } |
masahikofukasawa | 0:7a00359e701e | 201 | } |
masahikofukasawa | 29:b488d2c89fba | 202 | |
masahikofukasawa | 29:b488d2c89fba | 203 | if(primaryId != AkmSensor::AKM_PRIMARY_ID_DEMO){ |
Masahiko Fukasawa |
48:427bdb7bf31b | 204 | // for(int i=0; i<sensorNum; i++){ |
Masahiko Fukasawa |
48:427bdb7bf31b | 205 | if(sensor[0]->init(primaryId, subId) != AkmSensor::SUCCESS){ |
masahikofukasawa | 39:3821886c902e | 206 | MSG("#Error: sensor[i]->init failed. ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]); |
masahikofukasawa | 29:b488d2c89fba | 207 | return false; // couldn't find |
masahikofukasawa | 29:b488d2c89fba | 208 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 209 | // } |
masahikofukasawa | 27:41aa9fb23a2f | 210 | MSG("#ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]); |
masahikofukasawa | 0:7a00359e701e | 211 | } |
masahikofukasawa | 29:b488d2c89fba | 212 | |
masahikofukasawa | 39:3821886c902e | 213 | attachInterrupt(); |
masahikofukasawa | 39:3821886c902e | 214 | |
masahikofukasawa | 27:41aa9fb23a2f | 215 | return true; |
masahikofukasawa | 0:7a00359e701e | 216 | } |
masahikofukasawa | 0:7a00359e701e | 217 | |
masahikofukasawa | 29:b488d2c89fba | 218 | void AkmSensorManager::detectDRDY(){ |
tkstreet | 45:6af8fdde0ef3 | 219 | VERBOSE("#detect DRDY.\r\n"); |
Masahiko Fukasawa |
48:427bdb7bf31b | 220 | // for(int i=0; i<sensorNum; i++){ |
Masahiko Fukasawa |
48:427bdb7bf31b | 221 | sensor[0]->setEvent(); |
Masahiko Fukasawa |
48:427bdb7bf31b | 222 | // } |
masahikofukasawa | 29:b488d2c89fba | 223 | } |
masahikofukasawa | 29:b488d2c89fba | 224 | |
tkstreet | 49:c8f8946129b6 | 225 | void AkmSensorManager::commandReceivedCallback(){ |
tkstreet | 49:c8f8946129b6 | 226 | VERBOSE("#commandReceivedCallback: Command Received\r\n"); |
tkstreet | 49:c8f8946129b6 | 227 | } |
masahikofukasawa | 16:d85be9bafb80 | 228 | |
tkstreet | 33:d3e1e9eb2ef9 | 229 | |
tkstreet | 33:d3e1e9eb2ef9 | 230 | // For commands received via BLE |
masahikofukasawa | 0:7a00359e701e | 231 | AkmSensorManager::Status AkmSensorManager::commandReceived(char* buf){ |
masahikofukasawa | 0:7a00359e701e | 232 | // Construct message |
masahikofukasawa | 0:7a00359e701e | 233 | Status status = SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 234 | |
masahikofukasawa | 10:5c69b067d88a | 235 | if ((Message::parse(&msg, buf)) != Message::SUCCESS) { |
masahikofukasawa | 39:3821886c902e | 236 | MSG("#Error: Failed to parse message. %s\r\n", buf); |
masahikofukasawa | 0:7a00359e701e | 237 | status = ERROR; |
tkstreet | 33:d3e1e9eb2ef9 | 238 | eventCommandReceived = false; // Reset flag |
masahikofukasawa | 15:1238993fd75f | 239 | }else{ |
tkstreet | 33:d3e1e9eb2ef9 | 240 | eventCommandReceived = true; // Set flag |
tkstreet | 45:6af8fdde0ef3 | 241 | VERBOSE("#Parsed message. %s\r\n", buf); |
masahikofukasawa | 0:7a00359e701e | 242 | } |
tkstreet | 49:c8f8946129b6 | 243 | t.attach(callback(this, &AkmSensorManager::commandReceivedCallback),0); // wake-up from ble.waitForEvent |
masahikofukasawa | 0:7a00359e701e | 244 | return status; |
masahikofukasawa | 0:7a00359e701e | 245 | } |
masahikofukasawa | 0:7a00359e701e | 246 | |
tkstreet | 49:c8f8946129b6 | 247 | /* |
coisme | 2:11fe67783c4c | 248 | int16_t AkmSensorManager::getAdcData(MCP342X *mcp3428, MCP342X::AdcChannel ch, MCP342X::SampleSetting s) { |
coisme | 2:11fe67783c4c | 249 | const int WAIT_ADC_MS = 1; |
coisme | 2:11fe67783c4c | 250 | |
coisme | 2:11fe67783c4c | 251 | // Configure channel and trigger. |
coisme | 2:11fe67783c4c | 252 | mcp3428->setChannel(ch); |
coisme | 2:11fe67783c4c | 253 | mcp3428->setSampleSetting(s); |
coisme | 2:11fe67783c4c | 254 | mcp3428->trigger(); |
coisme | 2:11fe67783c4c | 255 | |
coisme | 2:11fe67783c4c | 256 | // polling data (!blocking) |
coisme | 2:11fe67783c4c | 257 | MCP342X::Data data; |
coisme | 2:11fe67783c4c | 258 | do { |
coisme | 2:11fe67783c4c | 259 | wait_ms(WAIT_ADC_MS); |
coisme | 2:11fe67783c4c | 260 | mcp3428->getData(&data); |
coisme | 2:11fe67783c4c | 261 | } while(data.st == MCP342X::DATA_NOT_UPDATED); |
coisme | 2:11fe67783c4c | 262 | |
coisme | 2:11fe67783c4c | 263 | return data.value; |
coisme | 2:11fe67783c4c | 264 | } |
tkstreet | 49:c8f8946129b6 | 265 | */ |
tkstreet | 33:d3e1e9eb2ef9 | 266 | |
masahikofukasawa | 0:7a00359e701e | 267 | uint8_t AkmSensorManager::getId(PinName pin, uint8_t bits) |
masahikofukasawa | 0:7a00359e701e | 268 | { |
tkstreet | 49:c8f8946129b6 | 269 | VERBOSE("#AkmSensorManager: GetID\r\n"); |
tkstreet | 21:966724730ce6 | 270 | |
tkstreet | 49:c8f8946129b6 | 271 | AnalogIn ain(pin); |
tkstreet | 49:c8f8946129b6 | 272 | double value = 0; |
tkstreet | 49:c8f8946129b6 | 273 | uint8_t ID = 0; |
tkstreet | 49:c8f8946129b6 | 274 | |
tkstreet | 49:c8f8946129b6 | 275 | value = ain.read(); |
tkstreet | 49:c8f8946129b6 | 276 | |
tkstreet | 49:c8f8946129b6 | 277 | MSG("#ADC ID Raw Value: %.5f\r\n", value); |
tkstreet | 49:c8f8946129b6 | 278 | |
tkstreet | 49:c8f8946129b6 | 279 | // Scale reading |
tkstreet | 49:c8f8946129b6 | 280 | // Range of reading is 0.0 to 1.0 |
tkstreet | 49:c8f8946129b6 | 281 | value = 2.0 * (3.0 * value); |
tkstreet | 49:c8f8946129b6 | 282 | // value = (1/0.5555556) * (3.0 * value); // multiply by 1/(voltage divider) and 3.0V |
tkstreet | 49:c8f8946129b6 | 283 | |
tkstreet | 49:c8f8946129b6 | 284 | MSG("#ADC ID Reading: %.4f\r\n", value); |
coisme | 2:11fe67783c4c | 285 | |
tkstreet | 49:c8f8946129b6 | 286 | if(bits == 4){ |
tkstreet | 49:c8f8946129b6 | 287 | // Convert reading into a 4-bit ID (i.e. 0-15) |
tkstreet | 49:c8f8946129b6 | 288 | ID = (uint8_t)((value/3.0)*16 + 0.5); |
tkstreet | 49:c8f8946129b6 | 289 | MSG("#4-bit ID = %d.\r\n", ID); |
tkstreet | 49:c8f8946129b6 | 290 | } |
tkstreet | 49:c8f8946129b6 | 291 | else if(bits == 5){ |
tkstreet | 49:c8f8946129b6 | 292 | // Convert reading into a 5-bit ID (i.e. 0-15) |
tkstreet | 49:c8f8946129b6 | 293 | ID = (uint8_t)((value/3.0)*32 + 0.5); |
tkstreet | 49:c8f8946129b6 | 294 | MSG("#5-bit ID = %d.\r\n", ID); |
tkstreet | 49:c8f8946129b6 | 295 | } |
tkstreet | 49:c8f8946129b6 | 296 | |
tkstreet | 49:c8f8946129b6 | 297 | return ID; |
masahikofukasawa | 0:7a00359e701e | 298 | } |
masahikofukasawa | 0:7a00359e701e | 299 | |
tkstreet | 33:d3e1e9eb2ef9 | 300 | |
masahikofukasawa | 0:7a00359e701e | 301 | bool AkmSensorManager::isEvent() |
masahikofukasawa | 0:7a00359e701e | 302 | { |
masahikofukasawa | 29:b488d2c89fba | 303 | // check sensor related event |
Masahiko Fukasawa |
48:427bdb7bf31b | 304 | // for(int i=0; i<sensorNum; i++){ |
Masahiko Fukasawa |
48:427bdb7bf31b | 305 | if(sensor[0]->isEvent()){ |
masahikofukasawa | 29:b488d2c89fba | 306 | return true; |
masahikofukasawa | 29:b488d2c89fba | 307 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 308 | // } |
masahikofukasawa | 29:b488d2c89fba | 309 | |
masahikofukasawa | 29:b488d2c89fba | 310 | // other events |
masahikofukasawa | 29:b488d2c89fba | 311 | return ( |
masahikofukasawa | 0:7a00359e701e | 312 | eventCommandReceived || |
masahikofukasawa | 0:7a00359e701e | 313 | eventConnected || |
masahikofukasawa | 0:7a00359e701e | 314 | eventDisconnected); |
masahikofukasawa | 0:7a00359e701e | 315 | } |
masahikofukasawa | 0:7a00359e701e | 316 | |
masahikofukasawa | 0:7a00359e701e | 317 | void AkmSensorManager::processCommand() |
masahikofukasawa | 0:7a00359e701e | 318 | { |
tkstreet | 23:50c98b286e41 | 319 | // Extracts command contained in the message |
masahikofukasawa | 0:7a00359e701e | 320 | Message::Command cmd = msg.getCommand(); |
masahikofukasawa | 0:7a00359e701e | 321 | |
tkstreet | 21:966724730ce6 | 322 | // Creates a message object to return |
masahikofukasawa | 0:7a00359e701e | 323 | Message resMsg; |
masahikofukasawa | 0:7a00359e701e | 324 | |
tkstreet | 23:50c98b286e41 | 325 | // Return message contains the extracted command |
masahikofukasawa | 0:7a00359e701e | 326 | resMsg.setCommand(cmd); |
masahikofukasawa | 0:7a00359e701e | 327 | |
masahikofukasawa | 0:7a00359e701e | 328 | switch(cmd) |
masahikofukasawa | 0:7a00359e701e | 329 | { |
masahikofukasawa | 0:7a00359e701e | 330 | case Message::CMD_GET_FW_VERSION: |
masahikofukasawa | 11:cef8dc1cf010 | 331 | { |
masahikofukasawa | 0:7a00359e701e | 332 | resMsg.setArgument(0, FIRMWARE_VERSION); |
masahikofukasawa | 0:7a00359e701e | 333 | throwMessage(&resMsg); |
masahikofukasawa | 11:cef8dc1cf010 | 334 | MSG("#FW version is reported.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 335 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 336 | } |
masahikofukasawa | 0:7a00359e701e | 337 | case Message::CMD_GET_MAG_PART: |
masahikofukasawa | 11:cef8dc1cf010 | 338 | { |
masahikofukasawa | 0:7a00359e701e | 339 | resMsg.setArgument(0, MAGNETOMETER_ID); |
masahikofukasawa | 0:7a00359e701e | 340 | throwMessage(&resMsg); |
masahikofukasawa | 11:cef8dc1cf010 | 341 | MSG("#Mag ID is reported.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 342 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 343 | } |
masahikofukasawa | 0:7a00359e701e | 344 | case Message::CMD_SET_SERIAL_TARGET: |
masahikofukasawa | 11:cef8dc1cf010 | 345 | { |
masahikofukasawa | 0:7a00359e701e | 346 | isEnabledBle = msg.getArgument(0)==Message::SW_ON ? true : false; |
masahikofukasawa | 0:7a00359e701e | 347 | isEnabledUsb = msg.getArgument(1)==Message::SW_ON ? true : false; |
masahikofukasawa | 0:7a00359e701e | 348 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 349 | } |
masahikofukasawa | 0:7a00359e701e | 350 | case Message::CMD_GET_ID: // return Primary ID and Sub ID |
masahikofukasawa | 11:cef8dc1cf010 | 351 | { |
masahikofukasawa | 10:5c69b067d88a | 352 | resMsg.setArgument(0, primaryId); |
masahikofukasawa | 0:7a00359e701e | 353 | resMsg.setArgument(1, subId); |
masahikofukasawa | 0:7a00359e701e | 354 | throwMessage(&resMsg); |
masahikofukasawa | 29:b488d2c89fba | 355 | MSG("#ID is reported.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 356 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 357 | } |
masahikofukasawa | 29:b488d2c89fba | 358 | case Message::CMD_GET_SENSOR_INDEX: |
masahikofukasawa | 27:41aa9fb23a2f | 359 | { |
masahikofukasawa | 29:b488d2c89fba | 360 | resMsg.setArgument(0, sensorIndex); |
masahikofukasawa | 27:41aa9fb23a2f | 361 | throwMessage(&resMsg); |
masahikofukasawa | 29:b488d2c89fba | 362 | MSG("#Get Sensor Index=%d.\r\n", sensorIndex); |
masahikofukasawa | 27:41aa9fb23a2f | 363 | break; |
masahikofukasawa | 27:41aa9fb23a2f | 364 | } |
masahikofukasawa | 29:b488d2c89fba | 365 | case Message::CMD_SET_SENSOR_INDEX: |
masahikofukasawa | 27:41aa9fb23a2f | 366 | { |
masahikofukasawa | 29:b488d2c89fba | 367 | uint8_t index = (uint8_t)msg.getArgument(0); |
masahikofukasawa | 30:5a241d9b3262 | 368 | if(msg.getArgNum() == 1 && index<sensorNum){ |
masahikofukasawa | 28:dc4eb14e4d7e | 369 | resMsg.setArgument(0, 0); |
masahikofukasawa | 29:b488d2c89fba | 370 | sensorIndex = index; |
masahikofukasawa | 29:b488d2c89fba | 371 | MSG("#Set Sensor Index=%d.\r\n", sensorIndex); |
masahikofukasawa | 30:5a241d9b3262 | 372 | }else{ |
masahikofukasawa | 30:5a241d9b3262 | 373 | resMsg.setArgument(0, 1); |
masahikofukasawa | 30:5a241d9b3262 | 374 | MSG("#Error: Set Sensor Index=%d.\r\n", sensorIndex); |
masahikofukasawa | 29:b488d2c89fba | 375 | } |
masahikofukasawa | 28:dc4eb14e4d7e | 376 | throwMessage(&resMsg); |
masahikofukasawa | 27:41aa9fb23a2f | 377 | break; |
masahikofukasawa | 27:41aa9fb23a2f | 378 | } |
masahikofukasawa | 29:b488d2c89fba | 379 | case Message::CMD_GET_TOTAL_SENSOR_NUM: |
masahikofukasawa | 27:41aa9fb23a2f | 380 | { |
masahikofukasawa | 29:b488d2c89fba | 381 | resMsg.setArgument(0, sensorNum); |
masahikofukasawa | 27:41aa9fb23a2f | 382 | throwMessage(&resMsg); |
masahikofukasawa | 29:b488d2c89fba | 383 | MSG("#Get Sensor Total Num=%d.\r\n", sensorNum); |
masahikofukasawa | 0:7a00359e701e | 384 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 385 | } |
masahikofukasawa | 0:7a00359e701e | 386 | case Message::CMD_STOP_MEASUREMENT: |
masahikofukasawa | 11:cef8dc1cf010 | 387 | { |
masahikofukasawa | 29:b488d2c89fba | 388 | if( sensor[sensorIndex]->stopSensor() != AkmSensor::SUCCESS){ |
masahikofukasawa | 15:1238993fd75f | 389 | resMsg.setArgument(0, 1); |
masahikofukasawa | 15:1238993fd75f | 390 | }else{ |
masahikofukasawa | 27:41aa9fb23a2f | 391 | resMsg.setArgument(0, 0); |
masahikofukasawa | 15:1238993fd75f | 392 | } |
masahikofukasawa | 0:7a00359e701e | 393 | throwMessage(&resMsg); |
masahikofukasawa | 39:3821886c902e | 394 | |
masahikofukasawa | 39:3821886c902e | 395 | detachInterrupt(); |
masahikofukasawa | 39:3821886c902e | 396 | |
masahikofukasawa | 29:b488d2c89fba | 397 | MSG("#Stop measurement:%s.\r\n",sensor[sensorIndex]->getSensorName()); |
masahikofukasawa | 0:7a00359e701e | 398 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 399 | } |
masahikofukasawa | 0:7a00359e701e | 400 | case Message::CMD_START_MEASUREMENT: |
masahikofukasawa | 11:cef8dc1cf010 | 401 | { |
masahikofukasawa | 11:cef8dc1cf010 | 402 | int error_code = AkmSensor::SUCCESS; |
Masahiko Fukasawa |
48:427bdb7bf31b | 403 | if(msg.getArgNum() == 0) |
Masahiko Fukasawa |
48:427bdb7bf31b | 404 | { |
masahikofukasawa | 29:b488d2c89fba | 405 | error_code = sensor[sensorIndex]->startSensor(); |
masahikofukasawa | 11:cef8dc1cf010 | 406 | if( error_code != AkmSensor::SUCCESS ){ |
masahikofukasawa | 39:3821886c902e | 407 | MSG("#Error: StartSensor Error. Code=%d\r\n",error_code); |
masahikofukasawa | 11:cef8dc1cf010 | 408 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 409 | else |
Masahiko Fukasawa |
48:427bdb7bf31b | 410 | { |
Masahiko Fukasawa |
48:427bdb7bf31b | 411 | switch(drdyType){ |
Masahiko Fukasawa |
48:427bdb7bf31b | 412 | case AkmAkd::INTERRUPT_ENABLED_PP: |
Masahiko Fukasawa |
48:427bdb7bf31b | 413 | { |
Masahiko Fukasawa |
48:427bdb7bf31b | 414 | interrupt->rise(callback(this, &AkmSensorManager::detectDRDY)); |
Masahiko Fukasawa |
48:427bdb7bf31b | 415 | break; |
Masahiko Fukasawa |
48:427bdb7bf31b | 416 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 417 | case AkmAkd::INTERRUPT_ENABLED_OD: |
Masahiko Fukasawa |
48:427bdb7bf31b | 418 | { |
Masahiko Fukasawa |
48:427bdb7bf31b | 419 | interrupt->fall(callback(this, &AkmSensorManager::detectDRDY)); |
Masahiko Fukasawa |
48:427bdb7bf31b | 420 | break; |
Masahiko Fukasawa |
48:427bdb7bf31b | 421 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 422 | default: |
Masahiko Fukasawa |
48:427bdb7bf31b | 423 | { |
Masahiko Fukasawa |
48:427bdb7bf31b | 424 | // nothing. |
Masahiko Fukasawa |
48:427bdb7bf31b | 425 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 426 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 427 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 428 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 429 | else if(msg.getArgNum() == 1) |
Masahiko Fukasawa |
48:427bdb7bf31b | 430 | { |
masahikofukasawa | 46:5938ad2039b0 | 431 | float interval = (float)(1.0 / (double)msg.getArgument(0)); |
masahikofukasawa | 29:b488d2c89fba | 432 | error_code = sensor[sensorIndex]->startSensor(interval); |
masahikofukasawa | 11:cef8dc1cf010 | 433 | if( error_code != AkmSensor::SUCCESS ){ |
masahikofukasawa | 39:3821886c902e | 434 | MSG("#Error: StartSensor Error. Code=%d\r\n",error_code); |
masahikofukasawa | 11:cef8dc1cf010 | 435 | } |
masahikofukasawa | 11:cef8dc1cf010 | 436 | else{ |
masahikofukasawa | 39:3821886c902e | 437 | detachInterrupt(); |
masahikofukasawa | 11:cef8dc1cf010 | 438 | } |
masahikofukasawa | 11:cef8dc1cf010 | 439 | }else{ |
tkstreet | 44:0e251c736282 | 440 | MSG("#Error: StartSensor Error: Wrong number of arguments.\r\n"); |
masahikofukasawa | 11:cef8dc1cf010 | 441 | } |
masahikofukasawa | 39:3821886c902e | 442 | |
masahikofukasawa | 11:cef8dc1cf010 | 443 | if(error_code == AkmSensor::SUCCESS){ |
masahikofukasawa | 11:cef8dc1cf010 | 444 | // get initial sensor state for switch type sensors |
masahikofukasawa | 11:cef8dc1cf010 | 445 | if( primaryId == AkmSensor::AKM_PRIMARY_ID_UNIPOLAR || |
masahikofukasawa | 11:cef8dc1cf010 | 446 | primaryId == AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR || |
masahikofukasawa | 11:cef8dc1cf010 | 447 | primaryId == AkmSensor::AKM_PRIMARY_ID_LATCH || |
masahikofukasawa | 11:cef8dc1cf010 | 448 | primaryId == AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT || |
masahikofukasawa | 11:cef8dc1cf010 | 449 | primaryId == AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER ){ |
masahikofukasawa | 11:cef8dc1cf010 | 450 | Message temp; |
masahikofukasawa | 29:b488d2c89fba | 451 | sensor[sensorIndex]->readSensorData(&temp); |
masahikofukasawa | 11:cef8dc1cf010 | 452 | throwMessage(&temp); |
masahikofukasawa | 11:cef8dc1cf010 | 453 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 454 | MSG("#Start measurement:%s index=%d.\r\n",sensor[sensorIndex]->getSensorName(), sensorIndex); |
masahikofukasawa | 0:7a00359e701e | 455 | } |
masahikofukasawa | 0:7a00359e701e | 456 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 457 | } |
tkstreet | 33:d3e1e9eb2ef9 | 458 | case Message::CMD_MOTOR_START_MOTOR: |
tkstreet | 33:d3e1e9eb2ef9 | 459 | case Message::CMD_MOTOR_STOP_MOTOR: |
tkstreet | 33:d3e1e9eb2ef9 | 460 | case Message::CMD_MOTOR_SET_DIRECTION: |
tkstreet | 33:d3e1e9eb2ef9 | 461 | case Message::CMD_MOTOR_SET_DUTY_CYCLE: |
masahikofukasawa | 9:6fa3e7b17c27 | 462 | case Message::CMD_PROGSW_GET_THRESHOLD: |
masahikofukasawa | 9:6fa3e7b17c27 | 463 | case Message::CMD_PROGSW_SET_THRESHOLD: |
masahikofukasawa | 9:6fa3e7b17c27 | 464 | case Message::CMD_PROGSW_GET_READ_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 465 | case Message::CMD_PROGSW_SET_READ_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 466 | case Message::CMD_PROGSW_GET_SWITCH_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 467 | case Message::CMD_PROGSW_SET_SWITCH_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 468 | case Message::CMD_PROGSW_GET_OPERATION_MODE: |
masahikofukasawa | 9:6fa3e7b17c27 | 469 | case Message::CMD_PROGSW_SET_OPERATION_MODE: |
masahikofukasawa | 1:b46b8653331f | 470 | case Message::CMD_IR_GET_THRESHOLD: |
masahikofukasawa | 1:b46b8653331f | 471 | case Message::CMD_IR_SET_THRESHOLD: |
masahikofukasawa | 1:b46b8653331f | 472 | case Message::CMD_IR_GET_HYSTERESIS: |
masahikofukasawa | 1:b46b8653331f | 473 | case Message::CMD_IR_SET_HYSTERESIS: |
masahikofukasawa | 1:b46b8653331f | 474 | case Message::CMD_IR_GET_INTERRUPT: |
masahikofukasawa | 1:b46b8653331f | 475 | case Message::CMD_IR_SET_INTERRUPT: |
masahikofukasawa | 1:b46b8653331f | 476 | case Message::CMD_IR_GET_OPERATION_MODE: |
masahikofukasawa | 1:b46b8653331f | 477 | case Message::CMD_IR_SET_OPERATION_MODE: |
masahikofukasawa | 1:b46b8653331f | 478 | case Message::CMD_IR_GET_THRESHOLD_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 479 | case Message::CMD_IR_SET_THRESHOLD_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 480 | case Message::CMD_IR_GET_HYSTERESIS_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 481 | case Message::CMD_IR_SET_HYSTERESIS_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 482 | case Message::CMD_IR_GET_INTERRUPT_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 483 | case Message::CMD_IR_SET_INTERRUPT_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 484 | case Message::CMD_IR_GET_OPERATION_MODE_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 485 | case Message::CMD_IR_SET_OPERATION_MODE_EEPROM: |
masahikofukasawa | 9:6fa3e7b17c27 | 486 | case Message::CMD_ANGLE_ZERO_RESET: |
masahikofukasawa | 30:5a241d9b3262 | 487 | case Message::CMD_ANGLE_READ: |
masahikofukasawa | 9:6fa3e7b17c27 | 488 | case Message::CMD_REG_WRITE: |
masahikofukasawa | 9:6fa3e7b17c27 | 489 | case Message::CMD_REG_WRITEN: |
masahikofukasawa | 9:6fa3e7b17c27 | 490 | case Message::CMD_REG_READ: |
masahikofukasawa | 9:6fa3e7b17c27 | 491 | case Message::CMD_REG_READN: |
masahikofukasawa | 9:6fa3e7b17c27 | 492 | case Message::CMD_COMPASS_GET_OPERATION_MODE: |
masahikofukasawa | 9:6fa3e7b17c27 | 493 | case Message::CMD_COMPASS_SET_OPERATION_MODE: |
masahikofukasawa | 11:cef8dc1cf010 | 494 | { |
masahikofukasawa | 29:b488d2c89fba | 495 | AkmSensor::Status st = sensor[sensorIndex]->requestCommand(&msg,&resMsg); |
masahikofukasawa | 15:1238993fd75f | 496 | if( (resMsg.getArgNum() == 0) && (st != AkmSensor::SUCCESS) ) |
masahikofukasawa | 15:1238993fd75f | 497 | { |
masahikofukasawa | 39:3821886c902e | 498 | MSG("#Error: Command failed.\r\n"); |
masahikofukasawa | 15:1238993fd75f | 499 | }else{ |
masahikofukasawa | 15:1238993fd75f | 500 | throwMessage(&resMsg); |
masahikofukasawa | 15:1238993fd75f | 501 | } |
masahikofukasawa | 0:7a00359e701e | 502 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 503 | } |
masahikofukasawa | 0:7a00359e701e | 504 | default: |
masahikofukasawa | 11:cef8dc1cf010 | 505 | { |
masahikofukasawa | 39:3821886c902e | 506 | MSG("#Error: Can't find command.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 507 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 508 | } |
masahikofukasawa | 0:7a00359e701e | 509 | } |
masahikofukasawa | 0:7a00359e701e | 510 | } |
masahikofukasawa | 0:7a00359e701e | 511 | |
masahikofukasawa | 0:7a00359e701e | 512 | AkmSensorManager::Status AkmSensorManager::processEvent() |
masahikofukasawa | 0:7a00359e701e | 513 | { |
masahikofukasawa | 0:7a00359e701e | 514 | AkmSensorManager::Status status = AkmSensorManager::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 515 | |
tkstreet | 33:d3e1e9eb2ef9 | 516 | // If event is a command received from BLE |
masahikofukasawa | 0:7a00359e701e | 517 | if(eventCommandReceived) |
masahikofukasawa | 0:7a00359e701e | 518 | { |
tkstreet | 45:6af8fdde0ef3 | 519 | VERBOSE("#Command received.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 520 | processCommand(); |
tkstreet | 21:966724730ce6 | 521 | eventCommandReceived = false; // clear the flag |
masahikofukasawa | 0:7a00359e701e | 522 | } |
masahikofukasawa | 29:b488d2c89fba | 523 | |
masahikofukasawa | 29:b488d2c89fba | 524 | // check sensor event |
Masahiko Fukasawa |
48:427bdb7bf31b | 525 | // for(int i=0; i<sensorNum; i++){ |
Masahiko Fukasawa |
48:427bdb7bf31b | 526 | if( sensor[0]->isEvent() ){ |
masahikofukasawa | 29:b488d2c89fba | 527 | Message msg; |
Masahiko Fukasawa |
48:427bdb7bf31b | 528 | if( sensor[0]->readSensorData(&msg) != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR; |
tkstreet | 34:1ea3357c8d9a | 529 | throwMessage(&msg); // Process and output message to USB/BLE |
masahikofukasawa | 29:b488d2c89fba | 530 | } |
Masahiko Fukasawa |
48:427bdb7bf31b | 531 | // } |
masahikofukasawa | 0:7a00359e701e | 532 | |
tkstreet | 34:1ea3357c8d9a | 533 | if(eventConnected) // If BLE connected, clear flag and start sensor. |
masahikofukasawa | 0:7a00359e701e | 534 | { |
tkstreet | 21:966724730ce6 | 535 | eventConnected = false; // clear the flag |
masahikofukasawa | 12:c06cd8b76358 | 536 | MSG("#BLE connected.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 537 | } |
tkstreet | 23:50c98b286e41 | 538 | |
tkstreet | 23:50c98b286e41 | 539 | // If event is the BLE being disconnected, stop the sensor |
tkstreet | 23:50c98b286e41 | 540 | if(eventDisconnected) |
masahikofukasawa | 0:7a00359e701e | 541 | { |
tkstreet | 45:6af8fdde0ef3 | 542 | MSG("#BLE disconnected.\r\n"); |
Masahiko Fukasawa |
48:427bdb7bf31b | 543 | // for(int i=0; i<sensorNum; i++){ |
Masahiko Fukasawa |
48:427bdb7bf31b | 544 | if( sensor[0]->stopSensor() != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR; |
Masahiko Fukasawa |
48:427bdb7bf31b | 545 | // } |
tkstreet | 34:1ea3357c8d9a | 546 | eventDisconnected = false; // clear the flag |
masahikofukasawa | 0:7a00359e701e | 547 | } |
masahikofukasawa | 0:7a00359e701e | 548 | return status; |
masahikofukasawa | 0:7a00359e701e | 549 | } |
masahikofukasawa | 0:7a00359e701e | 550 | |
masahikofukasawa | 0:7a00359e701e | 551 | AkmSensorManager::Status AkmSensorManager::throwMessage(const Message *msg) { |
masahikofukasawa | 46:5938ad2039b0 | 552 | const int len = Message::getMaxMessageLength(); |
masahikofukasawa | 0:7a00359e701e | 553 | char buf[len]; |
masahikofukasawa | 0:7a00359e701e | 554 | |
tkstreet | 23:50c98b286e41 | 555 | buf[0] = '$'; // Output message prefix |
masahikofukasawa | 0:7a00359e701e | 556 | |
tkstreet | 23:50c98b286e41 | 557 | // Processes command in msg to ASCII |
masahikofukasawa | 0:7a00359e701e | 558 | char cmd = (char)msg->getCommand(); |
masahikofukasawa | 0:7a00359e701e | 559 | Message::charToAscii(&buf[1], &cmd); |
masahikofukasawa | 0:7a00359e701e | 560 | |
tkstreet | 23:50c98b286e41 | 561 | // Processes arguments in msg to ASCII |
masahikofukasawa | 0:7a00359e701e | 562 | for (int i=0; i < msg->getArgNum(); i++) { |
masahikofukasawa | 0:7a00359e701e | 563 | char arg = msg->getArgument(i); |
masahikofukasawa | 0:7a00359e701e | 564 | Message::charToAscii(&buf[3+2*i], &arg); |
masahikofukasawa | 0:7a00359e701e | 565 | } |
masahikofukasawa | 0:7a00359e701e | 566 | |
masahikofukasawa | 0:7a00359e701e | 567 | // Add termination characters, 0x0D(\r), \n and \0, to the end of string |
masahikofukasawa | 0:7a00359e701e | 568 | int tIdx = 3 + 2 * (msg->getArgNum()); |
masahikofukasawa | 0:7a00359e701e | 569 | int bufSize = sizeof(buf)/sizeof(buf[0]); |
masahikofukasawa | 0:7a00359e701e | 570 | if ((tIdx + 3) > (bufSize - 1)) { |
masahikofukasawa | 11:cef8dc1cf010 | 571 | MSG("#Error: Message data exceeds the buffer.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 572 | return ERROR; |
masahikofukasawa | 0:7a00359e701e | 573 | } |
masahikofukasawa | 11:cef8dc1cf010 | 574 | buf[tIdx++] = CR; // '\r' |
masahikofukasawa | 11:cef8dc1cf010 | 575 | buf[tIdx++] = LF; // '\n' |
masahikofukasawa | 11:cef8dc1cf010 | 576 | buf[tIdx] = '\0'; |
tkstreet | 23:50c98b286e41 | 577 | |
tkstreet | 33:d3e1e9eb2ef9 | 578 | // If BLE is enabled, send to AKDP app |
tkstreet | 23:50c98b286e41 | 579 | if(isEnabledBle) uartService->writeString(buf); |
tkstreet | 23:50c98b286e41 | 580 | |
tkstreet | 33:d3e1e9eb2ef9 | 581 | // If USB is enabled, send to serial terminal |
masahikofukasawa | 0:7a00359e701e | 582 | if(isEnabledUsb) serial->printf(buf); |
masahikofukasawa | 0:7a00359e701e | 583 | |
masahikofukasawa | 0:7a00359e701e | 584 | return SUCCESS; |
masahikofukasawa | 12:c06cd8b76358 | 585 | } |
masahikofukasawa | 13:d008249f0359 | 586 | |
tkstreet | 49:c8f8946129b6 | 587 | char* AkmSensorManager::stringConcat(char* str1, char* str2) |
masahikofukasawa | 27:41aa9fb23a2f | 588 | { |
masahikofukasawa | 27:41aa9fb23a2f | 589 | int num1; |
masahikofukasawa | 27:41aa9fb23a2f | 590 | char* str; |
masahikofukasawa | 27:41aa9fb23a2f | 591 | |
masahikofukasawa | 27:41aa9fb23a2f | 592 | num1=strlen(str1) + strlen(str2); |
masahikofukasawa | 27:41aa9fb23a2f | 593 | str = (char *)malloc(num1 + 1); |
masahikofukasawa | 27:41aa9fb23a2f | 594 | sprintf(str,"%s%s",str1,str2); |
masahikofukasawa | 27:41aa9fb23a2f | 595 | return str; |
masahikofukasawa | 27:41aa9fb23a2f | 596 | } |
masahikofukasawa | 27:41aa9fb23a2f | 597 | |
masahikofukasawa | 13:d008249f0359 | 598 | char* AkmSensorManager::getSensorName(){ |
masahikofukasawa | 29:b488d2c89fba | 599 | char* name = ""; |
Masahiko Fukasawa |
48:427bdb7bf31b | 600 | // for(int i=0; i<sensorNum; i++){ |
tkstreet | 49:c8f8946129b6 | 601 | name = stringConcat(name, (char *)sensor[0]->getSensorName()); |
tkstreet | 49:c8f8946129b6 | 602 | // if( sensorNum > (i+1) )name = stringConcat(name, "+"); |
Masahiko Fukasawa |
48:427bdb7bf31b | 603 | // } |
masahikofukasawa | 27:41aa9fb23a2f | 604 | MSG("#Sensor Name='%s'.\r\n",name); |
masahikofukasawa | 27:41aa9fb23a2f | 605 | return name; |
masahikofukasawa | 39:3821886c902e | 606 | } |
masahikofukasawa | 39:3821886c902e | 607 | |
masahikofukasawa | 39:3821886c902e | 608 | void AkmSensorManager::attachInterrupt(){ |
masahikofukasawa | 39:3821886c902e | 609 | switch(drdyType){ |
masahikofukasawa | 39:3821886c902e | 610 | case AkmAkd::INTERRUPT_ENABLED_PP: |
masahikofukasawa | 39:3821886c902e | 611 | { |
masahikofukasawa | 39:3821886c902e | 612 | if(primaryId == AkmSensor::AKM_PRIMARY_ID_AKD_SPI) interrupt = new InterruptIn(SPI_DRDY); |
masahikofukasawa | 39:3821886c902e | 613 | else interrupt = new InterruptIn(I2C_DRDY); |
masahikofukasawa | 39:3821886c902e | 614 | break; |
masahikofukasawa | 39:3821886c902e | 615 | } |
masahikofukasawa | 39:3821886c902e | 616 | case AkmAkd::INTERRUPT_ENABLED_OD: |
masahikofukasawa | 39:3821886c902e | 617 | { |
masahikofukasawa | 39:3821886c902e | 618 | if(primaryId == AkmSensor::AKM_PRIMARY_ID_AKD_SPI) interrupt = new InterruptIn(SPI_DRDY); |
masahikofukasawa | 39:3821886c902e | 619 | else interrupt = new InterruptIn(I2C_DRDY); |
masahikofukasawa | 39:3821886c902e | 620 | break; |
masahikofukasawa | 39:3821886c902e | 621 | } |
masahikofukasawa | 39:3821886c902e | 622 | default: |
masahikofukasawa | 39:3821886c902e | 623 | { |
masahikofukasawa | 39:3821886c902e | 624 | // nothing. |
masahikofukasawa | 39:3821886c902e | 625 | } |
masahikofukasawa | 39:3821886c902e | 626 | } |
masahikofukasawa | 39:3821886c902e | 627 | } |
masahikofukasawa | 39:3821886c902e | 628 | |
masahikofukasawa | 39:3821886c902e | 629 | void AkmSensorManager::detachInterrupt(){ |
masahikofukasawa | 39:3821886c902e | 630 | switch(drdyType){ |
masahikofukasawa | 39:3821886c902e | 631 | case AkmAkd::INTERRUPT_ENABLED_PP: |
masahikofukasawa | 39:3821886c902e | 632 | { |
masahikofukasawa | 39:3821886c902e | 633 | interrupt->rise(NULL); |
masahikofukasawa | 39:3821886c902e | 634 | break; |
masahikofukasawa | 39:3821886c902e | 635 | } |
masahikofukasawa | 39:3821886c902e | 636 | case AkmAkd::INTERRUPT_ENABLED_OD: |
masahikofukasawa | 39:3821886c902e | 637 | { |
masahikofukasawa | 39:3821886c902e | 638 | interrupt->fall(NULL); |
masahikofukasawa | 39:3821886c902e | 639 | break; |
masahikofukasawa | 39:3821886c902e | 640 | } |
masahikofukasawa | 39:3821886c902e | 641 | default: |
masahikofukasawa | 39:3821886c902e | 642 | { |
masahikofukasawa | 39:3821886c902e | 643 | // nothing. |
masahikofukasawa | 39:3821886c902e | 644 | } |
masahikofukasawa | 39:3821886c902e | 645 | } |
masahikofukasawa | 13:d008249f0359 | 646 | } |