/* * Enable IRQs for the interface. */ static void test_enable_irq(void) { uint8_t rsp[20]; unsigned int rsplen = sizeof(rsp); bt_cmd(set_bmc_globals_cmd, sizeof(set_bmc_globals_cmd), rsp, &rsplen); g_assert(rsplen == sizeof(set_bmc_globals_rsp)); g_assert(memcmp(set_bmc_globals_rsp, rsp, rsplen) == 0); bt_write_irqreg(0x01); bt_ints_enabled = 1; }
/* コマンドモード(mode)に入るための送受信を行う関数 */ int bt_cmd_mode(char mode){ int i; char cmd[4]; if( bt_cmd("GK") > 0 ){ // コマンドに応答があった場合で、かつ、 if( rx_data[0]=='1') bt_cmd("K,"); // ネットワーク接続されている場合は切断 else bt_cmd("---"); // 接続していない時はコマンドモード解除 sleep(1); // (RN-42が応答するまでの)1秒の待ち時間 } bt_rx_clear(); // シリアルの受信バッファを消去する for(i=0;i<3;i++) cmd[i]=mode; // コマンドモードに入る命令「$$$」を作成 cmd[3]='\0'; // 文字列の終端(念のための代入) write(ComFd, cmd, 3 ); // コマンドモードに入る命令を実行 i = bt_rx(); // 結果を受信(正常なら「CMD」が返る) if( i>=5 ){ // 何らかの応答があった場合 if( rx_data[i-5]=='C' && rx_data[i-4]=='M' && rx_data[i-3]=='D'){ return(1); // 成功(CMDの応答があった時) } } return(0); // 失敗(CMDの応答が無かった時) }
/* ローカルMaster機の設定用 */ void bt_init_local(void){ printf("Config BT \n"); if( !bt_cmd_mode('$') ){ // ローカルコマンドモードへの移行を実行 bt_error("Config FAILED"); } bt_cmd("SF,1"); // 工場出荷時の設定に戻す bt_cmd("SM,1"); // BluetoothのMasterデバイスに設定する bt_cmd("SA,4"); // PINペアリング方式に変更する。 bt_cmd("SO,%"); // 接続・切断時にメッセージを表示する bt_cmd("ST,255"); // コマンドモードの時間制限を解除する bt_cmd("R,1"); // 再起動 printf("DONE\n"); sleep(1); // 再起動待ち /* デバイス探索の実行 */ if( !bt_cmd_mode('$') ){ // ローカルコマンドモードへの移行を実行 bt_error("FAILED to open"); } printf("Inquiry \n"); bt_repeat_cmd("I","Found",5); // デバイスが見つかるまで探索を繰り返す printf("Found\n"); while( bt_rx()==0 ); // アドレスの取得待ち /* ペアリングの実行 */ printf("Pairing \n"); bt_cmd("SR,I"); // 発見したデバイスのアドレスを保存 bt_repeat_cmd("C","%CONNECT",8); // 接続するまで接続コマンドを繰り返す printf("DONE\n"); sleep(1); // 接続後の待ち時間 /* リモート機の設定 */ printf("RemoteCnf \n"); if( !bt_cmd_mode('$') ){ // ローカルコマンドモードへの移行 bt_error("RemoteCnf Failed"); } bt_cmd("ST,255"); // コマンドモードの時間制限を解除する bt_cmd("R,1"); // 再起動 printf("DONE\n"); sleep(1); // 再起動待ち }
/* コマンド(cmd)を期待の応答(res)が得られるまで永続的に発行し続ける関数 */ void bt_repeat_cmd(char *cmd, char *res, int SizeOfRes){ int i=0,j; bt_rx_clear(); // シリアルの受信バッファを消去する if(SizeOfRes >= RX_MAX)SizeOfRes=RX_MAX-1; // 文字制限の調整 do{ if( i==0 ) bt_cmd(cmd); // コマンドの発行(10秒に1回) if( ++i > 10 ) i=0; // iのインクリメント sleep(1); // 1秒間の応答待ち if( bt_rx() ){ // 受信データを取得 if( SizeOfRes == 0 ) i=-1; // SizeOfResが0の時は受信内容の確認なし for(j=0; j <= SizeOfRes ; j++ ){ // 内容を確認 if( res[j] == '\0' ){ // 期待文字がすべて一致した i=-1; // do-whileループを抜ける break; // 本forループを抜ける } if( res[j] != rx_data[j] || rx_data[j] == '\0') break; } // 不一致があればforループを抜ける if( j == SizeOfRes ) i=-1; // } }while( i >= 0 ); // 期待の応答があるまで繰り返し }