キーボードの長押しに対応。

Dependents:   PS4_FF14_Adapter

Fork of USBDevice by mbed official

Revision:
73:803bc631881e
Parent:
72:8c3160323201
--- a/USBHID/USBKeyboard.cpp	Sat Aug 18 06:37:49 2018 +0000
+++ b/USBHID/USBKeyboard.cpp	Sat Aug 25 07:54:43 2018 +0000
@@ -183,7 +183,7 @@
     {0x4a, 0},          /* HOME */
     {0x4b, 0},          /* PAGE_UP */
     {0x4e, 0},          /* PAGE_DOWN */
-    
+
     {0x4f, 0},          /* RIGHT_ARROW */
     {0x50, 0},          /* LEFT_ARROW */
     {0x51, 0},          /* DOWN_ARROW */
@@ -344,7 +344,7 @@
     {0x4a, 0},          /* HOME */
     {0x4b, 0},          /* PAGE_UP */
     {0x4e, 0},          /* PAGE_DOWN */
-    
+
     {0x4f, 0},          /* RIGHT_ARROW */
     {0x50, 0},          /* LEFT_ARROW */
     {0x51, 0},          /* DOWN_ARROW */
@@ -355,7 +355,8 @@
 ///
 /// reportDesc
 ///
-uint8_t * USBKeyboard::reportDesc() {
+uint8_t * USBKeyboard::reportDesc()
+{
     static uint8_t reportDescriptor[] = {
         USAGE_PAGE(1), 0x01,                    // 標準デスクトップ
         USAGE(1), 0x06,                         // キーボード
@@ -425,14 +426,15 @@
 ///
 /// EP1_OUT_callback
 ///
-bool USBKeyboard::EP1_OUT_callback() {
+bool USBKeyboard::EP1_OUT_callback()
+{
     uint32_t bytesRead = 0;
     uint8_t led[65];
     USBDevice::readEP(EPINT_OUT, led, &bytesRead, MAX_HID_REPORT_SIZE);
-    
+
     // led[0]はレポートIDなので、我々はled[1]を取ります。
     lock_status = led[1] & 0x07;
-    
+
     // データを受信できるようにエンドポイントをアクティブ化します。
     if (!readStart(EPINT_OUT, MAX_HID_REPORT_SIZE))
         return false;
@@ -442,21 +444,24 @@
 ///
 /// ロックステータスを返す
 ///
-uint8_t USBKeyboard::lockStatus() {
+uint8_t USBKeyboard::lockStatus()
+{
     return lock_status;
 }
 
 ///
 /// 文字を送信する
 ///
-int USBKeyboard::_putc(int c) {
+int USBKeyboard::_putc(int c)
+{
     return keyCode(c, keymap[c].modifier);
 }
 
 ///
 /// キーコード
 ///
-bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier) {
+bool USBKeyboard::keyCode(uint8_t key, uint8_t modifier)
+{
     // シミューレートされたキーボードキーを送信します。成功した場合はtrueを返します。
     HID_REPORT report;
 
@@ -487,10 +492,73 @@
 
 }
 
+uint8_t downKey = 0;    // ダウン中のキー
+
+///
+/// キーダウン
+///
+bool USBKeyboard::keyDown(uint8_t key)
+{
+    // シミューレートされたキーボードキーを送信します。成功した場合はtrueを返します。
+    HID_REPORT report;
+
+    report.data[0] = REPORT_ID_KEYBOARD;
+    report.data[1] = keymap[key].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 (!send(&report)) {
+        return false;
+    }
+
+    downKey = key;  // ダウンしたキーを保存
+
+    return true;
+}
+
+///
+/// キーアップ
+///
+bool USBKeyboard::keyUp(uint8_t key)
+{
+    // ダウンしたキーと異なるキーなら終了
+    if (downKey != key) return;
+
+    // キーアップをシミュレートします。
+    HID_REPORT report;
+
+    report.data[0] = REPORT_ID_KEYBOARD;
+    report.data[1] = 0;
+    report.data[2] = 0;
+    report.data[3] = 0;
+    report.data[4] = 0;
+    report.data[5] = 0;
+    report.data[6] = 0;
+    report.data[7] = 0;
+    report.data[8] = 0;
+
+    report.length = 9;
+
+    if (!send(&report)) {
+        return false;
+    }
+
+    return true;
+}
+
+
 ///
 /// メディアコントロール
 ///
-bool USBKeyboard::mediaControl(MEDIA_KEY key) {
+bool USBKeyboard::mediaControl(MEDIA_KEY key)
+{
     HID_REPORT report;
 
     report.data[0] = REPORT_ID_VOLUME;
@@ -520,7 +588,8 @@
 ///
 /// Descの設定
 ///
-uint8_t * USBKeyboard::configurationDesc() {
+uint8_t * USBKeyboard::configurationDesc()
+{
     static uint8_t configurationDescriptor[] = {
         CONFIGURATION_DESCRIPTOR_LENGTH,// bLength
         CONFIGURATION_DESCRIPTOR,       // bDescriptorType