Skip to content
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 our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update USBKeyboard.cpp #683

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all 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 deletions libraries/USBHID/src/USBKeyboard.cpp
Original file line number Diff line number Diff 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 Down Expand 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 Down Expand 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 Down Expand 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 Down Expand 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