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:
Wed Aug 10 23:51:01 2016 +0000
Revision:
18:d75838bceaaf
Parent:
17:a22b52136eb8
Child:
19:7a6913400380
Modified for faster BLE connection.

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