BLE UART
Dependencies: Nucleo_BLE_API Nucleo_BLE_BlueNRG mbed
Fork of Nucleo_BLE_UART by
main.cpp@2:65ebe4ba9ba4, 2016-01-03 (annotated)
- Committer:
- sjallouli
- Date:
- Sun Jan 03 16:12:29 2016 +0000
- Revision:
- 2:65ebe4ba9ba4
- Parent:
- 1:69e44344edaa
BLE USART
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sjallouli | 0:3e2ce2bb50b9 | 1 | /* mbed Microcontroller Library |
sjallouli | 0:3e2ce2bb50b9 | 2 | * Copyright (c) 2006-2013 ARM Limited |
sjallouli | 0:3e2ce2bb50b9 | 3 | * |
sjallouli | 0:3e2ce2bb50b9 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
sjallouli | 0:3e2ce2bb50b9 | 5 | * you may not use this file except in compliance with the License. |
sjallouli | 0:3e2ce2bb50b9 | 6 | * You may obtain a copy of the License at |
sjallouli | 0:3e2ce2bb50b9 | 7 | * |
sjallouli | 0:3e2ce2bb50b9 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
sjallouli | 0:3e2ce2bb50b9 | 9 | * |
sjallouli | 0:3e2ce2bb50b9 | 10 | * Unless required by applicable law or agreed to in writing, software |
sjallouli | 0:3e2ce2bb50b9 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
sjallouli | 0:3e2ce2bb50b9 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
sjallouli | 0:3e2ce2bb50b9 | 13 | * See the License for the specific language governing permissions and |
sjallouli | 0:3e2ce2bb50b9 | 14 | * limitations under the License. |
sjallouli | 0:3e2ce2bb50b9 | 15 | */ |
sjallouli | 0:3e2ce2bb50b9 | 16 | |
sjallouli | 0:3e2ce2bb50b9 | 17 | #include "mbed.h" |
sjallouli | 0:3e2ce2bb50b9 | 18 | #include "BLEDevice.h" |
sjallouli | 1:69e44344edaa | 19 | #include "DeviceInformationService.h" |
sjallouli | 0:3e2ce2bb50b9 | 20 | #include "UARTService.h" |
sjallouli | 0:3e2ce2bb50b9 | 21 | #include "Utils.h" |
sjallouli | 0:3e2ce2bb50b9 | 22 | |
sjallouli | 1:69e44344edaa | 23 | const static char DEVICE_NAME[] = "BlueNRG_UART"; |
sjallouli | 1:69e44344edaa | 24 | uint8_t c = 'A'; |
sjallouli | 0:3e2ce2bb50b9 | 25 | |
sjallouli | 1:69e44344edaa | 26 | extern bool user_button_pressed; |
sjallouli | 1:69e44344edaa | 27 | bool connected = false; |
sjallouli | 1:69e44344edaa | 28 | bool UpdatedEnabled = false; |
sjallouli | 0:3e2ce2bb50b9 | 29 | |
sjallouli | 0:3e2ce2bb50b9 | 30 | BLEDevice ble; |
sjallouli | 1:69e44344edaa | 31 | UARTService *uartServicePtr; |
sjallouli | 0:3e2ce2bb50b9 | 32 | |
sjallouli | 1:69e44344edaa | 33 | /* Callback called when the device is disconnected */ |
sjallouli | 0:3e2ce2bb50b9 | 34 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
sjallouli | 0:3e2ce2bb50b9 | 35 | { |
sjallouli | 1:69e44344edaa | 36 | DEBUG("Disconnected!\n\r"); |
sjallouli | 1:69e44344edaa | 37 | DEBUG("Restarting the advertising process\n\r"); |
sjallouli | 1:69e44344edaa | 38 | |
sjallouli | 1:69e44344edaa | 39 | ble.startAdvertising(); |
sjallouli | 1:69e44344edaa | 40 | connected = false; |
sjallouli | 0:3e2ce2bb50b9 | 41 | } |
sjallouli | 0:3e2ce2bb50b9 | 42 | |
sjallouli | 1:69e44344edaa | 43 | /* Callback called when the device is connected */ |
sjallouli | 0:3e2ce2bb50b9 | 44 | void connectionCallback(Gap::Handle_t handle, const Gap::ConnectionParams_t *reason) |
sjallouli | 0:3e2ce2bb50b9 | 45 | { |
sjallouli | 0:3e2ce2bb50b9 | 46 | DEBUG("Connected\r\n"); |
sjallouli | 1:69e44344edaa | 47 | |
sjallouli | 0:3e2ce2bb50b9 | 48 | connected = true; |
sjallouli | 0:3e2ce2bb50b9 | 49 | } |
sjallouli | 0:3e2ce2bb50b9 | 50 | |
sjallouli | 1:69e44344edaa | 51 | void onDataSent(unsigned count) |
sjallouli | 1:69e44344edaa | 52 | { |
sjallouli | 1:69e44344edaa | 53 | DEBUG("onDataSent\r\n"); |
sjallouli | 1:69e44344edaa | 54 | } |
sjallouli | 1:69e44344edaa | 55 | |
sjallouli | 1:69e44344edaa | 56 | /* Not working */ |
sjallouli | 0:3e2ce2bb50b9 | 57 | void onDataWritten(const GattCharacteristicWriteCBParams *params) |
sjallouli | 0:3e2ce2bb50b9 | 58 | { |
sjallouli | 1:69e44344edaa | 59 | DEBUG("--onDataWritten\r\n"); |
sjallouli | 1:69e44344edaa | 60 | DEBUG("---charHandle : %d\r\n", params->charHandle); |
sjallouli | 1:69e44344edaa | 61 | DEBUG("---getTXCharacteristicHandle: %d\r\n", uartServicePtr->getTXCharacteristicHandle()); |
sjallouli | 1:69e44344edaa | 62 | DEBUG("---len: %d\r\n", params->len); |
sjallouli | 1:69e44344edaa | 63 | |
sjallouli | 1:69e44344edaa | 64 | if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) |
sjallouli | 1:69e44344edaa | 65 | { |
sjallouli | 1:69e44344edaa | 66 | DEBUG("received %u bytes\n\r", params->len); |
sjallouli | 1:69e44344edaa | 67 | |
sjallouli | 1:69e44344edaa | 68 | if(params->data[0] == 0x00) |
sjallouli | 1:69e44344edaa | 69 | { |
sjallouli | 1:69e44344edaa | 70 | //Do something |
sjallouli | 0:3e2ce2bb50b9 | 71 | } |
sjallouli | 1:69e44344edaa | 72 | else |
sjallouli | 1:69e44344edaa | 73 | { |
sjallouli | 1:69e44344edaa | 74 | //Do something else |
sjallouli | 1:69e44344edaa | 75 | } |
sjallouli | 1:69e44344edaa | 76 | } |
sjallouli | 1:69e44344edaa | 77 | } |
sjallouli | 1:69e44344edaa | 78 | |
sjallouli | 1:69e44344edaa | 79 | /* Callback called when the client enables updates */ |
sjallouli | 1:69e44344edaa | 80 | void onUpdatesEnabled(uint16_t attributeHandle) |
sjallouli | 1:69e44344edaa | 81 | { |
sjallouli | 1:69e44344edaa | 82 | DEBUG("**onUpdatesEnabled**\r\n"); |
sjallouli | 1:69e44344edaa | 83 | UpdatedEnabled = true; |
sjallouli | 1:69e44344edaa | 84 | } |
sjallouli | 1:69e44344edaa | 85 | |
sjallouli | 1:69e44344edaa | 86 | /* Callback called when the client disable updates */ |
sjallouli | 1:69e44344edaa | 87 | void onUpdatesDisabled(uint16_t attributeHandle) |
sjallouli | 1:69e44344edaa | 88 | { |
sjallouli | 1:69e44344edaa | 89 | DEBUG("**onUpdatesDisabled**\r\n"); |
sjallouli | 1:69e44344edaa | 90 | UpdatedEnabled = false; |
sjallouli | 0:3e2ce2bb50b9 | 91 | } |
sjallouli | 0:3e2ce2bb50b9 | 92 | |
sjallouli | 1:69e44344edaa | 93 | /* Main */ |
sjallouli | 0:3e2ce2bb50b9 | 94 | int main(void) |
sjallouli | 0:3e2ce2bb50b9 | 95 | { |
sjallouli | 1:69e44344edaa | 96 | DEBUG("Initialising \n\r"); |
sjallouli | 1:69e44344edaa | 97 | ble.init(); |
sjallouli | 1:69e44344edaa | 98 | #if 1 |
sjallouli | 1:69e44344edaa | 99 | /* Set callback functions */ |
sjallouli | 1:69e44344edaa | 100 | ble.onDisconnection(disconnectionCallback); |
sjallouli | 1:69e44344edaa | 101 | ble.onConnection(connectionCallback); |
sjallouli | 1:69e44344edaa | 102 | ble.onDataWritten(onDataWritten); |
sjallouli | 1:69e44344edaa | 103 | ble.onDataSent(onDataSent); |
sjallouli | 1:69e44344edaa | 104 | ble.onUpdatesEnabled(onUpdatesEnabled); |
sjallouli | 1:69e44344edaa | 105 | ble.onUpdatesDisabled(onUpdatesDisabled); |
sjallouli | 0:3e2ce2bb50b9 | 106 | |
sjallouli | 1:69e44344edaa | 107 | DeviceInformationService deviceInfo(ble, "ST", "Nucleo", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); |
sjallouli | 1:69e44344edaa | 108 | /* setup advertising */ |
sjallouli | 1:69e44344edaa | 109 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
sjallouli | 1:69e44344edaa | 110 | ble.setAdvertisingType (GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
sjallouli | 1:69e44344edaa | 111 | |
sjallouli | 1:69e44344edaa | 112 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME , (const uint8_t *)"BlueNRG_UART" , sizeof("BlueNRG_UART") - 1); |
sjallouli | 1:69e44344edaa | 113 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
sjallouli | 1:69e44344edaa | 114 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME , (uint8_t *)DEVICE_NAME , sizeof(DEVICE_NAME)); |
sjallouli | 1:69e44344edaa | 115 | |
sjallouli | 1:69e44344edaa | 116 | /* Start advertising */ |
sjallouli | 1:69e44344edaa | 117 | ble.setAdvertisingInterval(160); |
sjallouli | 1:69e44344edaa | 118 | ble.startAdvertising(); |
sjallouli | 0:3e2ce2bb50b9 | 119 | |
sjallouli | 1:69e44344edaa | 120 | UARTService uartService(ble); |
sjallouli | 1:69e44344edaa | 121 | uartServicePtr = &uartService; |
sjallouli | 1:69e44344edaa | 122 | |
sjallouli | 1:69e44344edaa | 123 | while (true) |
sjallouli | 1:69e44344edaa | 124 | { |
sjallouli | 1:69e44344edaa | 125 | ble.waitForEvent(); |
sjallouli | 1:69e44344edaa | 126 | |
sjallouli | 1:69e44344edaa | 127 | if(connected == true) |
sjallouli | 0:3e2ce2bb50b9 | 128 | { |
sjallouli | 1:69e44344edaa | 129 | if ((user_button_pressed == true) && (UpdatedEnabled == true)) |
sjallouli | 1:69e44344edaa | 130 | { |
sjallouli | 1:69e44344edaa | 131 | user_button_pressed = false; |
sjallouli | 1:69e44344edaa | 132 | DEBUG("Current Char: %c\r\n",c); |
sjallouli | 1:69e44344edaa | 133 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), &c, 1); |
sjallouli | 1:69e44344edaa | 134 | |
sjallouli | 1:69e44344edaa | 135 | c++; |
sjallouli | 1:69e44344edaa | 136 | |
sjallouli | 1:69e44344edaa | 137 | if(c == ('Z'+1)) |
sjallouli | 0:3e2ce2bb50b9 | 138 | { |
sjallouli | 1:69e44344edaa | 139 | c = 'A'; |
sjallouli | 0:3e2ce2bb50b9 | 140 | } |
sjallouli | 1:69e44344edaa | 141 | } |
sjallouli | 0:3e2ce2bb50b9 | 142 | } |
sjallouli | 1:69e44344edaa | 143 | } |
sjallouli | 1:69e44344edaa | 144 | #else |
sjallouli | 1:69e44344edaa | 145 | while (true) |
sjallouli | 1:69e44344edaa | 146 | { |
sjallouli | 1:69e44344edaa | 147 | if (user_button_pressed == true) |
sjallouli | 1:69e44344edaa | 148 | { |
sjallouli | 1:69e44344edaa | 149 | user_button_pressed = false; |
sjallouli | 1:69e44344edaa | 150 | DEBUG("Current Char: %c\r\n",c); |
sjallouli | 1:69e44344edaa | 151 | |
sjallouli | 1:69e44344edaa | 152 | c++; |
sjallouli | 1:69e44344edaa | 153 | |
sjallouli | 1:69e44344edaa | 154 | if(c == ('Z'+1)) |
sjallouli | 1:69e44344edaa | 155 | { |
sjallouli | 1:69e44344edaa | 156 | c = 'A'; |
sjallouli | 1:69e44344edaa | 157 | } |
sjallouli | 1:69e44344edaa | 158 | } |
sjallouli | 1:69e44344edaa | 159 | } |
sjallouli | 1:69e44344edaa | 160 | #endif |
sjallouli | 0:3e2ce2bb50b9 | 161 | } |