Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of AkmSensor by
akmsensormanager.cpp@48:427bdb7bf31b, 2017-12-19 (annotated)
- Committer:
- Masahiko Fukasawa
- Date:
- Tue Dec 19 12:18:13 2017 -0800
- Revision:
- 48:427bdb7bf31b
- Parent:
- 46:5938ad2039b0
- Child:
- 49:c8f8946129b6
First commit
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 | |
| masahikofukasawa | 16:d85be9bafb80 | 225 | void AkmSensorManager::dummyCallbackForCommandReceived(){} |
| masahikofukasawa | 16:d85be9bafb80 | 226 | |
| tkstreet | 33:d3e1e9eb2ef9 | 227 | |
| tkstreet | 33:d3e1e9eb2ef9 | 228 | // For commands received via BLE |
| masahikofukasawa | 0:7a00359e701e | 229 | AkmSensorManager::Status AkmSensorManager::commandReceived(char* buf){ |
| masahikofukasawa | 0:7a00359e701e | 230 | // Construct message |
| masahikofukasawa | 0:7a00359e701e | 231 | Status status = SUCCESS; |
| masahikofukasawa | 0:7a00359e701e | 232 | |
| masahikofukasawa | 10:5c69b067d88a | 233 | if ((Message::parse(&msg, buf)) != Message::SUCCESS) { |
| masahikofukasawa | 39:3821886c902e | 234 | MSG("#Error: Failed to parse message. %s\r\n", buf); |
| masahikofukasawa | 0:7a00359e701e | 235 | status = ERROR; |
| tkstreet | 33:d3e1e9eb2ef9 | 236 | eventCommandReceived = false; // Reset flag |
| masahikofukasawa | 15:1238993fd75f | 237 | }else{ |
| tkstreet | 33:d3e1e9eb2ef9 | 238 | eventCommandReceived = true; // Set flag |
| tkstreet | 45:6af8fdde0ef3 | 239 | VERBOSE("#Parsed message. %s\r\n", buf); |
| masahikofukasawa | 0:7a00359e701e | 240 | } |
| masahikofukasawa | 16:d85be9bafb80 | 241 | t.attach(callback(this, &AkmSensorManager::dummyCallbackForCommandReceived),0); // wake-up from ble.waitForEvent |
| masahikofukasawa | 0:7a00359e701e | 242 | return status; |
| masahikofukasawa | 0:7a00359e701e | 243 | } |
| masahikofukasawa | 0:7a00359e701e | 244 | |
| tkstreet | 33:d3e1e9eb2ef9 | 245 | |
| coisme | 2:11fe67783c4c | 246 | int16_t AkmSensorManager::getAdcData(MCP342X *mcp3428, MCP342X::AdcChannel ch, MCP342X::SampleSetting s) { |
| coisme | 2:11fe67783c4c | 247 | const int WAIT_ADC_MS = 1; |
| coisme | 2:11fe67783c4c | 248 | |
| coisme | 2:11fe67783c4c | 249 | // Configure channel and trigger. |
| coisme | 2:11fe67783c4c | 250 | mcp3428->setChannel(ch); |
| coisme | 2:11fe67783c4c | 251 | mcp3428->setSampleSetting(s); |
| coisme | 2:11fe67783c4c | 252 | mcp3428->trigger(); |
| coisme | 2:11fe67783c4c | 253 | |
| coisme | 2:11fe67783c4c | 254 | // polling data (!blocking) |
| coisme | 2:11fe67783c4c | 255 | MCP342X::Data data; |
| coisme | 2:11fe67783c4c | 256 | do { |
| coisme | 2:11fe67783c4c | 257 | wait_ms(WAIT_ADC_MS); |
| coisme | 2:11fe67783c4c | 258 | mcp3428->getData(&data); |
| coisme | 2:11fe67783c4c | 259 | } while(data.st == MCP342X::DATA_NOT_UPDATED); |
| coisme | 2:11fe67783c4c | 260 | |
| coisme | 2:11fe67783c4c | 261 | return data.value; |
| coisme | 2:11fe67783c4c | 262 | } |
| masahikofukasawa | 0:7a00359e701e | 263 | |
| tkstreet | 33:d3e1e9eb2ef9 | 264 | |
| masahikofukasawa | 0:7a00359e701e | 265 | uint8_t AkmSensorManager::getId(PinName pin, uint8_t bits) |
| masahikofukasawa | 0:7a00359e701e | 266 | { |
| masahikofukasawa | 11:cef8dc1cf010 | 267 | MSG("#GetID\r\n"); |
| masahikofukasawa | 6:c4401549d68f | 268 | |
| tkstreet | 21:966724730ce6 | 269 | I2C i2c(I2C_SDA, I2C_SCL); // establish I2C to read ID |
| tkstreet | 21:966724730ce6 | 270 | |
| coisme | 2:11fe67783c4c | 271 | // ADC |
| tkstreet | 21:966724730ce6 | 272 | MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_6EH); // ADC to convert voltage |
| tkstreet | 21:966724730ce6 | 273 | mcp342x.setConversionMode(MCP342X::ONE_SHOT); // Set to single sample |
| coisme | 2:11fe67783c4c | 274 | MCP342X::AdcChannel ch; |
| tkstreet | 21:966724730ce6 | 275 | |
| tkstreet | 21:966724730ce6 | 276 | if (pin == ANALOG_SENSOR_ID) { // Primary ID |
| coisme | 2:11fe67783c4c | 277 | ch = MCP342X::ADC_CH1; |
| tkstreet | 21:966724730ce6 | 278 | } else { // pin == ANALOG_SENSOR_ID_SUB |
| tkstreet | 21:966724730ce6 | 279 | ch = MCP342X::ADC_CH2; // Secondary ID |
| coisme | 2:11fe67783c4c | 280 | } |
| tkstreet | 21:966724730ce6 | 281 | |
| coisme | 2:11fe67783c4c | 282 | int16_t val = getAdcData(&mcp342x, ch, MCP342X::SAMPLE_240HZ_12BIT); |
| masahikofukasawa | 11:cef8dc1cf010 | 283 | MSG("#12bit ADC Val = %d.\r\n", val); |
| coisme | 2:11fe67783c4c | 284 | |
| tkstreet | 21:966724730ce6 | 285 | // Voltage boundaries for ID voltage divider system |
| coisme | 2:11fe67783c4c | 286 | const int16_t VAL_MAX = 3000-2048; // Corresponds to 3V |
| coisme | 2:11fe67783c4c | 287 | const int16_t VAL_MIN = -2048; // Corresponds to 0V |
| coisme | 2:11fe67783c4c | 288 | |
| tkstreet | 21:966724730ce6 | 289 | // Convert voltage to ID value |
| masahikofukasawa | 46:5938ad2039b0 | 290 | uint8_t value = (uint8_t)((val - VAL_MIN)/(double)(VAL_MAX - VAL_MIN) * (1 << bits) + 0.5); |
| masahikofukasawa | 11:cef8dc1cf010 | 291 | MSG("#ID = %d.\r\n", value); |
| masahikofukasawa | 6:c4401549d68f | 292 | |
| masahikofukasawa | 0:7a00359e701e | 293 | return value; |
| masahikofukasawa | 0:7a00359e701e | 294 | } |
| masahikofukasawa | 0:7a00359e701e | 295 | |
| tkstreet | 33:d3e1e9eb2ef9 | 296 | |
| masahikofukasawa | 0:7a00359e701e | 297 | bool AkmSensorManager::isEvent() |
| masahikofukasawa | 0:7a00359e701e | 298 | { |
| masahikofukasawa | 29:b488d2c89fba | 299 | // check sensor related event |
| Masahiko Fukasawa |
48:427bdb7bf31b | 300 | // for(int i=0; i<sensorNum; i++){ |
| Masahiko Fukasawa |
48:427bdb7bf31b | 301 | if(sensor[0]->isEvent()){ |
| masahikofukasawa | 29:b488d2c89fba | 302 | return true; |
| masahikofukasawa | 29:b488d2c89fba | 303 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 304 | // } |
| masahikofukasawa | 29:b488d2c89fba | 305 | |
| masahikofukasawa | 29:b488d2c89fba | 306 | // other events |
| masahikofukasawa | 29:b488d2c89fba | 307 | return ( |
| masahikofukasawa | 0:7a00359e701e | 308 | eventCommandReceived || |
| masahikofukasawa | 0:7a00359e701e | 309 | eventConnected || |
| masahikofukasawa | 0:7a00359e701e | 310 | eventDisconnected); |
| masahikofukasawa | 0:7a00359e701e | 311 | } |
| masahikofukasawa | 0:7a00359e701e | 312 | |
| masahikofukasawa | 0:7a00359e701e | 313 | void AkmSensorManager::processCommand() |
| masahikofukasawa | 0:7a00359e701e | 314 | { |
| tkstreet | 23:50c98b286e41 | 315 | // Extracts command contained in the message |
| masahikofukasawa | 0:7a00359e701e | 316 | Message::Command cmd = msg.getCommand(); |
| masahikofukasawa | 0:7a00359e701e | 317 | |
| tkstreet | 21:966724730ce6 | 318 | // Creates a message object to return |
| masahikofukasawa | 0:7a00359e701e | 319 | Message resMsg; |
| masahikofukasawa | 0:7a00359e701e | 320 | |
| tkstreet | 23:50c98b286e41 | 321 | // Return message contains the extracted command |
| masahikofukasawa | 0:7a00359e701e | 322 | resMsg.setCommand(cmd); |
| masahikofukasawa | 0:7a00359e701e | 323 | |
| masahikofukasawa | 0:7a00359e701e | 324 | switch(cmd) |
| masahikofukasawa | 0:7a00359e701e | 325 | { |
| masahikofukasawa | 0:7a00359e701e | 326 | case Message::CMD_GET_FW_VERSION: |
| masahikofukasawa | 11:cef8dc1cf010 | 327 | { |
| masahikofukasawa | 0:7a00359e701e | 328 | resMsg.setArgument(0, FIRMWARE_VERSION); |
| masahikofukasawa | 0:7a00359e701e | 329 | throwMessage(&resMsg); |
| masahikofukasawa | 11:cef8dc1cf010 | 330 | MSG("#FW version is reported.\r\n"); |
| masahikofukasawa | 0:7a00359e701e | 331 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 332 | } |
| masahikofukasawa | 0:7a00359e701e | 333 | case Message::CMD_GET_MAG_PART: |
| masahikofukasawa | 11:cef8dc1cf010 | 334 | { |
| masahikofukasawa | 0:7a00359e701e | 335 | resMsg.setArgument(0, MAGNETOMETER_ID); |
| masahikofukasawa | 0:7a00359e701e | 336 | throwMessage(&resMsg); |
| masahikofukasawa | 11:cef8dc1cf010 | 337 | MSG("#Mag ID is reported.\r\n"); |
| masahikofukasawa | 0:7a00359e701e | 338 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 339 | } |
| masahikofukasawa | 0:7a00359e701e | 340 | case Message::CMD_SET_SERIAL_TARGET: |
| masahikofukasawa | 11:cef8dc1cf010 | 341 | { |
| masahikofukasawa | 0:7a00359e701e | 342 | isEnabledBle = msg.getArgument(0)==Message::SW_ON ? true : false; |
| masahikofukasawa | 0:7a00359e701e | 343 | isEnabledUsb = msg.getArgument(1)==Message::SW_ON ? true : false; |
| masahikofukasawa | 0:7a00359e701e | 344 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 345 | } |
| masahikofukasawa | 0:7a00359e701e | 346 | case Message::CMD_GET_ID: // return Primary ID and Sub ID |
| masahikofukasawa | 11:cef8dc1cf010 | 347 | { |
| masahikofukasawa | 10:5c69b067d88a | 348 | resMsg.setArgument(0, primaryId); |
| masahikofukasawa | 0:7a00359e701e | 349 | resMsg.setArgument(1, subId); |
| masahikofukasawa | 0:7a00359e701e | 350 | throwMessage(&resMsg); |
| masahikofukasawa | 29:b488d2c89fba | 351 | MSG("#ID is reported.\r\n"); |
| masahikofukasawa | 0:7a00359e701e | 352 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 353 | } |
| masahikofukasawa | 29:b488d2c89fba | 354 | case Message::CMD_GET_SENSOR_INDEX: |
| masahikofukasawa | 27:41aa9fb23a2f | 355 | { |
| masahikofukasawa | 29:b488d2c89fba | 356 | resMsg.setArgument(0, sensorIndex); |
| masahikofukasawa | 27:41aa9fb23a2f | 357 | throwMessage(&resMsg); |
| masahikofukasawa | 29:b488d2c89fba | 358 | MSG("#Get Sensor Index=%d.\r\n", sensorIndex); |
| masahikofukasawa | 27:41aa9fb23a2f | 359 | break; |
| masahikofukasawa | 27:41aa9fb23a2f | 360 | } |
| masahikofukasawa | 29:b488d2c89fba | 361 | case Message::CMD_SET_SENSOR_INDEX: |
| masahikofukasawa | 27:41aa9fb23a2f | 362 | { |
| masahikofukasawa | 29:b488d2c89fba | 363 | uint8_t index = (uint8_t)msg.getArgument(0); |
| masahikofukasawa | 30:5a241d9b3262 | 364 | if(msg.getArgNum() == 1 && index<sensorNum){ |
| masahikofukasawa | 28:dc4eb14e4d7e | 365 | resMsg.setArgument(0, 0); |
| masahikofukasawa | 29:b488d2c89fba | 366 | sensorIndex = index; |
| masahikofukasawa | 29:b488d2c89fba | 367 | MSG("#Set Sensor Index=%d.\r\n", sensorIndex); |
| masahikofukasawa | 30:5a241d9b3262 | 368 | }else{ |
| masahikofukasawa | 30:5a241d9b3262 | 369 | resMsg.setArgument(0, 1); |
| masahikofukasawa | 30:5a241d9b3262 | 370 | MSG("#Error: Set Sensor Index=%d.\r\n", sensorIndex); |
| masahikofukasawa | 29:b488d2c89fba | 371 | } |
| masahikofukasawa | 28:dc4eb14e4d7e | 372 | throwMessage(&resMsg); |
| masahikofukasawa | 27:41aa9fb23a2f | 373 | break; |
| masahikofukasawa | 27:41aa9fb23a2f | 374 | } |
| masahikofukasawa | 29:b488d2c89fba | 375 | case Message::CMD_GET_TOTAL_SENSOR_NUM: |
| masahikofukasawa | 27:41aa9fb23a2f | 376 | { |
| masahikofukasawa | 29:b488d2c89fba | 377 | resMsg.setArgument(0, sensorNum); |
| masahikofukasawa | 27:41aa9fb23a2f | 378 | throwMessage(&resMsg); |
| masahikofukasawa | 29:b488d2c89fba | 379 | MSG("#Get Sensor Total Num=%d.\r\n", sensorNum); |
| masahikofukasawa | 0:7a00359e701e | 380 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 381 | } |
| masahikofukasawa | 0:7a00359e701e | 382 | case Message::CMD_STOP_MEASUREMENT: |
| masahikofukasawa | 11:cef8dc1cf010 | 383 | { |
| masahikofukasawa | 29:b488d2c89fba | 384 | if( sensor[sensorIndex]->stopSensor() != AkmSensor::SUCCESS){ |
| masahikofukasawa | 15:1238993fd75f | 385 | resMsg.setArgument(0, 1); |
| masahikofukasawa | 15:1238993fd75f | 386 | }else{ |
| masahikofukasawa | 27:41aa9fb23a2f | 387 | resMsg.setArgument(0, 0); |
| masahikofukasawa | 15:1238993fd75f | 388 | } |
| masahikofukasawa | 0:7a00359e701e | 389 | throwMessage(&resMsg); |
| masahikofukasawa | 39:3821886c902e | 390 | |
| masahikofukasawa | 39:3821886c902e | 391 | detachInterrupt(); |
| masahikofukasawa | 39:3821886c902e | 392 | |
| masahikofukasawa | 29:b488d2c89fba | 393 | MSG("#Stop measurement:%s.\r\n",sensor[sensorIndex]->getSensorName()); |
| masahikofukasawa | 0:7a00359e701e | 394 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 395 | } |
| masahikofukasawa | 0:7a00359e701e | 396 | case Message::CMD_START_MEASUREMENT: |
| masahikofukasawa | 11:cef8dc1cf010 | 397 | { |
| masahikofukasawa | 11:cef8dc1cf010 | 398 | int error_code = AkmSensor::SUCCESS; |
| Masahiko Fukasawa |
48:427bdb7bf31b | 399 | if(msg.getArgNum() == 0) |
| Masahiko Fukasawa |
48:427bdb7bf31b | 400 | { |
| masahikofukasawa | 29:b488d2c89fba | 401 | error_code = sensor[sensorIndex]->startSensor(); |
| masahikofukasawa | 11:cef8dc1cf010 | 402 | if( error_code != AkmSensor::SUCCESS ){ |
| masahikofukasawa | 39:3821886c902e | 403 | MSG("#Error: StartSensor Error. Code=%d\r\n",error_code); |
| masahikofukasawa | 11:cef8dc1cf010 | 404 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 405 | else |
| Masahiko Fukasawa |
48:427bdb7bf31b | 406 | { |
| Masahiko Fukasawa |
48:427bdb7bf31b | 407 | switch(drdyType){ |
| Masahiko Fukasawa |
48:427bdb7bf31b | 408 | case AkmAkd::INTERRUPT_ENABLED_PP: |
| Masahiko Fukasawa |
48:427bdb7bf31b | 409 | { |
| Masahiko Fukasawa |
48:427bdb7bf31b | 410 | interrupt->rise(callback(this, &AkmSensorManager::detectDRDY)); |
| Masahiko Fukasawa |
48:427bdb7bf31b | 411 | break; |
| Masahiko Fukasawa |
48:427bdb7bf31b | 412 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 413 | case AkmAkd::INTERRUPT_ENABLED_OD: |
| Masahiko Fukasawa |
48:427bdb7bf31b | 414 | { |
| Masahiko Fukasawa |
48:427bdb7bf31b | 415 | interrupt->fall(callback(this, &AkmSensorManager::detectDRDY)); |
| Masahiko Fukasawa |
48:427bdb7bf31b | 416 | break; |
| Masahiko Fukasawa |
48:427bdb7bf31b | 417 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 418 | default: |
| Masahiko Fukasawa |
48:427bdb7bf31b | 419 | { |
| Masahiko Fukasawa |
48:427bdb7bf31b | 420 | // nothing. |
| Masahiko Fukasawa |
48:427bdb7bf31b | 421 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 422 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 423 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 424 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 425 | else if(msg.getArgNum() == 1) |
| Masahiko Fukasawa |
48:427bdb7bf31b | 426 | { |
| masahikofukasawa | 46:5938ad2039b0 | 427 | float interval = (float)(1.0 / (double)msg.getArgument(0)); |
| masahikofukasawa | 29:b488d2c89fba | 428 | error_code = sensor[sensorIndex]->startSensor(interval); |
| masahikofukasawa | 11:cef8dc1cf010 | 429 | if( error_code != AkmSensor::SUCCESS ){ |
| masahikofukasawa | 39:3821886c902e | 430 | MSG("#Error: StartSensor Error. Code=%d\r\n",error_code); |
| masahikofukasawa | 11:cef8dc1cf010 | 431 | } |
| masahikofukasawa | 11:cef8dc1cf010 | 432 | else{ |
| masahikofukasawa | 39:3821886c902e | 433 | detachInterrupt(); |
| masahikofukasawa | 11:cef8dc1cf010 | 434 | } |
| masahikofukasawa | 11:cef8dc1cf010 | 435 | }else{ |
| tkstreet | 44:0e251c736282 | 436 | MSG("#Error: StartSensor Error: Wrong number of arguments.\r\n"); |
| masahikofukasawa | 11:cef8dc1cf010 | 437 | } |
| masahikofukasawa | 39:3821886c902e | 438 | |
| masahikofukasawa | 11:cef8dc1cf010 | 439 | if(error_code == AkmSensor::SUCCESS){ |
| masahikofukasawa | 11:cef8dc1cf010 | 440 | // get initial sensor state for switch type sensors |
| masahikofukasawa | 11:cef8dc1cf010 | 441 | if( primaryId == AkmSensor::AKM_PRIMARY_ID_UNIPOLAR || |
| masahikofukasawa | 11:cef8dc1cf010 | 442 | primaryId == AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR || |
| masahikofukasawa | 11:cef8dc1cf010 | 443 | primaryId == AkmSensor::AKM_PRIMARY_ID_LATCH || |
| masahikofukasawa | 11:cef8dc1cf010 | 444 | primaryId == AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT || |
| masahikofukasawa | 11:cef8dc1cf010 | 445 | primaryId == AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER ){ |
| masahikofukasawa | 11:cef8dc1cf010 | 446 | Message temp; |
| masahikofukasawa | 29:b488d2c89fba | 447 | sensor[sensorIndex]->readSensorData(&temp); |
| masahikofukasawa | 11:cef8dc1cf010 | 448 | throwMessage(&temp); |
| masahikofukasawa | 11:cef8dc1cf010 | 449 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 450 | MSG("#Start measurement:%s index=%d.\r\n",sensor[sensorIndex]->getSensorName(), sensorIndex); |
| masahikofukasawa | 0:7a00359e701e | 451 | } |
| masahikofukasawa | 0:7a00359e701e | 452 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 453 | } |
| tkstreet | 33:d3e1e9eb2ef9 | 454 | case Message::CMD_MOTOR_START_MOTOR: |
| tkstreet | 33:d3e1e9eb2ef9 | 455 | case Message::CMD_MOTOR_STOP_MOTOR: |
| tkstreet | 33:d3e1e9eb2ef9 | 456 | case Message::CMD_MOTOR_SET_DIRECTION: |
| tkstreet | 33:d3e1e9eb2ef9 | 457 | case Message::CMD_MOTOR_SET_DUTY_CYCLE: |
| masahikofukasawa | 9:6fa3e7b17c27 | 458 | case Message::CMD_PROGSW_GET_THRESHOLD: |
| masahikofukasawa | 9:6fa3e7b17c27 | 459 | case Message::CMD_PROGSW_SET_THRESHOLD: |
| masahikofukasawa | 9:6fa3e7b17c27 | 460 | case Message::CMD_PROGSW_GET_READ_COFIGURATION: |
| masahikofukasawa | 9:6fa3e7b17c27 | 461 | case Message::CMD_PROGSW_SET_READ_COFIGURATION: |
| masahikofukasawa | 9:6fa3e7b17c27 | 462 | case Message::CMD_PROGSW_GET_SWITCH_COFIGURATION: |
| masahikofukasawa | 9:6fa3e7b17c27 | 463 | case Message::CMD_PROGSW_SET_SWITCH_COFIGURATION: |
| masahikofukasawa | 9:6fa3e7b17c27 | 464 | case Message::CMD_PROGSW_GET_OPERATION_MODE: |
| masahikofukasawa | 9:6fa3e7b17c27 | 465 | case Message::CMD_PROGSW_SET_OPERATION_MODE: |
| masahikofukasawa | 1:b46b8653331f | 466 | case Message::CMD_IR_GET_THRESHOLD: |
| masahikofukasawa | 1:b46b8653331f | 467 | case Message::CMD_IR_SET_THRESHOLD: |
| masahikofukasawa | 1:b46b8653331f | 468 | case Message::CMD_IR_GET_HYSTERESIS: |
| masahikofukasawa | 1:b46b8653331f | 469 | case Message::CMD_IR_SET_HYSTERESIS: |
| masahikofukasawa | 1:b46b8653331f | 470 | case Message::CMD_IR_GET_INTERRUPT: |
| masahikofukasawa | 1:b46b8653331f | 471 | case Message::CMD_IR_SET_INTERRUPT: |
| masahikofukasawa | 1:b46b8653331f | 472 | case Message::CMD_IR_GET_OPERATION_MODE: |
| masahikofukasawa | 1:b46b8653331f | 473 | case Message::CMD_IR_SET_OPERATION_MODE: |
| masahikofukasawa | 1:b46b8653331f | 474 | case Message::CMD_IR_GET_THRESHOLD_EEPROM: |
| masahikofukasawa | 1:b46b8653331f | 475 | case Message::CMD_IR_SET_THRESHOLD_EEPROM: |
| masahikofukasawa | 1:b46b8653331f | 476 | case Message::CMD_IR_GET_HYSTERESIS_EEPROM: |
| masahikofukasawa | 1:b46b8653331f | 477 | case Message::CMD_IR_SET_HYSTERESIS_EEPROM: |
| masahikofukasawa | 1:b46b8653331f | 478 | case Message::CMD_IR_GET_INTERRUPT_EEPROM: |
| masahikofukasawa | 1:b46b8653331f | 479 | case Message::CMD_IR_SET_INTERRUPT_EEPROM: |
| masahikofukasawa | 1:b46b8653331f | 480 | case Message::CMD_IR_GET_OPERATION_MODE_EEPROM: |
| masahikofukasawa | 1:b46b8653331f | 481 | case Message::CMD_IR_SET_OPERATION_MODE_EEPROM: |
| masahikofukasawa | 9:6fa3e7b17c27 | 482 | case Message::CMD_ANGLE_ZERO_RESET: |
| masahikofukasawa | 30:5a241d9b3262 | 483 | case Message::CMD_ANGLE_READ: |
| masahikofukasawa | 9:6fa3e7b17c27 | 484 | case Message::CMD_REG_WRITE: |
| masahikofukasawa | 9:6fa3e7b17c27 | 485 | case Message::CMD_REG_WRITEN: |
| masahikofukasawa | 9:6fa3e7b17c27 | 486 | case Message::CMD_REG_READ: |
| masahikofukasawa | 9:6fa3e7b17c27 | 487 | case Message::CMD_REG_READN: |
| masahikofukasawa | 9:6fa3e7b17c27 | 488 | case Message::CMD_COMPASS_GET_OPERATION_MODE: |
| masahikofukasawa | 9:6fa3e7b17c27 | 489 | case Message::CMD_COMPASS_SET_OPERATION_MODE: |
| masahikofukasawa | 11:cef8dc1cf010 | 490 | { |
| masahikofukasawa | 29:b488d2c89fba | 491 | AkmSensor::Status st = sensor[sensorIndex]->requestCommand(&msg,&resMsg); |
| masahikofukasawa | 15:1238993fd75f | 492 | if( (resMsg.getArgNum() == 0) && (st != AkmSensor::SUCCESS) ) |
| masahikofukasawa | 15:1238993fd75f | 493 | { |
| masahikofukasawa | 39:3821886c902e | 494 | MSG("#Error: Command failed.\r\n"); |
| masahikofukasawa | 15:1238993fd75f | 495 | }else{ |
| masahikofukasawa | 15:1238993fd75f | 496 | throwMessage(&resMsg); |
| masahikofukasawa | 15:1238993fd75f | 497 | } |
| masahikofukasawa | 0:7a00359e701e | 498 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 499 | } |
| masahikofukasawa | 0:7a00359e701e | 500 | default: |
| masahikofukasawa | 11:cef8dc1cf010 | 501 | { |
| masahikofukasawa | 39:3821886c902e | 502 | MSG("#Error: Can't find command.\r\n"); |
| masahikofukasawa | 0:7a00359e701e | 503 | break; |
| masahikofukasawa | 11:cef8dc1cf010 | 504 | } |
| masahikofukasawa | 0:7a00359e701e | 505 | } |
| masahikofukasawa | 0:7a00359e701e | 506 | } |
| masahikofukasawa | 0:7a00359e701e | 507 | |
| masahikofukasawa | 0:7a00359e701e | 508 | AkmSensorManager::Status AkmSensorManager::processEvent() |
| masahikofukasawa | 0:7a00359e701e | 509 | { |
| masahikofukasawa | 0:7a00359e701e | 510 | AkmSensorManager::Status status = AkmSensorManager::SUCCESS; |
| masahikofukasawa | 0:7a00359e701e | 511 | |
| tkstreet | 33:d3e1e9eb2ef9 | 512 | // If event is a command received from BLE |
| masahikofukasawa | 0:7a00359e701e | 513 | if(eventCommandReceived) |
| masahikofukasawa | 0:7a00359e701e | 514 | { |
| tkstreet | 45:6af8fdde0ef3 | 515 | VERBOSE("#Command received.\r\n"); |
| masahikofukasawa | 0:7a00359e701e | 516 | processCommand(); |
| tkstreet | 21:966724730ce6 | 517 | eventCommandReceived = false; // clear the flag |
| masahikofukasawa | 0:7a00359e701e | 518 | } |
| masahikofukasawa | 29:b488d2c89fba | 519 | |
| masahikofukasawa | 29:b488d2c89fba | 520 | // check sensor event |
| Masahiko Fukasawa |
48:427bdb7bf31b | 521 | // for(int i=0; i<sensorNum; i++){ |
| Masahiko Fukasawa |
48:427bdb7bf31b | 522 | if( sensor[0]->isEvent() ){ |
| masahikofukasawa | 29:b488d2c89fba | 523 | Message msg; |
| Masahiko Fukasawa |
48:427bdb7bf31b | 524 | if( sensor[0]->readSensorData(&msg) != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR; |
| tkstreet | 34:1ea3357c8d9a | 525 | throwMessage(&msg); // Process and output message to USB/BLE |
| masahikofukasawa | 29:b488d2c89fba | 526 | } |
| Masahiko Fukasawa |
48:427bdb7bf31b | 527 | // } |
| masahikofukasawa | 0:7a00359e701e | 528 | |
| tkstreet | 34:1ea3357c8d9a | 529 | if(eventConnected) // If BLE connected, clear flag and start sensor. |
| masahikofukasawa | 0:7a00359e701e | 530 | { |
| tkstreet | 21:966724730ce6 | 531 | eventConnected = false; // clear the flag |
| masahikofukasawa | 12:c06cd8b76358 | 532 | MSG("#BLE connected.\r\n"); |
| masahikofukasawa | 0:7a00359e701e | 533 | } |
| tkstreet | 23:50c98b286e41 | 534 | |
| tkstreet | 23:50c98b286e41 | 535 | // If event is the BLE being disconnected, stop the sensor |
| tkstreet | 23:50c98b286e41 | 536 | if(eventDisconnected) |
| masahikofukasawa | 0:7a00359e701e | 537 | { |
| tkstreet | 45:6af8fdde0ef3 | 538 | MSG("#BLE disconnected.\r\n"); |
| Masahiko Fukasawa |
48:427bdb7bf31b | 539 | // for(int i=0; i<sensorNum; i++){ |
| Masahiko Fukasawa |
48:427bdb7bf31b | 540 | if( sensor[0]->stopSensor() != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR; |
| Masahiko Fukasawa |
48:427bdb7bf31b | 541 | // } |
| tkstreet | 34:1ea3357c8d9a | 542 | eventDisconnected = false; // clear the flag |
| masahikofukasawa | 0:7a00359e701e | 543 | } |
| masahikofukasawa | 0:7a00359e701e | 544 | return status; |
| masahikofukasawa | 0:7a00359e701e | 545 | } |
| masahikofukasawa | 0:7a00359e701e | 546 | |
| masahikofukasawa | 0:7a00359e701e | 547 | AkmSensorManager::Status AkmSensorManager::throwMessage(const Message *msg) { |
| masahikofukasawa | 46:5938ad2039b0 | 548 | const int len = Message::getMaxMessageLength(); |
| masahikofukasawa | 0:7a00359e701e | 549 | char buf[len]; |
| masahikofukasawa | 0:7a00359e701e | 550 | |
| tkstreet | 23:50c98b286e41 | 551 | buf[0] = '$'; // Output message prefix |
| masahikofukasawa | 0:7a00359e701e | 552 | |
| tkstreet | 23:50c98b286e41 | 553 | // Processes command in msg to ASCII |
| masahikofukasawa | 0:7a00359e701e | 554 | char cmd = (char)msg->getCommand(); |
| masahikofukasawa | 0:7a00359e701e | 555 | Message::charToAscii(&buf[1], &cmd); |
| masahikofukasawa | 0:7a00359e701e | 556 | |
| tkstreet | 23:50c98b286e41 | 557 | // Processes arguments in msg to ASCII |
| masahikofukasawa | 0:7a00359e701e | 558 | for (int i=0; i < msg->getArgNum(); i++) { |
| masahikofukasawa | 0:7a00359e701e | 559 | char arg = msg->getArgument(i); |
| masahikofukasawa | 0:7a00359e701e | 560 | Message::charToAscii(&buf[3+2*i], &arg); |
| masahikofukasawa | 0:7a00359e701e | 561 | } |
| masahikofukasawa | 0:7a00359e701e | 562 | |
| masahikofukasawa | 0:7a00359e701e | 563 | // Add termination characters, 0x0D(\r), \n and \0, to the end of string |
| masahikofukasawa | 0:7a00359e701e | 564 | int tIdx = 3 + 2 * (msg->getArgNum()); |
| masahikofukasawa | 0:7a00359e701e | 565 | int bufSize = sizeof(buf)/sizeof(buf[0]); |
| masahikofukasawa | 0:7a00359e701e | 566 | if ((tIdx + 3) > (bufSize - 1)) { |
| masahikofukasawa | 11:cef8dc1cf010 | 567 | MSG("#Error: Message data exceeds the buffer.\r\n"); |
| masahikofukasawa | 0:7a00359e701e | 568 | return ERROR; |
| masahikofukasawa | 0:7a00359e701e | 569 | } |
| masahikofukasawa | 11:cef8dc1cf010 | 570 | buf[tIdx++] = CR; // '\r' |
| masahikofukasawa | 11:cef8dc1cf010 | 571 | buf[tIdx++] = LF; // '\n' |
| masahikofukasawa | 11:cef8dc1cf010 | 572 | buf[tIdx] = '\0'; |
| tkstreet | 23:50c98b286e41 | 573 | |
| tkstreet | 33:d3e1e9eb2ef9 | 574 | // If BLE is enabled, send to AKDP app |
| tkstreet | 23:50c98b286e41 | 575 | if(isEnabledBle) uartService->writeString(buf); |
| tkstreet | 23:50c98b286e41 | 576 | |
| tkstreet | 33:d3e1e9eb2ef9 | 577 | // If USB is enabled, send to serial terminal |
| masahikofukasawa | 0:7a00359e701e | 578 | if(isEnabledUsb) serial->printf(buf); |
| masahikofukasawa | 0:7a00359e701e | 579 | |
| masahikofukasawa | 0:7a00359e701e | 580 | return SUCCESS; |
| masahikofukasawa | 12:c06cd8b76358 | 581 | } |
| masahikofukasawa | 13:d008249f0359 | 582 | |
| masahikofukasawa | 27:41aa9fb23a2f | 583 | char* AkmSensorManager::my_strcat(char* str1, char* str2) |
| masahikofukasawa | 27:41aa9fb23a2f | 584 | { |
| masahikofukasawa | 27:41aa9fb23a2f | 585 | int num1; |
| masahikofukasawa | 27:41aa9fb23a2f | 586 | char* str; |
| masahikofukasawa | 27:41aa9fb23a2f | 587 | |
| masahikofukasawa | 27:41aa9fb23a2f | 588 | num1=strlen(str1) + strlen(str2); |
| masahikofukasawa | 27:41aa9fb23a2f | 589 | str = (char *)malloc(num1 + 1); |
| masahikofukasawa | 27:41aa9fb23a2f | 590 | sprintf(str,"%s%s",str1,str2); |
| masahikofukasawa | 27:41aa9fb23a2f | 591 | return str; |
| masahikofukasawa | 27:41aa9fb23a2f | 592 | } |
| masahikofukasawa | 27:41aa9fb23a2f | 593 | |
| masahikofukasawa | 13:d008249f0359 | 594 | char* AkmSensorManager::getSensorName(){ |
| masahikofukasawa | 29:b488d2c89fba | 595 | char* name = ""; |
| Masahiko Fukasawa |
48:427bdb7bf31b | 596 | // for(int i=0; i<sensorNum; i++){ |
| Masahiko Fukasawa |
48:427bdb7bf31b | 597 | name = my_strcat(name, (char *)sensor[0]->getSensorName()); |
| Masahiko Fukasawa |
48:427bdb7bf31b | 598 | // if( sensorNum > (i+1) )name = my_strcat(name, "+"); |
| Masahiko Fukasawa |
48:427bdb7bf31b | 599 | // } |
| masahikofukasawa | 27:41aa9fb23a2f | 600 | MSG("#Sensor Name='%s'.\r\n",name); |
| masahikofukasawa | 27:41aa9fb23a2f | 601 | return name; |
| masahikofukasawa | 39:3821886c902e | 602 | } |
| masahikofukasawa | 39:3821886c902e | 603 | |
| masahikofukasawa | 39:3821886c902e | 604 | void AkmSensorManager::attachInterrupt(){ |
| masahikofukasawa | 39:3821886c902e | 605 | switch(drdyType){ |
| masahikofukasawa | 39:3821886c902e | 606 | case AkmAkd::INTERRUPT_ENABLED_PP: |
| masahikofukasawa | 39:3821886c902e | 607 | { |
| masahikofukasawa | 39:3821886c902e | 608 | if(primaryId == AkmSensor::AKM_PRIMARY_ID_AKD_SPI) interrupt = new InterruptIn(SPI_DRDY); |
| masahikofukasawa | 39:3821886c902e | 609 | else interrupt = new InterruptIn(I2C_DRDY); |
| masahikofukasawa | 39:3821886c902e | 610 | break; |
| masahikofukasawa | 39:3821886c902e | 611 | } |
| masahikofukasawa | 39:3821886c902e | 612 | case AkmAkd::INTERRUPT_ENABLED_OD: |
| masahikofukasawa | 39:3821886c902e | 613 | { |
| masahikofukasawa | 39:3821886c902e | 614 | if(primaryId == AkmSensor::AKM_PRIMARY_ID_AKD_SPI) interrupt = new InterruptIn(SPI_DRDY); |
| masahikofukasawa | 39:3821886c902e | 615 | else interrupt = new InterruptIn(I2C_DRDY); |
| masahikofukasawa | 39:3821886c902e | 616 | break; |
| masahikofukasawa | 39:3821886c902e | 617 | } |
| masahikofukasawa | 39:3821886c902e | 618 | default: |
| masahikofukasawa | 39:3821886c902e | 619 | { |
| masahikofukasawa | 39:3821886c902e | 620 | // nothing. |
| masahikofukasawa | 39:3821886c902e | 621 | } |
| masahikofukasawa | 39:3821886c902e | 622 | } |
| masahikofukasawa | 39:3821886c902e | 623 | } |
| masahikofukasawa | 39:3821886c902e | 624 | |
| masahikofukasawa | 39:3821886c902e | 625 | void AkmSensorManager::detachInterrupt(){ |
| masahikofukasawa | 39:3821886c902e | 626 | switch(drdyType){ |
| masahikofukasawa | 39:3821886c902e | 627 | case AkmAkd::INTERRUPT_ENABLED_PP: |
| masahikofukasawa | 39:3821886c902e | 628 | { |
| masahikofukasawa | 39:3821886c902e | 629 | interrupt->rise(NULL); |
| masahikofukasawa | 39:3821886c902e | 630 | break; |
| masahikofukasawa | 39:3821886c902e | 631 | } |
| masahikofukasawa | 39:3821886c902e | 632 | case AkmAkd::INTERRUPT_ENABLED_OD: |
| masahikofukasawa | 39:3821886c902e | 633 | { |
| masahikofukasawa | 39:3821886c902e | 634 | interrupt->fall(NULL); |
| masahikofukasawa | 39:3821886c902e | 635 | break; |
| masahikofukasawa | 39:3821886c902e | 636 | } |
| masahikofukasawa | 39:3821886c902e | 637 | default: |
| masahikofukasawa | 39:3821886c902e | 638 | { |
| masahikofukasawa | 39:3821886c902e | 639 | // nothing. |
| masahikofukasawa | 39:3821886c902e | 640 | } |
| masahikofukasawa | 39:3821886c902e | 641 | } |
| masahikofukasawa | 13:d008249f0359 | 642 | } |

