Parcourir la source

update: Support for simultaneous change of two or more keys

Satoshi Yoneda il y a 1 mois
Parent
commit
481bd7412a
5 fichiers modifiés avec 32 ajouts et 25 suppressions
  1. 1 1
      CMakeLists.txt
  2. 1 2
      display.c
  3. 2 1
      display.h
  4. 14 13
      keypad.c
  5. 14 8
      usb_keypad1.c

+ 1 - 1
CMakeLists.txt

@@ -44,7 +44,7 @@ pico_set_program_version(usb_keypad1 "0.1")
 pico_generate_pio_header(usb_keypad1 ${CMAKE_CURRENT_LIST_DIR}/keypad_scanner.pio)
 
 # Modify the below lines to enable/disable output over UART/USB
-pico_enable_stdio_uart(usb_keypad1 1)
+pico_enable_stdio_uart(usb_keypad1 0)
 pico_enable_stdio_usb(usb_keypad1 0)
 
 # Add the standard library to the build

+ 1 - 2
display.c

@@ -1,4 +1,3 @@
-#include "sd1306.h"
 #include "display.h"
 #include <stdlib.h>
 #include "pico/stdlib.h"
@@ -7,7 +6,7 @@
 #include "pico/util/queue.h"
 #include "pico/multicore.h"
 
-#include "font8x8.h"
+// #include "font8x8.h"
 
 uint8_t display_buffer[OLED_BUF_LEN];
 

+ 2 - 1
display.h

@@ -3,7 +3,8 @@
 
 #include <stdlib.h>
 #include "pico/stdlib.h"
-
+#include "sd1306.h"
+#include "font8x8.h"
 // extern uint8_t display_buffer[];
 
 void display_init(void);

+ 14 - 13
keypad.c

@@ -22,25 +22,25 @@ void pio_irq_handler(void)
     // IRQクリア
     pio_interrupt_clear(pio0, 0);
 
-    keycode = prev_keycode;
-    if(! pio_sm_is_rx_fifo_empty(pio0, 0)) {
+    while(! pio_sm_is_rx_fifo_empty(pio0, 0)) {
         keycode = pio_sm_get(pio0, 0);
-    }
-    uint32_t changed_bit = keycode ^ prev_keycode;
-    prev_keycode = keycode;
+        uint32_t changed_bit = keycode ^ prev_keycode;
+        prev_keycode = keycode;
 
-    for(uint16_t idx = 0; idx < 16; idx++) {
-        if(changed_bit & 1) {
-            keystate_buffer[write_p & 0xF].code = idx;
-            keystate_buffer[write_p & 0xF].state = keycode & 1;
-            gpio_put(LED_PIN, keystate_buffer[write_p & 0xF].state);
-            write_p++;
+        for(uint16_t idx = 0; idx < 16; idx++) {
+            if(changed_bit & 1) {
+                keystate_buffer[write_p & 0xF].code = idx;
+                keystate_buffer[write_p & 0xF].state = keycode & 1;
+                gpio_put(LED_PIN, keystate_buffer[write_p & 0xF].state);
+                write_p++;
+            }
+            changed_bit >>= 1;
+            keycode >>= 1;
         }
-        changed_bit >>= 1;
-        keycode >>= 1;
     }
 }
 
+// キーパッド初期化
 void keypad_init()
 {
     // オンボードLED
@@ -61,6 +61,7 @@ void keypad_init()
     pio_sm_set_enabled(pio, 0, true);
 }
 
+// キーバッファからデータを取り出す
 key_t get_key(void)
 {
     key_t   retval;

+ 14 - 8
usb_keypad1.c

@@ -13,19 +13,17 @@
 #define KEYBOARD_REPORT_COUNT    6
 uint8_t key_report[KEYBOARD_REPORT_COUNT] = {0,0,0,0,0,0};
 
-char report_str[16];        // キーボードレポート表示用
-char indicator_str[16];     // LEDインジケーター表示用
-
+char report_str[OLED_WIDTH/FONT_WIDTH];        // キーボードレポート表示用
+char indicator_str[OLED_WIDTH/FONT_WIDTH];     // LEDインジケーター表示用
 
 // レポート配列をクリア
-void clear_key_report(void)
+inline void clear_key_report(void)
 {
     for(int i = 0; i < KEYBOARD_REPORT_COUNT; i++){
         key_report[i] = 0;
     }
 }
 
-
 // USBデバイスがマウントされた
 void tud_mount_cb(void)
 {
@@ -61,7 +59,6 @@ void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_
   // 何もしない
 }
 
-
 // コントロールリクエストGET_REPORT
 // キーボードは何も行わない
 uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen)
@@ -100,6 +97,14 @@ void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_
     }
 }
 
+// キーボードレポート表示
+void display_report(void)
+{
+    sprintf(report_str,"%02x%02x%02x%02x%02x%02x", key_report[0],key_report[1],key_report[2],key_report[3],key_report[4],key_report[5]);
+    display_putstr(report_str, 0, 3, false);
+}
+
+// メイン
 int main()
 {
     // TinyUSBの初期化
@@ -112,6 +117,7 @@ int main()
     stdio_init_all();
     // OLED表示
     display_init();
+    display_report();
     // キーパッド
     keypad_init();
 
@@ -140,8 +146,8 @@ int main()
                     }
                 }
                 // キーボードレポートをOLEDに表示する
-                sprintf(report_str,"%02x%02x%02x%02x%02x%02x", key_report[0],key_report[1],key_report[2],key_report[3],key_report[4],key_report[5]);
-                display_putstr(report_str, 0, 3, false);
+                display_report();
+                // 空きがあればキーボードレポート送信
                 if(tud_hid_ready())
                     tud_hid_keyboard_report(REPORT_ID_KEYBOARD,0, key_report);
             }