Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822
Fork of BLE_UART_HRM1017 by
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 }
Generated on Wed Jul 27 2022 01:02:07 by
1.7.2
