前回C++からPython 用のIndi ClientライブラリPyIndiを起動しました。ではこれをSkySafariのようにIndi driverから起動します。まぁ特に引っかかるところもないでしょ、と思っていたら色々ハマってまだ途中。殆どは自分のポカなのですが、いくつかPyIndi側の課題があったのでメモ。
PyIndiの使い方は基本的にここに書かれている通り。C++でIndi Clientを作るときの基底クラスであるINDI::BaseClientのラッパなので、ここに書かれていないこともC++と同じ書き方すれば基本OK。
まず一つ目。Indi Driverをローカルとして実行するか、リモートとし実行するか。要するにKStarsのここの設定。リモートだと明示的にindiserverを起動してやる必要があります。
今回作るものは、Indi DriverからIndi Clientを起動します。そうすると起動されたIndi Clientは何につなぎに行けばよいのか、という話。indiserverが明示的に起動されていればそこにつなぎに行けばいいですが、ローカルの場合は?
SkySafariではこんなふうにしています。
indiserverのアドレスとポートはデフォルトではlocalhost, 7624となっていて、普通にindiserverに接続するのと同じ。これでSkySafari Clientはつなげているみたいです。
ただ今回それと同じことをPyIndiでやろうとすると、indiserverにはつながるものの、そのindiserverにつながっているデバイスを見つけてくれない・・・Pythonからはダメなんだろうか・・理由不明。仕方がないのでindiserverを明示的に立てることにします。
次2つ目。今回PyIndiをIndi Driverから起動したり停止したりします。これは何を意味するかというと、PyIndiの内部状態に関わらず、停止や開始の指示が来る、ということ。今回ハマったのはindiserverに接続かけた後、接続後の各種処理が終わる前に停止指示が来た場合。PyIndiにはそのあたりの処理が完了したことを知る手段がないようです。
仕方がないので、1秒の待ちを入れていますが、キモチワルイ・・
次3つ目。これはまだ未解決。KStarsから今回作ったIndi Driverにつないだ後、DisconnectするとIndi Driverごと停止してしまうという症状。まぁindiserverはよくできていて Indi Driverが死ぬと自動的に再度起動してくれるため、disconnect時に死んでも実用上は問題ないのですが、これもキモチワルイ。なんでだろうなぁ・・
それにしてもIndiのデバッグやりにくい。標準出力が表示されなくて、各種ログはKStars上に表示されるけど、簡単にKStarsごと落ちてくれるのでログが見られない。indiserverを立てている場合はそっちに表示させることもできるけど、表示するログレベルを変える必要があって、他のドライバやら関係ない通信の情報やらも表示されてエラー探すのが大変。
なんかいいやり方ないのかなぁ。
PyIndiの使い方は基本的にここに書かれている通り。C++でIndi Clientを作るときの基底クラスであるINDI::BaseClientのラッパなので、ここに書かれていないこともC++と同じ書き方すれば基本OK。
まず一つ目。Indi Driverをローカルとして実行するか、リモートとし実行するか。要するにKStarsのここの設定。リモートだと明示的にindiserverを起動してやる必要があります。
今回作るものは、Indi DriverからIndi Clientを起動します。そうすると起動されたIndi Clientは何につなぎに行けばよいのか、という話。indiserverが明示的に起動されていればそこにつなぎに行けばいいですが、ローカルの場合は?
SkySafariではこんなふうにしています。
bool SkySafari::Connect()
{
bool rc = startServer();//SkySafariスマホアプリとつなぐためのサーバ起動。今回関係なし
if (rc)
{
skySafariClient->setMount(ActiveDeviceT[ACTIVE_TELESCOPE].text);
skySafariClient->setServer(SettingsT[INDISERVER_HOST].text, std::stoi(SettingsT[INDISERVER_PORT].text)); // <= (1)
skySafariClient->connectServer(); //<=(2)
SetTimer(POLLMS);
}
return rc;
}
(1)がindiserverのアドレスとポート設定、(2)がindiserverへの接続です。indiserverのアドレスとポートはデフォルトではlocalhost, 7624となっていて、普通にindiserverに接続するのと同じ。これでSkySafari Clientはつなげているみたいです。
ただ今回それと同じことをPyIndiでやろうとすると、indiserverにはつながるものの、そのindiserverにつながっているデバイスを見つけてくれない・・・Pythonからはダメなんだろうか・・理由不明。仕方がないのでindiserverを明示的に立てることにします。
次2つ目。今回PyIndiをIndi Driverから起動したり停止したりします。これは何を意味するかというと、PyIndiの内部状態に関わらず、停止や開始の指示が来る、ということ。今回ハマったのはindiserverに接続かけた後、接続後の各種処理が終わる前に停止指示が来た場合。PyIndiにはそのあたりの処理が完了したことを知る手段がないようです。
indiclient.connectServer() while True: time.sleep(1) #<=ココ if not getRunningStatus(): break
仕方がないので、1秒の待ちを入れていますが、キモチワルイ・・
次3つ目。これはまだ未解決。KStarsから今回作ったIndi Driverにつないだ後、DisconnectするとIndi Driverごと停止してしまうという症状。まぁindiserverはよくできていて Indi Driverが死ぬと自動的に再度起動してくれるため、disconnect時に死んでも実用上は問題ないのですが、これもキモチワルイ。なんでだろうなぁ・・
それにしてもIndiのデバッグやりにくい。標準出力が表示されなくて、各種ログはKStars上に表示されるけど、簡単にKStarsごと落ちてくれるのでログが見られない。indiserverを立てている場合はそっちに表示させることもできるけど、表示するログレベルを変える必要があって、他のドライバやら関係ない通信の情報やらも表示されてエラー探すのが大変。
なんかいいやり方ないのかなぁ。
コメント
コメント一覧 (5)
ログですが、Ekosの設定画面の”LOG"ボタンでログ出力の変更やファイルへの書き出しが出来ますが、このボタンの設定で開発のチェックの役に立ちますか?
(この機能はStellarMateが出来て一気にトラブル報告が増えた時に付いたものです。)
nekomeshi312
がしました
サーバ自体はドライバを個別にオンオフ出来るのですが、Ekosの場合、プロファイルエディタでサーバ、ドライバをまとめて立ち上げる仕様になっています。(しかもサーバからではなく、KStarsが所持しているxmlでプロファイル設定するため、サーバ側でオリジナルのドライバを持っていてもEkosから起動できない矛盾が起きます。開発者には以前報告しましたが改善されていません。)
そのためなのかドライバ単体を再起動かけようとすると高い確率でクラッシュします。
私はこのトラブルを避けるためにINDIWebマネージャーを使用しています。(INDIWebマネージャーを使用するとインターフェイスも準備されており、ドライバ毎の再起動が容易です。
Ekos側はIPアドレスだけ揃えてCCDのみシミュレーションドライバでも設定しておけばサーバからXMLを取得しますのでオリジナルドライバも正常に起動します。
nekomeshi312
がしました
試してみます。ありがとうございます!!。
3つ目の問題については、indiserver側にオリジナルのドライバを持っているのではなくて、ローカルと同じところにドライバを置いていて単にindiserverで起動しているだけなので、教えていただいたケースには当たらないような気がします。でも情報ありがとうございます。気をつけてみてみます。
作っている今は使っていませんが、出来上がったらindidriverの起動は私もIndi web managerを使うつもりです。
nekomeshi312
がしました
KStarsにxmlファイル置いてあればEkosのプロファイルエディタで起動できますね。
なのですが、Ekosで起動する場合セットしたドライバセットの中のいくつかを外(もしくはKStarsにあるドライバ設定画面から)再起動かけるとクラッシュしてしまうんですよ。
(Ekosで起動したドライバの関係が崩れると、アプリもサーバもクラッシュすることが多いです。)
INDIWebマネージャーで起動してEkosで受信する設定にするとこの問題が起きません。(謎ですが。。。)
INDIというよりEkosがサーバやドライバの扱い方に癖があるように感じています。
nekomeshi312
がしました
今の所実用上は問題にはならないので、おいおいソースコード追いかけてみることにします。
にしても厄介だなぁ・・・
nekomeshi312
がしました