AndroidにキーボードとしてBLEモジュールを認識させて、ショートカットを叩けます。 ショートカットキー btn1:Alt + Tab btn2: Enter

Dependencies:   BLE_API mbed nRF51822

Committer:
leibun
Date:
Tue Sep 15 02:53:19 2015 +0000
Revision:
0:f9f11f6ee09d
First commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leibun 0:f9f11f6ee09d 1 #ifndef __BLE_HID_SERVICE_H__
leibun 0:f9f11f6ee09d 2 #define __BLE_HID_SERVICE_H__
leibun 0:f9f11f6ee09d 3
leibun 0:f9f11f6ee09d 4 #include <stdio.h>
leibun 0:f9f11f6ee09d 5 #include "BLE.h"
leibun 0:f9f11f6ee09d 6 /**
leibun 0:f9f11f6ee09d 7 * @class Human Interface Device Service
leibun 0:f9f11f6ee09d 8 * @brief BLE Human Interface Device Service. This service displays the Glucose measurement value represented as a 16bit Float format.<br>
leibun 0:f9f11f6ee09d 9 * @Author: Marco.Hsu
leibun 0:f9f11f6ee09d 10 * @Email: marco.missyou@gmail.com
leibun 0:f9f11f6ee09d 11 */
leibun 0:f9f11f6ee09d 12
leibun 0:f9f11f6ee09d 13 extern const uint8_t KeyboardReportMap[76];
leibun 0:f9f11f6ee09d 14
leibun 0:f9f11f6ee09d 15 class HIDService {
leibun 0:f9f11f6ee09d 16 public:
leibun 0:f9f11f6ee09d 17 HIDService(BLEDevice &_ble, const uint8_t* key = &KeyboardReportMap[0]):
leibun 0:f9f11f6ee09d 18 ble(_ble),
leibun 0:f9f11f6ee09d 19 protocol_modeValue(1), // Report Protocol Mode(1), Boot Protocol Mode(0)
leibun 0:f9f11f6ee09d 20 KeyboardMap(key),
leibun 0:f9f11f6ee09d 21 Protocol_Mode(GattCharacteristic::UUID_PROTOCOL_MODE_CHAR, &protocol_modeValue, 1, 1, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
leibun 0:f9f11f6ee09d 22 ReportMap(GattCharacteristic::UUID_REPORT_MAP_CHAR, KeyboardMap.getPointer(), 76, sizeof(KeyboardMap), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ |GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY),
leibun 0:f9f11f6ee09d 23 Report(GattCharacteristic::UUID_REPORT_CHAR, reportValue.getPointer(), 8, 8, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
leibun 0:f9f11f6ee09d 24 HID_Information(GattCharacteristic::UUID_HID_INFORMATION_CHAR, hidInformation.getPointer(), 4, 4, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ),
leibun 0:f9f11f6ee09d 25 HID_Control_Point(GattCharacteristic::UUID_HID_CONTROL_POINT_CHAR, &hidcontrolPointer, 1, 1, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE)
leibun 0:f9f11f6ee09d 26 {
leibun 0:f9f11f6ee09d 27 static bool serviceAdded = false; /* We should only ever need to add the heart rate service once. */
leibun 0:f9f11f6ee09d 28 if (serviceAdded) {
leibun 0:f9f11f6ee09d 29 return;
leibun 0:f9f11f6ee09d 30 }
leibun 0:f9f11f6ee09d 31 //Report.requireSecurity(SecurityManager::SECURITY_MODE_ENCRYPTION_OPEN_LINK);
leibun 0:f9f11f6ee09d 32 GattCharacteristic *charTable[] = {&Protocol_Mode, &ReportMap, &Report, &HID_Information, &HID_Control_Point};
leibun 0:f9f11f6ee09d 33 GattService HIDGattService(GattService::UUID_HUMAN_INTERFACE_DEVICE_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
leibun 0:f9f11f6ee09d 34 ble.addService(HIDGattService);
leibun 0:f9f11f6ee09d 35 serviceAdded = true;
leibun 0:f9f11f6ee09d 36 ble.onDataWritten(this, &HIDService::onDataWritten);
leibun 0:f9f11f6ee09d 37 }
leibun 0:f9f11f6ee09d 38 public:
leibun 0:f9f11f6ee09d 39 void updateReport(uint8_t modifydata, uint8_t data) {
leibun 0:f9f11f6ee09d 40 reportValue.updateReportValue(modifydata, data);
leibun 0:f9f11f6ee09d 41
leibun 0:f9f11f6ee09d 42 uint8_t *pRv = reportValue.getPointer();
leibun 0:f9f11f6ee09d 43 printf("reportValue[8]:");
leibun 0:f9f11f6ee09d 44 for(int i=0;i<8;i++){ printf("%x:",pRv[i]);}
leibun 0:f9f11f6ee09d 45 printf("\r\n");
leibun 0:f9f11f6ee09d 46
leibun 0:f9f11f6ee09d 47 ble.updateCharacteristicValue(Report.getValueAttribute().getHandle(), reportValue.getPointer(), 8);
leibun 0:f9f11f6ee09d 48 }
leibun 0:f9f11f6ee09d 49
leibun 0:f9f11f6ee09d 50 virtual void onDataWritten(const GattWriteCallbackParams *params) {
leibun 0:f9f11f6ee09d 51 if (params->handle == HID_Control_Point.getValueAttribute().getHandle()) {
leibun 0:f9f11f6ee09d 52 uint16_t bytesRead = params->len;
leibun 0:f9f11f6ee09d 53 if (bytesRead == 1) {
leibun 0:f9f11f6ee09d 54 memcpy(&hidcontrolPointer, params->data, bytesRead);
leibun 0:f9f11f6ee09d 55 }
leibun 0:f9f11f6ee09d 56 }
leibun 0:f9f11f6ee09d 57 if (params->handle == Report.getValueAttribute().getHandle()) {
leibun 0:f9f11f6ee09d 58 uint16_t bytesRead = params->len;
leibun 0:f9f11f6ee09d 59 if (bytesRead <= 4) {
leibun 0:f9f11f6ee09d 60 memcpy(&reportValue, params->data, bytesRead);
leibun 0:f9f11f6ee09d 61 }
leibun 0:f9f11f6ee09d 62 }
leibun 0:f9f11f6ee09d 63 }
leibun 0:f9f11f6ee09d 64
leibun 0:f9f11f6ee09d 65 private:
leibun 0:f9f11f6ee09d 66 struct ReportMapStructure{
leibun 0:f9f11f6ee09d 67 uint8_t KeyboardMap[76];
leibun 0:f9f11f6ee09d 68 ReportMapStructure(const uint8_t* data): KeyboardMap() {
leibun 0:f9f11f6ee09d 69 memcpy(&KeyboardMap[0], data, 76);
leibun 0:f9f11f6ee09d 70 }
leibun 0:f9f11f6ee09d 71 uint8_t *getPointer(void) {
leibun 0:f9f11f6ee09d 72 return KeyboardMap;
leibun 0:f9f11f6ee09d 73 }
leibun 0:f9f11f6ee09d 74 };
leibun 0:f9f11f6ee09d 75
leibun 0:f9f11f6ee09d 76 private:
leibun 0:f9f11f6ee09d 77 struct ReportStructure {
leibun 0:f9f11f6ee09d 78 // Initial setting report value
leibun 0:f9f11f6ee09d 79 ReportStructure(): reportValue() {
leibun 0:f9f11f6ee09d 80 uint8_t data= 0x00;
leibun 0:f9f11f6ee09d 81 updateReportValue(data, data);
leibun 0:f9f11f6ee09d 82 }
leibun 0:f9f11f6ee09d 83
leibun 0:f9f11f6ee09d 84 void updateReportValue(uint8_t modifyKey, uint8_t data){
leibun 0:f9f11f6ee09d 85 memset(&reportValue[0], 0 ,8);
leibun 0:f9f11f6ee09d 86 memcpy(&reportValue[0], &modifyKey, 1);
leibun 0:f9f11f6ee09d 87 memcpy(&reportValue[2], &data, 1);
leibun 0:f9f11f6ee09d 88 }
leibun 0:f9f11f6ee09d 89
leibun 0:f9f11f6ee09d 90 uint8_t *getPointer(void) {
leibun 0:f9f11f6ee09d 91 return reportValue;
leibun 0:f9f11f6ee09d 92 }
leibun 0:f9f11f6ee09d 93
leibun 0:f9f11f6ee09d 94 uint8_t reportValue[8];
leibun 0:f9f11f6ee09d 95 };
leibun 0:f9f11f6ee09d 96
leibun 0:f9f11f6ee09d 97 private:
leibun 0:f9f11f6ee09d 98 struct HIDInforStructure{
leibun 0:f9f11f6ee09d 99 uint16_t bcdHID;
leibun 0:f9f11f6ee09d 100 uint8_t bCountryCode;
leibun 0:f9f11f6ee09d 101 uint8_t Flags;
leibun 0:f9f11f6ee09d 102
leibun 0:f9f11f6ee09d 103 HIDInforStructure():bcdHID(0x001)/*Release version 0.01*/,bCountryCode(33)/*US*/,Flags(0){
leibun 0:f9f11f6ee09d 104 memcpy(&hidInformation[0], &bcdHID, 2);
leibun 0:f9f11f6ee09d 105 memcpy(&hidInformation[2], &bCountryCode, 1);
leibun 0:f9f11f6ee09d 106 memcpy(&hidInformation[3], &Flags, 1);
leibun 0:f9f11f6ee09d 107 }
leibun 0:f9f11f6ee09d 108 uint8_t *getPointer(void) {
leibun 0:f9f11f6ee09d 109 return hidInformation;
leibun 0:f9f11f6ee09d 110 }
leibun 0:f9f11f6ee09d 111
leibun 0:f9f11f6ee09d 112 uint8_t hidInformation[4];
leibun 0:f9f11f6ee09d 113 };
leibun 0:f9f11f6ee09d 114
leibun 0:f9f11f6ee09d 115 private:
leibun 0:f9f11f6ee09d 116 BLEDevice &ble;
leibun 0:f9f11f6ee09d 117 uint8_t protocol_modeValue;
leibun 0:f9f11f6ee09d 118 ReportStructure reportValue;
leibun 0:f9f11f6ee09d 119 uint8_t hidcontrolPointer;
leibun 0:f9f11f6ee09d 120 ReportMapStructure KeyboardMap;
leibun 0:f9f11f6ee09d 121 HIDInforStructure hidInformation;
leibun 0:f9f11f6ee09d 122 GattCharacteristic Protocol_Mode;
leibun 0:f9f11f6ee09d 123 GattCharacteristic ReportMap;
leibun 0:f9f11f6ee09d 124 GattCharacteristic Report;
leibun 0:f9f11f6ee09d 125 // ReadOnlyGattCharacteristic Boot_Keyboard_Input_Report;
leibun 0:f9f11f6ee09d 126 // ReadWriteGattCharacteristic Boot_Keyboard_Output_Report;
leibun 0:f9f11f6ee09d 127 // ReadOnlyGattCharacteristic Boot_Mouse_Input_Report;
leibun 0:f9f11f6ee09d 128 GattCharacteristic HID_Information;
leibun 0:f9f11f6ee09d 129 GattCharacteristic HID_Control_Point;
leibun 0:f9f11f6ee09d 130 };
leibun 0:f9f11f6ee09d 131 #endif /* #ifndef __BLE_GLUCOSE_SERVICE_H__*/