Program Resource

開発者向け各種コード、アルゴリズム、リソース情報ライブラリ もしくはねふぁの覚え書き

ATmega 32u4を使ったマウス応用同様、キーボードもレポート形式でデータを送信する事で複雑な制御が出来る。

ただ、マウス同様HID-Projectのライブラリそのままではレポート形式での送信が出来ないので、ライブラリに少し手を加える。

HID-Project\src\HID-APIs\KeyboardAPI.h を編集し、sSendReportの関数をpublicの所に追加する。

  // Needs to be implemented in a lower level
  virtual size_t removeAll(void) = 0;
  virtual int send(void) = 0;

  inline void sSendReport(void* data, int length) { HID().SendReport(HID_REPORTID_KEYBOARD, data, length); };

private:
  virtual size_t set(KeyboardKeycode k, bool s) = 0;
  inline size_t set(uint8_t k, bool s);
};

キーボードのレポートのデータ形式は下記の通り、キーは同時に6つまで+モディファイアキーを送信できる。

typedef union{
	struct{
		uint8_t modifiers;
		uint8_t reserved;
		KeyboardKeycode keycodes[6];
	};
} HID_KeyboardReport_Data_t;

モディファイアは下記の通り。

キー
0x01左Control
0x02左Shift
0x04左Alt
0x08左Win
0x10右Control
0x20右Shift
0x40右Alt
0x80右Win

キーの定義は下記を参照。

https://github.com/NicoHood/HID/blob/master/src/KeyboardLayouts/ImprovedKeylayouts.h

HID_KeyboardReport_Data_t のデータ構造体に押しているキーの情報を設定し、レポート送信する。もう一度空のデータを送信する事で、押して離した動作となる。

以下は、スケッチ開始5秒後にWin + R キーを押して離した後(ファイル名を指定して実行のウィンドウが開く)、notepad.exeを入力して改行を押すサンプル。上手く動けばメモ帳が開く。

#include <HID-Project.h> //HID-Project by NicoHood

#define MOD_CTL	0x01
#define MOD_SHFT	0x02
#define MOD_ALT	0x04
#define MOD_WIN	0x08

void setup() {
	delay(5000);

	Keyboard.begin();

	HID_KeyboardReport_Data_t report;
	memset(&report, 0, sizeof(HID_KeyboardReport_Data_t));
	report.keycodes[0] = KEY_R;
	report.modifiers = MOD_WIN;
	Keyboard.sSendReport(&report, sizeof(report)); //press

	delay(50);
	
	memset(&report, 0, sizeof(HID_KeyboardReport_Data_t));
	Keyboard.sSendReport(&report, sizeof(report)); //release

	delay(2000);
	
	Keyboard.print("notepad.exe\n");
}

void loop() {
}
Print Friendly, PDF & Email

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


*

CAPTCHA