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:
Thu Jun 16 18:37:41 2016 +0000
Revision:
11:53e52f5f1051
Parent:
10:a710e8c3311c
Child:
12:522a22a23f8a
AKDP 002; Modified For E-compass Operation Mode Setting

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 0:c240899240e7 7 #include "akmsensormanager.h"
masahikofukasawa 0:c240899240e7 8 #include "debug.h"
coisme 2:11a5873f8ec0 9 #include "tca9554a.h"
masahikofukasawa 0:c240899240e7 10
masahikofukasawa 0:c240899240e7 11 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
masahikofukasawa 0:c240899240e7 12 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
masahikofukasawa 0:c240899240e7 13 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
masahikofukasawa 0:c240899240e7 14
masahikofukasawa 10:a710e8c3311c 15 #define BLE_BUF_LEN UARTService::BLE_UART_SERVICE_MAX_DATA_LEN+1
masahikofukasawa 10:a710e8c3311c 16 #define TXRX_LEN 50
masahikofukasawa 0:c240899240e7 17
masahikofukasawa 0:c240899240e7 18 #define CR '\r'
masahikofukasawa 0:c240899240e7 19 #define LF '\n'
masahikofukasawa 0:c240899240e7 20
masahikofukasawa 11:53e52f5f1051 21 #define DEVICE_NAME "AKDP Rev002"
masahikofukasawa 11:53e52f5f1051 22
masahikofukasawa 0:c240899240e7 23 BLE ble;
masahikofukasawa 0:c240899240e7 24 UARTService* uartService;
coisme 2:11a5873f8ec0 25 #ifndef REV_D
coisme 2:11a5873f8ec0 26 SerialNano serial(P0_28, P0_29); // Rev.C pin configuration
coisme 2:11a5873f8ec0 27 #else
masahikofukasawa 7:f1f544deaaa3 28 SerialNano serial(P0_4, P0_5); // Rev.D pin configuration
masahikofukasawa 7:f1f544deaaa3 29 #endif
masahikofukasawa 4:749a21fd9c2d 30
masahikofukasawa 0:c240899240e7 31 AkmSensorManager* manager;
masahikofukasawa 0:c240899240e7 32
masahikofukasawa 0:c240899240e7 33 void WrittenHandler(const GattWriteCallbackParams *Handler)
masahikofukasawa 0:c240899240e7 34 {
masahikofukasawa 10:a710e8c3311c 35 static char command[TXRX_LEN]="";
masahikofukasawa 10:a710e8c3311c 36 static uint16_t len=0;
masahikofukasawa 10:a710e8c3311c 37
masahikofukasawa 10:a710e8c3311c 38 uint8_t buf[BLE_BUF_LEN];
masahikofukasawa 0:c240899240e7 39 uint16_t bytesRead;
masahikofukasawa 10:a710e8c3311c 40
masahikofukasawa 0:c240899240e7 41 if (Handler->handle == uartService->getTXCharacteristicHandle())
masahikofukasawa 0:c240899240e7 42 {
masahikofukasawa 0:c240899240e7 43 ble.gattServer().read(uartService->getTXCharacteristicHandle(), buf, &bytesRead);
masahikofukasawa 10:a710e8c3311c 44
masahikofukasawa 10:a710e8c3311c 45 for(uint16_t i=0; i<bytesRead; i++){
masahikofukasawa 10:a710e8c3311c 46 if(buf[i] == CR)
masahikofukasawa 10:a710e8c3311c 47 {
masahikofukasawa 10:a710e8c3311c 48 ; // ignore CR
masahikofukasawa 10:a710e8c3311c 49 }
masahikofukasawa 10:a710e8c3311c 50 else if(buf[i] == LF || len > TXRX_LEN)
masahikofukasawa 0:c240899240e7 51 {
masahikofukasawa 10:a710e8c3311c 52 manager->commandReceived(command);
masahikofukasawa 10:a710e8c3311c 53 for(int j=0; j<TXRX_LEN; j++){
masahikofukasawa 10:a710e8c3311c 54 command[j] = 0;
masahikofukasawa 10:a710e8c3311c 55 }
masahikofukasawa 10:a710e8c3311c 56 len = 0;
masahikofukasawa 10:a710e8c3311c 57 }
masahikofukasawa 10:a710e8c3311c 58 else
masahikofukasawa 10:a710e8c3311c 59 {
masahikofukasawa 10:a710e8c3311c 60 command[len++] = (char)buf[i];
masahikofukasawa 0:c240899240e7 61 }
masahikofukasawa 0:c240899240e7 62 }
masahikofukasawa 0:c240899240e7 63 }
masahikofukasawa 0:c240899240e7 64 }
masahikofukasawa 0:c240899240e7 65
masahikofukasawa 0:c240899240e7 66 void usbUartCallback(void)
masahikofukasawa 0:c240899240e7 67 {
masahikofukasawa 10:a710e8c3311c 68 static char command[TXRX_LEN] = "";
masahikofukasawa 10:a710e8c3311c 69 static uint16_t len=0;
masahikofukasawa 10:a710e8c3311c 70
masahikofukasawa 0:c240899240e7 71 if(serial.readable())
masahikofukasawa 0:c240899240e7 72 {
masahikofukasawa 0:c240899240e7 73 uint8_t c = serial.getc();
masahikofukasawa 0:c240899240e7 74
masahikofukasawa 0:c240899240e7 75 // ignore CR
masahikofukasawa 0:c240899240e7 76 if(c==CR) return;
masahikofukasawa 0:c240899240e7 77
masahikofukasawa 10:a710e8c3311c 78 command[len++] = c;
masahikofukasawa 10:a710e8c3311c 79 if(len>=TXRX_LEN || c == LF)
masahikofukasawa 0:c240899240e7 80 {
masahikofukasawa 10:a710e8c3311c 81 manager->commandReceived(command);
masahikofukasawa 10:a710e8c3311c 82 for(int j=0; j<TXRX_LEN; j++){
masahikofukasawa 10:a710e8c3311c 83 command[j] = 0;
masahikofukasawa 10:a710e8c3311c 84 }
masahikofukasawa 10:a710e8c3311c 85 len = 0;
masahikofukasawa 0:c240899240e7 86 }
masahikofukasawa 0:c240899240e7 87 }
masahikofukasawa 0:c240899240e7 88 }
masahikofukasawa 0:c240899240e7 89
masahikofukasawa 0:c240899240e7 90 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
masahikofukasawa 0:c240899240e7 91 {
masahikofukasawa 0:c240899240e7 92 manager->setEventConnected();
masahikofukasawa 10:a710e8c3311c 93 MSG("#Connected\n");
masahikofukasawa 0:c240899240e7 94 }
masahikofukasawa 0:c240899240e7 95
masahikofukasawa 0:c240899240e7 96 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
masahikofukasawa 0:c240899240e7 97 {
masahikofukasawa 0:c240899240e7 98 manager->setEventDisconnected();
masahikofukasawa 10:a710e8c3311c 99 MSG("#Disconnected\n");
masahikofukasawa 0:c240899240e7 100 ble.gap().startAdvertising();
masahikofukasawa 0:c240899240e7 101 }
masahikofukasawa 0:c240899240e7 102
masahikofukasawa 0:c240899240e7 103 int main(void)
masahikofukasawa 0:c240899240e7 104 {
masahikofukasawa 0:c240899240e7 105 // USB serial
masahikofukasawa 0:c240899240e7 106 serial.baud(115200);
masahikofukasawa 7:f1f544deaaa3 107
masahikofukasawa 7:f1f544deaaa3 108 // serial port RX event
masahikofukasawa 7:f1f544deaaa3 109 serial.attach(&usbUartCallback);
masahikofukasawa 7:f1f544deaaa3 110
masahikofukasawa 0:c240899240e7 111 #ifdef DEBUG
masahikofukasawa 0:c240899240e7 112 Debug::setSerial(&serial);
masahikofukasawa 0:c240899240e7 113 MSG("#Debug Mode.\n");
masahikofukasawa 0:c240899240e7 114 #endif
masahikofukasawa 7:f1f544deaaa3 115
masahikofukasawa 7:f1f544deaaa3 116 #ifdef REV_D
masahikofukasawa 7:f1f544deaaa3 117 /* Rev.D */
masahikofukasawa 7:f1f544deaaa3 118 {
masahikofukasawa 7:f1f544deaaa3 119 MSG("#I2C GPIO Expander.\n");
masahikofukasawa 7:f1f544deaaa3 120 const int TIME_FOR_OE_MS = 100;
masahikofukasawa 7:f1f544deaaa3 121 const TCA9554A::Port PORT_OE_LVS1 = TCA9554A::PORT_7;
masahikofukasawa 7:f1f544deaaa3 122 const TCA9554A::Port PORT_OE_LVS2 = TCA9554A::PORT_6;
masahikofukasawa 7:f1f544deaaa3 123 I2C i2c(I2C_SDA, I2C_SCL);
masahikofukasawa 7:f1f544deaaa3 124 TCA9554A tca9554a(&i2c, TCA9554A::SLAVE_ADDRESS_38H);
masahikofukasawa 7:f1f544deaaa3 125 // Initializes TCA9554A (I2C GPIO Expander)
masahikofukasawa 7:f1f544deaaa3 126 tca9554a.configurePort(PORT_OE_LVS1, TCA9554A::DIR_OUTPUT);
masahikofukasawa 7:f1f544deaaa3 127 tca9554a.configurePort(PORT_OE_LVS2, TCA9554A::DIR_OUTPUT);
masahikofukasawa 7:f1f544deaaa3 128 // Makes sure that the OE is low first.
masahikofukasawa 9:90a7650db802 129 // tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::LOW);
masahikofukasawa 9:90a7650db802 130 // tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::LOW);
masahikofukasawa 7:f1f544deaaa3 131 wait_ms(TIME_FOR_OE_MS);
masahikofukasawa 7:f1f544deaaa3 132 // Sets the OE pins high.
masahikofukasawa 7:f1f544deaaa3 133 tca9554a.setPortLevel(PORT_OE_LVS1, TCA9554A::HIGH);
masahikofukasawa 7:f1f544deaaa3 134 tca9554a.setPortLevel(PORT_OE_LVS2, TCA9554A::HIGH);
masahikofukasawa 7:f1f544deaaa3 135 MSG("#Start main loop.\n");
masahikofukasawa 9:90a7650db802 136 // manager->releaseTWI();
masahikofukasawa 7:f1f544deaaa3 137 }
masahikofukasawa 7:f1f544deaaa3 138 #endif
masahikofukasawa 0:c240899240e7 139
masahikofukasawa 0:c240899240e7 140 ble.init();
masahikofukasawa 0:c240899240e7 141 // setup advertising
masahikofukasawa 0:c240899240e7 142 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
masahikofukasawa 0:c240899240e7 143 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
masahikofukasawa 0:c240899240e7 144 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
masahikofukasawa 11:53e52f5f1051 145 (const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME) - 1);
masahikofukasawa 0:c240899240e7 146 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
masahikofukasawa 0:c240899240e7 147 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
masahikofukasawa 0:c240899240e7 148 ble.gap().onConnection(connectionCallback);
masahikofukasawa 0:c240899240e7 149 ble.gap().onDisconnection(disconnectionCallback);
masahikofukasawa 0:c240899240e7 150 ble.gattServer().onDataWritten(WrittenHandler);
masahikofukasawa 0:c240899240e7 151
masahikofukasawa 11:53e52f5f1051 152 // 40ms; in multiples of 0.625ms.
masahikofukasawa 11:53e52f5f1051 153 ble.gap().setAdvertisingInterval(64);
masahikofukasawa 0:c240899240e7 154 ble.gap().startAdvertising();
masahikofukasawa 0:c240899240e7 155
masahikofukasawa 0:c240899240e7 156 // BLE UART service
masahikofukasawa 0:c240899240e7 157 uartService = new UARTService(ble);
masahikofukasawa 7:f1f544deaaa3 158
masahikofukasawa 0:c240899240e7 159 // create sensor manager
masahikofukasawa 0:c240899240e7 160 manager = new AkmSensorManager(&serial, uartService);
masahikofukasawa 0:c240899240e7 161 if( manager->init() == AkmSensorManager::ERROR){
masahikofukasawa 0:c240899240e7 162 MSG("#Error: sensor is NULL\n");
masahikofukasawa 0:c240899240e7 163 }
masahikofukasawa 11:53e52f5f1051 164
masahikofukasawa 11:53e52f5f1051 165 MSG("#Connecting...\n");
masahikofukasawa 11:53e52f5f1051 166
masahikofukasawa 0:c240899240e7 167 // main loop
masahikofukasawa 0:c240899240e7 168 while(1)
masahikofukasawa 0:c240899240e7 169 {
masahikofukasawa 0:c240899240e7 170 if(manager->isEvent()){
masahikofukasawa 0:c240899240e7 171 manager->processEvent();
masahikofukasawa 0:c240899240e7 172 }else{
masahikofukasawa 0:c240899240e7 173 ble.waitForEvent();
masahikofukasawa 0:c240899240e7 174 }
masahikofukasawa 0:c240899240e7 175 }
masahikofukasawa 0:c240899240e7 176 }