Pair function with BLE_Paired_Client. If missing BLE_Paired_Server side, Client side of BZ will ON for notice.

Dependencies:   BLE_API mbed nRF51822 nRF51_LowPwr nRF51_Vdd

Fork of BLE_GATT_Example by Bluetooth Low Energy

Committer:
kenjiArai
Date:
Sun Jun 12 12:39:38 2016 +0000
Revision:
24:391e76b51b21
Parent:
23:f826de46d652
Use nRF51_LowPwr library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 23:f826de46d652 1 /*
kenjiArai 23:f826de46d652 2 * /////// Tested on Switch Science mbed TY51822r3 ///////
kenjiArai 23:f826de46d652 3 * Modified by Kenji Arai
kenjiArai 23:f826de46d652 4 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 23:f826de46d652 5 * http://mbed.org/users/kenjiArai/
kenjiArai 23:f826de46d652 6 *
kenjiArai 23:f826de46d652 7 * Started: April 5th, 2016
kenjiArai 24:391e76b51b21 8 * Revised: June 12th, 2016
kenjiArai 23:f826de46d652 9 *
kenjiArai 23:f826de46d652 10 * Original program:
kenjiArai 23:f826de46d652 11 * BLE_GATT_Example
kenjiArai 23:f826de46d652 12 * https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_GATT_Example/
kenjiArai 23:f826de46d652 13 * Tested Device:
kenjiArai 23:f826de46d652 14 * BLE_Paired_Client
kenjiArai 23:f826de46d652 15 *
kenjiArai 23:f826de46d652 16 */
kenjiArai 23:f826de46d652 17
kenjiArai 23:f826de46d652 18 // Include ---------------------------------------------------------------------------------------
mbedAustin 0:cd5b6733aeb1 19 #include "mbed.h"
kenjiArai 23:f826de46d652 20 #include "BLE.h"
kenjiArai 23:f826de46d652 21 #include "nRF51_Vdd.h"
kenjiArai 23:f826de46d652 22 #include "nRF51_lowpwr.h"
mbedAustin 1:94152e7d8b5c 23
kenjiArai 23:f826de46d652 24 // Definition ------------------------------------------------------------------------------------
kenjiArai 23:f826de46d652 25 // Before using this function, please specify your program are used following functions or not.
kenjiArai 23:f826de46d652 26 #define USE_DEVICE_STDIO_MESSAGES 0 // printf
kenjiArai 23:f826de46d652 27 #define USE_DEVICE_SERIAL 0 // Serial or DEBUG & etc.
kenjiArai 24:391e76b51b21 28 #define USE_DEVICE_I2C 0 // Sensors with I2C, LCD, EEPROM, Driver chips & etc.
kenjiArai 23:f826de46d652 29 #define USE_DEVICE_SPI 0 // Sensors with SOI, LCD, EEPROM, Driver chips & etc.
kenjiArai 23:f826de46d652 30 #define USE_DEVICE_SPISLAVE 0 // Communication with master vis SPI
kenjiArai 23:f826de46d652 31 #define USE_DEVICE_PWMOUT 0 // PWM duty output, Serve & etc.
kenjiArai 23:f826de46d652 32 #define USE_DEVICE_ANALOGIN 0 // Analog adc
kenjiArai 23:f826de46d652 33
kenjiArai 23:f826de46d652 34 #define SHOW_MY_MAC 0
kenjiArai 23:f826de46d652 35
kenjiArai 23:f826de46d652 36 #if USE_DEVICE_STDIO_MESSAGES
kenjiArai 23:f826de46d652 37 #define DEBUG(...) { printf(__VA_ARGS__); }
kenjiArai 23:f826de46d652 38 #else
kenjiArai 23:f826de46d652 39 #define DEBUG(...)
kenjiArai 23:f826de46d652 40 #endif
kenjiArai 23:f826de46d652 41
kenjiArai 23:f826de46d652 42 // Object ----------------------------------------------------------------------------------------
kenjiArai 23:f826de46d652 43 Ticker ticker;
kenjiArai 23:f826de46d652 44 InterruptIn sw(P0_0);
kenjiArai 23:f826de46d652 45 nRF51_Vdd vdd(3.6f, 1.8f, ONLY4VDD);
mbedAustin 1:94152e7d8b5c 46
kenjiArai 23:f826de46d652 47 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 23:f826de46d652 48 const static char DEVICE_NAME[] = "JH1PJL";
kenjiArai 23:f826de46d652 49 static const uint16_t uuid16_list[] = {0xFFFF};//Custom UUID, FFFF is reserved for development
kenjiArai 23:f826de46d652 50 const uint16_t customServiceUUID = 0xA000;
kenjiArai 23:f826de46d652 51 const uint16_t readCharUUID = 0xA001;
kenjiArai 23:f826de46d652 52 const uint16_t writeCharUUID = 0xA002;
kenjiArai 23:f826de46d652 53 const int8_t tx_power_level[8] =
kenjiArai 23:f826de46d652 54 {
kenjiArai 23:f826de46d652 55 RADIO_TXPOWER_TXPOWER_Pos4dBm, // 0
kenjiArai 23:f826de46d652 56 RADIO_TXPOWER_TXPOWER_0dBm, // 1
kenjiArai 23:f826de46d652 57 RADIO_TXPOWER_TXPOWER_Neg4dBm, // 2
kenjiArai 23:f826de46d652 58 RADIO_TXPOWER_TXPOWER_Neg8dBm, // 3
kenjiArai 23:f826de46d652 59 RADIO_TXPOWER_TXPOWER_Neg12dBm, // 4
kenjiArai 23:f826de46d652 60 RADIO_TXPOWER_TXPOWER_Neg16dBm, // 5
kenjiArai 23:f826de46d652 61 RADIO_TXPOWER_TXPOWER_Neg20dBm, // 6
kenjiArai 23:f826de46d652 62 RADIO_TXPOWER_TXPOWER_Neg30dBm // 7
kenjiArai 23:f826de46d652 63 };
mbedAustin 1:94152e7d8b5c 64
kenjiArai 23:f826de46d652 65 const nRF51_LOWPWR_TypeDef lowpwr_table =
kenjiArai 23:f826de46d652 66 {
kenjiArai 23:f826de46d652 67 #if USE_DEVICE_STDIO_MESSAGES
kenjiArai 23:f826de46d652 68 true,
kenjiArai 23:f826de46d652 69 #else
kenjiArai 23:f826de46d652 70 false,
kenjiArai 23:f826de46d652 71 #endif
kenjiArai 23:f826de46d652 72 #if USE_DEVICE_SERIAL
kenjiArai 23:f826de46d652 73 true,
kenjiArai 23:f826de46d652 74 #else
kenjiArai 23:f826de46d652 75 false,
kenjiArai 23:f826de46d652 76 #endif
kenjiArai 23:f826de46d652 77 #if USE_DEVICE_I2C
kenjiArai 23:f826de46d652 78 true,
kenjiArai 23:f826de46d652 79 #else
kenjiArai 23:f826de46d652 80 false,
kenjiArai 23:f826de46d652 81 #endif
kenjiArai 23:f826de46d652 82 #if USE_DEVICE_SPI
kenjiArai 23:f826de46d652 83 true,
kenjiArai 23:f826de46d652 84 #else
kenjiArai 23:f826de46d652 85 false,
kenjiArai 23:f826de46d652 86 #endif
kenjiArai 23:f826de46d652 87 #if USE_DEVICE_SPISLAVE
kenjiArai 23:f826de46d652 88 true,
kenjiArai 23:f826de46d652 89 #else
kenjiArai 23:f826de46d652 90 false,
kenjiArai 23:f826de46d652 91 #endif
kenjiArai 23:f826de46d652 92 #if USE_DEVICE_PWMOUT
kenjiArai 23:f826de46d652 93 true,
kenjiArai 23:f826de46d652 94 #else
kenjiArai 23:f826de46d652 95 false,
kenjiArai 23:f826de46d652 96 #endif
kenjiArai 23:f826de46d652 97 #if USE_DEVICE_ANALOGIN
kenjiArai 23:f826de46d652 98 true
kenjiArai 23:f826de46d652 99 #else
kenjiArai 23:f826de46d652 100 false
kenjiArai 23:f826de46d652 101 #endif
kenjiArai 23:f826de46d652 102 };
mbedAustin 2:e84c13abc479 103
kenjiArai 23:f826de46d652 104 // RAM -------------------------------------------------------------------------------------------
kenjiArai 23:f826de46d652 105 volatile bool triggerSensorPolling = false;
kenjiArai 23:f826de46d652 106 static uint8_t readValue[10] = {0};
kenjiArai 23:f826de46d652 107 static uint8_t writeValue[10] = {0};
kenjiArai 23:f826de46d652 108 ReadOnlyArrayGattCharacteristic<uint8_t, sizeof(readValue)> readChar(readCharUUID, readValue);
mbedAustin 12:6d1f77d0cb37 109 WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(writeValue)> writeChar(writeCharUUID, writeValue);
andresag 22:406127954d1f 110 /* Set up custom service */
mbedAustin 8:60ede963dfe2 111 GattCharacteristic *characteristics[] = {&readChar, &writeChar};
kenjiArai 23:f826de46d652 112 GattService customService(
kenjiArai 23:f826de46d652 113 customServiceUUID,
kenjiArai 23:f826de46d652 114 characteristics,
kenjiArai 23:f826de46d652 115 sizeof(characteristics) / sizeof(GattCharacteristic *)
kenjiArai 23:f826de46d652 116 );
mbedAustin 2:e84c13abc479 117
kenjiArai 23:f826de46d652 118 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 23:f826de46d652 119 void bleInitComplete(BLE::InitializationCompleteCallbackContext *);
kenjiArai 23:f826de46d652 120 void periodicCallback(void);
kenjiArai 23:f826de46d652 121 void buttonPressedCallback(void);
kenjiArai 23:f826de46d652 122 void buttonReleasedCallback(void);
kenjiArai 23:f826de46d652 123 void connectionCallback(const Gap::ConnectionCallbackParams_t *params);
kenjiArai 23:f826de46d652 124 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params);
kenjiArai 23:f826de46d652 125
kenjiArai 23:f826de46d652 126 //-------------------------------------------------------------------------------------------------
kenjiArai 23:f826de46d652 127 // Control Program
kenjiArai 23:f826de46d652 128 //-------------------------------------------------------------------------------------------------
kenjiArai 23:f826de46d652 129 void reset_cpu(){
kenjiArai 23:f826de46d652 130 NVIC_SystemReset(); // System RESET!!
kenjiArai 23:f826de46d652 131 }
mbedAustin 2:e84c13abc479 132
kenjiArai 23:f826de46d652 133 int main(void){
kenjiArai 23:f826de46d652 134 uint8_t n = 0;
kenjiArai 23:f826de46d652 135 uint8_t bf_send_to_client[10];
kenjiArai 23:f826de46d652 136 uint16_t len_send;
kenjiArai 23:f826de46d652 137
kenjiArai 23:f826de46d652 138 LowPwr set_lowpwr(&lowpwr_table);
kenjiArai 23:f826de46d652 139 sw.fall(&reset_cpu);
kenjiArai 23:f826de46d652 140 ticker.attach(periodicCallback, 5);
kenjiArai 23:f826de46d652 141 BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
kenjiArai 23:f826de46d652 142 ble.init(bleInitComplete);
kenjiArai 23:f826de46d652 143 while (ble.hasInitialized() == false){ ;}
kenjiArai 23:f826de46d652 144 while (true){
kenjiArai 23:f826de46d652 145 if (triggerSensorPolling){ // Send Chip Vdd value
kenjiArai 23:f826de46d652 146 triggerSensorPolling = false;
kenjiArai 23:f826de46d652 147 if (++n >= 100){ n = 0;}
kenjiArai 23:f826de46d652 148 sprintf((char *)bf_send_to_client,"%02u %3.2f[V]", n, vdd.read_real_value());
kenjiArai 23:f826de46d652 149 len_send = strlen((const char *)bf_send_to_client);
kenjiArai 23:f826de46d652 150 ble.gattServer().write(readChar.getValueHandle(), bf_send_to_client, len_send);
kenjiArai 23:f826de46d652 151 }
kenjiArai 23:f826de46d652 152 ble.waitForEvent(); // Save power
kenjiArai 23:f826de46d652 153 }
kenjiArai 23:f826de46d652 154 }
kenjiArai 23:f826de46d652 155
kenjiArai 23:f826de46d652 156 void periodicCallback(void){
kenjiArai 23:f826de46d652 157 triggerSensorPolling = true;
kenjiArai 23:f826de46d652 158 }
kenjiArai 23:f826de46d652 159
kenjiArai 23:f826de46d652 160 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *){
andresag 22:406127954d1f 161 BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
mbedAustin 1:94152e7d8b5c 162 }
mbedAustin 0:cd5b6733aeb1 163
kenjiArai 23:f826de46d652 164 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params){
andresag 22:406127954d1f 165 BLE &ble = params->ble;
andresag 22:406127954d1f 166 ble_error_t error = params->error;
andresag 22:406127954d1f 167
kenjiArai 23:f826de46d652 168 if (error != BLE_ERROR_NONE) { return;}
kenjiArai 23:f826de46d652 169 #if SHOW_MY_MAC
kenjiArai 23:f826de46d652 170 Gap::AddressType_t my_mac_type;
kenjiArai 23:f826de46d652 171 Gap::Address_t my_mac;
kenjiArai 23:f826de46d652 172 ble.gap().getAddress(&my_mac_type, my_mac);
kenjiArai 23:f826de46d652 173 DEBUG(
kenjiArai 23:f826de46d652 174 " my_MAC %02x:%02x:%02x:%02x:%02x:%02x (%s)\r\n",
kenjiArai 23:f826de46d652 175 my_mac[5], my_mac[4], my_mac[3], my_mac[2], my_mac[1], my_mac[0],
kenjiArai 23:f826de46d652 176 (my_mac_type == Gap::ADDR_TYPE_PUBLIC) ? "public" : "random"
kenjiArai 23:f826de46d652 177 );
kenjiArai 23:f826de46d652 178 DEBUG(
kenjiArai 23:f826de46d652 179 " mac_board_? = {0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x};\r\n",
kenjiArai 23:f826de46d652 180 my_mac[0], my_mac[1], my_mac[2], my_mac[3], my_mac[4], my_mac[5]
kenjiArai 23:f826de46d652 181 );
kenjiArai 23:f826de46d652 182 #endif
kenjiArai 23:f826de46d652 183 ble.gap().onConnection(connectionCallback);
andresag 19:477567297aac 184 ble.gap().onDisconnection(disconnectionCallback);
kenjiArai 23:f826de46d652 185 ble.gap().accumulateAdvertisingPayload(
kenjiArai 23:f826de46d652 186 GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE
kenjiArai 23:f826de46d652 187 ); // BLE only, no classic BT
kenjiArai 23:f826de46d652 188 ble.gap().setAdvertisingType(
kenjiArai 23:f826de46d652 189 GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED
kenjiArai 23:f826de46d652 190 ); // advertising type
kenjiArai 23:f826de46d652 191 ble.gap().accumulateAdvertisingPayload(
kenjiArai 23:f826de46d652 192 GapAdvertisingData::COMPLETE_LOCAL_NAME,
kenjiArai 23:f826de46d652 193 (uint8_t *)DEVICE_NAME,
kenjiArai 23:f826de46d652 194 sizeof(DEVICE_NAME)
kenjiArai 23:f826de46d652 195 ); // add name
kenjiArai 23:f826de46d652 196 ble.gap().accumulateAdvertisingPayload(
kenjiArai 23:f826de46d652 197 GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
kenjiArai 23:f826de46d652 198 (uint8_t *)uuid16_list,
kenjiArai 23:f826de46d652 199 sizeof(uuid16_list)
kenjiArai 23:f826de46d652 200 ); // UUID's broadcast in advertising packet
kenjiArai 23:f826de46d652 201 ble.gap().setTxPower(tx_power_level[2]);
kenjiArai 23:f826de46d652 202 ble.gap().setAdvertisingInterval(1000); // 1000ms.
mbedAustin 13:62b1d32745ac 203 ble.addService(customService);
andresag 19:477567297aac 204 ble.gap().startAdvertising();
andresag 22:406127954d1f 205 }
andresag 19:477567297aac 206
kenjiArai 23:f826de46d652 207 void connectionCallback(const Gap::ConnectionCallbackParams_t *params){
kenjiArai 23:f826de46d652 208 DEBUG("connected as device (handle = %d)\r\n\r", params->handle);
kenjiArai 23:f826de46d652 209 DEBUG(
kenjiArai 23:f826de46d652 210 "Conn. params => min=%d, max=%d, slave=%d, supervision=%d\r\n",
kenjiArai 23:f826de46d652 211 params->connectionParams->minConnectionInterval,
kenjiArai 23:f826de46d652 212 params->connectionParams->maxConnectionInterval,
kenjiArai 23:f826de46d652 213 params->connectionParams->slaveLatency,
kenjiArai 23:f826de46d652 214 params->connectionParams->connectionSupervisionTimeout
kenjiArai 23:f826de46d652 215 );
kenjiArai 23:f826de46d652 216 #if 0
kenjiArai 23:f826de46d652 217 Gap::ConnectionParams_t connectionParams;
kenjiArai 23:f826de46d652 218 connectionParams.minConnectionInterval = 200;
kenjiArai 23:f826de46d652 219 connectionParams.maxConnectionInterval = 500;
kenjiArai 23:f826de46d652 220 connectionParams.slaveLatency = 0;
kenjiArai 23:f826de46d652 221 connectionParams.connectionSupervisionTimeout = 1500;
kenjiArai 23:f826de46d652 222 if (BLE::Instance(
kenjiArai 23:f826de46d652 223 BLE::DEFAULT_INSTANCE).gap().updateConnectionParams(params->handle,
kenjiArai 23:f826de46d652 224 &connectionParams) != BLE_ERROR_NONE
kenjiArai 23:f826de46d652 225 ){
kenjiArai 23:f826de46d652 226 DEBUG("failed to update connection parameter\r\n");
mbedAustin 2:e84c13abc479 227 }
kenjiArai 23:f826de46d652 228 #endif
kenjiArai 23:f826de46d652 229 }