ble nano hid over gatt
Dependencies: BLE_API mbed-dev nRF51822
Diff: KeyboardService.h
- Revision:
- 75:351d7ffe81d1
- Parent:
- 60:b899414e1d34
- Child:
- 79:0095bfb18c57
--- a/KeyboardService.h Fri Sep 02 09:41:12 2016 +0900 +++ b/KeyboardService.h Fri Sep 02 21:16:15 2016 +0900 @@ -28,51 +28,66 @@ USAGE_PAGE(1), 0x01, // Generic Desktop Ctrls USAGE(1), 0x06, // Keyboard COLLECTION(1), 0x01, // Application - USAGE_PAGE(1), 0x07, // Kbrd/Keypad - USAGE_MINIMUM(1), 0xE0, - USAGE_MAXIMUM(1), 0xE7, - LOGICAL_MINIMUM(1), 0x00, - LOGICAL_MAXIMUM(1), 0x01, - REPORT_SIZE(1), 0x01, // 1 byte (Modifier) - REPORT_COUNT(1), 0x08, - INPUT(1), 0x02, // Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position - REPORT_COUNT(1), 0x01, // 1 byte (Reserved) - REPORT_SIZE(1), 0x08, - INPUT(1), 0x01, // Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position - REPORT_COUNT(1), 0x05, // 5 bits (Num lock, Caps lock, Scroll lock, Compose, Kana) - REPORT_SIZE(1), 0x01, - USAGE_PAGE(1), 0x08, // LEDs - USAGE_MINIMUM(1), 0x01, // Num Lock - USAGE_MAXIMUM(1), 0x05, // Kana - OUTPUT(1), 0x02, // Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile - REPORT_COUNT(1), 0x01, // 3 bits (Padding) - REPORT_SIZE(1), 0x03, - OUTPUT(1), 0x01, // Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile - REPORT_COUNT(1), 0x06, // 6 bytes (Keys) - REPORT_SIZE(1), 0x08, - LOGICAL_MINIMUM(1), 0x00, - LOGICAL_MAXIMUM(1), 0x65, // 101 keys - USAGE_PAGE(1), 0x07, // Kbrd/Keypad - USAGE_MINIMUM(1), 0x00, - USAGE_MAXIMUM(1), 0x65, - INPUT(1), 0x00, // Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position + USAGE_PAGE(1), 0x07, // Kbrd/Keypad + USAGE_MINIMUM(1), 0xE0, + USAGE_MAXIMUM(1), 0xE7, + LOGICAL_MINIMUM(1), 0x00, + LOGICAL_MAXIMUM(1), 0x01, + REPORT_SIZE(1), 0x01, // 1 byte (Modifier) + REPORT_COUNT(1), 0x08, + INPUT(1), 0x02, // Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position + + REPORT_COUNT(1), 0x01, // 1 byte (Reserved) + REPORT_SIZE(1), 0x08, + INPUT(1), 0x01, // Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position + + REPORT_COUNT(1), 0x05, // 5 bits (Num lock, Caps lock, Scroll lock, Compose, Kana) + REPORT_SIZE(1), 0x01, + USAGE_PAGE(1), 0x08, // LEDs + USAGE_MINIMUM(1), 0x01, // Num Lock + USAGE_MAXIMUM(1), 0x05, // Kana + OUTPUT(1), 0x02, // Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile + + REPORT_COUNT(1), 0x01, // 3 bits (Padding) + REPORT_SIZE(1), 0x03, + OUTPUT(1), 0x01, // Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile + + REPORT_COUNT(1), 0x06, // 6 bytes (Keys) + REPORT_SIZE(1), 0x08, + LOGICAL_MINIMUM(1), 0x00, + LOGICAL_MAXIMUM(1), 0x65, // 101 keys + USAGE_PAGE(1), 0x07, // Kbrd/Keypad + USAGE_MINIMUM(1), 0x00, + USAGE_MAXIMUM(1), 0x65, + INPUT(1), 0x00, // Data,Array,Abs,No Wrap,Linear,Preferred State,No Null Position + + USAGE_PAGE(1), 0x00, // Undefined + USAGE_MINIMUM(1), 0x00, + USAGE_MAXIMUM(1), 0xFF, + REPORT_COUNT(1), 0x01, // 1 byte + REPORT_SIZE(1), 0x08, + FEATURE(1), 0x02, // Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile END_COLLECTION(0), }; -union InputReportData { - uint8_t raw[8]; - struct { - uint8_t modifier; - uint8_t padding; - uint8_t keycode[6]; - } data; -}; +class KeyboardService : public HIDServiceBase { -union { - uint8_t raw[1]; -} outputReportData; + union InputReportData { + uint8_t raw[8]; + struct { + uint8_t modifier; + uint8_t padding; + uint8_t keycode[6]; + } data; + }; -class KeyboardService : public HIDServiceBase { + union OutputReportData { + uint8_t raw[1]; + }; + + union FeatureReportData { + uint8_t raw[1]; + }; InputReportData inputReportDataPublished; InputReportData inputReportData; @@ -84,6 +99,8 @@ // 実際にカウントして測ってみたところ、どんなに乱暴に連打しても8ぐらいまでしかいかない CircularBuffer<InputReportData, 8, uint8_t> inputReportBuffer; InputReportData inputReportDataSending; + OutputReportData outputReportData; + FeatureReportData featureReportData; bool isSending; static const uint8_t MODIFIER_LEFT_CONTROL = 1<<0; @@ -106,10 +123,10 @@ sizeof(KEYBOARD_REPORT_MAP), inputReport = inputReportDataPublished.raw, outputReport = outputReportData.raw, - featureReport = NULL, + featureReport = featureReportData.raw, inputReportLength = sizeof(inputReportData), outputReportLength = sizeof(outputReportData), - featureReportLength = 0, + featureReportLength = sizeof(featureReportData), reportTickerDelay = 20 ), isSending(false),