ATmega 32u4を使った簡単なマウス操作をPart 2、Part 3で紹介したが、もう少し細かく制御したい場合に標準関数だともの足りない事がある。
マウス移動、複数マウスボタンのダウン/アップ状態、ホイールの移動を組み合わせて制御したい場合にはマウス制御のデータを直接組むと良い。
USBデバイスは各データをレポートと言う形で送信している。Absoluteタイプのマウスの場合、レポートは下記形式になっている。
typedef union{
// Absolute mouse report: 8 buttons, 2 absolute axis, wheel
struct{
uint8_t buttons;
int16_t xAxis;
int16_t yAxis;
int8_t wheel;
};
} HID_MouseAbsoluteReport_Data_t;
このデータを埋めて送信する事で、マウスを細かく制御出来る。
しかし、HID-Projectのライブラリではレポートの形式を送信する関数SendReportが封印されているため、ライブラリに少し手を入れる必要がある。
AbsoluteMouseの場合、HID-Project\src\HID-APIs\AbsoluteMouseAPI.h を編集しクラスの最後の方に sSendReport と言う関数を追加しておく。
public:
inline AbsoluteMouseAPI(void);
(中略)
// Sending is public in the base class for advanced users.
virtual void SendReport(void* data, int length) = 0;
inline void sSendReport(void* data, int length) { SendReport(data, length);};
};
これでsSendReport関数を使ってレポートを送信できる様になるので、Step 2で紹介したスタートメニューをクリックするサンプルをレポート形式制御してみると下記の様なスケッチになる。
#include <HID-Project.h> //HID-Project by NicoHood
void sendabsmousereport(uint16_t xpos, uint16_t ypos, uint8_t btn, int8_t wheel) {
HID_MouseAbsoluteReport_Data_t report;
report.xAxis = xpos;
report.yAxis = ypos;
report.buttons = btn;
report.wheel = wheel;
AbsoluteMouse.sSendReport(&report, sizeof(report));
}
void setup() {
delay(5000);
AbsoluteMouse.begin();
sendabsmousereport(30,32740,MOUSE_LEFT,0);
delay(100);
sendabsmousereport(30,32740,0,0);
}
void loop() {
}