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
main.cpp@23:f826de46d652, 2016-06-01 (annotated)
- Committer:
- kenjiArai
- Date:
- Wed Jun 01 12:37:52 2016 +0000
- Revision:
- 23:f826de46d652
- Parent:
- 22:406127954d1f
- Child:
- 24:391e76b51b21
Pair function with BLE_Paired_Client. If missing BLE_Paired_Server side, Client side of BZ will ON for notice.
Who changed what in which revision?
User | Revision | Line number | New 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 | 23:f826de46d652 | 8 | * Revised: June 1st, 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 | 23:f826de46d652 | 28 | #define USE_DEVICE_I2C 1 // 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 | } |