AKM Development Platform. This is the D7.014 version.

Dependencies:   AK09970 AK099XX AK7401 AK7451 AK8963X AK9750 AK9752 AkmSensor BLE_API I2CNano MCP342x SerialNano SpiNano TCA9554A mbed nRF51822

Fork of AKDP by Masahiko Fukasawa

Committer:
masahikofukasawa
Date:
Fri Aug 05 23:17:17 2016 +0000
Revision:
17:a22b52136eb8
Parent:
16:5343a852fea4
Child:
18:d75838bceaaf
Added a general reset on the board initialization.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masahikofukasawa 0:c240899240e7 1 #include <stdio.h>
masahikofukasawa 0:c240899240e7 2 #include <stdlib.h>
masahikofukasawa 0:c240899240e7 3 #include "mbed.h"
masahikofukasawa 0:c240899240e7 4 #include "ble/BLE.h"
masahikofukasawa 0:c240899240e7 5 #include "ble/services/UARTService.h"
masahikofukasawa 0:c240899240e7 6 #include "SerialNano.h"
masahikofukasawa 12:522a22a23f8a 7 #include "akmsensor.h"
masahikofukasawa 0:c240899240e7 8 #include "akmsensormanager.h"
masahikofukasawa 0:c240899240e7 9 #include "debug.h"
coisme 2:11a5873f8ec0 10 #include "tca9554a.h"
masahikofukasawa 0:c240899240e7 11
masahikofukasawa 0:c240899240e7 12 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
masahikofukasawa 0:c240899240e7 13 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
masahikofukasawa 0:c240899240e7 14 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
masahikofukasawa 0:c240899240e7 15
masahikofukasawa 10:a710e8c3311c 16 #define BLE_BUF_LEN UARTService::BLE_UART_SERVICE_MAX_DATA_LEN+1
masahikofukasawa 10:a710e8c3311c 17 #define TXRX_LEN 50
masahikofukasawa 0:c240899240e7 18
masahikofukasawa 0:c240899240e7 19 #define CR '\r'
masahikofukasawa 0:c240899240e7 20 #define LF '\n'
masahikofukasawa 0:c240899240e7 21
masahikofukasawa 17:a22b52136eb8 22 #define DEVICE_NAME "AKDP Rev.D7.006"
masahikofukasawa 11:53e52f5f1051 23
masahikofukasawa 0:c240899240e7 24 BLE ble;
masahikofukasawa 0:c240899240e7 25 UARTService* uartService;
coisme 2:11a5873f8ec0 26 #ifndef REV_D
coisme 2:11a5873f8ec0 27 SerialNano serial(P0_28, P0_29); // Rev.C pin configuration
coisme 2:11a5873f8ec0 28 #else
masahikofukasawa 7:f1f544deaaa3 29 SerialNano serial(P0_4, P0_5); // Rev.D pin configuration
masahikofukasawa 7:f1f544deaaa3 30 #endif
masahikofukasawa 4:749a21fd9c2d 31
masahikofukasawa 0:c240899240e7 32 AkmSensorManager* manager;
masahikofukasawa 12:522a22a23f8a 33 uint8_t id;
masahikofukasawa 12:522a22a23f8a 34 uint8_t subId;
masahikofukasawa 0:c240899240e7 35
masahikofukasawa 0:c240899240e7 36 void WrittenHandler(const GattWriteCallbackParams *Handler)
masahikofukasawa 0:c240899240e7 37 {
masahikofukasawa 10:a710e8c3311c 38 static char command[TXRX_LEN]="";
masahikofukasawa 10:a710e8c3311c 39 static uint16_t len=0;
masahikofukasawa 10:a710e8c3311c 40
masahikofukasawa 10:a710e8c3311c 41 uint8_t buf[BLE_BUF_LEN];
masahikofukasawa 0:c240899240e7 42 uint16_t bytesRead;
masahikofukasawa 10:a710e8c3311c 43
masahikofukasawa 0:c240899240e7 44 if (Handler->handle == uartService->getTXCharacteristicHandle())
masahikofukasawa 0:c240899240e7 45 {
masahikofukasawa 0:c240899240e7 46 ble.gattServer().read(uartService->getTXCharacteristicHandle(), buf, &bytesRead);
masahikofukasawa 10:a710e8c3311c 47
masahikofukasawa 10:a710e8c3311c 48 for(uint16_t i=0; i<bytesRead; i++){
masahikofukasawa 10:a710e8c3311c 49 if(buf[i] == CR)
masahikofukasawa 10:a710e8c3311c 50 {
masahikofukasawa 10:a710e8c3311c 51 ; // ignore CR
masahikofukasawa 10:a710e8c3311c 52 }
masahikofukasawa 10:a710e8c3311c 53 else if(buf[i] == LF || len > TXRX_LEN)
masahikofukasawa 0:c240899240e7 54 {
masahikofukasawa 10:a710e8c3311c 55 manager->commandReceived(command);
masahikofukasawa 10:a710e8c3311c 56 for(int j=0; j<TXRX_LEN; j++){
masahikofukasawa 10:a710e8c3311c 57 command[j] = 0;
masahikofukasawa 10:a710e8c3311c 58 }
masahikofukasawa 10:a710e8c3311c 59 len = 0;
masahikofukasawa 10:a710e8c3311c 60 }
masahikofukasawa 10:a710e8c3311c 61 else
masahikofukasawa 10:a710e8c3311c 62 {
masahikofukasawa 10:a710e8c3311c 63 command[len++] = (char)buf[i];
masahikofukasawa 0:c240899240e7 64 }
masahikofukasawa 0:c240899240e7 65 }
masahikofukasawa 0:c240899240e7 66 }
masahikofukasawa 0:c240899240e7 67 }
masahikofukasawa 0:c240899240e7 68
masahikofukasawa 0:c240899240e7 69 void usbUartCallback(void)
masahikofukasawa 0:c240899240e7 70 {
masahikofukasawa 10:a710e8c3311c 71 static char command[TXRX_LEN] = "";
masahikofukasawa 10:a710e8c3311c 72 static uint16_t len=0;
masahikofukasawa 10:a710e8c3311c 73
masahikofukasawa 0:c240899240e7 74 if(serial.readable())
masahikofukasawa 0:c240899240e7 75 {
masahikofukasawa 0:c240899240e7 76 uint8_t c = serial.getc();
masahikofukasawa 0:c240899240e7 77
masahikofukasawa 0:c240899240e7 78 // ignore CR
masahikofukasawa 0:c240899240e7 79 if(c==CR) return;
masahikofukasawa 0:c240899240e7 80
masahikofukasawa 10:a710e8c3311c 81 command[len++] = c;
masahikofukasawa 10:a710e8c3311c 82 if(len>=TXRX_LEN || c == LF)
masahikofukasawa 0:c240899240e7 83 {
masahikofukasawa 10:a710e8c3311c 84 manager->commandReceived(command);
masahikofukasawa 10:a710e8c3311c 85 for(int j=0; j<TXRX_LEN; j++){
masahikofukasawa 10:a710e8c3311c 86 command[j] = 0;
masahikofukasawa 10:a710e8c3311c 87 }
masahikofukasawa 10:a710e8c3311c 88 len = 0;
masahikofukasawa 0:c240899240e7 89 }
masahikofukasawa 0:c240899240e7 90 }
masahikofukasawa 0:c240899240e7 91 }
masahikofukasawa 0:c240899240e7 92
masahikofukasawa 0:c240899240e7 93 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
masahikofukasawa 0:c240899240e7 94 {
masahikofukasawa 0:c240899240e7 95 manager->setEventConnected();
masahikofukasawa 14:76205d28fea2 96 MSG("#Connected\r\n");
masahikofukasawa 0:c240899240e7 97 }
masahikofukasawa 0:c240899240e7 98
masahikofukasawa 0:c240899240e7 99 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
masahikofukasawa 0:c240899240e7 100 {
masahikofukasawa 0:c240899240e7 101 manager->setEventDisconnected();
masahikofukasawa 14:76205d28fea2 102 MSG("#Disconnected\r\n");
masahikofukasawa 0:c240899240e7 103 ble.gap().startAdvertising();
masahikofukasawa 0:c240899240e7 104 }
masahikofukasawa 0:c240899240e7 105
masahikofukasawa 12:522a22a23f8a 106 void bleSetup(){
masahikofukasawa 0:c240899240e7 107 ble.init();
masahikofukasawa 0:c240899240e7 108 // setup advertising
masahikofukasawa 0:c240899240e7 109 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
masahikofukasawa 0:c240899240e7 110 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
masahikofukasawa 0:c240899240e7 111 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
masahikofukasawa 11:53e52f5f1051 112 (const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME) - 1);
masahikofukasawa 0:c240899240e7 113 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
masahikofukasawa 0:c240899240e7 114 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
masahikofukasawa 0:c240899240e7 115 ble.gap().onConnection(connectionCallback);
masahikofukasawa 0:c240899240e7 116 ble.gap().onDisconnection(disconnectionCallback);
masahikofukasawa 0:c240899240e7 117 ble.gattServer().onDataWritten(WrittenHandler);
masahikofukasawa 0:c240899240e7 118
masahikofukasawa 12:522a22a23f8a 119 // 100ms; in multiples of 0.625ms.
masahikofukasawa 12:522a22a23f8a 120 ble.gap().setAdvertisingInterval(100);
masahikofukasawa 0:c240899240e7 121 ble.gap().startAdvertising();
masahikofukasawa 12:522a22a23f8a 122 }
masahikofukasawa 0:c240899240e7 123
masahikofukasawa 12:522a22a23f8a 124
masahikofukasawa 12:522a22a23f8a 125 #ifdef REV_D
masahikofukasawa 12:522a22a23f8a 126 int16_t getAdcData(MCP342X *mcp3428, MCP342X::AdcChannel ch, MCP342X::SampleSetting s) {
masahikofukasawa 12:522a22a23f8a 127 const int WAIT_ADC_MS = 1;
masahikofukasawa 12:522a22a23f8a 128
masahikofukasawa 12:522a22a23f8a 129 // Configure channel and trigger.
masahikofukasawa 12:522a22a23f8a 130 mcp3428->setChannel(ch);
masahikofukasawa 12:522a22a23f8a 131 mcp3428->setSampleSetting(s);
masahikofukasawa 12:522a22a23f8a 132 mcp3428->trigger();
masahikofukasawa 12:522a22a23f8a 133
masahikofukasawa 12:522a22a23f8a 134 // polling data (!blocking)
masahikofukasawa 12:522a22a23f8a 135 MCP342X::Data data;
masahikofukasawa 12:522a22a23f8a 136 do {
masahikofukasawa 12:522a22a23f8a 137 wait_ms(WAIT_ADC_MS);
masahikofukasawa 12:522a22a23f8a 138 mcp3428->getData(&data);
masahikofukasawa 12:522a22a23f8a 139 } while(data.st == MCP342X::DATA_NOT_UPDATED);
masahikofukasawa 12:522a22a23f8a 140
masahikofukasawa 12:522a22a23f8a 141 return data.value;
masahikofukasawa 12:522a22a23f8a 142 }
masahikofukasawa 12:522a22a23f8a 143 #endif
masahikofukasawa 12:522a22a23f8a 144
masahikofukasawa 12:522a22a23f8a 145 uint8_t getId(PinName pin, uint8_t bits)
masahikofukasawa 12:522a22a23f8a 146 {
masahikofukasawa 12:522a22a23f8a 147 #ifndef REV_D
masahikofukasawa 12:522a22a23f8a 148 /* Rev.C */
masahikofukasawa 12:522a22a23f8a 149 AnalogIn id(pin);
masahikofukasawa 14:76205d28fea2 150 // MSG("#Voltage=%5.2f[V]\r\n",id*3.0);
masahikofukasawa 12:522a22a23f8a 151 double s = id + 1.0/(double)(pow(2.0,bits+1));
masahikofukasawa 12:522a22a23f8a 152 uint8_t value = (uint8_t)(s*pow(2.0,bits));
masahikofukasawa 12:522a22a23f8a 153 #else
masahikofukasawa 12:522a22a23f8a 154 /* Rev.D */
masahikofukasawa 14:76205d28fea2 155 // MSG("#GetID\r\n");
masahikofukasawa 12:522a22a23f8a 156
masahikofukasawa 12:522a22a23f8a 157 I2C i2c(I2C_SDA, I2C_SCL);
masahikofukasawa 12:522a22a23f8a 158 // ADC
masahikofukasawa 12:522a22a23f8a 159 MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_6EH);
masahikofukasawa 12:522a22a23f8a 160 mcp342x.setConversionMode(MCP342X::ONE_SHOT);
masahikofukasawa 12:522a22a23f8a 161 MCP342X::AdcChannel ch;
masahikofukasawa 12:522a22a23f8a 162 if (pin == ANALOG_SENSOR_ID) {
masahikofukasawa 12:522a22a23f8a 163 ch = MCP342X::ADC_CH1;
masahikofukasawa 12:522a22a23f8a 164 } else { // pin == ANALOG_SENSOR_ID_SUB
masahikofukasawa 12:522a22a23f8a 165 ch = MCP342X::ADC_CH2;
masahikofukasawa 12:522a22a23f8a 166 }
masahikofukasawa 12:522a22a23f8a 167 int16_t val = getAdcData(&mcp342x, ch, MCP342X::SAMPLE_240HZ_12BIT);
masahikofukasawa 14:76205d28fea2 168 // MSG("#12bit ADC Val = %d.\r\n", val);
masahikofukasawa 12:522a22a23f8a 169
masahikofukasawa 12:522a22a23f8a 170 const int16_t VAL_MAX = 3000-2048; // Corresponds to 3V
masahikofukasawa 12:522a22a23f8a 171 const int16_t VAL_MIN = -2048; // Corresponds to 0V
masahikofukasawa 12:522a22a23f8a 172
masahikofukasawa 12:522a22a23f8a 173 uint8_t value = (uint8_t)((val - VAL_MIN)/(float)(VAL_MAX - VAL_MIN) * (1 << bits) + 0.5);
masahikofukasawa 14:76205d28fea2 174 // MSG("#ID = %d.\r\n", value);
masahikofukasawa 12:522a22a23f8a 175
masahikofukasawa 12:522a22a23f8a 176 #endif
masahikofukasawa 12:522a22a23f8a 177 return value;
masahikofukasawa 12:522a22a23f8a 178 }
masahikofukasawa 12:522a22a23f8a 179
masahikofukasawa 12:522a22a23f8a 180
masahikofukasawa 12:522a22a23f8a 181 void releaseTWI(){
masahikofukasawa 12:522a22a23f8a 182 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
masahikofukasawa 12:522a22a23f8a 183 NRF_TWI0->POWER = 0;
masahikofukasawa 12:522a22a23f8a 184 NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
masahikofukasawa 12:522a22a23f8a 185 NRF_TWI1->POWER = 0;
masahikofukasawa 12:522a22a23f8a 186 }
masahikofukasawa 12:522a22a23f8a 187
masahikofukasawa 14:76205d28fea2 188 bool initAkdpBoard(){
masahikofukasawa 17:a22b52136eb8 189 MSG("#Init AKDP board.\r\n");
masahikofukasawa 17:a22b52136eb8 190 const int TIME_FOR_OE_MS = 100;
masahikofukasawa 17:a22b52136eb8 191
masahikofukasawa 14:76205d28fea2 192 // CSN High to activate I2C_GATE
masahikofukasawa 12:522a22a23f8a 193 DigitalOut _cs = DigitalOut(SPI_CS);
masahikofukasawa 12:522a22a23f8a 194 _cs.write(1);
masahikofukasawa 12:522a22a23f8a 195
masahikofukasawa 17:a22b52136eb8 196 // I2C communication ports to HIGH for preventing mulfunction.
masahikofukasawa 17:a22b52136eb8 197 DigitalOut _scl = DigitalOut(I2C_SCL);
masahikofukasawa 17:a22b52136eb8 198 _scl.write(1);
masahikofukasawa 17:a22b52136eb8 199 DigitalOut _sda = DigitalOut(I2C_SDA);
masahikofukasawa 17:a22b52136eb8 200 _sda.write(1);
masahikofukasawa 17:a22b52136eb8 201 MSG("#SCL,SDA port high.\r\n");
masahikofukasawa 17:a22b52136eb8 202 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 17:a22b52136eb8 203
masahikofukasawa 12:522a22a23f8a 204 const TCA9554A::Port PORT_OE_LVS1 = TCA9554A::PORT_7;
masahikofukasawa 12:522a22a23f8a 205 const TCA9554A::Port PORT_OE_LVS2 = TCA9554A::PORT_6;
masahikofukasawa 12:522a22a23f8a 206 const TCA9554A::Port PORT_SPIN = TCA9554A::PORT_5;
masahikofukasawa 12:522a22a23f8a 207 const TCA9554A::Port PORT_RSV_RSTN = TCA9554A::PORT_0;
masahikofukasawa 12:522a22a23f8a 208
masahikofukasawa 12:522a22a23f8a 209 I2C i2c(I2C_SDA, I2C_SCL);
masahikofukasawa 17:a22b52136eb8 210
masahikofukasawa 17:a22b52136eb8 211 // call I2C general reset only once
masahikofukasawa 17:a22b52136eb8 212 char cmd[] = {0x06}; // general reset code
masahikofukasawa 17:a22b52136eb8 213 i2c.write(0x00, cmd, 1);
masahikofukasawa 17:a22b52136eb8 214 MSG("#General Reset.\r\n");
masahikofukasawa 17:a22b52136eb8 215 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 17:a22b52136eb8 216
masahikofukasawa 12:522a22a23f8a 217 TCA9554A tca9554a(&i2c, TCA9554A::SLAVE_ADDRESS_38H);
masahikofukasawa 12:522a22a23f8a 218
masahikofukasawa 12:522a22a23f8a 219 // Initializes TCA9554A (I2C GPIO Expander)
masahikofukasawa 12:522a22a23f8a 220 tca9554a.configurePort(PORT_OE_LVS1, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 221 tca9554a.configurePort(PORT_OE_LVS2, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 222 tca9554a.configurePort(PORT_SPIN, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 223 tca9554a.configurePort(PORT_RSV_RSTN, TCA9554A::DIR_OUTPUT);
masahikofukasawa 12:522a22a23f8a 224
masahikofukasawa 12:522a22a23f8a 225 // enable 5V level shifter
masahikofukasawa 12:522a22a23f8a 226 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 227 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 228 tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 229 tca9554a.setPortLevel(PORT_SPIN, TCA9554A::HIGH);
masahikofukasawa 14:76205d28fea2 230 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 231
masahikofukasawa 12:522a22a23f8a 232 // disable 1.8V level shifter to read ID
masahikofukasawa 12:522a22a23f8a 233 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::LOW);
masahikofukasawa 17:a22b52136eb8 234 MSG("#LVS1 Low.\r\n");
masahikofukasawa 12:522a22a23f8a 235 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 16:5343a852fea4 236
masahikofukasawa 16:5343a852fea4 237 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::HIGH);
masahikofukasawa 17:a22b52136eb8 238 MSG("#LVS1 High.\r\n");
masahikofukasawa 16:5343a852fea4 239 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 16:5343a852fea4 240
masahikofukasawa 16:5343a852fea4 241 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::LOW);
masahikofukasawa 17:a22b52136eb8 242 MSG("#LVS1 Low.\r\n");
masahikofukasawa 16:5343a852fea4 243 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 244
masahikofukasawa 12:522a22a23f8a 245 // read ID and subId from ADC
masahikofukasawa 12:522a22a23f8a 246 id = getId(ANALOG_SENSOR_ID,4);
masahikofukasawa 12:522a22a23f8a 247 uint8_t subid_bitlen = 4;
masahikofukasawa 12:522a22a23f8a 248 if(id == AkmSensor::AKM_PRIMARY_ID_AKD_SPI || id == AkmSensor::AKM_PRIMARY_ID_AKD_I2C){
masahikofukasawa 14:76205d28fea2 249 // MSG("#5 bit sub ID.\r\n");
masahikofukasawa 12:522a22a23f8a 250 subid_bitlen = 5;
masahikofukasawa 12:522a22a23f8a 251 }
masahikofukasawa 12:522a22a23f8a 252 subId = getId(ANALOG_SENSOR_ID_SUB,subid_bitlen);
masahikofukasawa 12:522a22a23f8a 253
masahikofukasawa 14:76205d28fea2 254 if( (id == 11 && subId == 11) || (id == 55 && subId == 55) ){
masahikofukasawa 14:76205d28fea2 255 return true;
masahikofukasawa 14:76205d28fea2 256 }
masahikofukasawa 14:76205d28fea2 257
masahikofukasawa 12:522a22a23f8a 258 // enable 1.8V level shifter
masahikofukasawa 12:522a22a23f8a 259 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::HIGH);
masahikofukasawa 17:a22b52136eb8 260 MSG("#LVS1 High.\r\n");
masahikofukasawa 12:522a22a23f8a 261 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 262
masahikofukasawa 12:522a22a23f8a 263 // RSTN control
masahikofukasawa 12:522a22a23f8a 264 if(id == AkmSensor::AKM_PRIMARY_ID_AKD_SPI || id == AkmSensor::AKM_PRIMARY_ID_AKD_I2C){
masahikofukasawa 12:522a22a23f8a 265 tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::LOW);
masahikofukasawa 12:522a22a23f8a 266 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 267 tca9554a.setPortLevel(PORT_RSV_RSTN, TCA9554A::HIGH);
masahikofukasawa 14:76205d28fea2 268 // MSG("#Detect AKD, RSTN control.\r\n");
masahikofukasawa 12:522a22a23f8a 269 }
masahikofukasawa 12:522a22a23f8a 270
masahikofukasawa 12:522a22a23f8a 271 // SPI disable/enable
masahikofukasawa 12:522a22a23f8a 272 if( id == AkmSensor::AKM_PRIMARY_ID_AKD_SPI || id == AkmSensor::AKM_PRIMARY_ID_ANGLE_SENSOR ){
masahikofukasawa 12:522a22a23f8a 273 tca9554a.setPortLevel(PORT_SPIN, TCA9554A::LOW);
masahikofukasawa 12:522a22a23f8a 274 // Disable 5.0V level shifter in order to ADC doesn't respond.
masahikofukasawa 12:522a22a23f8a 275 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::LOW);
masahikofukasawa 14:76205d28fea2 276 // MSG("#Detect SPI, set SPIN low.\r\n");
masahikofukasawa 12:522a22a23f8a 277 }
masahikofukasawa 12:522a22a23f8a 278 else{
masahikofukasawa 12:522a22a23f8a 279 tca9554a.setPortLevel(PORT_SPIN, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 280 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::HIGH);
masahikofukasawa 12:522a22a23f8a 281 }
masahikofukasawa 12:522a22a23f8a 282
masahikofukasawa 12:522a22a23f8a 283 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 12:522a22a23f8a 284
masahikofukasawa 12:522a22a23f8a 285 releaseTWI();
masahikofukasawa 14:76205d28fea2 286
masahikofukasawa 14:76205d28fea2 287 return false;
masahikofukasawa 12:522a22a23f8a 288 }
masahikofukasawa 12:522a22a23f8a 289
masahikofukasawa 12:522a22a23f8a 290
masahikofukasawa 12:522a22a23f8a 291
masahikofukasawa 12:522a22a23f8a 292 int main(void)
masahikofukasawa 14:76205d28fea2 293 {
masahikofukasawa 14:76205d28fea2 294 // bool isFailedBoot = false;
masahikofukasawa 14:76205d28fea2 295
masahikofukasawa 12:522a22a23f8a 296 // USB serial
masahikofukasawa 12:522a22a23f8a 297 serial.baud(115200);
masahikofukasawa 12:522a22a23f8a 298
masahikofukasawa 12:522a22a23f8a 299 // serial port RX event
masahikofukasawa 12:522a22a23f8a 300 serial.attach(&usbUartCallback);
masahikofukasawa 12:522a22a23f8a 301
masahikofukasawa 12:522a22a23f8a 302 #ifdef DEBUG
masahikofukasawa 12:522a22a23f8a 303 Debug::setSerial(&serial);
masahikofukasawa 14:76205d28fea2 304 MSG("#Debug Mode.\r\n");
masahikofukasawa 12:522a22a23f8a 305 #endif
masahikofukasawa 12:522a22a23f8a 306
masahikofukasawa 12:522a22a23f8a 307 // initialize AKDP board
masahikofukasawa 14:76205d28fea2 308 if( initAkdpBoard() ){
masahikofukasawa 14:76205d28fea2 309 // isFailedBoot = true;
masahikofukasawa 14:76205d28fea2 310 MSG("#Error: AKDP boot failed.\r\n");
masahikofukasawa 14:76205d28fea2 311 }
masahikofukasawa 12:522a22a23f8a 312
masahikofukasawa 12:522a22a23f8a 313 // ble initialize
masahikofukasawa 12:522a22a23f8a 314 bleSetup();
masahikofukasawa 12:522a22a23f8a 315
masahikofukasawa 0:c240899240e7 316 // BLE UART service
masahikofukasawa 0:c240899240e7 317 uartService = new UARTService(ble);
masahikofukasawa 12:522a22a23f8a 318
masahikofukasawa 0:c240899240e7 319 // create sensor manager
masahikofukasawa 0:c240899240e7 320 manager = new AkmSensorManager(&serial, uartService);
masahikofukasawa 12:522a22a23f8a 321
masahikofukasawa 12:522a22a23f8a 322 if( manager->init(id, subId) == AkmSensorManager::ERROR){
masahikofukasawa 14:76205d28fea2 323 // isFailedBoot = true;
masahikofukasawa 14:76205d28fea2 324 MSG("#Error: sensor is NULL\r\n");
masahikofukasawa 0:c240899240e7 325 }
masahikofukasawa 11:53e52f5f1051 326
masahikofukasawa 14:76205d28fea2 327 MSG("#Connecting...\r\n");
masahikofukasawa 14:76205d28fea2 328 /*
masahikofukasawa 14:76205d28fea2 329 Message msg;
masahikofukasawa 14:76205d28fea2 330 msg.setCommand(Message::CMD_BOOT_STATUS);
masahikofukasawa 14:76205d28fea2 331 msg.setArgument( 0, isFailedBoot ? 1 : 0 );
masahikofukasawa 14:76205d28fea2 332 manager->throwMessage(&msg);
masahikofukasawa 14:76205d28fea2 333 */
masahikofukasawa 0:c240899240e7 334 // main loop
masahikofukasawa 0:c240899240e7 335 while(1)
masahikofukasawa 0:c240899240e7 336 {
masahikofukasawa 0:c240899240e7 337 if(manager->isEvent()){
masahikofukasawa 0:c240899240e7 338 manager->processEvent();
masahikofukasawa 0:c240899240e7 339 }else{
masahikofukasawa 0:c240899240e7 340 ble.waitForEvent();
masahikofukasawa 0:c240899240e7 341 }
masahikofukasawa 0:c240899240e7 342 }
masahikofukasawa 0:c240899240e7 343 }