あそ~ぶUSB サンプルソース解説・その4

USBマウスを作る

2010/11/26

Assembly Desk

1. 概要

ここでは、あそ~ぶUSB のサンプルプログラムを解説していきます。

ここではUSBマウスを作成します。

59秒に一回、マウスカーソルをわずかに動かしてスクリーンセイバに入らない様にするソフトを作成します。

なお、本サンプルソースはMicrochip社のMCHPFSUSBver2.7を元にして作成しています。

この文章は、開発環境が既にインストールされている事を前提としてかかれています。

まだ、開発環境を整えて居ない方はこちらを参考にして、まずは開発環境を整えて下さい。

http://a-desk.jp/modules/forum_pic/index.php?cat_id=4

まだ、ファームウェアのビルドの仕方についてはこちらを参考にして下さい。

http://a-desk.jp/modules/forum_pic/index.php?cat_id=3

2. ソースコード解説

2.1 ファイルの構成

”mouse_sample”は次の様な、様々なファイルで構成されています。

これらのファイルには、USBの通信を行う為の様々な記述があります。

ここでは、手っ取り早くUSBマウスのソフトを作れる様になるための、最低限の説明を行います。

“mouse.c”このファイルを開いてください。

とりあえず、このファイルの中の次の二つの関数を弄るだけで、大抵のマウスの機能は実現出来ます。

2.2 void UserInit(void)関数

まずは、”mouse.c”の中のUserInit関数を見ていきます。

ここは、プログラムが動きだしてから最初に一回だけ実行されます。

色々な初期化ルーチンを書く事が出来ます。

また、USB関係の初期化はこの関数が実行された後にやってくれるので、よっぽど変な設定をしない限りは正常に動作してくれます。


/******************************************************************************

 * Function:        void UserInit(void)

 *****************************************************************************/

void UserInit(void)

{

    //Initialize all of the mouse data to 0,0,0 (no movement)

    buffer[0]=buffer[1]=buffer[2]=0;

    lastTransmission = 0;

}//end UserInit


ここでは、バッファの初期化を行っています。

このbuffer[]と言う配列は後で、USBのデータ送信に使用する為のものです。

lastTransmissionは後で使うUSB通信の管理を行う為の変数です。

削除しないでください。

2.3 void Emulate_Mouse(void)関数

Emulate_Mouse関数では、マウスとして、PCにどのようなデータを送信するかを記述します。


/******************************************************************************

 * Function:        void Emulate_Mouse(void)

 *****************************************************************************/

void Emulate_Mouse(void)

{  

if(HIDTxHandleBusy(lastTransmission) == 0)

{

//ここは1/1000秒に一度実行される。

//よって、SSC_TIMER_COUNT/1000秒に一回、マウスが左に10ビット、右に10ビットぴくっとうごく

                   ssc_timer--;

                if(ssc_timer == 2)

                        buffer[1] = -10;

                if(ssc_timer == 1)

                        buffer[1] = 10;

                if(ssc_timer == 0)

                        ssc_timer = SSC_TIMER_COUNT;

           

//copy over the data to the HID buffer

hid_report_in[0] = buffer[0];

hid_report_in[1] = buffer[1];

hid_report_in[2] = buffer[2];

buffer[0] = 0;

                buffer[1] = 0;

                buffer[2] = 0;

     

lastTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);

}

}//end Emulate_Mouse


if(HIDTxHandleBusy(lastTransmission) == 0)このif文の中に、ASOOVUからPCに送信するデータを入れます。

一度buffer[0]~[2]に格納したデータをhid_report_in[0]~[2]に代入し、それを送信しています。

実はこのif文はUSB通信の際にしか実行されません。ASOOVEはPCとの通信を1/1000秒に一回行う様に設定してあるので、このif文は1/1000秒に一回しか実行されません。

この事を用いて、59秒と言う時間を測っています。

具体的には、初期値を59000としたssc_timer変数を1/1000秒に一回ずつ1ずつ減らします。

そして、このカウンタが2になったときにマウスを-10ドット(実際にはwindowsの設定によって何ドット動くかは変わります)1になったときに10ドット動かします。

ssc_timerが0になったら再び59000に戻します。

なお、buffer[0]~[1]は以下の様な意味になっています。

buffer[0] ビット0

左クリック

buffer[0] ビット1

右クリック

buffer[1]

マウスの左右移動量

buffer[2]

マウスの上下移動量