yoshiyuki nakanishi / Mbed 2 deprecated BLE_UART_HRM1017

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_UART_HRM1017 by robo 8080

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /* mbed Microcontroller Library
00002  * Copyright (c) 2006-2013 ARM Limited
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *     http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00017 #include "mbed.h"
00018 #include "BLEDevice.h"
00019 
00020 #define BLE_UUID_NUS_SERVICE            0x0001 /**< The UUID of the Nordic UART Service. */
00021 #define BLE_UUID_NUS_TX_CHARACTERISTIC  0x0002 /**< The UUID of the TX Characteristic. */
00022 #define BLE_UUID_NUS_RX_CHARACTERISTIC  0x0003 /**< The UUID of the RX Characteristic. */
00023 
00024 #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
00025                                * it will have an impact on code-size and power consumption. */
00026 
00027 #if NEED_CONSOLE_OUTPUT
00028 //Serial  pc(USBTX, USBRX);
00029 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
00030 #else
00031 #define DEBUG(...) /* nothing */
00032 #endif /* #if NEED_CONSOLE_OUTPUT */
00033 
00034 Serial  pc(USBTX, USBRX);
00035 BLEDevice  ble;
00036 DigitalOut led1(LED1);
00037 
00038 #define USE_BLE_SERIAL_UUID 0   //BLESerialのUUIDを使う時1にする
00039 /*#if USE_BLE_SERIAL_UUID
00040 // BLESerial
00041 const static char  DEVICE_NAME[] = "BLESerial";
00042 static const uint8_t uart_base_uuid[] = {0x56,0x9a,0x11,0x01,0xb8,0x7F,0x49,0x0c,0x92,0xcb,0x11,0xba,0x5e,0xa5,0x16,0x7c};
00043 static const uint8_t uart_tx_uuid[]   = {0x56,0x9a,0x20,0x01,0xb8,0x7F,0x49,0x0c,0x92,0xcb,0x11,0xba,0x5e,0xa5,0x16,0x7c};
00044 static const uint8_t uart_rx_uuid[]   = {0x56,0x9a,0x20,0x00,0xb8,0x7F,0x49,0x0c,0x92,0xcb,0x11,0xba,0x5e,0xa5,0x16,0x7c};
00045 static const uint8_t uart_base_uuid_rev[] = {0x7c,0x16,0xa5,0x5e,0xba,0x11,0xcb,0x92,0x0c,0x49,0x7F,0xb8,0x01,0x11,0x9a,0x56};
00046 #else*/
00047 // The Nordic UART Service
00048 const static char  DEVICE_NAME[] = "mbed HRM1017";
00049 static const uint8_t uart_base_uuid[] = {0x6e, 0x40, 0x00, 0x01, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5,0x0e, 0x24, 0xdc, 0xca, 0x9e};
00050 static const uint8_t uart_tx_uuid[]   = {0x6e, 0x40, 0x00, 0x02, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5,0x0e, 0x24, 0xdc, 0xca, 0x9e};
00051 static const uint8_t uart_rx_uuid[]   = {0x6e, 0x40, 0x00, 0x03, 0xb5, 0xa3, 0xf3, 0x93, 0xe0, 0xa9, 0xe5,0x0e, 0x24, 0xdc, 0xca, 0x9e};
00052 static const uint8_t uart_base_uuid_rev[] = {0x9e, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0, 0x93, 0xf3, 0xa3, 0xb5, 0x01, 0x00, 0x40, 0x6e};
00053 //#endif
00054 
00055 /*static const uint8_t SIZEOF_TX_BUFFER = 21;
00056 uint8_t             thermSCANPayload[SIZEOF_TX_BUFFER] = {0,};// = { 0, 0, 0, 0, 0 };
00057 GattCharacteristic  SCANChar(GattCharacteristic::UUID_SCAN_INTERVAL_WINDOW_CHAR,
00058                                 thermSCANPayload, 1, SIZEOF_TX_BUFFER,
00059 //                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ|
00060                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE|
00061                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE
00062 //                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE
00063 //                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE
00064                                 );*/
00065 //static const uint8_t SIZEOF_TX_RX_BUFFER = 128;
00066 static const uint8_t SIZEOF_TX_RX_BUFFER = 21;
00067 uint8_t rxPayload[SIZEOF_TX_RX_BUFFER] = {0,};
00068 uint8_t txPayload[SIZEOF_TX_RX_BUFFER] = {0,};
00069 GattCharacteristic  rxCharacteristic (uart_tx_uuid, rxPayload, 1, SIZEOF_TX_RX_BUFFER,
00070                                       GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE|
00071                                       GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
00072 GattCharacteristic  txCharacteristic (uart_rx_uuid, txPayload, 1, SIZEOF_TX_RX_BUFFER, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
00073 GattCharacteristic *uartChars[] = {&rxCharacteristic, &txCharacteristic/*,&SCANChar*/};
00074 GattService         uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
00075 
00076 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
00077 {
00078     DEBUG("Disconnected!\n\r");
00079     led1 = 1;
00080     DEBUG("Restarting the advertising process\n\r");
00081     ble.startAdvertising();
00082 }
00083 void onConnectionCallback(Gap::Handle_t handle, const Gap::ConnectionParams_t *params)
00084 {
00085     DEBUG("connected. Got handle %u\r\n", handle);
00086     led1 = 0;
00087 }
00088 
00089 void onDataWritten(uint16_t charHandle, const GattCharacteristicWriteCBParams *params)
00090 {
00091     DEBUG("received handle=%d bytes\n\r", charHandle);
00092     if (charHandle == rxCharacteristic.getValueAttribute().getHandle()) {
00093         uint16_t bytesRead = params->len;
00094         DEBUG("received %u bytes\n\r", bytesRead);
00095         if (bytesRead < sizeof(rxPayload)) {
00096             memcpy(rxPayload, params->data, bytesRead);
00097             rxPayload[bytesRead] = 0;
00098         }
00099         DEBUG("ECHO: %s\n\r", (char *)rxPayload);
00100 #if NEED_CONSOLE_OUTPUT
00101         ble.updateCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), rxPayload, bytesRead);
00102 #else
00103         /*
00104         for(int i = 0; i < bytesRead; i++) {
00105             pc.putc(rxPayload[i]);
00106         }
00107         */
00108         switch( bytesRead ){
00109         case 1:
00110             pc.printf("%c",rxPayload[0]);
00111         case 2:
00112             pc.printf("%c%c",rxPayload[0],rxPayload[1]);
00113         case 3:
00114             pc.printf("%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2]);
00115         case 4:
00116             pc.printf("%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3]);
00117         case 5:
00118             pc.printf("%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4]);
00119         case 6:
00120             pc.printf("%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5]);
00121         case 7:
00122             pc.printf("%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6]);
00123         case 8:
00124             pc.printf("%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7]);
00125         case 9:
00126             pc.printf("%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8]);
00127         case 10:
00128             pc.printf("%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9]);
00129         case 11:
00130             pc.printf("%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10]);
00131         case 12:
00132             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11]);
00133         case 13:
00134             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12]);
00135         case 14:
00136             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12],rxPayload[13]);
00137         case 15:
00138             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12],rxPayload[13],rxPayload[14]);
00139         case 16:
00140             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12],rxPayload[13],rxPayload[14],rxPayload[15]);
00141         case 17:
00142             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12],rxPayload[13],rxPayload[14],rxPayload[15],rxPayload[16]);
00143         case 18:
00144             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12],rxPayload[13],rxPayload[14],rxPayload[15],rxPayload[16],rxPayload[17]);
00145         case 19:
00146             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12],rxPayload[13],rxPayload[14],rxPayload[15],rxPayload[16],rxPayload[17],rxPayload[18]);
00147         case 20:
00148             pc.printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",rxPayload[0],rxPayload[1],rxPayload[2],rxPayload[3],rxPayload[4],rxPayload[5],rxPayload[6],rxPayload[7],rxPayload[8],rxPayload[9],rxPayload[10],rxPayload[11],rxPayload[12],rxPayload[13],rxPayload[14],rxPayload[15],rxPayload[16],rxPayload[17],rxPayload[18],rxPayload[19]);
00149         }
00150 #endif  //NEED_CONSOLE_OUTPUT
00151     }
00152 }
00153 
00154 static volatile bool uartTxUpdatesEnable = false;
00155 void onUpdatesEnabled(uint16_t charHandle)
00156 {
00157     DEBUG("onUpdatesEnabled handle %u!\n\r", charHandle);
00158     if (charHandle == txCharacteristic.getValueAttribute().getHandle()) {
00159         DEBUG("uartRxCharacteristic!\n\r");
00160         uartTxUpdatesEnable = true;
00161     }              
00162 }
00163 void onUpdatesDisabled(uint16_t charHandle)
00164 {
00165     DEBUG("onUpdatesDisabled handle %u!\n\r", charHandle);
00166     if (charHandle == txCharacteristic.getValueAttribute().getHandle()) {
00167         DEBUG("uartRxCharacteristic!\n\r");
00168         uartTxUpdatesEnable = false;
00169     }                     
00170 }
00171 static volatile bool triggerUartPolling = false;
00172 
00173 static int eventcount = 0;
00174 
00175 void periodicCallback(void)
00176 {
00177 //    led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
00178     /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
00179      * heavy-weight sensor polling from the main thread. */
00180     triggerUartPolling = true;
00181     eventcount++;
00182 }
00183 
00184 int main(void)
00185 {
00186     led1 = 1;
00187     uint16_t bytesRead = 0;
00188     Ticker ticker;
00189     ticker.attach(periodicCallback, 0.05 );       //50ms
00190 
00191     pc.baud(38400);
00192     
00193 #if NEED_CONSOLE_OUTPUT
00194 //    pc.baud(38400);
00195 #endif
00196 
00197     DEBUG("Initialising the nRF51822\n\r");
00198     ble.init();
00199     ble.setDeviceName((uint8_t *)DEVICE_NAME);
00200     ble.onConnection(onConnectionCallback);
00201     ble.onDisconnection(disconnectionCallback);
00202     ble.onDataWritten(onDataWritten);
00203     ble.onUpdatesEnabled(onUpdatesEnabled);
00204     ble.onUpdatesDisabled(onUpdatesDisabled);
00205 
00206     /* setup advertising */
00207     ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
00208     ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
00209 #if USE_BLE_SERIAL_UUID
00210     ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
00211                                     (const uint8_t *)"BLESerial", sizeof("BLESerial") - 1);
00212 #else
00213     ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
00214                                     (const uint8_t *)"HRM1017", sizeof("HRM1017") - 1);
00215 #endif
00216     ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
00217                                     (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
00218     ble.setAdvertisingInterval(80); /* 100ms; in multiples of 0.625ms. */
00219     ble.startAdvertising();
00220 
00221     ble.addService(uartService);
00222     
00223     while (true) {
00224         if (triggerUartPolling) {
00225 //            triggerUartPolling = false;
00226             /* Do blocking calls or whatever is necessary for sensor polling. */
00227             if(ble.getGapState().connected) { 
00228 //#if !NEED_CONSOLE_OUTPUT
00229                 if(uartTxUpdatesEnable) {
00230                     bytesRead = 0;
00231                     eventcount = 0;
00232                     while( bytesRead < sizeof(txPayload) - 1 )  {
00233                         if ( bytesRead < sizeof(txPayload)  - 1) {
00234                             if ( pc.readable() ){
00235                                 txPayload[bytesRead++] = pc.getc();
00236 /*                            } else if ( bytesRead > 0 ) {
00237                                 ble.waitForEvent();*/
00238                             }
00239                         } else {
00240                             break;
00241                         }
00242                         if ( eventcount > 10 ){
00243                             break;
00244                         }
00245                     }
00246                     if ( bytesRead <= sizeof(txPayload) - 1 ) {
00247                         ble.updateCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), (uint8_t*)txPayload, bytesRead);
00248                     }
00249                 }
00250 //#endif
00251             }
00252         } else {
00253             ble.waitForEvent();
00254         }
00255     }
00256 }