Modified for compatibility with Rev.E. hardware

Fork of AkmSensor by AKM Development Platform

Committer:
masahikofukasawa
Date:
Sat Jun 11 00:16:17 2016 +0000
Revision:
8:8fa4b81db50b
Parent:
7:e269411568c9
Child:
9:6fa3e7b17c27
Add AK09970;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masahikofukasawa 0:7a00359e701e 1 #include "ble/services/UARTService.h"
masahikofukasawa 0:7a00359e701e 2 #include "akmsensormanager.h"
masahikofukasawa 0:7a00359e701e 3 #include "akmanglesensor.h"
masahikofukasawa 0:7a00359e701e 4 #include "akmhallswitch.h"
masahikofukasawa 0:7a00359e701e 5 #include "akmlinearsensor.h"
masahikofukasawa 6:c4401549d68f 6 #include "akmcurrentsensor.h"
masahikofukasawa 1:b46b8653331f 7 #include "akmirsensor.h"
masahikofukasawa 0:7a00359e701e 8 #include "akmakd.h"
masahikofukasawa 0:7a00359e701e 9 #include "debug.h"
masahikofukasawa 0:7a00359e701e 10 #include "Message.h"
coisme 2:11fe67783c4c 11 #ifdef REV_D
coisme 2:11fe67783c4c 12 #include "mcp342x.h"
masahikofukasawa 6:c4401549d68f 13 #include "I2CNano.h"
masahikofukasawa 7:e269411568c9 14 #include "tca9554a.h"
coisme 2:11fe67783c4c 15 #endif
masahikofukasawa 0:7a00359e701e 16
masahikofukasawa 0:7a00359e701e 17 #define FIRMWARE_VERSION 0x02
masahikofukasawa 0:7a00359e701e 18 #define MAGNETOMETER_ID 0x0A
masahikofukasawa 0:7a00359e701e 19
masahikofukasawa 0:7a00359e701e 20 #define CONV16I(high,low) ((int16_t)(((high) << 8) | (low)))
masahikofukasawa 0:7a00359e701e 21
masahikofukasawa 0:7a00359e701e 22
masahikofukasawa 0:7a00359e701e 23 static char* AKM_PRIMARY_ID_STR[] = {
masahikofukasawa 7:e269411568c9 24 "AKD Daughter Cards(SPI)",
masahikofukasawa 0:7a00359e701e 25 "Switch, Unipolar",
masahikofukasawa 0:7a00359e701e 26 "Switch, Onmipolar",
masahikofukasawa 0:7a00359e701e 27 "Latch, Bipolar",
masahikofukasawa 0:7a00359e701e 28 "Switch, Dual Output",
masahikofukasawa 0:7a00359e701e 29 "Onechip Encoder",
masahikofukasawa 0:7a00359e701e 30 "TBD1",
masahikofukasawa 0:7a00359e701e 31 "TBD2",
masahikofukasawa 0:7a00359e701e 32 "Linear Sensor Legacy",
masahikofukasawa 0:7a00359e701e 33 "Current Sensor",
masahikofukasawa 0:7a00359e701e 34 "MISC(Analog)",
masahikofukasawa 0:7a00359e701e 35 "Linear Sensor",
masahikofukasawa 4:af13b985c689 36 "TBD3",
masahikofukasawa 1:b46b8653331f 37 "IR Sensor",
masahikofukasawa 7:e269411568c9 38 "Angle Sensor(SPI)",
masahikofukasawa 0:7a00359e701e 39 "AKD Daughter Cards(I2C)",
masahikofukasawa 0:7a00359e701e 40 };
masahikofukasawa 0:7a00359e701e 41
masahikofukasawa 0:7a00359e701e 42 AkmSensorManager::AkmSensorManager(SerialNano* com, UARTService* service)
masahikofukasawa 0:7a00359e701e 43 {
masahikofukasawa 0:7a00359e701e 44 serial = com;
masahikofukasawa 0:7a00359e701e 45 uartService = service;
masahikofukasawa 0:7a00359e701e 46 isEnabledBle = true;
masahikofukasawa 0:7a00359e701e 47 isEnabledUsb = true;
masahikofukasawa 0:7a00359e701e 48 eventCommandReceived = false;
masahikofukasawa 0:7a00359e701e 49 eventConnected = false;
masahikofukasawa 0:7a00359e701e 50 eventDisconnected = false;
masahikofukasawa 0:7a00359e701e 51 }
masahikofukasawa 0:7a00359e701e 52
masahikofukasawa 0:7a00359e701e 53 AkmSensorManager::Status AkmSensorManager::init()
masahikofukasawa 0:7a00359e701e 54 {
masahikofukasawa 0:7a00359e701e 55 sensor = AkmSensorManager::getAkmSensor();
masahikofukasawa 0:7a00359e701e 56 if(sensor == NULL) return AkmSensorManager::ERROR;
masahikofukasawa 0:7a00359e701e 57 return AkmSensorManager::SUCCESS;
masahikofukasawa 0:7a00359e701e 58 }
masahikofukasawa 0:7a00359e701e 59
masahikofukasawa 0:7a00359e701e 60 void AkmSensorManager::setEventConnected()
masahikofukasawa 0:7a00359e701e 61 {
masahikofukasawa 0:7a00359e701e 62 eventConnected = true;
masahikofukasawa 0:7a00359e701e 63 }
masahikofukasawa 0:7a00359e701e 64
masahikofukasawa 0:7a00359e701e 65 void AkmSensorManager::setEventDisconnected()
masahikofukasawa 0:7a00359e701e 66 {
masahikofukasawa 0:7a00359e701e 67 eventDisconnected = true;
masahikofukasawa 0:7a00359e701e 68 }
masahikofukasawa 0:7a00359e701e 69
masahikofukasawa 0:7a00359e701e 70 AkmSensor* AkmSensorManager::getAkmSensor()
masahikofukasawa 0:7a00359e701e 71 {
masahikofukasawa 0:7a00359e701e 72 AkmSensor* sensor = NULL;
masahikofukasawa 0:7a00359e701e 73
masahikofukasawa 0:7a00359e701e 74 // primary id check
masahikofukasawa 0:7a00359e701e 75 id = AkmSensorManager::getId(ANALOG_SENSOR_ID,4);
masahikofukasawa 0:7a00359e701e 76
masahikofukasawa 0:7a00359e701e 77 switch(id){
masahikofukasawa 7:e269411568c9 78 case AkmSensor::AKM_PRIMARY_ID_AKD_SPI:
masahikofukasawa 0:7a00359e701e 79 case AkmSensor::AKM_PRIMARY_ID_AKD_I2C:
masahikofukasawa 0:7a00359e701e 80 subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,5); // 5bit sub id
masahikofukasawa 0:7a00359e701e 81 AkmAkd* akd;
masahikofukasawa 0:7a00359e701e 82 akd = new AkmAkd();
masahikofukasawa 0:7a00359e701e 83 sensor = akd;
masahikofukasawa 7:e269411568c9 84
masahikofukasawa 7:e269411568c9 85
masahikofukasawa 7:e269411568c9 86 #ifdef REV_D
masahikofukasawa 7:e269411568c9 87 {
masahikofukasawa 7:e269411568c9 88 const int TIME_FOR_OE_MS = 100;
masahikofukasawa 7:e269411568c9 89 const TCA9554A::Port PORT_OE_LVS2 = TCA9554A::PORT_6;
masahikofukasawa 7:e269411568c9 90 I2C i2c(I2C_SDA, I2C_SCL);
masahikofukasawa 7:e269411568c9 91 TCA9554A tca9554a(&i2c, TCA9554A::SLAVE_ADDRESS_38H);
masahikofukasawa 7:e269411568c9 92 // Makes sure that the OE is low first.
masahikofukasawa 7:e269411568c9 93 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::LOW);
masahikofukasawa 7:e269411568c9 94 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 7:e269411568c9 95 }
masahikofukasawa 7:e269411568c9 96 #endif
masahikofukasawa 7:e269411568c9 97
masahikofukasawa 0:7a00359e701e 98 break;
masahikofukasawa 0:7a00359e701e 99
masahikofukasawa 0:7a00359e701e 100 case AkmSensor::AKM_PRIMARY_ID_ANGLE_SENSOR:
masahikofukasawa 0:7a00359e701e 101 subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4); // 4bit sub id
masahikofukasawa 0:7a00359e701e 102 AkmAngleSensor* angleSensor;
masahikofukasawa 0:7a00359e701e 103 angleSensor = new AkmAngleSensor();
masahikofukasawa 0:7a00359e701e 104 sensor = angleSensor;
masahikofukasawa 0:7a00359e701e 105 break;
masahikofukasawa 0:7a00359e701e 106
masahikofukasawa 0:7a00359e701e 107 case AkmSensor::AKM_PRIMARY_ID_UNIPOLAR:
masahikofukasawa 0:7a00359e701e 108 case AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR:
masahikofukasawa 0:7a00359e701e 109 case AkmSensor::AKM_PRIMARY_ID_LATCH:
masahikofukasawa 0:7a00359e701e 110 case AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT:
masahikofukasawa 0:7a00359e701e 111 case AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER:
masahikofukasawa 0:7a00359e701e 112 subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4); // 4bit sub id
masahikofukasawa 0:7a00359e701e 113 AkmHallSwitch* hallswitch;
masahikofukasawa 0:7a00359e701e 114 hallswitch = new AkmHallSwitch();
masahikofukasawa 0:7a00359e701e 115 sensor = hallswitch;
masahikofukasawa 0:7a00359e701e 116 break;
masahikofukasawa 0:7a00359e701e 117
masahikofukasawa 0:7a00359e701e 118 case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR_LEGACY:
masahikofukasawa 4:af13b985c689 119 case AkmSensor::AKM_PRIMARY_ID_LINEAR_SENSOR:
masahikofukasawa 0:7a00359e701e 120 subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4); // 4bit sub id
masahikofukasawa 0:7a00359e701e 121 AkmLinearSensor* linearsensor;
masahikofukasawa 0:7a00359e701e 122 linearsensor = new AkmLinearSensor();
masahikofukasawa 0:7a00359e701e 123 sensor = linearsensor;
masahikofukasawa 0:7a00359e701e 124 break;
masahikofukasawa 0:7a00359e701e 125
masahikofukasawa 6:c4401549d68f 126 case AkmSensor::AKM_PRIMARY_ID_CURRENT_SENSOR:
masahikofukasawa 6:c4401549d68f 127 subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4); // 4bit sub id
masahikofukasawa 6:c4401549d68f 128 AkmCurrentSensor* currentsensor;
masahikofukasawa 6:c4401549d68f 129 currentsensor = new AkmCurrentSensor();
masahikofukasawa 6:c4401549d68f 130 sensor = currentsensor;
masahikofukasawa 6:c4401549d68f 131 break;
masahikofukasawa 6:c4401549d68f 132
masahikofukasawa 1:b46b8653331f 133 case AkmSensor::AKM_PRIMARY_ID_IR_SENSOR:
masahikofukasawa 1:b46b8653331f 134 subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4); // 4bit sub id
masahikofukasawa 1:b46b8653331f 135 AkmIrSensor* irsensor;
masahikofukasawa 1:b46b8653331f 136 irsensor = new AkmIrSensor();
masahikofukasawa 1:b46b8653331f 137 sensor = irsensor;
masahikofukasawa 1:b46b8653331f 138 break;
masahikofukasawa 1:b46b8653331f 139
masahikofukasawa 0:7a00359e701e 140 default:
masahikofukasawa 0:7a00359e701e 141 subId = AkmSensorManager::getId(ANALOG_SENSOR_ID_SUB,4); // 4bit sub id
masahikofukasawa 0:7a00359e701e 142 MSG("#Can't find ID=%d SubID=%d %s\r\n", id, subId, AKM_PRIMARY_ID_STR[id]);
masahikofukasawa 0:7a00359e701e 143 return NULL; // couldn't find
masahikofukasawa 0:7a00359e701e 144 }
masahikofukasawa 7:e269411568c9 145
masahikofukasawa 7:e269411568c9 146 #ifdef REV_D
masahikofukasawa 7:e269411568c9 147 // I2C turn off
masahikofukasawa 7:e269411568c9 148 releaseTWI();
masahikofukasawa 7:e269411568c9 149 #endif
masahikofukasawa 0:7a00359e701e 150
masahikofukasawa 0:7a00359e701e 151 if(sensor->init(id, subId) != AkmSensor::SUCCESS){
masahikofukasawa 1:b46b8653331f 152 MSG("#sensor->init failed. ID=%d SubID=%d %s\r\n", id, subId, AKM_PRIMARY_ID_STR[id]);
masahikofukasawa 0:7a00359e701e 153 return NULL; // couldn't find
masahikofukasawa 0:7a00359e701e 154 }
masahikofukasawa 0:7a00359e701e 155
masahikofukasawa 0:7a00359e701e 156 MSG("#ID=%d SubID=%d %s\r\n", id, subId, AKM_PRIMARY_ID_STR[id]);
masahikofukasawa 0:7a00359e701e 157 return sensor;
masahikofukasawa 0:7a00359e701e 158 }
masahikofukasawa 0:7a00359e701e 159
masahikofukasawa 0:7a00359e701e 160 AkmSensorManager::Status AkmSensorManager::commandReceived(char* buf){
masahikofukasawa 0:7a00359e701e 161 // Construct message
masahikofukasawa 0:7a00359e701e 162 Status status = SUCCESS;
masahikofukasawa 0:7a00359e701e 163
masahikofukasawa 0:7a00359e701e 164 Message::Status st;
masahikofukasawa 0:7a00359e701e 165 if ((st=Message::parse(&msg, buf)) != Message::SUCCESS) {
masahikofukasawa 0:7a00359e701e 166 MSG("#Failed to parse message. status = %02x. %s\n", st, buf);
masahikofukasawa 0:7a00359e701e 167 status = ERROR;
masahikofukasawa 0:7a00359e701e 168 eventCommandReceived = false;
masahikofukasawa 0:7a00359e701e 169 }
masahikofukasawa 0:7a00359e701e 170 eventCommandReceived = true;
masahikofukasawa 0:7a00359e701e 171 return status;
masahikofukasawa 0:7a00359e701e 172 }
masahikofukasawa 0:7a00359e701e 173
coisme 2:11fe67783c4c 174 #ifdef REV_D
coisme 2:11fe67783c4c 175 int16_t AkmSensorManager::getAdcData(MCP342X *mcp3428, MCP342X::AdcChannel ch, MCP342X::SampleSetting s) {
coisme 2:11fe67783c4c 176 const int WAIT_ADC_MS = 1;
coisme 2:11fe67783c4c 177
coisme 2:11fe67783c4c 178 // Configure channel and trigger.
coisme 2:11fe67783c4c 179 mcp3428->setChannel(ch);
coisme 2:11fe67783c4c 180 mcp3428->setSampleSetting(s);
coisme 2:11fe67783c4c 181 mcp3428->trigger();
coisme 2:11fe67783c4c 182
coisme 2:11fe67783c4c 183 // polling data (!blocking)
coisme 2:11fe67783c4c 184 MCP342X::Data data;
coisme 2:11fe67783c4c 185 do {
coisme 2:11fe67783c4c 186 wait_ms(WAIT_ADC_MS);
coisme 2:11fe67783c4c 187 mcp3428->getData(&data);
coisme 2:11fe67783c4c 188 } while(data.st == MCP342X::DATA_NOT_UPDATED);
coisme 2:11fe67783c4c 189
coisme 2:11fe67783c4c 190 return data.value;
coisme 2:11fe67783c4c 191 }
coisme 2:11fe67783c4c 192 #endif
masahikofukasawa 0:7a00359e701e 193
masahikofukasawa 0:7a00359e701e 194 uint8_t AkmSensorManager::getId(PinName pin, uint8_t bits)
masahikofukasawa 0:7a00359e701e 195 {
coisme 2:11fe67783c4c 196 #ifndef REV_D
coisme 2:11fe67783c4c 197 /* Rev.C */
masahikofukasawa 0:7a00359e701e 198 AnalogIn id(pin);
masahikofukasawa 1:b46b8653331f 199 MSG("#Voltage=%5.2f[V]\n",id*3.0);
masahikofukasawa 0:7a00359e701e 200 double s = id + 1.0/(double)(pow(2.0,bits+1));
masahikofukasawa 0:7a00359e701e 201 uint8_t value = (uint8_t)(s*pow(2.0,bits));
coisme 2:11fe67783c4c 202 #else
coisme 2:11fe67783c4c 203 /* Rev.D */
masahikofukasawa 4:af13b985c689 204 MSG("#GetID\n");
masahikofukasawa 6:c4401549d68f 205
masahikofukasawa 6:c4401549d68f 206 I2C i2c(I2C_SDA, I2C_SCL);
coisme 2:11fe67783c4c 207 // ADC
coisme 2:11fe67783c4c 208 MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_6EH);
coisme 2:11fe67783c4c 209 mcp342x.setConversionMode(MCP342X::ONE_SHOT);
coisme 2:11fe67783c4c 210 MCP342X::AdcChannel ch;
coisme 2:11fe67783c4c 211 if (pin == ANALOG_SENSOR_ID) {
coisme 2:11fe67783c4c 212 ch = MCP342X::ADC_CH1;
coisme 2:11fe67783c4c 213 } else { // pin == ANALOG_SENSOR_ID_SUB
coisme 2:11fe67783c4c 214 ch = MCP342X::ADC_CH2;
coisme 2:11fe67783c4c 215 }
coisme 2:11fe67783c4c 216 int16_t val = getAdcData(&mcp342x, ch, MCP342X::SAMPLE_240HZ_12BIT);
coisme 2:11fe67783c4c 217 MSG("#12bit ADC Val = %d.\n", val);
coisme 2:11fe67783c4c 218
coisme 2:11fe67783c4c 219 const int16_t VAL_MAX = 3000-2048; // Corresponds to 3V
coisme 2:11fe67783c4c 220 const int16_t VAL_MIN = -2048; // Corresponds to 0V
coisme 2:11fe67783c4c 221
masahikofukasawa 6:c4401549d68f 222 uint8_t value = (uint8_t)((val - VAL_MIN)/(float)(VAL_MAX - VAL_MIN) * (1 << bits) + 0.5);
masahikofukasawa 4:af13b985c689 223 MSG("#ID = %d.\n", value);
masahikofukasawa 6:c4401549d68f 224
coisme 2:11fe67783c4c 225 #endif
masahikofukasawa 0:7a00359e701e 226 return value;
masahikofukasawa 0:7a00359e701e 227 }
masahikofukasawa 0:7a00359e701e 228
masahikofukasawa 0:7a00359e701e 229 bool AkmSensorManager::isEvent()
masahikofukasawa 0:7a00359e701e 230 {
masahikofukasawa 0:7a00359e701e 231 return (sensor->isEvent() ||
masahikofukasawa 0:7a00359e701e 232 eventCommandReceived ||
masahikofukasawa 0:7a00359e701e 233 eventConnected ||
masahikofukasawa 0:7a00359e701e 234 eventDisconnected);
masahikofukasawa 0:7a00359e701e 235 }
masahikofukasawa 0:7a00359e701e 236
masahikofukasawa 0:7a00359e701e 237
masahikofukasawa 0:7a00359e701e 238 void AkmSensorManager::processCommand()
masahikofukasawa 0:7a00359e701e 239 {
masahikofukasawa 0:7a00359e701e 240 AkmSensorManager::Status status = AkmSensorManager::SUCCESS;
masahikofukasawa 0:7a00359e701e 241 // MSG("#processCommand.\n");
masahikofukasawa 0:7a00359e701e 242
masahikofukasawa 0:7a00359e701e 243 // Gets command in the message
masahikofukasawa 0:7a00359e701e 244 Message::Command cmd = msg.getCommand();
masahikofukasawa 0:7a00359e701e 245
masahikofukasawa 0:7a00359e701e 246 // Creates an message object to return
masahikofukasawa 0:7a00359e701e 247 Message resMsg;
masahikofukasawa 0:7a00359e701e 248
masahikofukasawa 0:7a00359e701e 249 // Return message has the same command as input
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 0:7a00359e701e 255 resMsg.setArgument(0, FIRMWARE_VERSION);
masahikofukasawa 0:7a00359e701e 256 throwMessage(&resMsg);
masahikofukasawa 0:7a00359e701e 257 MSG("#FW version is reported.\n");
masahikofukasawa 0:7a00359e701e 258 break;
masahikofukasawa 0:7a00359e701e 259
masahikofukasawa 0:7a00359e701e 260 case Message::CMD_GET_MAG_PART:
masahikofukasawa 0:7a00359e701e 261 resMsg.setArgument(0, MAGNETOMETER_ID);
masahikofukasawa 0:7a00359e701e 262 throwMessage(&resMsg);
masahikofukasawa 0:7a00359e701e 263 MSG("#Mag ID is reported.\n");
masahikofukasawa 0:7a00359e701e 264 break;
masahikofukasawa 0:7a00359e701e 265
masahikofukasawa 0:7a00359e701e 266 case Message::CMD_SET_SERIAL_TARGET:
masahikofukasawa 0:7a00359e701e 267 isEnabledBle = msg.getArgument(0)==Message::SW_ON ? true : false;
masahikofukasawa 0:7a00359e701e 268 isEnabledUsb = msg.getArgument(1)==Message::SW_ON ? true : false;
masahikofukasawa 0:7a00359e701e 269 resMsg.setArgument(0, 0);
masahikofukasawa 0:7a00359e701e 270 throwMessage(&resMsg);
masahikofukasawa 8:8fa4b81db50b 271 MSG("#Serial target is set.\n");
masahikofukasawa 0:7a00359e701e 272 break;
masahikofukasawa 0:7a00359e701e 273
masahikofukasawa 0:7a00359e701e 274 case Message::CMD_GET_ID: // return Primary ID and Sub ID
masahikofukasawa 0:7a00359e701e 275 resMsg.setArgument(0, id);
masahikofukasawa 0:7a00359e701e 276 resMsg.setArgument(1, subId);
masahikofukasawa 0:7a00359e701e 277 throwMessage(&resMsg);
masahikofukasawa 0:7a00359e701e 278 wait(0.4); // wait for App initialization
masahikofukasawa 0:7a00359e701e 279 MSG("#Mag ID is reported.\n");
masahikofukasawa 0:7a00359e701e 280 break;
masahikofukasawa 0:7a00359e701e 281
masahikofukasawa 0:7a00359e701e 282 case Message::CMD_STOP_MEASUREMENT:
masahikofukasawa 0:7a00359e701e 283 if( sensor->stopSensor() != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR;
masahikofukasawa 0:7a00359e701e 284 resMsg.setArgument(0, status==AkmSensorManager::SUCCESS ? 0 : 1);
masahikofukasawa 0:7a00359e701e 285 throwMessage(&resMsg);
masahikofukasawa 0:7a00359e701e 286 MSG("#Stop measurement.\n");
masahikofukasawa 0:7a00359e701e 287 break;
masahikofukasawa 0:7a00359e701e 288
masahikofukasawa 0:7a00359e701e 289 case Message::CMD_START_MEASUREMENT:
masahikofukasawa 0:7a00359e701e 290 MSG("#Start measurement.\n");
masahikofukasawa 0:7a00359e701e 291 sensor->startSensor();
masahikofukasawa 0:7a00359e701e 292 // get initial sensor state for switch type sensors
masahikofukasawa 0:7a00359e701e 293 if( id == AkmSensor::AKM_PRIMARY_ID_UNIPOLAR ||
masahikofukasawa 0:7a00359e701e 294 id == AkmSensor::AKM_PRIMARY_ID_OMNIPOLAR ||
masahikofukasawa 0:7a00359e701e 295 id == AkmSensor::AKM_PRIMARY_ID_LATCH ||
masahikofukasawa 0:7a00359e701e 296 id == AkmSensor::AKM_PRIMARY_ID_DUAL_OUTPUT ||
masahikofukasawa 0:7a00359e701e 297 id == AkmSensor::AKM_PRIMARY_ID_ONECHIP_ENCODER ){
masahikofukasawa 0:7a00359e701e 298 Message temp;
masahikofukasawa 0:7a00359e701e 299 sensor->readSensorData(&temp);
masahikofukasawa 0:7a00359e701e 300 throwMessage(&temp);
masahikofukasawa 0:7a00359e701e 301 }
masahikofukasawa 0:7a00359e701e 302 break;
masahikofukasawa 0:7a00359e701e 303
masahikofukasawa 0:7a00359e701e 304 case Message::CMD_ANGLE_ZERO_RESET:
masahikofukasawa 1:b46b8653331f 305 case Message::CMD_IR_GET_THRESHOLD:
masahikofukasawa 1:b46b8653331f 306 case Message::CMD_IR_SET_THRESHOLD:
masahikofukasawa 1:b46b8653331f 307 case Message::CMD_IR_GET_HYSTERESIS:
masahikofukasawa 1:b46b8653331f 308 case Message::CMD_IR_SET_HYSTERESIS:
masahikofukasawa 1:b46b8653331f 309 case Message::CMD_IR_GET_INTERRUPT:
masahikofukasawa 1:b46b8653331f 310 case Message::CMD_IR_SET_INTERRUPT:
masahikofukasawa 1:b46b8653331f 311 case Message::CMD_IR_GET_OPERATION_MODE:
masahikofukasawa 1:b46b8653331f 312 case Message::CMD_IR_SET_OPERATION_MODE:
masahikofukasawa 1:b46b8653331f 313 case Message::CMD_IR_GET_THRESHOLD_EEPROM:
masahikofukasawa 1:b46b8653331f 314 case Message::CMD_IR_SET_THRESHOLD_EEPROM:
masahikofukasawa 1:b46b8653331f 315 case Message::CMD_IR_GET_HYSTERESIS_EEPROM:
masahikofukasawa 1:b46b8653331f 316 case Message::CMD_IR_SET_HYSTERESIS_EEPROM:
masahikofukasawa 1:b46b8653331f 317 case Message::CMD_IR_GET_INTERRUPT_EEPROM:
masahikofukasawa 1:b46b8653331f 318 case Message::CMD_IR_SET_INTERRUPT_EEPROM:
masahikofukasawa 1:b46b8653331f 319 case Message::CMD_IR_GET_OPERATION_MODE_EEPROM:
masahikofukasawa 1:b46b8653331f 320 case Message::CMD_IR_SET_OPERATION_MODE_EEPROM:
masahikofukasawa 0:7a00359e701e 321 sensor->requestCommand(&msg,&resMsg);
masahikofukasawa 0:7a00359e701e 322 throwMessage(&resMsg);
masahikofukasawa 0:7a00359e701e 323 break;
masahikofukasawa 1:b46b8653331f 324
masahikofukasawa 0:7a00359e701e 325 default:
masahikofukasawa 0:7a00359e701e 326 MSG("#Can't find command:%s\n", (char)cmd);
masahikofukasawa 0:7a00359e701e 327 break;
masahikofukasawa 0:7a00359e701e 328 }
masahikofukasawa 0:7a00359e701e 329 }
masahikofukasawa 0:7a00359e701e 330
masahikofukasawa 0:7a00359e701e 331 AkmSensorManager::Status AkmSensorManager::processEvent()
masahikofukasawa 0:7a00359e701e 332 {
masahikofukasawa 0:7a00359e701e 333 AkmSensorManager::Status status = AkmSensorManager::SUCCESS;
masahikofukasawa 0:7a00359e701e 334
masahikofukasawa 0:7a00359e701e 335 // command received from the host
masahikofukasawa 0:7a00359e701e 336 if(eventCommandReceived)
masahikofukasawa 0:7a00359e701e 337 {
masahikofukasawa 0:7a00359e701e 338 processCommand();
masahikofukasawa 0:7a00359e701e 339 eventCommandReceived = false;
masahikofukasawa 0:7a00359e701e 340 }
masahikofukasawa 0:7a00359e701e 341 if(sensor->isEvent()) // sensor read data event
masahikofukasawa 0:7a00359e701e 342 {
masahikofukasawa 0:7a00359e701e 343 Message msg;
masahikofukasawa 0:7a00359e701e 344 if( sensor->readSensorData(&msg) != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR;
masahikofukasawa 0:7a00359e701e 345 throwMessage(&msg);
masahikofukasawa 0:7a00359e701e 346 }
masahikofukasawa 0:7a00359e701e 347
masahikofukasawa 0:7a00359e701e 348 if(eventConnected) // BLE connected. Start sensor.
masahikofukasawa 0:7a00359e701e 349 {
masahikofukasawa 0:7a00359e701e 350 // if( sensor->startSensor() != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR;
masahikofukasawa 0:7a00359e701e 351 eventConnected = false;
masahikofukasawa 0:7a00359e701e 352 }
masahikofukasawa 0:7a00359e701e 353 if(eventDisconnected) // BLE dis-connected. Stop sensor.
masahikofukasawa 0:7a00359e701e 354 {
masahikofukasawa 0:7a00359e701e 355 if( sensor->stopSensor() != AkmSensor::SUCCESS) status = AkmSensorManager::ERROR;
masahikofukasawa 0:7a00359e701e 356 eventDisconnected = false;
masahikofukasawa 0:7a00359e701e 357 }
masahikofukasawa 0:7a00359e701e 358 return status;
masahikofukasawa 0:7a00359e701e 359 }
masahikofukasawa 0:7a00359e701e 360
masahikofukasawa 0:7a00359e701e 361 AkmSensorManager::Status AkmSensorManager::throwMessage(const Message *msg) {
masahikofukasawa 0:7a00359e701e 362 int len = Message::getMaxMessageLength();
masahikofukasawa 0:7a00359e701e 363 char buf[len];
masahikofukasawa 0:7a00359e701e 364
masahikofukasawa 0:7a00359e701e 365 buf[0] = '$';
masahikofukasawa 0:7a00359e701e 366
masahikofukasawa 0:7a00359e701e 367 // Processes command
masahikofukasawa 0:7a00359e701e 368 char cmd = (char)msg->getCommand();
masahikofukasawa 0:7a00359e701e 369 Message::charToAscii(&buf[1], &cmd);
masahikofukasawa 0:7a00359e701e 370
masahikofukasawa 0:7a00359e701e 371 // Processes arguments
masahikofukasawa 0:7a00359e701e 372 for (int i=0; i < msg->getArgNum(); i++) {
masahikofukasawa 0:7a00359e701e 373 char arg = msg->getArgument(i);
masahikofukasawa 0:7a00359e701e 374 Message::charToAscii(&buf[3+2*i], &arg);
masahikofukasawa 0:7a00359e701e 375 }
masahikofukasawa 0:7a00359e701e 376
masahikofukasawa 0:7a00359e701e 377 // Add termination characters, 0x0D(\r), \n and \0, to the end of string
masahikofukasawa 0:7a00359e701e 378 int tIdx = 3 + 2 * (msg->getArgNum());
masahikofukasawa 0:7a00359e701e 379 int bufSize = sizeof(buf)/sizeof(buf[0]);
masahikofukasawa 0:7a00359e701e 380 if ((tIdx + 3) > (bufSize - 1)) {
masahikofukasawa 0:7a00359e701e 381 MSG("#Error: Message data exceeds the buffer.\n");
masahikofukasawa 0:7a00359e701e 382 return ERROR;
masahikofukasawa 0:7a00359e701e 383 }
masahikofukasawa 0:7a00359e701e 384 buf[tIdx++] = 0x0D; // '\r'
masahikofukasawa 0:7a00359e701e 385 buf[tIdx++] = '\n';
masahikofukasawa 0:7a00359e701e 386 buf[tIdx] = '\0';
masahikofukasawa 0:7a00359e701e 387
masahikofukasawa 0:7a00359e701e 388 // Send to the BLE buffer
masahikofukasawa 0:7a00359e701e 389 // Hardware *hw = Hardware::getInstance();
masahikofukasawa 0:7a00359e701e 390 // hw->uartService->writeString(buf);
masahikofukasawa 0:7a00359e701e 391 if(isEnabledBle) uartService->writeString(buf);
masahikofukasawa 0:7a00359e701e 392 if(isEnabledUsb) serial->printf(buf);
masahikofukasawa 0:7a00359e701e 393
masahikofukasawa 0:7a00359e701e 394 // MSG("#A message thrown: \"%s\"\n", buf);
masahikofukasawa 0:7a00359e701e 395
masahikofukasawa 0:7a00359e701e 396 return SUCCESS;
masahikofukasawa 0:7a00359e701e 397 }
masahikofukasawa 0:7a00359e701e 398
masahikofukasawa 6:c4401549d68f 399 void AkmSensorManager::releaseTWI(){
masahikofukasawa 6:c4401549d68f 400 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
masahikofukasawa 6:c4401549d68f 401 NRF_TWI0->POWER = 0;
masahikofukasawa 6:c4401549d68f 402 NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
masahikofukasawa 6:c4401549d68f 403 NRF_TWI1->POWER = 0;
masahikofukasawa 6:c4401549d68f 404 }
masahikofukasawa 6:c4401549d68f 405
masahikofukasawa 0:7a00359e701e 406 /*
masahikofukasawa 0:7a00359e701e 407 void AkmSensorManager::dataOut(char* str){
masahikofukasawa 0:7a00359e701e 408 if(isBleMode) uartService->writeString(str);
masahikofukasawa 0:7a00359e701e 409 if(isSerialMode) serial->printf(str);
masahikofukasawa 0:7a00359e701e 410 }
masahikofukasawa 0:7a00359e701e 411 */