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まで順番に再生するというのができます。