Re-up

Dependencies:   BLE_API mbed nRF51822

Committer:
kyowa_watanabe
Date:
Fri Jun 19 02:12:47 2015 +0000
Revision:
0:fecf1e9f5a98
Re-up

Who changed what in which revision?

UserRevisionLine numberNew 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 }