Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Update USBKeyboard.cpp#683

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
Epipeppy wants to merge1 commit intoarduino:main
base:main
Choose a base branch
Loading
fromEpipeppy:patch-2
Open
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
185 changes: 157 additions & 28 deletionslibraries/USBHID/src/USBKeyboard.cpp
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,15 @@

#define REPORT_ID_KEYBOARD 1
#define REPORT_ID_VOLUME 3
/**
TODO:
* Alter functions to use CUSTSIZE for size of report.
Would need to alter change line 410 as well.
* Currently report only takes the first modifier key
pressed. Should either change this, or use
key_code_raw to send the hex codes.
**/


using namespace arduino;

Expand All@@ -32,7 +41,7 @@ typedef struct {

#ifdef US_KEYBOARD
/* US keyboard (as HID standard) */
#define KEYMAP_SIZE (164)
#define KEYMAP_SIZE (152)
const KEYMAP keymap[KEYMAP_SIZE] = {
{0, 0}, /* NUL */
{0, 0}, /* SOH */
Expand DownExpand Up@@ -175,18 +184,6 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
{0x43, 0}, /* F10 */
{0x44, 0}, /* F11 */
{0x45, 0}, /* F12 */
{0x68, 0}, /* F13 */
{0x69, 0}, /* F14 */
{0x6a, 0}, /* F15 */
{0x6b, 0}, /* F16 */
{0x6c, 0}, /* F17 */
{0x6d, 0}, /* F18 */
{0x6e, 0}, /* F19 */
{0x6f, 0}, /* F20 */
{0x70, 0}, /* F21 */
{0x71, 0}, /* F22 */
{0x72, 0}, /* F23 */
{0x73, 0}, /* F24 */

{0x46, 0}, /* PRINT_SCREEN */
{0x47, 0}, /* SCROLL_LOCK */
Expand All@@ -205,7 +202,7 @@ const KEYMAP keymap[KEYMAP_SIZE] = {

#else
/* UK keyboard */
#define KEYMAP_SIZE (164)
#define KEYMAP_SIZE (152)
const KEYMAP keymap[KEYMAP_SIZE] = {
{0, 0}, /* NUL */
{0, 0}, /* SOH */
Expand DownExpand Up@@ -348,18 +345,6 @@ const KEYMAP keymap[KEYMAP_SIZE] = {
{0x43, 0}, /* F10 */
{0x44, 0}, /* F11 */
{0x45, 0}, /* F12 */
{0x68, 0}, /* F13 */
{0x69, 0}, /* F14 */
{0x6a, 0}, /* F15 */
{0x6b, 0}, /* F16 */
{0x6c, 0}, /* F17 */
{0x6d, 0}, /* F18 */
{0x6e, 0}, /* F19 */
{0x6f, 0}, /* F20 */
{0x70, 0}, /* F21 */
{0x71, 0}, /* F22 */
{0x72, 0}, /* F23 */
{0x73, 0}, /* F24 */

{0x46, 0}, /* PRINT_SCREEN */
{0x47, 0}, /* SCROLL_LOCK */
Expand DownExpand Up@@ -417,6 +402,7 @@ const uint8_t *USBKeyboard::report_desc()
INPUT(1), 0x01, // Constant


// LED section.
REPORT_COUNT(1), 0x05,
REPORT_SIZE(1), 0x01,
USAGE_PAGE(1), 0x08, // LEDs
Expand All@@ -428,7 +414,9 @@ const uint8_t *USBKeyboard::report_desc()
OUTPUT(1), 0x01, // Constant


REPORT_COUNT(1), 0x06,
// Keyboard section.
//REPORT_COUNT(1), 0x06,
REPORT_COUNT(1), 0x0A, // Allows up to 10 keys.
REPORT_SIZE(1), 0x08,
LOGICAL_MINIMUM(1), 0x00,
LOGICAL_MAXIMUM(1), 0x65,
Expand DownExpand Up@@ -464,6 +452,16 @@ const uint8_t *USBKeyboard::report_desc()
return reportDescriptor;
}

void USBKeyboard::emptyButtonBuffer()
{
// Using hard-coded value of 10 for keys pressed array for testing.
// Empties the pressed buttons buffer.
// Buffer is 10 (0 through 9) long.
for(int i = 0; i < 10; i++)
{
_keys_pressed[i] = 0;
}
}

void USBKeyboard::report_rx()
{
Expand All@@ -486,6 +484,133 @@ int USBKeyboard::_putc(int c)
return key_code(c, keymap[c].modifier);
}

void USBKeyboard::press_button(uint8_t c)
{
if(_keys_pressed[0] != c && _keys_pressed[1] != c &&
_keys_pressed[2] != c && _keys_pressed[3] != c &&
_keys_pressed[4] != c && _keys_pressed[5] != c &&
_keys_pressed[6] != c && _keys_pressed[7] != c &&
_keys_pressed[8] != c && _keys_pressed[9] != c)
{
for(int i = 0; i < 10 ; i++)
{
if(_keys_pressed[i] == 0)
{
_keys_pressed[i] = c;
//////////////////////////////////////////////////////////
// If we don't break, it'll loop through and put the //
// character in all 10 slots, since we've already //
// checked if it was in the array *BEFORE* starting the //
// loop. //
//////////////////////////////////////////////////////////
break;
}
}
}

}

bool USBKeyboard::sendReleaseAll()
{
_mutex.lock();

// Testing with hardcoded values of array size 10, and
// report length 13.

// Send simulated keyboard buttons, and empty the button pressed buffer.
// Returns true if successful.
HID_REPORT report;

report.data[0] = REPORT_ID_KEYBOARD;
report.data[1] = 0;
report.data[2] = 0;
for(int i = 3; i < 13; i++)
{
report.data[i] = keymap[_keys_pressed[i-3]].usage;
if(keymap[_keys_pressed[i-3]].modifier && !report.data[1]) {
report.data[1] = keymap[_keys_pressed[i-3]].modifier;
}
}

report.length = 13;

if (!send(&report)) {
_mutex.unlock();
return false;
}

// Need to clear the modifier from the report.
report.data[1] = 0;
for(int i = 3; i < 13; i++)
{
report.data[i] = 0;
}

emptyButtonBuffer();

if (!send(&report)) {
_mutex.unlock();
return false;
}


_mutex.unlock();
return true;

}

bool USBKeyboard::sendReleaseKeys(uint8_t* keys_array)
{
_mutex.lock();

////////////////////////////////////////////////////////////////////////////
// Should add a keys_array_length as an additional argument, so we can //
// handle different sizes. For now, we're just using a //
// hardcoded value of 10 for the keys array, and 13 for the //
// HID report length. If we send the wrong size report the //
// computer will get confused. //
////////////////////////////////////////////////////////////////////////////

// Send simulated keyboard buttons, and empty the button pressed buffer.
// Returns true if successful.
HID_REPORT report;

report.data[0] = REPORT_ID_KEYBOARD;
report.data[1] = 0;
report.data[2] = 0;
for(int i = 3; i < 13; i++)
{
report.data[i] = keymap[keys_array[i-3]].usage;
if(keymap[keys_array[i-3]].modifier && !report.data[1]) {
report.data[1] = keymap[keys_array[i-3]].modifier;
}
}

report.length = 13;

if (!send(&report)) {
_mutex.unlock();
return false;
}

// Need to clear the modifier from the report.
report.data[1] = 0;
for(int i = 3; i < 13; i++)
{
report.data[i] = 0;
keys_array[i-3] = 0;
}

if (!send(&report)) {
_mutex.unlock();
return false;
}


_mutex.unlock();
return true;
}

bool USBKeyboard::key_code(uint8_t key, uint8_t modifier)
{
return key_code_raw(keymap[key].usage, modifier);
Expand All@@ -507,8 +632,12 @@ bool USBKeyboard::key_code_raw(uint8_t key, uint8_t modifier)
report.data[6] = 0;
report.data[7] = 0;
report.data[8] = 0;
report.data[9] = 0;
report.data[10] = 0;
report.data[11] = 0;
report.data[12] = 0;

report.length =9;
report.length =13;

if (!send(&report)) {
_mutex.unlock();
Expand Down

[8]ページ先頭

©2009-2025 Movatter.jp