A BLE HID controller implementation with communication over SPI
Dependencies: BLE_API BLE_HID mbed nRF51822
ControllerService.h@0:f21dc3a04d62, 2017-12-13 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |