AndroidにキーボードとしてBLEモジュールを認識させて、ショートカットを叩けます。 ショートカットキー btn1:Alt + Tab btn2: Enter
Dependencies: BLE_API mbed nRF51822
HIDService.h@0:f9f11f6ee09d, 2015-09-15 (annotated)
- Committer:
- leibun
- Date:
- Tue Sep 15 02:53:19 2015 +0000
- Revision:
- 0:f9f11f6ee09d
First commit.
Who changed what in which revision?
User | Revision | Line number | New 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__*/ |