はじめに
前回の念を入れた調査により、送信した命令文がそもそも有効かどうか、そしてその実行に成功したかどうかをpcall()
の返値によって調べられることがわかりました。
今回はこれらの結果を、命令文を送信する(コンピュータ)側で表示するようプログラムを改造しました。
まずはどのような挙動をするか、インストールして試してみましょう。
プログラムのインストール
メッセージ受信(タートル)側プログラム バージョン6
> pastebin get ZsGmzz2T msg_receiver6
メッセージ送信(コンピュータ)側プログラム バージョン6
> pastebin get yUgqzL98 msg_sender6
プログラムの挙動
メッセージ送信(コンピュータ)側の画面
- そもそも存在しない、てきとーな命令を入力
- 有効な命令であり、その実行に成功した
- 有効な命令だが、その実行に失敗した
この遠隔操作プログラムを使って、タートルに命令を出したとき、
- 「そもそもそんな命令存在しないですよ」
- 「命令の遂行に成功しましたよ」
- 「命令の遂行に失敗しましたよ(原因は・・・)」
のような返事を得ることができます。これで、かなり使いやすくなりますね。
それではどうやってこのような返事のやり取りを実装したのでしょうか。ソースコードを見てみましょう。
メッセージ受信(タートル)側プログラム バージョン6
ソースコード
解説
注目ポイントは2点あります。
1つ目は、pcall()
による関数実行結果(L48でテーブルコンストラクタを使ってテーブル型に変換)をrednet.send()
で送信元に送り返していることです。
rednet.send()
により送信するメッセージは、必ず「文字列」でなければいけません。
そのためL51のように、textutils.serialize(results))
を使うことで、テーブルを無理矢理文字列型に変換(シリアライズ)しています。
2つ目はL54のように、pcall()による関数実行結果をprintResults()
によって詳細に識別し、その結果を画面に表示していることです。
どのように判別しているかについてはL17-34のコードと、前回の分析結果を参照してください。
メッセージ送信(コンピュータ)側プログラム バージョン6
ソースコード
解説
注目ポイントは3点あります。
1つ目はL69を見てください。
rednet.receive(3)
によって命令の返答を受け取っています。ここでは念のため3秒間だけ返事を待っていますが、もしかしたら1秒でも問題ないかもしれません。
2つ目はL70になります。
受け取った返答であるresults
は、もう片方の受信側プログラムの中でtextutils.serialize(results))
によってシリアライズ(文字列化)されています。
そのため、textutils.unserialize()
を使ってテーブル型に復元しています。
最後の3つ目は、同じくL70において、テーブル型に復元された返答をprintResults()
を使って詳細に分析し、実行の成功失敗を表示していることです。
おわりに
このように、送ったメッセージ(命令文)に対して折り返し返答を得るためには、先方がrednet.send()を使って意図的にメッセージを送り返す必要があります。
めんどー。
このあたり、新しいバージョンであるComputerCraft1.6で改善されているようです。期待しましょう。
それではこれで、無線通信のチュートリアルを一旦終了とします。
更なる改造のアイデアはありますが、これ以上は無線通信とはかけ離れてしまいますので。
次回の連載は、Twitterでリクエストいただいた、ファイル操作関連(FS API)が面白いのではないかと考えています。
予定は未定で決定ではありません。他にもリクエストいただければ喜んで検討しますのでぜひご意見をお寄せください。
またこれまでの無線通信関連のチュートリアル記事について、感想もお待ちしております。