Hiroh Satoh / keyboard Featured

Dependencies:   BLE_API mbed-dev nRF51822

Revision:
0:be89b5fdea09
Child:
2:c2e3f240640c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Jul 17 23:08:32 2016 +0000
@@ -0,0 +1,205 @@
+/* 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(); 
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+