Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Committer:
tkstreet
Date:
Tue May 01 21:31:15 2018 +0000
Revision:
49:c8f8946129b6
Parent:
48:427bdb7bf31b
Modified for Rev.E. compatibility.

Who changed what in which revision?

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