138 lines
5.3 KiB
C++
138 lines
5.3 KiB
C++
/* USB API for Teensy USB Development Board
|
|
* http://www.pjrc.com/teensy/teensyduino.html
|
|
* Copyright (c) 2008 PJRC.COM, LLC
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "HID.h"
|
|
|
|
#if !defined(_USING_HID)
|
|
|
|
#error "This is not an USB AVR or you use an old version of the IDE."
|
|
|
|
#else
|
|
|
|
#include "HID-Project.h"
|
|
#include "TeensyKeylayouts.h"
|
|
|
|
// Keyboard Protocol 1, HID 1.11 spec, Appendix B, page 59-60
|
|
static const uint8_t PROGMEM teensykeyboard_hid_report_desc[] = {
|
|
0x05, 0x01, // Usage Page (Generic Desktop),
|
|
0x09, 0x06, // Usage (Keyboard),
|
|
0xA1, 0x01, // Collection (Application),
|
|
0x85, HID_REPORTID_TEENSY_KEYBOARD, // REPORT_ID
|
|
0x75, 0x01, // Report Size (1),
|
|
0x95, 0x08, // Report Count (8),
|
|
0x05, 0x07, // Usage Page (Key Codes),
|
|
0x19, 0xE0, // Usage Minimum (224),
|
|
0x29, 0xE7, // Usage Maximum (231),
|
|
0x15, 0x00, // Logical Minimum (0),
|
|
0x25, 0x01, // Logical Maximum (1),
|
|
0x81, 0x02, // Input (Data, Variable, Absolute), ;Modifier byte
|
|
0x95, 0x08, // Report Count (8),
|
|
0x75, 0x01, // Report Size (1),
|
|
0x15, 0x00, // Logical Minimum (0),
|
|
0x25, 0x01, // Logical Maximum (1),
|
|
0x05, 0x0C, // Usage Page (Consumer),
|
|
0x09, 0xE9, // Usage (Volume Increment),
|
|
0x09, 0xEA, // Usage (Volume Decrement),
|
|
0x09, 0xE2, // Usage (Mute),
|
|
0x09, 0xCD, // Usage (Play/Pause),
|
|
0x09, 0xB5, // Usage (Scan Next Track),
|
|
0x09, 0xB6, // Usage (Scan Previous Track),
|
|
0x09, 0xB7, // Usage (Stop),
|
|
0x09, 0xB8, // Usage (Eject),
|
|
// Note: Teensy ledreport was not modified to 8 bit, nor left out when leds are deactivated
|
|
0x81, 0x02, // Input (Data, Variable, Absolute), ;Media keys
|
|
0x95, 0x05, // Report Count (5),
|
|
0x75, 0x01, // Report Size (1),
|
|
0x05, 0x08, // Usage Page (LEDs),
|
|
0x19, 0x01, // Usage Minimum (1),
|
|
0x29, 0x05, // Usage Maximum (5),
|
|
0x91, 0x02, // Output (Data, Variable, Absolute), ;LED report
|
|
0x95, 0x01, // Report Count (1),
|
|
0x75, 0x03, // Report Size (3),
|
|
0x91, 0x03, // Output (Constant), ;LED report padding
|
|
0x95, 0x06, // Report Count (6),
|
|
0x75, 0x08, // Report Size (8),
|
|
0x15, 0x00, // Logical Minimum (0),
|
|
0x25, 0x7F, // Logical Maximum(104),
|
|
0x05, 0x07, // Usage Page (Key Codes),
|
|
0x19, 0x00, // Usage Minimum (0),
|
|
0x29, 0x7F, // Usage Maximum (104),
|
|
0x81, 0x00, // Input (Data, Array), ;Normal keys
|
|
0xc0 // End Collection
|
|
};
|
|
|
|
// Keyboard Leds
|
|
#define LED_NUM_LOCK 0x01
|
|
#define LED_CAPS_LOCK 0x02
|
|
#define LED_SCROLL_LOCK 0x04
|
|
|
|
class usb_keyboard_class : public Print, private HIDDevice
|
|
{
|
|
public:
|
|
usb_keyboard_class(void);
|
|
|
|
#if defined(HID_KEYBOARD_LEDS_ENABLED)
|
|
uint8_t getLeds(void);
|
|
#endif
|
|
|
|
void begin(void) { }
|
|
void end(void) { }
|
|
virtual size_t write(uint8_t);
|
|
using Print::write;
|
|
inline void write_unicode(uint16_t unicode) { write_keycode(unicode_to_keycode(unicode)); }
|
|
void set_modifier(uint8_t);
|
|
void set_key1(uint8_t);
|
|
void set_key2(uint8_t);
|
|
void set_key3(uint8_t);
|
|
void set_key4(uint8_t);
|
|
void set_key5(uint8_t);
|
|
void set_key6(uint8_t);
|
|
void set_media(uint8_t);
|
|
void send_now(void);
|
|
void press(uint16_t n);
|
|
void release(uint16_t n);
|
|
void releaseAll(void);
|
|
private:
|
|
KEYCODE_TYPE unicode_to_keycode(uint16_t unicode);
|
|
KEYCODE_TYPE deadkey_to_keycode(KEYCODE_TYPE keycode);
|
|
uint8_t keycode_to_modifier(KEYCODE_TYPE keycode);
|
|
uint8_t keycode_to_key(KEYCODE_TYPE keycode);
|
|
void presskey(uint8_t key, uint8_t modifier);
|
|
void releasekey(uint8_t key, uint8_t modifier);
|
|
void write_keycode(KEYCODE_TYPE key);
|
|
void write_key(KEYCODE_TYPE code);
|
|
uint8_t utf8_state;
|
|
uint16_t unicode_wchar;
|
|
uint8_t keyboard_report_data[8];
|
|
|
|
#if defined(HID_KEYBOARD_LEDS_ENABLED)
|
|
virtual void setReportData(void* &data, int len);
|
|
uint8_t leds;
|
|
#endif
|
|
};
|
|
|
|
extern usb_keyboard_class TeensyKeyboard;
|
|
|
|
#endif
|