Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed-dev nRF51822
main.cpp
- Committer:
- cho45
- Date:
- 2016-07-17
- Revision:
- 0:be89b5fdea09
- Child:
- 2:c2e3f240640c
File content as of revision 0:be89b5fdea09:
/* mbed Microcontroller Library
* Copyright (c) 2015 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "mbed.h"
#include "BLE.h"
#include "KeyboardService.h"
#include "BatteryService.h"
#include "DeviceInformationService.h"
static const char MODEL_NAME[] = "keyboard";
static const char SERIAL_NUMBER[] = "X00000";
static const char HARDWARE_REVISION[] = "0.1";
static const char FIRMWARE_REVISION[] = "0.1";
static const char SOFTWARE_REVISION[] = "0.0";
static const uint8_t DEVICE_NAME[] = "my keyboard";
static const uint8_t SHORT_DEVICE_NAME[] = "kbd1";
InterruptIn button1(D2);
static const uint16_t uuid16_list[] = {
GattService::UUID_HUMAN_INTERFACE_DEVICE_SERVICE,
GattService::UUID_DEVICE_INFORMATION_SERVICE,
GattService::UUID_BATTERY_SERVICE
};
KeyboardService* keyboardService;
BatteryService* batteryService;
DeviceInformationService* deviceInformationService;
// I2C i2c(D2, D3);
// AnalogIn batteryInput(A4);
static void onDisconnect(const Gap::DisconnectionCallbackParams_t *params) {
printf("onDisconnect\r\n");
BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
}
static void onConnect(const Gap::ConnectionCallbackParams_t *params) {
printf("onConnect\r\n");
}
static void passkeyDisplayCallback(Gap::Handle_t handle, const SecurityManager::Passkey_t passkey) {
printf("Input passKey: ");
for (unsigned i = 0; i < Gap::ADDR_LEN; i++) {
printf("%c", passkey[i]);
}
printf("\r\n");
}
static void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status)
{
if (status == SecurityManager::SEC_STATUS_SUCCESS) {
printf("Security success %d\r\n", status);
} else {
printf("Security failed %d\r\n", status);
}
}
static void securitySetupInitiatedCallback(Gap::Handle_t, bool allowBonding, bool requireMITM, SecurityManager::SecurityIOCapabilities_t iocaps)
{
printf("Security setup initiated\r\n");
}
void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) {
BLE &ble = params->ble;
ble_error_t error = params->error;
if (error != BLE_ERROR_NONE) {
printf("error on ble.init() \r\n");
return;
}
ble.gap().onDisconnection(onDisconnect);
ble.gap().onConnection(onConnect);
bool enableBonding = true;
bool requireMITM = true;
uint8_t passkey[] = "123456";
printf("setup ble security manager\r\n");
ble.securityManager().onSecuritySetupInitiated(securitySetupInitiatedCallback);
ble.securityManager().onPasskeyDisplay(passkeyDisplayCallback);
ble.securityManager().onSecuritySetupCompleted(securitySetupCompletedCallback);
// TODO
// ble.securityManager().init(true, true, SecurityManager::IO_CAPS_DISPLAY_ONLY);
// ble.securityManager().init(enableBonding, requireMITM, SecurityManager::IO_CAPS_KEYBOARD_ONLY, passkey);
// ble.securityManager().init(enableBonding, requireMITM, SecurityManager::IO_CAPS_NONE);
ble.securityManager().init(enableBonding, requireMITM, SecurityManager::IO_CAPS_DISPLAY_ONLY, passkey);
keyboardService = new KeyboardService(ble);
deviceInformationService = new DeviceInformationService(ble, "lowreal.net", MODEL_NAME, SERIAL_NUMBER, HARDWARE_REVISION, FIRMWARE_REVISION, SOFTWARE_REVISION);
batteryService = new BatteryService(ble, 10);
printf("general setup\r\n");
ble.gap().accumulateAdvertisingPayload(
GapAdvertisingData::BREDR_NOT_SUPPORTED |
GapAdvertisingData::LE_GENERAL_DISCOVERABLE
);
ble.gap().accumulateAdvertisingPayload(
GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
(uint8_t*)uuid16_list, sizeof(uuid16_list)
);
printf("set advertising\r\n");
// see 5.1.2: HID over GATT Specification (pg. 25)
ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
printf("set advertising interval\r\n");
ble.gap().setAdvertisingInterval(50);
// XXX
ble.gap().setAdvertisingTimeout(0);
printf("set key board\r\n");
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::KEYBOARD);
ble.gap().accumulateAdvertisingPayload(
GapAdvertisingData::COMPLETE_LOCAL_NAME,
DEVICE_NAME, sizeof(DEVICE_NAME)
);
ble.gap().accumulateAdvertisingPayload(
GapAdvertisingData::SHORTENED_LOCAL_NAME,
SHORT_DEVICE_NAME, sizeof(SHORT_DEVICE_NAME)
);
printf("set device name\r\n");
ble.gap().setDeviceName(DEVICE_NAME);
// ble.gap().setTxPower(-12);
printf("advertising\r\n");
ble.gap().startAdvertising();
}
void send_string(const char * c) {
if (!keyboardService)
return;
if (!keyboardService->isConnected()) {
printf("we haven't connected yet...");
} else {
int len = strlen(c);
keyboardService->printf(c);
printf("sending %d chars\r\n", len);
}
}
void send_stuff() {
send_string("hello world!\n");
}
int main(void) {
// https://github.com/jpbrucker/BLE_HID/blob/master/examples/examples_common.cpp
printf("ble.init\r\n");
BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
ble.init(bleInitComplete);
button1.rise(send_stuff);
// TODO: Use internal 1.2V reference for batteryInput
while (!ble.hasInitialized()) { }
printf("ble.hasIntialized\r\n");
while(1) {
ble.waitForEvent();
}
}