Re-up
Dependencies: BLE_API mbed nRF51822
main.cpp@0:fecf1e9f5a98, 2015-06-19 (annotated)
- Committer:
- kyowa_watanabe
- Date:
- Fri Jun 19 02:12:47 2015 +0000
- Revision:
- 0:fecf1e9f5a98
Re-up
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kyowa_watanabe | 0:fecf1e9f5a98 | 1 | // ヘッダのインクルード |
kyowa_watanabe | 0:fecf1e9f5a98 | 2 | #include "mbed.h" |
kyowa_watanabe | 0:fecf1e9f5a98 | 3 | #include "BLEDevice.h" |
kyowa_watanabe | 0:fecf1e9f5a98 | 4 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 5 | #define CHARACTERISTIC_LEN 100 |
kyowa_watanabe | 0:fecf1e9f5a98 | 6 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 7 | // デバイス名の登録 |
kyowa_watanabe | 0:fecf1e9f5a98 | 8 | const static char DEVICE_NAME[] = "mbed_HRM1017"; |
kyowa_watanabe | 0:fecf1e9f5a98 | 9 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 10 | // UUIDの登録 |
kyowa_watanabe | 0:fecf1e9f5a98 | 11 | static const uint8_t UUID_BRIL_SERVICE[] = {0x4d,0x92,0x37,0xc0,0xbd,0x5b,0x45,0x93,0xad,0x55,0xd8,0xf5,0x95,0xcf,0xe2,0xea}; |
kyowa_watanabe | 0:fecf1e9f5a98 | 12 | static const uint8_t UUID_CHAR_DATA[] = {0xe5,0xc1,0xcf,0x6e,0xe0,0x57,0x40,0x08,0x98,0x21,0x17,0x71,0x10,0x24,0xe8,0x85}; |
kyowa_watanabe | 0:fecf1e9f5a98 | 13 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 14 | // |
kyowa_watanabe | 0:fecf1e9f5a98 | 15 | uint8_t gRwData[CHARACTERISTIC_LEN] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; |
kyowa_watanabe | 0:fecf1e9f5a98 | 16 | int g_conflg = 0; |
kyowa_watanabe | 0:fecf1e9f5a98 | 17 | int g_test = 0; |
kyowa_watanabe | 0:fecf1e9f5a98 | 18 | int g_receiveflg = 0; |
kyowa_watanabe | 0:fecf1e9f5a98 | 19 | uint8_t g_txdata[100]; |
kyowa_watanabe | 0:fecf1e9f5a98 | 20 | uint8_t g_rxdata[100]; |
kyowa_watanabe | 0:fecf1e9f5a98 | 21 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 22 | BLEDevice ble; |
kyowa_watanabe | 0:fecf1e9f5a98 | 23 | Serial pc(USBTX, USBRX); |
kyowa_watanabe | 0:fecf1e9f5a98 | 24 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 25 | uint8_t thermTempPayload[5] = { 1, 2, 3, 4, 5 }; |
kyowa_watanabe | 0:fecf1e9f5a98 | 26 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 27 | GattCharacteristic gDataCharacteristic ( UUID_CHAR_DATA, gRwData, sizeof(gRwData), sizeof(gRwData), |
kyowa_watanabe | 0:fecf1e9f5a98 | 28 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE); |
kyowa_watanabe | 0:fecf1e9f5a98 | 29 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 30 | GattCharacteristic tempChar( GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR, |
kyowa_watanabe | 0:fecf1e9f5a98 | 31 | thermTempPayload, 100, 100, |
kyowa_watanabe | 0:fecf1e9f5a98 | 32 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE | |
kyowa_watanabe | 0:fecf1e9f5a98 | 33 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | |
kyowa_watanabe | 0:fecf1e9f5a98 | 34 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 35 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 36 | // バッテリーレベル用変数 |
kyowa_watanabe | 0:fecf1e9f5a98 | 37 | uint8_t batt = 100; // Battery level |
kyowa_watanabe | 0:fecf1e9f5a98 | 38 | uint8_t read_batt = 0; // Variable to hold battery level reads |
kyowa_watanabe | 0:fecf1e9f5a98 | 39 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 40 | // バッテリーレベル用GATT |
kyowa_watanabe | 0:fecf1e9f5a98 | 41 | GattCharacteristic battLevel ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, |
kyowa_watanabe | 0:fecf1e9f5a98 | 42 | (uint8_t *)batt, 1, 1, |
kyowa_watanabe | 0:fecf1e9f5a98 | 43 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY | |
kyowa_watanabe | 0:fecf1e9f5a98 | 44 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | |
kyowa_watanabe | 0:fecf1e9f5a98 | 45 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 46 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 47 | // |
kyowa_watanabe | 0:fecf1e9f5a98 | 48 | GattCharacteristic *htmChars[] = {&tempChar, }; |
kyowa_watanabe | 0:fecf1e9f5a98 | 49 | GattCharacteristic *battChars[] = {&battLevel, }; |
kyowa_watanabe | 0:fecf1e9f5a98 | 50 | GattCharacteristic *RwDataChars[] = {&gDataCharacteristic}; |
kyowa_watanabe | 0:fecf1e9f5a98 | 51 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 52 | GattService htmService( GattService::UUID_HEALTH_THERMOMETER_SERVICE, htmChars, |
kyowa_watanabe | 0:fecf1e9f5a98 | 53 | sizeof(htmChars) / sizeof(GattCharacteristic * ) ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 54 | GattService battService( GattService::UUID_BATTERY_SERVICE, battChars, |
kyowa_watanabe | 0:fecf1e9f5a98 | 55 | sizeof(battChars) / sizeof(GattCharacteristic * ) ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 56 | GattService gBrilService = GattService(UUID_BRIL_SERVICE, RwDataChars, sizeof(RwDataChars) / sizeof(GattCharacteristic *)); |
kyowa_watanabe | 0:fecf1e9f5a98 | 57 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 58 | uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE, |
kyowa_watanabe | 0:fecf1e9f5a98 | 59 | GattService::UUID_BATTERY_SERVICE}; |
kyowa_watanabe | 0:fecf1e9f5a98 | 60 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 61 | static Gap::ConnectionParams_t connectionParams; |
kyowa_watanabe | 0:fecf1e9f5a98 | 62 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 63 | void onDisconnectionCallback( Gap::Handle_t handle, Gap::DisconnectionReason_t reason ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 64 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 65 | g_conflg = 0; |
kyowa_watanabe | 0:fecf1e9f5a98 | 66 | ble.startAdvertising(); |
kyowa_watanabe | 0:fecf1e9f5a98 | 67 | pc.printf( "Disconnect!!\r\n" ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 68 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 69 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 70 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 71 | void onConnectionCallback( Gap::Handle_t handle, Gap::addr_type_t type, const Gap::address_t addr, |
kyowa_watanabe | 0:fecf1e9f5a98 | 72 | Gap::addr_type_t addr_type_townAddrType, const Gap::address_t ownAddr, |
kyowa_watanabe | 0:fecf1e9f5a98 | 73 | const Gap::ConnectionParams_t *params ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 74 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 75 | g_conflg = 1; |
kyowa_watanabe | 0:fecf1e9f5a98 | 76 | pc.printf( "Connect!!\r\n" ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 77 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 78 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 79 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 80 | void onDataWrittenCallback( const GattCharacteristicWriteCBParams *params ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 81 | int i; |
kyowa_watanabe | 0:fecf1e9f5a98 | 82 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 83 | uint16_t bytesread = params->len; |
kyowa_watanabe | 0:fecf1e9f5a98 | 84 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 85 | batt--; |
kyowa_watanabe | 0:fecf1e9f5a98 | 86 | if( batt < 0 ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 87 | batt = 100; |
kyowa_watanabe | 0:fecf1e9f5a98 | 88 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 89 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 90 | pc.printf( "Written %d Bytes.\r\n", bytesread ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 91 | for( i = 0; i < bytesread; i++ ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 92 | pc.printf( "%02x",params->data[i] ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 93 | if( ( i + 1 ) < bytesread ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 94 | pc.printf( ", " ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 95 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 96 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 97 | pc.printf( "\r\n" ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 98 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 99 | if( ( params->data[0] == 0x24 ) && ( params->data[1] == 0x02 ) ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 100 | g_receiveflg = 1; |
kyowa_watanabe | 0:fecf1e9f5a98 | 101 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 102 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 103 | ble.updateCharacteristicValue( tempChar.getValueAttribute().getHandle(), thermTempPayload, sizeof( thermTempPayload ) ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 104 | // ble.updateCharacteristicValue(battLevel.getHandle(), (uint8_t *)&batt, sizeof(batt)); |
kyowa_watanabe | 0:fecf1e9f5a98 | 105 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 106 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 107 | void create_data(){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 108 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 109 | int i; |
kyowa_watanabe | 0:fecf1e9f5a98 | 110 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 111 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 112 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 113 | int main( void ) |
kyowa_watanabe | 0:fecf1e9f5a98 | 114 | { |
kyowa_watanabe | 0:fecf1e9f5a98 | 115 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 116 | // 初期設定 |
kyowa_watanabe | 0:fecf1e9f5a98 | 117 | ble.init(); |
kyowa_watanabe | 0:fecf1e9f5a98 | 118 | // コールバック関数の設定 |
kyowa_watanabe | 0:fecf1e9f5a98 | 119 | ble.onDisconnection( onDisconnectionCallback ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 120 | ble.onConnection( onConnectionCallback ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 121 | ble.onDataWritten(onDataWrittenCallback); |
kyowa_watanabe | 0:fecf1e9f5a98 | 122 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 123 | ble.getPreferredConnectionParams( &connectionParams ); |
kyowa_watanabe | 0:fecf1e9f5a98 | 124 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 125 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
kyowa_watanabe | 0:fecf1e9f5a98 | 126 | // ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list)); |
kyowa_watanabe | 0:fecf1e9f5a98 | 127 | // ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER); |
kyowa_watanabe | 0:fecf1e9f5a98 | 128 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
kyowa_watanabe | 0:fecf1e9f5a98 | 129 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
kyowa_watanabe | 0:fecf1e9f5a98 | 130 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
kyowa_watanabe | 0:fecf1e9f5a98 | 131 | ble.setAdvertisingTimeout(0); // アドバタイジングモードのタイムアウト無効 |
kyowa_watanabe | 0:fecf1e9f5a98 | 132 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 133 | // アドバタイズモード開始 |
kyowa_watanabe | 0:fecf1e9f5a98 | 134 | ble.startAdvertising(); |
kyowa_watanabe | 0:fecf1e9f5a98 | 135 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 136 | // サービスの追加 |
kyowa_watanabe | 0:fecf1e9f5a98 | 137 | ble.addService(htmService); |
kyowa_watanabe | 0:fecf1e9f5a98 | 138 | ble.addService(battService); |
kyowa_watanabe | 0:fecf1e9f5a98 | 139 | ble.addService(gBrilService); |
kyowa_watanabe | 0:fecf1e9f5a98 | 140 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 141 | while(1){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 142 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 143 | ble.waitForEvent(); |
kyowa_watanabe | 0:fecf1e9f5a98 | 144 | if( g_receiveflg ){ |
kyowa_watanabe | 0:fecf1e9f5a98 | 145 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 146 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 147 | |
kyowa_watanabe | 0:fecf1e9f5a98 | 148 | } |
kyowa_watanabe | 0:fecf1e9f5a98 | 149 | } |