B. H. / Mbed 2 deprecated trolololol

Dependencies:   mbed

USBDevice/USBHID/.svn/text-base/USBKeyboard.cpp.svn-base

Committer:
znuh
Date:
2011-11-29
Revision:
0:505207de8566

File content as of revision 0:505207de8566:

/* USBKeyboard.c */
/* USB device example: Standard keyboard */
/* Copyright (c) 2011 ARM Limited. All rights reserved. */

#include "stdint.h"

#include "USBKeyboard.h"

/*
 *  Descriptors
 */

uint8_t * USBKeyboard::ReportDesc() {
    static uint8_t reportDescriptor[] = {

        /* Based on Appendix E.6 of "Device Class Definition for Human Interface
           Devices (HID)" Version 1.11. */

        USAGE_PAGE(1), 0x01,                    /* Generic Desktop */
        USAGE(1), 0x06,                         /* Keyboard */
        COLLECTION(1), 0x01,                    /* Application*/
        REPORT_ID(1),       REPORT_ID_KEYBOARD,

        USAGE_PAGE(1), 0x07,                    /* Key Codes */
        USAGE_MINIMUM(1), 0xE0,
        USAGE_MAXIMUM(1), 0xE7,
        LOGICAL_MINIMUM(1), 0x00,
        LOGICAL_MAXIMUM(1), 0x01,
        REPORT_SIZE(1), 0x01,
        REPORT_COUNT(1), 0x08,
        INPUT(1), 0x02,                         /* Data, Variable, Absolute */
        REPORT_COUNT(1), 0x01,
        REPORT_SIZE(1), 0x08,
        INPUT(1), 0x01,                         /* Constant */
        REPORT_COUNT(1), 0x05,
        REPORT_SIZE(1), 0x01,


        USAGE_PAGE(1), 0x08,                    /* LEDs */
        USAGE_MINIMUM(1), 0x01,
        USAGE_MAXIMUM(1), 0x05,
        OUTPUT(1), 0x02,                        /* Data, Variable, Absolute */
        REPORT_COUNT(1), 0x01,
        REPORT_SIZE(1), 0x03,
        OUTPUT(1), 0x01,                        /* Constant */
        REPORT_COUNT(1), 0x06,
        REPORT_SIZE(1), 0x08,
        LOGICAL_MINIMUM(1), 0x00,
        LOGICAL_MAXIMUM(1), 0x65,


        USAGE_PAGE(1), 0x07,                    /* Key Codes */
        USAGE_MINIMUM(1), 0x00,
        USAGE_MAXIMUM(1), 0x65,
        INPUT(1), 0x00,                         /* Data, Array */
        END_COLLECTION(0),

        /* Media Control */
        USAGE_PAGE(1), 0x0C,
        USAGE(1), 0x01,
        COLLECTION(1), 0x01,
        REPORT_ID(1), REPORT_ID_VOLUME,
        USAGE_PAGE(1), 0x0C,
        LOGICAL_MINIMUM(1), 0x00,
        LOGICAL_MAXIMUM(1), 0x01,
        REPORT_SIZE(1), 0x01,
        REPORT_COUNT(1), 0x07,
        USAGE(1), 0xB5,             /* Next Track */
        USAGE(1), 0xB6,             /* Previous Track */
        USAGE(1), 0xB7,             /* Stop */
        USAGE(1), 0xCD,             /* Play / Pause */
        USAGE(1), 0xE2,             /* Mute */
        USAGE(1), 0xE9,             /* Volume Up */
        USAGE(1), 0xEA,             /* Volume Down */
        INPUT(1), 0x02,             /* Input (Data, Variable, Absolute) */
        REPORT_COUNT(1), 0x01,
        INPUT(1), 0x01,
        END_COLLECTION(0),

    };
    reportLength = sizeof(reportDescriptor);
    return reportDescriptor;
}

int USBKeyboard::_putc(int c) {
    return keyCode(keymap[c].modifier, c);
}

bool USBKeyboard::keyCode(uint8_t modifier, uint8_t key) {
    /* Send a simulated keyboard keypress. Returns true if successful. */

    HID_REPORT report;

    report.data[0] = REPORT_ID_KEYBOARD;
    report.data[1] = modifier;
    report.data[2] = 0;
    report.data[3] = keymap[key].usage;
    report.data[4] = 0;
    report.data[5] = 0;
    report.data[6] = 0;
    report.data[7] = 0;
    report.data[8] = 0;

    report.length = 9;

    if (!USBHID_send(EPINT_IN, &report)) {
        return false;
    }
    
    report.data[1] = 0;
    report.data[3] = 0;

    if (!USBHID_send(EPINT_IN, &report)) {
        return false;
    }

    return true;

}


bool USBKeyboard::mediaControl(MEDIA_KEY key) {
    HID_REPORT report;

    report.data[0] = REPORT_ID_VOLUME;
    report.data[1] = (1 << key) & 0x7f;

    report.length = 2;

    return USBHID_send(EPINT_IN, &report);
}