A BLE HID controller implementation with communication over SPI

Dependencies:   BLE_API BLE_HID mbed nRF51822

Committer:
mrhannah
Date:
Wed Dec 13 05:34:15 2017 +0000
Revision:
0:f21dc3a04d62
Initial/(final) changes for project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mrhannah 0:f21dc3a04d62 1 /* mbed Microcontroller Library
mrhannah 0:f21dc3a04d62 2 * Copyright (c) 2015 ARM Limited
mrhannah 0:f21dc3a04d62 3 *
mrhannah 0:f21dc3a04d62 4 * Licensed under the Apache License, Version 2.0 (the "License");
mrhannah 0:f21dc3a04d62 5 * you may not use this file except in compliance with the License.
mrhannah 0:f21dc3a04d62 6 * You may obtain a copy of the License at
mrhannah 0:f21dc3a04d62 7 *
mrhannah 0:f21dc3a04d62 8 * http://www.apache.org/licenses/LICENSE-2.0
mrhannah 0:f21dc3a04d62 9 *
mrhannah 0:f21dc3a04d62 10 * Unless required by applicable law or agreed to in writing, software
mrhannah 0:f21dc3a04d62 11 * distributed under the License is distributed on an "AS IS" BASIS,
mrhannah 0:f21dc3a04d62 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mrhannah 0:f21dc3a04d62 13 * See the License for the specific language governing permissions and
mrhannah 0:f21dc3a04d62 14 * limitations under the License.
mrhannah 0:f21dc3a04d62 15 */
mrhannah 0:f21dc3a04d62 16
mrhannah 0:f21dc3a04d62 17 #include "mbed.h"
mrhannah 0:f21dc3a04d62 18
mrhannah 0:f21dc3a04d62 19 #include "HIDServiceBase.h"
mrhannah 0:f21dc3a04d62 20
mrhannah 0:f21dc3a04d62 21 /**
mrhannah 0:f21dc3a04d62 22 * Report descriptor for a standard 3 buttons + wheel mouse with relative X/Y
mrhannah 0:f21dc3a04d62 23 * moves
mrhannah 0:f21dc3a04d62 24 */
mrhannah 0:f21dc3a04d62 25 report_map_t CONTROLLER_REPORT_MAP = {
mrhannah 0:f21dc3a04d62 26 USAGE_PAGE(1), 0x01, // Genric Desktop
mrhannah 0:f21dc3a04d62 27 USAGE(1), 0x05, // Gamepad
mrhannah 0:f21dc3a04d62 28 COLLECTION(1), 0x01, // Application
mrhannah 0:f21dc3a04d62 29 COLLECTION(1), 0x00, // Physical
mrhannah 0:f21dc3a04d62 30
mrhannah 0:f21dc3a04d62 31 REPORT_ID(1), 0x03, // Report ID 3
mrhannah 0:f21dc3a04d62 32 USAGE_PAGE(1), 0x09, // Buttons
mrhannah 0:f21dc3a04d62 33 USAGE_MINIMUM(1), 0x01, // Minimum of 1
mrhannah 0:f21dc3a04d62 34 USAGE_MAXIMUM(1), 0x10, // Maximum of 16
mrhannah 0:f21dc3a04d62 35 LOGICAL_MINIMUM(1), 0x00, // Logical Minimum of 0
mrhannah 0:f21dc3a04d62 36 LOGICAL_MAXIMUM(1), 0x01, // Logical Maximum of 1
mrhannah 0:f21dc3a04d62 37 REPORT_SIZE(1), 0x01, // Each report is 1 bit
mrhannah 0:f21dc3a04d62 38 REPORT_COUNT(1), 0x10, // All in all 16 * 1 bit
mrhannah 0:f21dc3a04d62 39 INPUT(1), 0x02, // Input (Data, Var, Abs)
mrhannah 0:f21dc3a04d62 40
mrhannah 0:f21dc3a04d62 41 USAGE_PAGE(1), 0x01, // Generic Desktop
mrhannah 0:f21dc3a04d62 42 USAGE(1), 0x30, // Usage X
mrhannah 0:f21dc3a04d62 43 USAGE(1), 0x31, // Usage Y
mrhannah 0:f21dc3a04d62 44 USAGE(1), 0x32, // Usage Z
mrhannah 0:f21dc3a04d62 45 USAGE(1), 0x33, // Usage Rx
mrhannah 0:f21dc3a04d62 46 LOGICAL_MINIMUM(1), 0x00, // Logical Minimum: 0
mrhannah 0:f21dc3a04d62 47 LOGICAL_MAXIMUM(1), 0xFE, // Logical maximum: 254
mrhannah 0:f21dc3a04d62 48 REPORT_SIZE(1), 0x08, // Each report is 8 bits
mrhannah 0:f21dc3a04d62 49 REPORT_COUNT(1), 0x04, // 4 reports * 8 bits
mrhannah 0:f21dc3a04d62 50 INPUT(1), 0x02, // Input (Data, Var, Abs)
mrhannah 0:f21dc3a04d62 51 END_COLLECTION(0),
mrhannah 0:f21dc3a04d62 52 END_COLLECTION(0)
mrhannah 0:f21dc3a04d62 53 };
mrhannah 0:f21dc3a04d62 54
mrhannah 0:f21dc3a04d62 55 uint8_t report[7] = {0x03, 0, 0, 0, 0, 0, 0};
mrhannah 0:f21dc3a04d62 56
mrhannah 0:f21dc3a04d62 57 //bool toggle = true;
mrhannah 0:f21dc3a04d62 58 //uint8_t onReport[7] = {0x03, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80};
mrhannah 0:f21dc3a04d62 59 //uint8_t offReport[7] = {0x03, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20};
mrhannah 0:f21dc3a04d62 60
mrhannah 0:f21dc3a04d62 61 class ControllerService: public HIDServiceBase
mrhannah 0:f21dc3a04d62 62 {
mrhannah 0:f21dc3a04d62 63 public:
mrhannah 0:f21dc3a04d62 64 ControllerService(BLE &_ble) :
mrhannah 0:f21dc3a04d62 65 HIDServiceBase(_ble,
mrhannah 0:f21dc3a04d62 66 CONTROLLER_REPORT_MAP, sizeof(CONTROLLER_REPORT_MAP),
mrhannah 0:f21dc3a04d62 67 inputReport = report,
mrhannah 0:f21dc3a04d62 68 outputReport = NULL,
mrhannah 0:f21dc3a04d62 69 featureReport = NULL,
mrhannah 0:f21dc3a04d62 70 inputReportLength = 7,
mrhannah 0:f21dc3a04d62 71 outputReportLength = 0,
mrhannah 0:f21dc3a04d62 72 featureReportLength = 0,
mrhannah 0:f21dc3a04d62 73 reportTickerDelay = 250)
mrhannah 0:f21dc3a04d62 74 {
mrhannah 0:f21dc3a04d62 75 failedReports = 0;
mrhannah 0:f21dc3a04d62 76 startReportTicker();
mrhannah 0:f21dc3a04d62 77 }
mrhannah 0:f21dc3a04d62 78
mrhannah 0:f21dc3a04d62 79 virtual void onConnection(const Gap::ConnectionCallbackParams_t *params)
mrhannah 0:f21dc3a04d62 80 {
mrhannah 0:f21dc3a04d62 81 HIDServiceBase::onConnection(params);
mrhannah 0:f21dc3a04d62 82 startReportTicker();
mrhannah 0:f21dc3a04d62 83 }
mrhannah 0:f21dc3a04d62 84
mrhannah 0:f21dc3a04d62 85 virtual void onDisconnection(const Gap::DisconnectionCallbackParams_t *params)
mrhannah 0:f21dc3a04d62 86 {
mrhannah 0:f21dc3a04d62 87 stopReportTicker();
mrhannah 0:f21dc3a04d62 88 HIDServiceBase::onDisconnection(params);
mrhannah 0:f21dc3a04d62 89 }
mrhannah 0:f21dc3a04d62 90
mrhannah 0:f21dc3a04d62 91 void setReport(uint8_t *r) {
mrhannah 0:f21dc3a04d62 92 // for (int i = 0; i < 6; i++) {
mrhannah 0:f21dc3a04d62 93 // report[i+1] = r[i];
mrhannah 0:f21dc3a04d62 94 // }
mrhannah 0:f21dc3a04d62 95 memcpy(&report[1], r, 6);
mrhannah 0:f21dc3a04d62 96 }
mrhannah 0:f21dc3a04d62 97
mrhannah 0:f21dc3a04d62 98 /**
mrhannah 0:f21dc3a04d62 99 * Called by the report ticker
mrhannah 0:f21dc3a04d62 100 */
mrhannah 0:f21dc3a04d62 101
mrhannah 0:f21dc3a04d62 102 virtual void sendCallback(void) {
mrhannah 0:f21dc3a04d62 103 // if (toggle) {
mrhannah 0:f21dc3a04d62 104 // send(onReport);
mrhannah 0:f21dc3a04d62 105 // } else {
mrhannah 0:f21dc3a04d62 106 // send(offReport);
mrhannah 0:f21dc3a04d62 107 // }
mrhannah 0:f21dc3a04d62 108 // toggle = !toggle;
mrhannah 0:f21dc3a04d62 109
mrhannah 0:f21dc3a04d62 110 if (send(report)) {
mrhannah 0:f21dc3a04d62 111 failedReports++;
mrhannah 0:f21dc3a04d62 112 }
mrhannah 0:f21dc3a04d62 113 }
mrhannah 0:f21dc3a04d62 114
mrhannah 0:f21dc3a04d62 115 uint32_t failedReports;
mrhannah 0:f21dc3a04d62 116 };