Modified for compatibility with Rev.E. hardware
Fork of AkmSensor by
akmsensormanager.cpp@24:1d37438f31a9, 2017-04-13 (annotated)
- Committer:
- tkstreet
- Date:
- Thu Apr 13 22:50:02 2017 +0000
- Revision:
- 24:1d37438f31a9
- Parent:
- 23:50c98b286e41
- Parent:
- 18:b7182d5ad8d5
- Child:
- 33:d3e1e9eb2ef9
Merge of revisions 20 and 23
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
masahikofukasawa | 0:7a00359e701e | 1 | #include "ble/services/UARTService.h" |
masahikofukasawa | 15:1238993fd75f | 2 | #include "akdphwinfo.h" |
masahikofukasawa | 0:7a00359e701e | 3 | #include "akmsensormanager.h" |
masahikofukasawa | 0:7a00359e701e | 4 | #include "akmhallswitch.h" |
masahikofukasawa | 11:cef8dc1cf010 | 5 | #include "akmanalogsensor.h" |
masahikofukasawa | 10:5c69b067d88a | 6 | #include "ak09970ctrl.h" |
masahikofukasawa | 10:5c69b067d88a | 7 | #include "ak9750ctrl.h" |
masahikofukasawa | 10:5c69b067d88a | 8 | #include "ak9752ctrl.h" |
masahikofukasawa | 11:cef8dc1cf010 | 9 | #include "ak7451ctrl.h" |
masahikofukasawa | 10:5c69b067d88a | 10 | #include "ak7401ctrl.h" |
masahikofukasawa | 0:7a00359e701e | 11 | #include "akmakd.h" |
masahikofukasawa | 0:7a00359e701e | 12 | #include "debug.h" |
masahikofukasawa | 0:7a00359e701e | 13 | #include "Message.h" |
coisme | 2:11fe67783c4c | 14 | #include "mcp342x.h" |
masahikofukasawa | 6:c4401549d68f | 15 | #include "I2CNano.h" |
masahikofukasawa | 0:7a00359e701e | 16 | |
masahikofukasawa | 0:7a00359e701e | 17 | #define MAGNETOMETER_ID 0x0A |
masahikofukasawa | 0:7a00359e701e | 18 | |
masahikofukasawa | 0:7a00359e701e | 19 | #define CONV16I(high,low) ((int16_t)(((high) << 8) | (low))) |
masahikofukasawa | 0:7a00359e701e | 20 | |
masahikofukasawa | 0:7a00359e701e | 21 | |
masahikofukasawa | 10:5c69b067d88a | 22 | const char* AKM_PRIMARY_ID_STR[] = { |
masahikofukasawa | 7:e269411568c9 | 23 | "AKD Daughter Cards(SPI)", |
masahikofukasawa | 0:7a00359e701e | 24 | "Switch, Unipolar", |
masahikofukasawa | 0:7a00359e701e | 25 | "Switch, Onmipolar", |
masahikofukasawa | 0:7a00359e701e | 26 | "Latch, Bipolar", |
masahikofukasawa | 0:7a00359e701e | 27 | "Switch, Dual Output", |
masahikofukasawa | 0:7a00359e701e | 28 | "Onechip Encoder", |
masahikofukasawa | 0:7a00359e701e | 29 | "TBD1", |
masahikofukasawa | 0:7a00359e701e | 30 | "TBD2", |
masahikofukasawa | 0:7a00359e701e | 31 | "Linear Sensor Legacy", |
masahikofukasawa | 0:7a00359e701e | 32 | "Current Sensor", |
masahikofukasawa | 0:7a00359e701e | 33 | "MISC(Analog)", |
masahikofukasawa | 0:7a00359e701e | 34 | "Linear Sensor", |
masahikofukasawa | 18:b7182d5ad8d5 | 35 | "Motor Drivers", |
masahikofukasawa | 1:b46b8653331f | 36 | "IR Sensor", |
masahikofukasawa | 7:e269411568c9 | 37 | "Angle Sensor(SPI)", |
masahikofukasawa | 10:5c69b067d88a | 38 | "AKD Daughter Cards(I2C)" |
masahikofukasawa | 0:7a00359e701e | 39 | }; |
masahikofukasawa | 0:7a00359e701e | 40 | |
masahikofukasawa | 13:d008249f0359 | 41 | AkmSensorManager::AkmSensorManager(SerialNano* com) |
masahikofukasawa | 0:7a00359e701e | 42 | { |
masahikofukasawa | 0:7a00359e701e | 43 | serial = com; |
masahikofukasawa | 0:7a00359e701e | 44 | isEnabledUsb = true; |
masahikofukasawa | 0:7a00359e701e | 45 | eventCommandReceived = false; |
masahikofukasawa | 0:7a00359e701e | 46 | eventConnected = false; |
masahikofukasawa | 0:7a00359e701e | 47 | eventDisconnected = false; |
masahikofukasawa | 0:7a00359e701e | 48 | } |
masahikofukasawa | 0:7a00359e701e | 49 | |
masahikofukasawa | 10:5c69b067d88a | 50 | AkmSensorManager::Status AkmSensorManager::init(uint8_t id, uint8_t subid) |
masahikofukasawa | 0:7a00359e701e | 51 | { |
masahikofukasawa | 10:5c69b067d88a | 52 | primaryId = id; |
masahikofukasawa | 10:5c69b067d88a | 53 | subId = subid; |
masahikofukasawa | 0:7a00359e701e | 54 | sensor = AkmSensorManager::getAkmSensor(); |
masahikofukasawa | 0:7a00359e701e | 55 | if(sensor == NULL) return AkmSensorManager::ERROR; |
masahikofukasawa | 0:7a00359e701e | 56 | return AkmSensorManager::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 57 | } |
masahikofukasawa | 0:7a00359e701e | 58 | |
masahikofukasawa | 13:d008249f0359 | 59 | |
masahikofukasawa | 13:d008249f0359 | 60 | void AkmSensorManager::setBleUartService(UARTService* service) |
masahikofukasawa | 13:d008249f0359 | 61 | { |
masahikofukasawa | 13:d008249f0359 | 62 | uartService = service; |
masahikofukasawa | 13:d008249f0359 | 63 | isEnabledBle = true; |
masahikofukasawa | 13:d008249f0359 | 64 | } |
masahikofukasawa | 13:d008249f0359 | 65 | |
masahikofukasawa | 0:7a00359e701e | 66 | void AkmSensorManager::setEventConnected() |
masahikofukasawa | 0:7a00359e701e | 67 | { |
masahikofukasawa | 0:7a00359e701e | 68 | eventConnected = true; |
masahikofukasawa | 0:7a00359e701e | 69 | } |
masahikofukasawa | 0:7a00359e701e | 70 | |
masahikofukasawa | 0:7a00359e701e | 71 | void AkmSensorManager::setEventDisconnected() |
masahikofukasawa | 0:7a00359e701e | 72 | { |
masahikofukasawa | 0:7a00359e701e | 73 | eventDisconnected = true; |
masahikofukasawa | 0:7a00359e701e | 74 | } |
masahikofukasawa | 0:7a00359e701e | 75 | |
masahikofukasawa | 0:7a00359e701e | 76 | AkmSensor* AkmSensorManager::getAkmSensor() |
masahikofukasawa | 0:7a00359e701e | 77 | { |
masahikofukasawa | 0:7a00359e701e | 78 | AkmSensor* sensor = NULL; |
masahikofukasawa | 0:7a00359e701e | 79 | |
masahikofukasawa | 10:5c69b067d88a | 80 | switch(primaryId){ |
masahikofukasawa | 17:9abb7c28709c | 81 | |
masahikofukasawa | 7:e269411568c9 | 82 | case AkmSensor::AKM_PRIMARY_ID_AKD_SPI: |
masahikofukasawa | 0:7a00359e701e | 83 | case AkmSensor::AKM_PRIMARY_ID_AKD_I2C: |
masahikofukasawa | 10:5c69b067d88a | 84 | { |
masahikofukasawa | 10:5c69b067d88a | 85 | if(subId != Ak09970Ctrl::SUB_ID_AK09970){ |
masahikofukasawa | 10:5c69b067d88a | 86 | AkmAkd* akd = new AkmAkd(); |
masahikofukasawa | 10:5c69b067d88a | 87 | sensor = akd; |
masahikofukasawa | 10:5c69b067d88a | 88 | } |
masahikofukasawa | 10:5c69b067d88a | 89 | else{ |
masahikofukasawa | 10:5c69b067d88a | 90 | Ak09970Ctrl* ak09970 = new Ak09970Ctrl(); |
masahikofukasawa | 10:5c69b067d88a | 91 | sensor = ak09970; |
masahikofukasawa | 10:5c69b067d88a | 92 | } |
masahikofukasawa | 0:7a00359e701e | 93 | break; |
masahikofukasawa | 10:5c69b067d88a | 94 | } |
masahikofukasawa | 17:9abb7c28709c | 95 | |
masahikofukasawa | 0:7a00359e701e | 96 | case AkmSensor::AKM_PRIMARY_ID_ANGLE_SENSOR: |
masahikofukasawa | 10:5c69b067d88a | 97 | { |
masahikofukasawa | 11:cef8dc1cf010 | 98 | if(subId == Ak7451Ctrl::SUB_ID_AK7451){ |
masahikofukasawa | 11:cef8dc1cf010 | 99 | Ak7451Ctrl* ak7451ctrl = new Ak7451Ctrl(); |
masahikofukasawa | 11:cef8dc1cf010 | 100 | sensor = ak7451ctrl; |
masahikofukasawa | 10:5c69b067d88a | 101 | break; |
masahikofukasawa | 10:5c69b067d88a | 102 | } |
masahikofukasawa | 10:5c69b067d88a | 103 | else if(subId == Ak7401Ctrl::SUB_ID_AK7401){ |
masahikofukasawa | 10:5c69b067d88a | 104 | Ak7401Ctrl* ak7401ctrl = new Ak7401Ctrl(); |
masahikofukasawa | 10:5c69b067d88a | 105 | sensor = ak7401ctrl; |
masahikofukasawa | 10:5c69b067d88a | 106 | break; |
masahikofukasawa | 10:5c69b067d88a | 107 | } |
masahikofukasawa | 0:7a00359e701e | 108 | break; |
masahikofukasawa | 10:5c69b067d88a | 109 | } |
masahikofukasawa | 17:9abb7c28709c | 110 | |
masahikofukasawa | 0:7a00359e701e | 111 | case AkmSensor::AKM_PRIMARY_ID_UNIPOLAR: |
masahikofukasawa | 0:7a00359e701e | 112 | case AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR: |
masahikofukasawa | 0:7a00359e701e | 113 | case AkmSensor::AKM_PRIMARY_ID_LATCH: |
masahikofukasawa | 0:7a00359e701e | 114 | case AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT: |
masahikofukasawa | 0:7a00359e701e | 115 | case AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER: |
masahikofukasawa | 10:5c69b067d88a | 116 | { |
masahikofukasawa | 10:5c69b067d88a | 117 | AkmHallSwitch* hallswitch = new AkmHallSwitch(); |
masahikofukasawa | 0:7a00359e701e | 118 | sensor = hallswitch; |
masahikofukasawa | 0:7a00359e701e | 119 | break; |
masahikofukasawa | 10:5c69b067d88a | 120 | } |
masahikofukasawa | 17:9abb7c28709c | 121 | // case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY: |
masahikofukasawa | 4:af13b985c689 | 122 | case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR: |
masahikofukasawa | 10:5c69b067d88a | 123 | case AkmSensor::AKM_PRIMARY_ID_CURRENT_SENSOR: |
masahikofukasawa | 10:5c69b067d88a | 124 | case AkmSensor::AKM_PRIMARY_ID_MISC_ANALOG: |
masahikofukasawa | 10:5c69b067d88a | 125 | { |
masahikofukasawa | 11:cef8dc1cf010 | 126 | AkmAnalogSensor* analogsensor = new AkmAnalogSensor(); |
masahikofukasawa | 11:cef8dc1cf010 | 127 | sensor = analogsensor; |
masahikofukasawa | 0:7a00359e701e | 128 | break; |
masahikofukasawa | 10:5c69b067d88a | 129 | } |
masahikofukasawa | 17:9abb7c28709c | 130 | |
masahikofukasawa | 1:b46b8653331f | 131 | case AkmSensor::AKM_PRIMARY_ID_IR_SENSOR: |
masahikofukasawa | 10:5c69b067d88a | 132 | { |
masahikofukasawa | 10:5c69b067d88a | 133 | if(subId == Ak9750Ctrl::SUB_ID_AK9750){ |
masahikofukasawa | 10:5c69b067d88a | 134 | Ak9750Ctrl* ak9750ctrl = new Ak9750Ctrl(); |
masahikofukasawa | 10:5c69b067d88a | 135 | sensor = ak9750ctrl; |
masahikofukasawa | 15:1238993fd75f | 136 | }else if(subId == Ak9750Ctrl::SUB_ID_AK9753){ |
masahikofukasawa | 15:1238993fd75f | 137 | Ak9750Ctrl* ak9753ctrl = new Ak9750Ctrl(); |
masahikofukasawa | 15:1238993fd75f | 138 | sensor = ak9753ctrl; |
masahikofukasawa | 10:5c69b067d88a | 139 | }else if(subId == Ak9752Ctrl::SUB_ID_AK9752){ |
masahikofukasawa | 10:5c69b067d88a | 140 | Ak9752Ctrl* ak9752ctrl = new Ak9752Ctrl(); |
masahikofukasawa | 10:5c69b067d88a | 141 | sensor = ak9752ctrl; |
masahikofukasawa | 10:5c69b067d88a | 142 | }else{ |
masahikofukasawa | 10:5c69b067d88a | 143 | return NULL; // couldn't find |
masahikofukasawa | 10:5c69b067d88a | 144 | } |
masahikofukasawa | 10:5c69b067d88a | 145 | |
masahikofukasawa | 1:b46b8653331f | 146 | break; |
masahikofukasawa | 10:5c69b067d88a | 147 | } |
masahikofukasawa | 17:9abb7c28709c | 148 | |
masahikofukasawa | 0:7a00359e701e | 149 | default: |
masahikofukasawa | 10:5c69b067d88a | 150 | { |
masahikofukasawa | 17:9abb7c28709c | 151 | MSG("#Can't find ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]); |
masahikofukasawa | 0:7a00359e701e | 152 | return NULL; // couldn't find |
masahikofukasawa | 10:5c69b067d88a | 153 | } |
masahikofukasawa | 0:7a00359e701e | 154 | } |
masahikofukasawa | 11:cef8dc1cf010 | 155 | |
masahikofukasawa | 10:5c69b067d88a | 156 | if(sensor->init(primaryId, subId) != AkmSensor::SUCCESS){ |
masahikofukasawa | 10:5c69b067d88a | 157 | MSG("#sensor->init failed. ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]); |
masahikofukasawa | 0:7a00359e701e | 158 | return NULL; // couldn't find |
masahikofukasawa | 0:7a00359e701e | 159 | } |
masahikofukasawa | 0:7a00359e701e | 160 | |
masahikofukasawa | 10:5c69b067d88a | 161 | MSG("#ID=%d SubID=%d %s\r\n", primaryId, subId, AKM_PRIMARY_ID_STR[primaryId]); |
masahikofukasawa | 0:7a00359e701e | 162 | return sensor; |
masahikofukasawa | 0:7a00359e701e | 163 | } |
masahikofukasawa | 0:7a00359e701e | 164 | |
masahikofukasawa | 16:d85be9bafb80 | 165 | |
masahikofukasawa | 16:d85be9bafb80 | 166 | void AkmSensorManager::dummyCallbackForCommandReceived(){} |
masahikofukasawa | 16:d85be9bafb80 | 167 | |
masahikofukasawa | 0:7a00359e701e | 168 | AkmSensorManager::Status AkmSensorManager::commandReceived(char* buf){ |
masahikofukasawa | 0:7a00359e701e | 169 | // Construct message |
masahikofukasawa | 0:7a00359e701e | 170 | Status status = SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 171 | |
masahikofukasawa | 10:5c69b067d88a | 172 | if ((Message::parse(&msg, buf)) != Message::SUCCESS) { |
masahikofukasawa | 11:cef8dc1cf010 | 173 | MSG("#Failed to parse message. %s\r\n", buf); |
masahikofukasawa | 0:7a00359e701e | 174 | status = ERROR; |
masahikofukasawa | 0:7a00359e701e | 175 | eventCommandReceived = false; |
masahikofukasawa | 15:1238993fd75f | 176 | }else{ |
masahikofukasawa | 15:1238993fd75f | 177 | eventCommandReceived = true; |
masahikofukasawa | 16:d85be9bafb80 | 178 | // MSG("#Parsed message. %s\r\n", buf); |
masahikofukasawa | 0:7a00359e701e | 179 | } |
masahikofukasawa | 16:d85be9bafb80 | 180 | t.attach(callback(this, &AkmSensorManager::dummyCallbackForCommandReceived),0); // wake-up from ble.waitForEvent |
masahikofukasawa | 0:7a00359e701e | 181 | return status; |
masahikofukasawa | 0:7a00359e701e | 182 | } |
masahikofukasawa | 0:7a00359e701e | 183 | |
coisme | 2:11fe67783c4c | 184 | int16_t AkmSensorManager::getAdcData(MCP342X *mcp3428, MCP342X::AdcChannel ch, MCP342X::SampleSetting s) { |
coisme | 2:11fe67783c4c | 185 | const int WAIT_ADC_MS = 1; |
coisme | 2:11fe67783c4c | 186 | |
coisme | 2:11fe67783c4c | 187 | // Configure channel and trigger. |
coisme | 2:11fe67783c4c | 188 | mcp3428->setChannel(ch); |
coisme | 2:11fe67783c4c | 189 | mcp3428->setSampleSetting(s); |
coisme | 2:11fe67783c4c | 190 | mcp3428->trigger(); |
coisme | 2:11fe67783c4c | 191 | |
coisme | 2:11fe67783c4c | 192 | // polling data (!blocking) |
coisme | 2:11fe67783c4c | 193 | MCP342X::Data data; |
coisme | 2:11fe67783c4c | 194 | do { |
coisme | 2:11fe67783c4c | 195 | wait_ms(WAIT_ADC_MS); |
coisme | 2:11fe67783c4c | 196 | mcp3428->getData(&data); |
coisme | 2:11fe67783c4c | 197 | } while(data.st == MCP342X::DATA_NOT_UPDATED); |
coisme | 2:11fe67783c4c | 198 | |
coisme | 2:11fe67783c4c | 199 | return data.value; |
coisme | 2:11fe67783c4c | 200 | } |
masahikofukasawa | 0:7a00359e701e | 201 | |
masahikofukasawa | 0:7a00359e701e | 202 | uint8_t AkmSensorManager::getId(PinName pin, uint8_t bits) |
masahikofukasawa | 0:7a00359e701e | 203 | { |
masahikofukasawa | 11:cef8dc1cf010 | 204 | MSG("#GetID\r\n"); |
masahikofukasawa | 6:c4401549d68f | 205 | |
tkstreet | 21:966724730ce6 | 206 | I2C i2c(I2C_SDA, I2C_SCL); // establish I2C to read ID |
tkstreet | 21:966724730ce6 | 207 | |
coisme | 2:11fe67783c4c | 208 | // ADC |
tkstreet | 21:966724730ce6 | 209 | MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_6EH); // ADC to convert voltage |
tkstreet | 21:966724730ce6 | 210 | mcp342x.setConversionMode(MCP342X::ONE_SHOT); // Set to single sample |
coisme | 2:11fe67783c4c | 211 | MCP342X::AdcChannel ch; |
tkstreet | 21:966724730ce6 | 212 | |
tkstreet | 21:966724730ce6 | 213 | if (pin == ANALOG_SENSOR_ID) { // Primary ID |
coisme | 2:11fe67783c4c | 214 | ch = MCP342X::ADC_CH1; |
tkstreet | 21:966724730ce6 | 215 | } else { // pin == ANALOG_SENSOR_ID_SUB |
tkstreet | 21:966724730ce6 | 216 | ch = MCP342X::ADC_CH2; // Secondary ID |
coisme | 2:11fe67783c4c | 217 | } |
tkstreet | 21:966724730ce6 | 218 | |
coisme | 2:11fe67783c4c | 219 | int16_t val = getAdcData(&mcp342x, ch, MCP342X::SAMPLE_240HZ_12BIT); |
masahikofukasawa | 11:cef8dc1cf010 | 220 | MSG("#12bit ADC Val = %d.\r\n", val); |
coisme | 2:11fe67783c4c | 221 | |
tkstreet | 21:966724730ce6 | 222 | // Voltage boundaries for ID voltage divider system |
coisme | 2:11fe67783c4c | 223 | const int16_t VAL_MAX = 3000-2048; // Corresponds to 3V |
coisme | 2:11fe67783c4c | 224 | const int16_t VAL_MIN = -2048; // Corresponds to 0V |
coisme | 2:11fe67783c4c | 225 | |
tkstreet | 21:966724730ce6 | 226 | // Convert voltage to ID value |
masahikofukasawa | 6:c4401549d68f | 227 | uint8_t value = (uint8_t)((val - VAL_MIN)/(float)(VAL_MAX - VAL_MIN) * (1 << bits) + 0.5); |
masahikofukasawa | 11:cef8dc1cf010 | 228 | MSG("#ID = %d.\r\n", value); |
masahikofukasawa | 6:c4401549d68f | 229 | |
masahikofukasawa | 0:7a00359e701e | 230 | return value; |
masahikofukasawa | 0:7a00359e701e | 231 | } |
masahikofukasawa | 0:7a00359e701e | 232 | |
masahikofukasawa | 0:7a00359e701e | 233 | bool AkmSensorManager::isEvent() |
masahikofukasawa | 0:7a00359e701e | 234 | { |
masahikofukasawa | 0:7a00359e701e | 235 | return (sensor->isEvent() || |
masahikofukasawa | 0:7a00359e701e | 236 | eventCommandReceived || |
masahikofukasawa | 0:7a00359e701e | 237 | eventConnected || |
masahikofukasawa | 0:7a00359e701e | 238 | eventDisconnected); |
masahikofukasawa | 0:7a00359e701e | 239 | } |
masahikofukasawa | 0:7a00359e701e | 240 | |
masahikofukasawa | 0:7a00359e701e | 241 | void AkmSensorManager::processCommand() |
masahikofukasawa | 0:7a00359e701e | 242 | { |
tkstreet | 23:50c98b286e41 | 243 | // Extracts command contained in the message |
masahikofukasawa | 0:7a00359e701e | 244 | Message::Command cmd = msg.getCommand(); |
masahikofukasawa | 0:7a00359e701e | 245 | |
tkstreet | 21:966724730ce6 | 246 | // Creates a message object to return |
masahikofukasawa | 0:7a00359e701e | 247 | Message resMsg; |
masahikofukasawa | 0:7a00359e701e | 248 | |
tkstreet | 23:50c98b286e41 | 249 | // Return message contains the extracted command |
masahikofukasawa | 0:7a00359e701e | 250 | resMsg.setCommand(cmd); |
masahikofukasawa | 0:7a00359e701e | 251 | |
masahikofukasawa | 0:7a00359e701e | 252 | switch(cmd) |
masahikofukasawa | 0:7a00359e701e | 253 | { |
masahikofukasawa | 0:7a00359e701e | 254 | case Message::CMD_GET_FW_VERSION: |
masahikofukasawa | 11:cef8dc1cf010 | 255 | { |
masahikofukasawa | 0:7a00359e701e | 256 | resMsg.setArgument(0, FIRMWARE_VERSION); |
masahikofukasawa | 0:7a00359e701e | 257 | throwMessage(&resMsg); |
masahikofukasawa | 11:cef8dc1cf010 | 258 | MSG("#FW version is reported.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 259 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 260 | } |
masahikofukasawa | 0:7a00359e701e | 261 | case Message::CMD_GET_MAG_PART: |
masahikofukasawa | 11:cef8dc1cf010 | 262 | { |
masahikofukasawa | 0:7a00359e701e | 263 | resMsg.setArgument(0, MAGNETOMETER_ID); |
masahikofukasawa | 0:7a00359e701e | 264 | throwMessage(&resMsg); |
masahikofukasawa | 11:cef8dc1cf010 | 265 | MSG("#Mag ID is reported.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 266 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 267 | } |
masahikofukasawa | 0:7a00359e701e | 268 | case Message::CMD_SET_SERIAL_TARGET: |
masahikofukasawa | 11:cef8dc1cf010 | 269 | { |
masahikofukasawa | 0:7a00359e701e | 270 | isEnabledBle = msg.getArgument(0)==Message::SW_ON ? true : false; |
masahikofukasawa | 0:7a00359e701e | 271 | isEnabledUsb = msg.getArgument(1)==Message::SW_ON ? true : false; |
masahikofukasawa | 0:7a00359e701e | 272 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 273 | } |
masahikofukasawa | 0:7a00359e701e | 274 | case Message::CMD_GET_ID: // return Primary ID and Sub ID |
masahikofukasawa | 11:cef8dc1cf010 | 275 | { |
masahikofukasawa | 10:5c69b067d88a | 276 | resMsg.setArgument(0, primaryId); |
masahikofukasawa | 0:7a00359e701e | 277 | resMsg.setArgument(1, subId); |
masahikofukasawa | 0:7a00359e701e | 278 | throwMessage(&resMsg); |
masahikofukasawa | 11:cef8dc1cf010 | 279 | MSG("#Mag ID is reported.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 280 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 281 | } |
masahikofukasawa | 0:7a00359e701e | 282 | case Message::CMD_STOP_MEASUREMENT: |
masahikofukasawa | 11:cef8dc1cf010 | 283 | { |
masahikofukasawa | 15:1238993fd75f | 284 | if( sensor->stopSensor() != AkmSensor::SUCCESS){ |
masahikofukasawa | 15:1238993fd75f | 285 | resMsg.setArgument(0, 1); |
masahikofukasawa | 15:1238993fd75f | 286 | }else{ |
masahikofukasawa | 15:1238993fd75f | 287 | resMsg.setArgument(0, 0); |
masahikofukasawa | 15:1238993fd75f | 288 | } |
masahikofukasawa | 0:7a00359e701e | 289 | throwMessage(&resMsg); |
masahikofukasawa | 11:cef8dc1cf010 | 290 | MSG("#Stop measurement.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 291 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 292 | } |
masahikofukasawa | 0:7a00359e701e | 293 | case Message::CMD_START_MEASUREMENT: |
masahikofukasawa | 11:cef8dc1cf010 | 294 | { |
masahikofukasawa | 11:cef8dc1cf010 | 295 | int error_code = AkmSensor::SUCCESS; |
masahikofukasawa | 11:cef8dc1cf010 | 296 | if(msg.getArgNum() == 0){ |
masahikofukasawa | 11:cef8dc1cf010 | 297 | error_code = sensor->startSensor(); |
masahikofukasawa | 11:cef8dc1cf010 | 298 | if( error_code != AkmSensor::SUCCESS ){ |
masahikofukasawa | 11:cef8dc1cf010 | 299 | MSG("#StartSensor Error. Code=%d\r\n",error_code); |
masahikofukasawa | 11:cef8dc1cf010 | 300 | } |
masahikofukasawa | 11:cef8dc1cf010 | 301 | else{ |
masahikofukasawa | 11:cef8dc1cf010 | 302 | MSG("#Start measurement.\r\n"); |
masahikofukasawa | 11:cef8dc1cf010 | 303 | } |
masahikofukasawa | 11:cef8dc1cf010 | 304 | }else if(msg.getArgNum() == 1){ |
masahikofukasawa | 11:cef8dc1cf010 | 305 | float interval = (float)(1.0 / (float)msg.getArgument(0)); |
masahikofukasawa | 11:cef8dc1cf010 | 306 | error_code = sensor->startSensor(interval); |
masahikofukasawa | 11:cef8dc1cf010 | 307 | if( error_code != AkmSensor::SUCCESS ){ |
masahikofukasawa | 11:cef8dc1cf010 | 308 | MSG("#StartSensor Error. Code=%d\r\n",error_code); |
masahikofukasawa | 11:cef8dc1cf010 | 309 | } |
masahikofukasawa | 11:cef8dc1cf010 | 310 | else{ |
masahikofukasawa | 11:cef8dc1cf010 | 311 | MSG("#Start measurement.\r\n"); |
masahikofukasawa | 11:cef8dc1cf010 | 312 | } |
masahikofukasawa | 11:cef8dc1cf010 | 313 | }else{ |
masahikofukasawa | 11:cef8dc1cf010 | 314 | MSG("#StartSensor Error. Wrong Argument num.\r\n"); |
masahikofukasawa | 11:cef8dc1cf010 | 315 | } |
masahikofukasawa | 11:cef8dc1cf010 | 316 | if(error_code == AkmSensor::SUCCESS){ |
masahikofukasawa | 11:cef8dc1cf010 | 317 | // get initial sensor state for switch type sensors |
masahikofukasawa | 11:cef8dc1cf010 | 318 | if( primaryId == AkmSensor::AKM_PRIMARY_ID_UNIPOLAR || |
masahikofukasawa | 11:cef8dc1cf010 | 319 | primaryId == AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR || |
masahikofukasawa | 11:cef8dc1cf010 | 320 | primaryId == AkmSensor::AKM_PRIMARY_ID_LATCH || |
masahikofukasawa | 11:cef8dc1cf010 | 321 | primaryId == AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT || |
masahikofukasawa | 11:cef8dc1cf010 | 322 | primaryId == AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER ){ |
masahikofukasawa | 11:cef8dc1cf010 | 323 | Message temp; |
masahikofukasawa | 11:cef8dc1cf010 | 324 | sensor->readSensorData(&temp); |
masahikofukasawa | 11:cef8dc1cf010 | 325 | throwMessage(&temp); |
masahikofukasawa | 11:cef8dc1cf010 | 326 | } |
masahikofukasawa | 0:7a00359e701e | 327 | } |
masahikofukasawa | 0:7a00359e701e | 328 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 329 | } |
masahikofukasawa | 9:6fa3e7b17c27 | 330 | case Message::CMD_PROGSW_GET_THRESHOLD: |
masahikofukasawa | 9:6fa3e7b17c27 | 331 | case Message::CMD_PROGSW_SET_THRESHOLD: |
masahikofukasawa | 9:6fa3e7b17c27 | 332 | case Message::CMD_PROGSW_GET_READ_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 333 | case Message::CMD_PROGSW_SET_READ_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 334 | case Message::CMD_PROGSW_GET_SWITCH_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 335 | case Message::CMD_PROGSW_SET_SWITCH_COFIGURATION: |
masahikofukasawa | 9:6fa3e7b17c27 | 336 | case Message::CMD_PROGSW_GET_OPERATION_MODE: |
masahikofukasawa | 9:6fa3e7b17c27 | 337 | case Message::CMD_PROGSW_SET_OPERATION_MODE: |
masahikofukasawa | 1:b46b8653331f | 338 | case Message::CMD_IR_GET_THRESHOLD: |
masahikofukasawa | 1:b46b8653331f | 339 | case Message::CMD_IR_SET_THRESHOLD: |
masahikofukasawa | 1:b46b8653331f | 340 | case Message::CMD_IR_GET_HYSTERESIS: |
masahikofukasawa | 1:b46b8653331f | 341 | case Message::CMD_IR_SET_HYSTERESIS: |
masahikofukasawa | 1:b46b8653331f | 342 | case Message::CMD_IR_GET_INTERRUPT: |
masahikofukasawa | 1:b46b8653331f | 343 | case Message::CMD_IR_SET_INTERRUPT: |
masahikofukasawa | 1:b46b8653331f | 344 | case Message::CMD_IR_GET_OPERATION_MODE: |
masahikofukasawa | 1:b46b8653331f | 345 | case Message::CMD_IR_SET_OPERATION_MODE: |
masahikofukasawa | 1:b46b8653331f | 346 | case Message::CMD_IR_GET_THRESHOLD_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 347 | case Message::CMD_IR_SET_THRESHOLD_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 348 | case Message::CMD_IR_GET_HYSTERESIS_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 349 | case Message::CMD_IR_SET_HYSTERESIS_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 350 | case Message::CMD_IR_GET_INTERRUPT_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 351 | case Message::CMD_IR_SET_INTERRUPT_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 352 | case Message::CMD_IR_GET_OPERATION_MODE_EEPROM: |
masahikofukasawa | 1:b46b8653331f | 353 | case Message::CMD_IR_SET_OPERATION_MODE_EEPROM: |
masahikofukasawa | 9:6fa3e7b17c27 | 354 | case Message::CMD_ANGLE_ZERO_RESET: |
masahikofukasawa | 9:6fa3e7b17c27 | 355 | case Message::CMD_REG_WRITE: |
masahikofukasawa | 9:6fa3e7b17c27 | 356 | case Message::CMD_REG_WRITEN: |
masahikofukasawa | 9:6fa3e7b17c27 | 357 | case Message::CMD_REG_READ: |
masahikofukasawa | 9:6fa3e7b17c27 | 358 | case Message::CMD_REG_READN: |
masahikofukasawa | 9:6fa3e7b17c27 | 359 | case Message::CMD_COMPASS_GET_OPERATION_MODE: |
masahikofukasawa | 9:6fa3e7b17c27 | 360 | case Message::CMD_COMPASS_SET_OPERATION_MODE: |
masahikofukasawa | 11:cef8dc1cf010 | 361 | { |
masahikofukasawa | 15:1238993fd75f | 362 | AkmSensor::Status st = sensor->requestCommand(&msg,&resMsg); |
masahikofukasawa | 15:1238993fd75f | 363 | if( (resMsg.getArgNum() == 0) && (st != AkmSensor::SUCCESS) ) |
masahikofukasawa | 15:1238993fd75f | 364 | { |
masahikofukasawa | 15:1238993fd75f | 365 | MSG("#Command failed.\r\n"); |
masahikofukasawa | 15:1238993fd75f | 366 | }else{ |
masahikofukasawa | 15:1238993fd75f | 367 | throwMessage(&resMsg); |
masahikofukasawa | 15:1238993fd75f | 368 | } |
masahikofukasawa | 0:7a00359e701e | 369 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 370 | } |
masahikofukasawa | 0:7a00359e701e | 371 | default: |
masahikofukasawa | 11:cef8dc1cf010 | 372 | { |
masahikofukasawa | 15:1238993fd75f | 373 | MSG("#Can't find command.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 374 | break; |
masahikofukasawa | 11:cef8dc1cf010 | 375 | } |
masahikofukasawa | 0:7a00359e701e | 376 | } |
masahikofukasawa | 0:7a00359e701e | 377 | } |
masahikofukasawa | 0:7a00359e701e | 378 | |
masahikofukasawa | 0:7a00359e701e | 379 | AkmSensorManager::Status AkmSensorManager::processEvent() |
masahikofukasawa | 0:7a00359e701e | 380 | { |
masahikofukasawa | 0:7a00359e701e | 381 | AkmSensorManager::Status status = AkmSensorManager::SUCCESS; |
masahikofukasawa | 0:7a00359e701e | 382 | |
tkstreet | 23:50c98b286e41 | 383 | // If event is a command received from the host |
masahikofukasawa | 0:7a00359e701e | 384 | if(eventCommandReceived) |
masahikofukasawa | 0:7a00359e701e | 385 | { |
masahikofukasawa | 16:d85be9bafb80 | 386 | // MSG("#Command received.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 387 | processCommand(); |
tkstreet | 21:966724730ce6 | 388 | eventCommandReceived = false; // clear the flag |
masahikofukasawa | 0:7a00359e701e | 389 | } |
tkstreet | 23:50c98b286e41 | 390 | |
tkstreet | 23:50c98b286e41 | 391 | // If event is sensor read data event, read the message |
tkstreet | 23:50c98b286e41 | 392 | if(sensor->isEvent()) |
masahikofukasawa | 0:7a00359e701e | 393 | { |
masahikofukasawa | 16:d85be9bafb80 | 394 | // MSG("#Sensor event received.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 395 | Message msg; |
masahikofukasawa | 0:7a00359e701e | 396 | if( sensor->readSensorData(&msg) != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR; |
tkstreet | 23:50c98b286e41 | 397 | throwMessage(&msg); // Process and output message to USB/BLE |
masahikofukasawa | 0:7a00359e701e | 398 | } |
masahikofukasawa | 0:7a00359e701e | 399 | |
tkstreet | 23:50c98b286e41 | 400 | // If event is the BLE being connected, clear the flag and start sensor |
tkstreet | 23:50c98b286e41 | 401 | if(eventConnected) |
masahikofukasawa | 0:7a00359e701e | 402 | { |
tkstreet | 21:966724730ce6 | 403 | eventConnected = false; // clear the flag |
masahikofukasawa | 12:c06cd8b76358 | 404 | MSG("#BLE connected.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 405 | } |
tkstreet | 23:50c98b286e41 | 406 | |
tkstreet | 23:50c98b286e41 | 407 | // If event is the BLE being disconnected, stop the sensor |
tkstreet | 23:50c98b286e41 | 408 | if(eventDisconnected) |
masahikofukasawa | 0:7a00359e701e | 409 | { |
masahikofukasawa | 12:c06cd8b76358 | 410 | MSG("#BLE dis-connected.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 411 | if( sensor->stopSensor() != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR; |
tkstreet | 21:966724730ce6 | 412 | eventDisconnected = false; // clear the flag |
masahikofukasawa | 0:7a00359e701e | 413 | } |
masahikofukasawa | 0:7a00359e701e | 414 | return status; |
masahikofukasawa | 0:7a00359e701e | 415 | } |
masahikofukasawa | 0:7a00359e701e | 416 | |
masahikofukasawa | 0:7a00359e701e | 417 | AkmSensorManager::Status AkmSensorManager::throwMessage(const Message *msg) { |
masahikofukasawa | 0:7a00359e701e | 418 | int len = Message::getMaxMessageLength(); |
masahikofukasawa | 0:7a00359e701e | 419 | char buf[len]; |
masahikofukasawa | 0:7a00359e701e | 420 | |
tkstreet | 23:50c98b286e41 | 421 | buf[0] = '$'; // Output message prefix |
masahikofukasawa | 0:7a00359e701e | 422 | |
tkstreet | 23:50c98b286e41 | 423 | // Processes command in msg to ASCII |
masahikofukasawa | 0:7a00359e701e | 424 | char cmd = (char)msg->getCommand(); |
masahikofukasawa | 0:7a00359e701e | 425 | Message::charToAscii(&buf[1], &cmd); |
masahikofukasawa | 0:7a00359e701e | 426 | |
tkstreet | 23:50c98b286e41 | 427 | // Processes arguments in msg to ASCII |
masahikofukasawa | 0:7a00359e701e | 428 | for (int i=0; i < msg->getArgNum(); i++) { |
masahikofukasawa | 0:7a00359e701e | 429 | char arg = msg->getArgument(i); |
masahikofukasawa | 0:7a00359e701e | 430 | Message::charToAscii(&buf[3+2*i], &arg); |
masahikofukasawa | 0:7a00359e701e | 431 | } |
masahikofukasawa | 0:7a00359e701e | 432 | |
masahikofukasawa | 0:7a00359e701e | 433 | // Add termination characters, 0x0D(\r), \n and \0, to the end of string |
masahikofukasawa | 0:7a00359e701e | 434 | int tIdx = 3 + 2 * (msg->getArgNum()); |
masahikofukasawa | 0:7a00359e701e | 435 | int bufSize = sizeof(buf)/sizeof(buf[0]); |
masahikofukasawa | 0:7a00359e701e | 436 | if ((tIdx + 3) > (bufSize - 1)) { |
masahikofukasawa | 11:cef8dc1cf010 | 437 | MSG("#Error: Message data exceeds the buffer.\r\n"); |
masahikofukasawa | 0:7a00359e701e | 438 | return ERROR; |
masahikofukasawa | 0:7a00359e701e | 439 | } |
masahikofukasawa | 11:cef8dc1cf010 | 440 | buf[tIdx++] = CR; // '\r' |
masahikofukasawa | 11:cef8dc1cf010 | 441 | buf[tIdx++] = LF; // '\n' |
masahikofukasawa | 11:cef8dc1cf010 | 442 | buf[tIdx] = '\0'; |
tkstreet | 23:50c98b286e41 | 443 | |
tkstreet | 23:50c98b286e41 | 444 | // If BLE is enabled, send to AKDP app (?) |
tkstreet | 23:50c98b286e41 | 445 | if(isEnabledBle) uartService->writeString(buf); |
tkstreet | 23:50c98b286e41 | 446 | |
tkstreet | 23:50c98b286e41 | 447 | // If USB is enabled, send to serial terminal (?) |
masahikofukasawa | 0:7a00359e701e | 448 | if(isEnabledUsb) serial->printf(buf); |
masahikofukasawa | 0:7a00359e701e | 449 | |
masahikofukasawa | 0:7a00359e701e | 450 | return SUCCESS; |
masahikofukasawa | 12:c06cd8b76358 | 451 | } |
masahikofukasawa | 13:d008249f0359 | 452 | |
masahikofukasawa | 13:d008249f0359 | 453 | char* AkmSensorManager::getSensorName(){ |
masahikofukasawa | 13:d008249f0359 | 454 | return sensor->getSensorName(); |
masahikofukasawa | 13:d008249f0359 | 455 | } |