前回C++からPython 用のIndi ClientライブラリPyIndiを起動しました。ではこれをSkySafariのようにIndi driverから起動します。まぁ特に引っかかるところもないでしょ、と思っていたら色々ハマってまだ途中。殆どは自分のポカなのですが、いくつかPyIndi側の課題があったのでメモ。

PyIndiの使い方は基本的にここに書かれている通り。C++でIndi Clientを作るときの基底クラスであるINDI::BaseClientのラッパなので、ここに書かれていないこともC++と同じ書き方すれば基本OK。



まず一つ目。Indi Driverをローカルとして実行するか、リモートとし実行するか。要するにKStarsのここの設定。リモートだと明示的にindiserverを起動してやる必要があります。
Screenshot_2020-10-11_22-23-18

今回作るものは、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時に死んでも実用上は問題ないのですが、これもキモチワルイ。なんでだろうなぁ・・

Screenshot_2020-10-11_21-30-42


それにしてもIndiのデバッグやりにくい。標準出力が表示されなくて、各種ログはKStars上に表示されるけど、簡単にKStarsごと落ちてくれるのでログが見られない。indiserverを立てている場合はそっちに表示させることもできるけど、表示するログレベルを変える必要があって、他のドライバやら関係ない通信の情報やらも表示されてエラー探すのが大変。

なんかいいやり方ないのかなぁ。