A BLE HID controller implementation with communication over SPI

Dependencies:   BLE_API BLE_HID mbed nRF51822

ControllerService.h

Committer:
mrhannah
Date:
2017-12-13
Revision:
0:f21dc3a04d62

File content as of revision 0:f21dc3a04d62:

/* mbed Microcontroller Library
 * Copyright (c) 2015 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "mbed.h"

#include "HIDServiceBase.h"

/**
 * Report descriptor for a standard 3 buttons + wheel mouse with relative X/Y
 * moves
 */
report_map_t CONTROLLER_REPORT_MAP = {
        USAGE_PAGE(1),      0x01,       // Genric Desktop
        USAGE(1),           0x05,       // Gamepad
        COLLECTION(1),      0x01,       // Application
        COLLECTION(1),      0x00,       // Physical
        
        REPORT_ID(1),       0x03,       // Report ID 3
        USAGE_PAGE(1),      0x09,       // Buttons
        USAGE_MINIMUM(1),       0x01,   // Minimum of 1
        USAGE_MAXIMUM(1),       0x10,   // Maximum of 16
        LOGICAL_MINIMUM(1),     0x00,   // Logical Minimum of 0
        LOGICAL_MAXIMUM(1),     0x01,   // Logical Maximum of 1
        REPORT_SIZE(1),     0x01,       // Each report is 1 bit
        REPORT_COUNT(1),    0x10,       // All in all 16 * 1 bit
        INPUT(1),           0x02,       // Input (Data, Var, Abs)
        
        USAGE_PAGE(1),      0x01,       // Generic Desktop
        USAGE(1),           0x30,       // Usage X
        USAGE(1),           0x31,       // Usage Y
        USAGE(1),           0x32,       // Usage Z
        USAGE(1),           0x33,       // Usage Rx
        LOGICAL_MINIMUM(1), 0x00,       // Logical Minimum: 0
        LOGICAL_MAXIMUM(1), 0xFE,       // Logical maximum: 254
        REPORT_SIZE(1),     0x08,       // Each report is 8 bits
        REPORT_COUNT(1),    0x04,       // 4 reports * 8 bits
        INPUT(1),           0x02,        // Input (Data, Var, Abs)
        END_COLLECTION(0),
        END_COLLECTION(0)
};

uint8_t report[7] = {0x03, 0, 0, 0, 0, 0, 0};

//bool toggle = true;
//uint8_t onReport[7] = {0x03, 0xFF, 0xFF, 0x80, 0x80, 0x80, 0x80};
//uint8_t offReport[7] = {0x03, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20};

class ControllerService: public HIDServiceBase
{
public:
    ControllerService(BLE &_ble) :
        HIDServiceBase(_ble,
                       CONTROLLER_REPORT_MAP, sizeof(CONTROLLER_REPORT_MAP),
                       inputReport          = report,
                       outputReport         = NULL,
                       featureReport        = NULL,
                       inputReportLength    = 7,
                       outputReportLength   = 0,
                       featureReportLength  = 0,
                       reportTickerDelay    = 250)
    {
        failedReports = 0;
        startReportTicker();
    }

    virtual void onConnection(const Gap::ConnectionCallbackParams_t *params)
    {
        HIDServiceBase::onConnection(params);
        startReportTicker();
    }

    virtual void onDisconnection(const Gap::DisconnectionCallbackParams_t *params)
    {
        stopReportTicker();
        HIDServiceBase::onDisconnection(params);
    }
    
    void setReport(uint8_t *r) {
//        for (int i = 0; i < 6; i++) {
//            report[i+1] = r[i];
//        }
        memcpy(&report[1], r, 6);
    }

    /**
     * Called by the report ticker
     */

    virtual void sendCallback(void) {
//        if (toggle) {
//            send(onReport);
//        } else {
//            send(offReport);
//        }
//        toggle = !toggle;
        
        if (send(report)) {
            failedReports++;
        }   
    }
    
    uint32_t failedReports;
};