ble nano hid over gatt

Dependencies:   BLE_API mbed-dev nRF51822

Revision:
9:d1daefbf1fbd
Parent:
7:b9270a37345b
Child:
21:d801c32231b0
--- a/KeyboardService.h	Thu Jul 21 08:45:27 2016 +0900
+++ b/KeyboardService.h	Thu Jul 21 21:33:56 2016 +0900
@@ -68,6 +68,7 @@
 		} data;
 	};
 
+	InputReportData inputReportDataPublished;
 	InputReportData inputReportData;
 
 	union {
@@ -87,18 +88,13 @@
 	static const uint8_t MODIFIER_RIGHT_ALT = 1<<6;
 	static const uint8_t MODIFIER_RIGHT_GUI = 1<<7;
 
-	void queueCurrentReportData() {
-		inputReportBuffer.push(inputReportData);
-		startReportTicker();
-	}
-
 public:
 	KeyboardService(BLE& _ble) :
 		HIDServiceBase(
 			_ble,
 			KEYBOARD_REPORT_MAP,
 			sizeof(KEYBOARD_REPORT_MAP),
-			inputReport         = inputReportData.raw,
+			inputReport         = inputReportDataPublished.raw,
 			outputReport        = outputReportData.raw,
 			featureReport       = NULL,
 			inputReportLength   = sizeof(inputReportData),
@@ -120,7 +116,6 @@
 		uint8_t modifier = toModifierBit(keycode);
 		if (modifier) {
 			inputReportData.data.modifier |= modifier;
-			queueCurrentReportData();
 			return;
 		}
 
@@ -128,7 +123,6 @@
 		for (int i = 0; i < 6; i++) {
 			if (inputReportData.data.keycode[i] == 0) {
 				inputReportData.data.keycode[i] = keycode;
-				queueCurrentReportData();
 				return;
 			}
 		}
@@ -140,19 +134,22 @@
 		uint8_t modifier = toModifierBit(keycode);
 		if (modifier) {
 			inputReportData.data.modifier &= ~modifier;
-			queueCurrentReportData();
 			return;
 		}
 
 		for (int i = 0; i < 6; i++) {
 			if (inputReportData.data.keycode[i] == keycode) {
 				inputReportData.data.keycode[i] = 0;
-				queueCurrentReportData();
 				return;
 			}
 		}
 	}
 
+	void queueCurrentReportData() {
+		inputReportBuffer.push(inputReportData);
+		startReportTicker();
+	}
+
 	uint8_t toModifierBit(uint8_t keycode) const {
 		switch (keycode) {
 			case KEY_LeftControl:  return MODIFIER_LEFT_CONTROL;
@@ -179,13 +176,10 @@
 	virtual void sendCallback(void) {
 		// do not call printf in this function... it cause BLE_STACK_BUSY
 
-		InputReportData data;
-		if (isSending) {
-			data = inputReportDataSending;
-		} else {
-			if (!inputReportBuffer.pop(data)) {
+		if (!isSending) {
+			if (!inputReportBuffer.pop(inputReportDataSending)) {
 				if (isKeyPressed()) {
-					data = inputReportData;
+					inputReportDataSending = inputReportData;
 				} else {
 					stopReportTicker();
 					return;
@@ -195,14 +189,13 @@
 
 		static uint8_t busyCount = 0;
 		isSending = true;
-		ble_error_t error = HIDServiceBase::send(data.raw);
+		ble_error_t error = HIDServiceBase::send(inputReportDataSending.raw);
 		if (error == BLE_STACK_BUSY) {
 			if (busyCount++ > 10) {
 				busyCount = 0;
 				printf("BLE_STACK_BUSY is over 10-times stop\r\n");
 				stopReportTicker();
 			}
-			inputReportDataSending = data;
 			// retry after
 			return;
 		}