ble nano hid over gatt

Dependencies:   BLE_API mbed-dev nRF51822

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),