|
|
当サイトは、玄箱PRO (KURO-BOX/Pro)を中心とした組み込み、Linuxと電子工作を扱っています。
会社案内
情報セキュリティおよび個人情報の取り扱いについて コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。コメントはそれぞれ投稿した人のものです。 |
シリアル・ポートからのデータは1バイトずつ受信し、改行コードを受信したらRI端子から送信します。6バイトを超えた場合には不正なデータとして破棄しています。スケッチの全体はOnkyoIntec205-111112a.zipです。Arduinoに書き込んでください。long recieve(bool s) { long r = 0; byte recv[6]; unsigned long time = micros() + 500; delayMicroseconds(500); for (int j=0; j<6; j ++) { for (int i=0; i<6; i ++) { if (digitalRead(pinRIin) == HIGH) { // Serial.print("0,"); recv[i] = 0; } else { // Serial.print("1,"); recv[i] = 1; } while ((micros() - time)<1000) {} time += 1000; } int b = sig2byte(recv); if (b>=0 || r>=0) { r = (r<<4 | b); if (s) Serial.print(b, HEX); } else { r = -1; if (s) Serial.print('X', BYTE); } } if (s) Serial.println(); return r; }
■MPDクライアントの動作を考える// シリアルから文字を受信したとき if (Serial.available()) { int b = Serial.read(); if (b == '\r' || b == '\n') { if (len == 6) { send(cmd); if (strncmp(cmd, S_ALL_POWER_ON, 6) == 0) power = true; else if (strncmp(cmd, S_ALL_POWER_OFF, 6) == 0) power = false; } len = 0; } else { if (len<6) { cmd[len] = b; len ++; } else { // 6バイト以上送られてきたときは受信した文字を捨てる len = 0; } } }
while (1) {
/* RI 端子の信号をチェックする */
ri_cmd = ri_check(asy);
if (ri_cmd > 0) {
//fprintf(stderr, "%06x\n", ri_cmd);
if (ri_cmd == CD_PLAY) {
// 再生ボタンが押されたら、mpdにplayを送って、アンプの電源を入れる
mpd_send_cmd(s_mpd, "play\n");
mpd_playing = 1;
ri_send(asy, ALL_POWERON);
ri_send(asy, AMP_XXX);
ri_send(asy, AMP_SELCD);
} else if (ri_cmd == CD_PAUSE)
mpd_send_cmd(s_mpd, "pause\n");
else if (ri_cmd == CD_STOP || ri_cmd == ALL_POWEROFF)
mpd_send_cmd(s_mpd, "stop\n");
else if (ri_cmd == CD_NEXT)
mpd_send_cmd(s_mpd, "next\n");
else if (ri_cmd == CD_PREV)
mpd_send_cmd(s_mpd, "previous\n");
else if (ri_cmd == CD_RANDOM) {
if (mpd_status.random == 0)
mpd_send_cmd(s_mpd, "random 1\n");
else
mpd_send_cmd(s_mpd, "random 0\n");
} else if (ri_cmd == CD_REPEAT) {
if (mpd_status.repeat == 0)
mpd_send_cmd(s_mpd, "repeat 1\n");
else
mpd_send_cmd(s_mpd, "repeat 0\n");
}
}
// mpd の状態をチェックする
if (s_mpd > 0) {
if (mpd_get_status(s_mpd, &mpd_status) < 0) {
/* エラーの場合は接続を切る */
shutdown(s_mpd, SHUT_RDWR);
close(s_mpd);
s_mpd = -1;
} else {
if (strcmp(mpd_status.state, "play") == 0) {
if (mpd_playing == 0) {
// 再生が始まったら、アンプの電源を入れる
// fprintf(stderr, "Start playing\n");
ri_send(asy, ALL_POWERON);
ri_send(asy, AMP_XXX);
ri_send(asy, AMP_SELCD);
}
mpd_playing = 1;
} else {
mpd_playing = 0;
}
}
}
usleep(100*1000);
}
このブログ記事を参照しているブログ一覧: MPD (Music Player Daemon) とミニコンポを連動させる (2/2)
このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/6142
おすすめ書籍 |
![]() |
コメントする