MicroBit as BLE gamepad

Dependencies:   BLE_API mbed-dev-bin nRF51822

Dependents:   microbit

Fork of microbit-dal by Lancaster University

Committer:
rengro01
Date:
Mon Jan 30 08:24:15 2017 +0000
Revision:
74:1b9850e39cd1
Microbit as a BLE gamepad

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rengro01 74:1b9850e39cd1 1 /* mbed Microcontroller Library
rengro01 74:1b9850e39cd1 2 * Copyright (c) 2015 ARM Limited
rengro01 74:1b9850e39cd1 3 *
rengro01 74:1b9850e39cd1 4 * Licensed under the Apache License, Version 2.0 (the "License");
rengro01 74:1b9850e39cd1 5 * you may not use this file except in compliance with the License.
rengro01 74:1b9850e39cd1 6 * You may obtain a copy of the License at
rengro01 74:1b9850e39cd1 7 *
rengro01 74:1b9850e39cd1 8 * http://www.apache.org/licenses/LICENSE-2.0
rengro01 74:1b9850e39cd1 9 *
rengro01 74:1b9850e39cd1 10 * Unless required by applicable law or agreed to in writing, software
rengro01 74:1b9850e39cd1 11 * distributed under the License is distributed on an "AS IS" BASIS,
rengro01 74:1b9850e39cd1 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rengro01 74:1b9850e39cd1 13 * See the License for the specific language governing permissions and
rengro01 74:1b9850e39cd1 14 * limitations under the License.
rengro01 74:1b9850e39cd1 15 */
rengro01 74:1b9850e39cd1 16
rengro01 74:1b9850e39cd1 17 #include "mbed.h"
rengro01 74:1b9850e39cd1 18
rengro01 74:1b9850e39cd1 19 #include "HIDServiceBase.h"
rengro01 74:1b9850e39cd1 20
rengro01 74:1b9850e39cd1 21 enum ButtonState
rengro01 74:1b9850e39cd1 22 {
rengro01 74:1b9850e39cd1 23 BUTTON_UP,
rengro01 74:1b9850e39cd1 24 BUTTON_DOWN
rengro01 74:1b9850e39cd1 25 };
rengro01 74:1b9850e39cd1 26
rengro01 74:1b9850e39cd1 27 enum JoystickButton
rengro01 74:1b9850e39cd1 28 {
rengro01 74:1b9850e39cd1 29 JOYSTICK_BUTTON_1 = 0x1,
rengro01 74:1b9850e39cd1 30 JOYSTICK_BUTTON_2 = 0x2,
rengro01 74:1b9850e39cd1 31 };
rengro01 74:1b9850e39cd1 32
rengro01 74:1b9850e39cd1 33 report_map_t JOYSTICK_REPORT_MAP = {
rengro01 74:1b9850e39cd1 34 USAGE_PAGE(1), 0x01, // Generic Desktop
rengro01 74:1b9850e39cd1 35 USAGE(1), 0x04, // Joystick
rengro01 74:1b9850e39cd1 36 COLLECTION(1), 0x01, // Application
rengro01 74:1b9850e39cd1 37 COLLECTION(1), 0x00, // Physical
rengro01 74:1b9850e39cd1 38 USAGE_PAGE(1), 0x09, // Buttons
rengro01 74:1b9850e39cd1 39 USAGE_MINIMUM(1), 0x01,
rengro01 74:1b9850e39cd1 40 USAGE_MAXIMUM(1), 0x03,
rengro01 74:1b9850e39cd1 41 LOGICAL_MINIMUM(1), 0x00,
rengro01 74:1b9850e39cd1 42 LOGICAL_MAXIMUM(1), 0x01,
rengro01 74:1b9850e39cd1 43 REPORT_COUNT(1), 0x03, // 2 bits (Buttons)
rengro01 74:1b9850e39cd1 44 REPORT_SIZE(1), 0x01,
rengro01 74:1b9850e39cd1 45 INPUT(1), 0x02, // Data, Variable, Absolute
rengro01 74:1b9850e39cd1 46 REPORT_COUNT(1), 0x01, // 6 bits (Padding)
rengro01 74:1b9850e39cd1 47 REPORT_SIZE(1), 0x05,
rengro01 74:1b9850e39cd1 48 INPUT(1), 0x01, // Constant
rengro01 74:1b9850e39cd1 49 USAGE_PAGE(1), 0x01, // Generic Desktop
rengro01 74:1b9850e39cd1 50 USAGE(1), 0x30, // X
rengro01 74:1b9850e39cd1 51 USAGE(1), 0x31, // Y
rengro01 74:1b9850e39cd1 52 USAGE(1), 0x32, // Z
rengro01 74:1b9850e39cd1 53 USAGE(1), 0x33, // Rx
rengro01 74:1b9850e39cd1 54 LOGICAL_MINIMUM(1), 0x81, // -127
rengro01 74:1b9850e39cd1 55 LOGICAL_MAXIMUM(1), 0x7f, // 127
rengro01 74:1b9850e39cd1 56 REPORT_SIZE(1), 0x08, // Three bytes
rengro01 74:1b9850e39cd1 57 REPORT_COUNT(1), 0x04,
rengro01 74:1b9850e39cd1 58 INPUT(1), 0x02, // Data, Variable, Absolute (unlike mouse)
rengro01 74:1b9850e39cd1 59 END_COLLECTION(0),
rengro01 74:1b9850e39cd1 60 END_COLLECTION(0),
rengro01 74:1b9850e39cd1 61 };
rengro01 74:1b9850e39cd1 62
rengro01 74:1b9850e39cd1 63 uint8_t report[] = { 0, 0, 0, 0, 0 };
rengro01 74:1b9850e39cd1 64
rengro01 74:1b9850e39cd1 65 class JoystickService: public HIDServiceBase
rengro01 74:1b9850e39cd1 66 {
rengro01 74:1b9850e39cd1 67 public:
rengro01 74:1b9850e39cd1 68 JoystickService(BLE &_ble) :
rengro01 74:1b9850e39cd1 69 HIDServiceBase(_ble,
rengro01 74:1b9850e39cd1 70 JOYSTICK_REPORT_MAP, sizeof(JOYSTICK_REPORT_MAP),
rengro01 74:1b9850e39cd1 71 inputReport = report,
rengro01 74:1b9850e39cd1 72 outputReport = NULL,
rengro01 74:1b9850e39cd1 73 featureReport = NULL,
rengro01 74:1b9850e39cd1 74 inputReportLength = sizeof(inputReport),
rengro01 74:1b9850e39cd1 75 outputReportLength = 0,
rengro01 74:1b9850e39cd1 76 featureReportLength = 0,
rengro01 74:1b9850e39cd1 77 reportTickerDelay = 20),
rengro01 74:1b9850e39cd1 78 buttonsState (0),
rengro01 74:1b9850e39cd1 79 failedReports (0)
rengro01 74:1b9850e39cd1 80 {
rengro01 74:1b9850e39cd1 81 speed[0] = 0;
rengro01 74:1b9850e39cd1 82 speed[1] = 0;
rengro01 74:1b9850e39cd1 83 speed[2] = 0;
rengro01 74:1b9850e39cd1 84 speed[3] = 0;
rengro01 74:1b9850e39cd1 85
rengro01 74:1b9850e39cd1 86 startReportTicker();
rengro01 74:1b9850e39cd1 87 }
rengro01 74:1b9850e39cd1 88
rengro01 74:1b9850e39cd1 89 int setSpeed(int8_t x, int8_t y, int8_t z)
rengro01 74:1b9850e39cd1 90 {
rengro01 74:1b9850e39cd1 91 speed[0] = x;
rengro01 74:1b9850e39cd1 92 speed[1] = y;
rengro01 74:1b9850e39cd1 93 speed[2] = z;
rengro01 74:1b9850e39cd1 94
rengro01 74:1b9850e39cd1 95 return 0;
rengro01 74:1b9850e39cd1 96 }
rengro01 74:1b9850e39cd1 97
rengro01 74:1b9850e39cd1 98 int setButton(JoystickButton button, ButtonState state)
rengro01 74:1b9850e39cd1 99 {
rengro01 74:1b9850e39cd1 100 if (state == BUTTON_UP)
rengro01 74:1b9850e39cd1 101 buttonsState &= ~(button);
rengro01 74:1b9850e39cd1 102 else
rengro01 74:1b9850e39cd1 103 buttonsState |= button;
rengro01 74:1b9850e39cd1 104
rengro01 74:1b9850e39cd1 105 return 0;
rengro01 74:1b9850e39cd1 106 }
rengro01 74:1b9850e39cd1 107
rengro01 74:1b9850e39cd1 108 virtual void sendCallback(void) {
rengro01 74:1b9850e39cd1 109 if (!connected)
rengro01 74:1b9850e39cd1 110 return;
rengro01 74:1b9850e39cd1 111
rengro01 74:1b9850e39cd1 112 report[0] = buttonsState & 0x7;
rengro01 74:1b9850e39cd1 113 report[1] = speed[0];
rengro01 74:1b9850e39cd1 114 report[2] = speed[1];
rengro01 74:1b9850e39cd1 115 report[3] = speed[2];
rengro01 74:1b9850e39cd1 116 report[4] = speed[3];
rengro01 74:1b9850e39cd1 117
rengro01 74:1b9850e39cd1 118 if (send(report))
rengro01 74:1b9850e39cd1 119 failedReports++;
rengro01 74:1b9850e39cd1 120 }
rengro01 74:1b9850e39cd1 121
rengro01 74:1b9850e39cd1 122 protected:
rengro01 74:1b9850e39cd1 123 uint8_t buttonsState;
rengro01 74:1b9850e39cd1 124 uint8_t speed[4];
rengro01 74:1b9850e39cd1 125
rengro01 74:1b9850e39cd1 126 public:
rengro01 74:1b9850e39cd1 127 uint32_t failedReports;
rengro01 74:1b9850e39cd1 128 };
rengro01 74:1b9850e39cd1 129