KeyboardStream example from BLE_HID

Dependencies:   BLE_API BLE_HID mbed nRF51822

This example is currently copied as-is from the github development repo.

Committer:
Jean-Philippe Brucker
Date:
Wed Oct 07 11:42:06 2015 +0100
Revision:
0:1484ce3a8cdf
Child:
1:40ee264cd4f0
Initial commit, version 0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jean-Philippe Brucker 0:1484ce3a8cdf 1 /* mbed Microcontroller Library
Jean-Philippe Brucker 0:1484ce3a8cdf 2 * Copyright (c) 2015 ARM Limited
Jean-Philippe Brucker 0:1484ce3a8cdf 3 *
Jean-Philippe Brucker 0:1484ce3a8cdf 4 * Licensed under the Apache License, Version 2.0 (the "License");
Jean-Philippe Brucker 0:1484ce3a8cdf 5 * you may not use this file except in compliance with the License.
Jean-Philippe Brucker 0:1484ce3a8cdf 6 * You may obtain a copy of the License at
Jean-Philippe Brucker 0:1484ce3a8cdf 7 *
Jean-Philippe Brucker 0:1484ce3a8cdf 8 * http://www.apache.org/licenses/LICENSE-2.0
Jean-Philippe Brucker 0:1484ce3a8cdf 9 *
Jean-Philippe Brucker 0:1484ce3a8cdf 10 * Unless required by applicable law or agreed to in writing, software
Jean-Philippe Brucker 0:1484ce3a8cdf 11 * distributed under the License is distributed on an "AS IS" BASIS,
Jean-Philippe Brucker 0:1484ce3a8cdf 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Jean-Philippe Brucker 0:1484ce3a8cdf 13 * See the License for the specific language governing permissions and
Jean-Philippe Brucker 0:1484ce3a8cdf 14 * limitations under the License.
Jean-Philippe Brucker 0:1484ce3a8cdf 15 */
Jean-Philippe Brucker 0:1484ce3a8cdf 16
Jean-Philippe Brucker 0:1484ce3a8cdf 17 #include "mbed.h"
Jean-Philippe Brucker 0:1484ce3a8cdf 18
Jean-Philippe Brucker 0:1484ce3a8cdf 19 #include "ble/BLE.h"
Jean-Philippe Brucker 0:1484ce3a8cdf 20 #include "KeyboardService.h"
Jean-Philippe Brucker 0:1484ce3a8cdf 21
Jean-Philippe Brucker 0:1484ce3a8cdf 22 #include "examples_common.h"
Jean-Philippe Brucker 0:1484ce3a8cdf 23
Jean-Philippe Brucker 0:1484ce3a8cdf 24 /**
Jean-Philippe Brucker 0:1484ce3a8cdf 25 * This program implements a complete HID-over-Gatt Profile:
Jean-Philippe Brucker 0:1484ce3a8cdf 26 * - HID is provided by KeyboardService
Jean-Philippe Brucker 0:1484ce3a8cdf 27 * - Battery Service
Jean-Philippe Brucker 0:1484ce3a8cdf 28 * - Device Information Service
Jean-Philippe Brucker 0:1484ce3a8cdf 29 *
Jean-Philippe Brucker 0:1484ce3a8cdf 30 * Complete strings can be sent over BLE using printf. Please note, however, than a 12char string
Jean-Philippe Brucker 0:1484ce3a8cdf 31 * will take about 500ms to transmit, principally because of the limited notification rate in BLE.
Jean-Philippe Brucker 0:1484ce3a8cdf 32 * KeyboardService uses a circular buffer to store the strings to send, and calls to putc will fail
Jean-Philippe Brucker 0:1484ce3a8cdf 33 * once this buffer is full. This will result in partial strings being sent to the client.
Jean-Philippe Brucker 0:1484ce3a8cdf 34 */
Jean-Philippe Brucker 0:1484ce3a8cdf 35
Jean-Philippe Brucker 0:1484ce3a8cdf 36 DigitalOut waiting_led(LED1);
Jean-Philippe Brucker 0:1484ce3a8cdf 37 DigitalOut connected_led(LED2);
Jean-Philippe Brucker 0:1484ce3a8cdf 38
Jean-Philippe Brucker 0:1484ce3a8cdf 39 InterruptIn button1(BUTTON1);
Jean-Philippe Brucker 0:1484ce3a8cdf 40 InterruptIn button2(BUTTON2);
Jean-Philippe Brucker 0:1484ce3a8cdf 41
Jean-Philippe Brucker 0:1484ce3a8cdf 42 BLE ble;
Jean-Philippe Brucker 0:1484ce3a8cdf 43 KeyboardService *kbdServicePtr;
Jean-Philippe Brucker 0:1484ce3a8cdf 44
Jean-Philippe Brucker 0:1484ce3a8cdf 45 static const char DEVICE_NAME[] = "µKbd";
Jean-Philippe Brucker 0:1484ce3a8cdf 46 static const char SHORT_DEVICE_NAME[] = "kbd1";
Jean-Philippe Brucker 0:1484ce3a8cdf 47
Jean-Philippe Brucker 0:1484ce3a8cdf 48 static void onDisconnect(const Gap::DisconnectionCallbackParams_t *params)
Jean-Philippe Brucker 0:1484ce3a8cdf 49 {
Jean-Philippe Brucker 0:1484ce3a8cdf 50 HID_DEBUG("disconnected\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 51 connected_led = 0;
Jean-Philippe Brucker 0:1484ce3a8cdf 52
Jean-Philippe Brucker 0:1484ce3a8cdf 53 ble.gap().startAdvertising(); // restart advertising
Jean-Philippe Brucker 0:1484ce3a8cdf 54 }
Jean-Philippe Brucker 0:1484ce3a8cdf 55
Jean-Philippe Brucker 0:1484ce3a8cdf 56 static void onConnect(const Gap::ConnectionCallbackParams_t *params)
Jean-Philippe Brucker 0:1484ce3a8cdf 57 {
Jean-Philippe Brucker 0:1484ce3a8cdf 58 HID_DEBUG("connected\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 59 waiting_led = false;
Jean-Philippe Brucker 0:1484ce3a8cdf 60 }
Jean-Philippe Brucker 0:1484ce3a8cdf 61
Jean-Philippe Brucker 0:1484ce3a8cdf 62 static void waiting() {
Jean-Philippe Brucker 0:1484ce3a8cdf 63 if (!kbdServicePtr->isConnected())
Jean-Philippe Brucker 0:1484ce3a8cdf 64 waiting_led = !waiting_led;
Jean-Philippe Brucker 0:1484ce3a8cdf 65 else
Jean-Philippe Brucker 0:1484ce3a8cdf 66 connected_led = !connected_led;
Jean-Philippe Brucker 0:1484ce3a8cdf 67 }
Jean-Philippe Brucker 0:1484ce3a8cdf 68
Jean-Philippe Brucker 0:1484ce3a8cdf 69 void send_string(const char * c) {
Jean-Philippe Brucker 0:1484ce3a8cdf 70 if (!kbdServicePtr)
Jean-Philippe Brucker 0:1484ce3a8cdf 71 return;
Jean-Philippe Brucker 0:1484ce3a8cdf 72
Jean-Philippe Brucker 0:1484ce3a8cdf 73 if (!kbdServicePtr->isConnected()) {
Jean-Philippe Brucker 0:1484ce3a8cdf 74 HID_DEBUG("we haven't connected yet...");
Jean-Philippe Brucker 0:1484ce3a8cdf 75 } else {
Jean-Philippe Brucker 0:1484ce3a8cdf 76 int len = strlen(c);
Jean-Philippe Brucker 0:1484ce3a8cdf 77 kbdServicePtr->printf(c);
Jean-Philippe Brucker 0:1484ce3a8cdf 78 HID_DEBUG("sending %d chars\r\n", len);
Jean-Philippe Brucker 0:1484ce3a8cdf 79 }
Jean-Philippe Brucker 0:1484ce3a8cdf 80 }
Jean-Philippe Brucker 0:1484ce3a8cdf 81
Jean-Philippe Brucker 0:1484ce3a8cdf 82 void send_stuff() {
Jean-Philippe Brucker 0:1484ce3a8cdf 83 send_string("hello world!");
Jean-Philippe Brucker 0:1484ce3a8cdf 84 }
Jean-Philippe Brucker 0:1484ce3a8cdf 85
Jean-Philippe Brucker 0:1484ce3a8cdf 86 void send_more_stuff() {
Jean-Philippe Brucker 0:1484ce3a8cdf 87 send_string("All work and no play makes Jack a dull boy\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 88 }
Jean-Philippe Brucker 0:1484ce3a8cdf 89
Jean-Philippe Brucker 0:1484ce3a8cdf 90 int main()
Jean-Philippe Brucker 0:1484ce3a8cdf 91 {
Jean-Philippe Brucker 0:1484ce3a8cdf 92 Ticker heartbeat;
Jean-Philippe Brucker 0:1484ce3a8cdf 93
Jean-Philippe Brucker 0:1484ce3a8cdf 94 button1.rise(send_stuff);
Jean-Philippe Brucker 0:1484ce3a8cdf 95 button2.rise(send_more_stuff);
Jean-Philippe Brucker 0:1484ce3a8cdf 96
Jean-Philippe Brucker 0:1484ce3a8cdf 97 HID_DEBUG("initialising ticker\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 98
Jean-Philippe Brucker 0:1484ce3a8cdf 99 heartbeat.attach(waiting, 1);
Jean-Philippe Brucker 0:1484ce3a8cdf 100
Jean-Philippe Brucker 0:1484ce3a8cdf 101 HID_DEBUG("initialising ble\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 102 ble.init();
Jean-Philippe Brucker 0:1484ce3a8cdf 103
Jean-Philippe Brucker 0:1484ce3a8cdf 104 ble.gap().onDisconnection(onDisconnect);
Jean-Philippe Brucker 0:1484ce3a8cdf 105 ble.gap().onConnection(onConnect);
Jean-Philippe Brucker 0:1484ce3a8cdf 106
Jean-Philippe Brucker 0:1484ce3a8cdf 107 initializeSecurity(ble);
Jean-Philippe Brucker 0:1484ce3a8cdf 108
Jean-Philippe Brucker 0:1484ce3a8cdf 109 HID_DEBUG("adding hid service\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 110 KeyboardService kbdService(ble);
Jean-Philippe Brucker 0:1484ce3a8cdf 111 kbdServicePtr = &kbdService;
Jean-Philippe Brucker 0:1484ce3a8cdf 112
Jean-Philippe Brucker 0:1484ce3a8cdf 113 HID_DEBUG("adding device info and battery service\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 114 initializeHOGP(ble);
Jean-Philippe Brucker 0:1484ce3a8cdf 115
Jean-Philippe Brucker 0:1484ce3a8cdf 116 HID_DEBUG("setting up gap\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 117 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::KEYBOARD);
Jean-Philippe Brucker 0:1484ce3a8cdf 118 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME,
Jean-Philippe Brucker 0:1484ce3a8cdf 119 (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Jean-Philippe Brucker 0:1484ce3a8cdf 120 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
Jean-Philippe Brucker 0:1484ce3a8cdf 121 (uint8_t *)SHORT_DEVICE_NAME, sizeof(SHORT_DEVICE_NAME));
Jean-Philippe Brucker 0:1484ce3a8cdf 122
Jean-Philippe Brucker 0:1484ce3a8cdf 123 HID_DEBUG("advertising\r\n");
Jean-Philippe Brucker 0:1484ce3a8cdf 124 ble.gap().startAdvertising();
Jean-Philippe Brucker 0:1484ce3a8cdf 125
Jean-Philippe Brucker 0:1484ce3a8cdf 126 while (true) {
Jean-Philippe Brucker 0:1484ce3a8cdf 127 ble.waitForEvent();
Jean-Philippe Brucker 0:1484ce3a8cdf 128 }
Jean-Philippe Brucker 0:1484ce3a8cdf 129 }