ユーザ用ツール

サイト用ツール


ハイハイスクールアドベンチャー_m5stack_m5cardputer版

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
ハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2024/10/29 02:20] – [ビルド] arakiハイハイスクールアドベンチャー_m5stack_m5cardputer版 [2024/10/29 02:27] (現在) – [BTキーボードをつなごう] araki
行 266: 行 266:
 手抜きの極みのキー処理である。 手抜きの極みのキー処理である。
 キーボードからの通知が来るたびに、これが呼び出される。 キーボードからの通知が来るたびに、これが呼び出される。
 +Handle == 41は modifiers + 10文字分のキーバッファだが Handle == 29は modifiers + res + 6文字分のキーバッファとなっている。
 +そもそも Handle で見分けるのが正しいのかさえよくわかっていないがとにかく試して動いたキーボードはこのどちらかだった。
  
-データは keyboardReport に格納され、あとで、BTKeyBoard::update()が呼び出されるときに処理される。+動作は単純で、前回渡されたデータと、今回渡ってきたデータとでキーバッファ部分を比べて、新しいのがあったらそれが今回入力されたキーだとみなして、keybufに積んでいく。 
 +これは、例えば、A, B, Cのキーを押しっぱなしにして、新しく D を押したときに、バッファには A, B, C, Dの四文字が入ってくるからである。古いバッファは A, B, Cのみだったので Dが追加で押されたことがわかる。 
 + 
 +データは keybufに格納され、あとで、BTKeyBoard::update()が呼び出されるときに処理される。
  
  
 <code> <code>
-typedef struct __attribute__((__packed__)) +typedef union { 
-+    struct __attribute__((__packed__)) 
-    uint8_t modifiers; +    
-    uint8_t keys[10];+        uint8_t modifiers; 
 +        uint8_t keys[10]; 
 +    } k1; 
 +    struct __attribute__((__packed__)) 
 +    { 
 +        uint8_t modifiers; 
 +        uint8_t reserved; 
 +        uint8_t keys[6]; 
 +        uint8_t padding[3]; 
 +    } k2; 
 +    uint8_t raw[11];
 } keyboard_t; } keyboard_t;
 +
  
 static keyboard_t keyboardReport; static keyboard_t keyboardReport;
-static bool newKeyData = false;+static std::queue<uint16_t> keybuf;
  
 static void static void
行 289: 行 305:
         for (int i = 0 ; i < 10 ; i++)         for (int i = 0 ; i < 10 ; i++)
         {         {
-            uint8_t c = newKeyReport->keys[i];+            uint8_t c = newKeyReport->k1.keys[i];
             if (c == 0) break;             if (c == 0) break;
-            if (memchr(&keyboardReport, c, 10) == NULL) keybuf.push((((uint16_t)newKeyReport->modifiers) << 8)|c);+            if (memchr(&keyboardReport, c, 10) == NULL) keybuf.push((((uint16_t)newKeyReport->k1.modifiers) << 8)|c);
         }         }
         memcpy(&keyboardReport, pData, sizeof(keyboardReport));         memcpy(&keyboardReport, pData, sizeof(keyboardReport));
 +    }
 +    else if (pRemoteCharacteristic->getHandle() == 29)
 +    {
 +        keyboard_t *newKeyReport = (keyboard_t*)pData;
 +        if(newKeyReport->k2.modifiers == 3) return;
 +        for (int i = 0 ; i < 6 ; i++)
 +        {
 +            uint8_t c = newKeyReport->k2.keys[i];
 +            if (c == 0) break;
 +            if (memchr(&keyboardReport, c, 10) == NULL) keybuf.push((((uint16_t)newKeyReport->k2.modifiers) << 8)|c);
 +        }
 +        memcpy(&keyboardReport, pData, sizeof(keyboardReport));        
     }     }
 } }
 +
 </code> </code>
  
ハイハイスクールアドベンチャー_m5stack_m5cardputer版.txt · 最終更新: 2024/10/29 02:27 by araki