BT_CommandWaitからの卒業

プレンのBluetooth通信を支配しているのはBT_CommandWait()関数です。
BT_CommandWait()はライブラリから提供されている関数であり、
ソースコードを見れないので何をやっているかはわからない。


Bluetooth通信の制御を僕たちの手に取り戻すには、自分で送受信部分のコードを書かなければいけないわけです。

http://d.hatena.ne.jp/plen/20080214 
に書いたファームのコードから該当しそうなところを下に貼付けます。
説明しやすいように行に番号をつけてます。

  1 while(1){
  2     //      walk(); 
  3     if( 0 < Rs0_DataIsIn() ){
  4         c = Rs0_CharGet();  
  5         if ( c == '0' ) {               
  6             MotionTask_Start_EEPROM( 0 );                                
  7             Rs0_Printf( "playing motion 0" ); 
  8         }                                                                   
  9         else if ( c == '1' ) {
 10             MotionTask_Start_EEPROM( 1 );                                   
 11             Rs0_Printf( "playing motion 1" );  
 12         }                                                       
 13         while( MotionTask_IsRunning() );
 14         //BT_CommandWait();                                                 
 15     }               
 16     if( 0 < Rs_DataIsIn()) {                                                
 17         PCLink_CommandWait();                   
 18     }
 19 }   


まず、あんまり関係ないところから。
2行目のwalk()関数は、その名前から歩行関係の制御をしているのが予想できます。今は関係ないのでコメントアウトしてます。
14行目、BT_CommandWait()からの卒業だ。

16行目から18行目は、モーション作成やモーション登録に必要なので、今は残しておきます。


3行目から15行目までで、送受信とモーション再生をやっています。
3行目でBluetoothモジュールに接続されたポートにデータが入ってきたかどうかを判定しています。


4行目で1文字受信して変数cに代入します。
5行目と9行目で変数cを評価します。


6行目と10行目でEEPROMに登録したモーションを再生します。引数に渡す数字はモーション番号です。


7行目と11行目で文字列を送信します。今はデバグのために使ってます。


13行目は、再生をはじめたモーションが終了するまで待たせる命令です。
これがないとモーション再生中でも、コマンドを受信したら次のモーションを開始してしまいます。


大雑把にこんな感じですが、説明がだらだらして面白くないので、ここで例題。
一つのコマンドで、モーションを複数再生する場合はどうするか。
#たいした例題じゃないですが。

c = Rs0_CharGet();  
if ( c == '0' ) {  
    MotionTask_Start_EEPROM( 0 );
    while( MotionTask_IsRunning() );
    MotionTask_Start_EEPROM( 1 );
    while( MotionTask_IsRunning() );
    MotionTask_Start_EEPROM( 2 );
    while( MotionTask_IsRunning() );
}

0を受信すると、モーション番号0から2まで順番に再生するというのができます。