TINETを入れた際、ひとつ問題が生じました。TINETではppp_input_taskというタスクが入力の処理をおこなっており、モデムであるW-SIMへのアクセスも生じます。一方、音声通話処理ではmodem_reader_taskがやはりW-SIMからの入力を処理しています。このように、W-SIMからの入力を監視・処理するタスクが2つあるのです。
最初は音声通話(DTEモード)とデータ通信(アダプタモード)の変更をおこなう際に、担当タスクを起動し、他方は終了させることを考えました。しかし、ppp_input_taskはさらにnet_timer_taskやppp_output_taskタスクを起動する構造になっており、各タスクの管理する資源を正しく解放してやらないと、再起動がうまくできそうもありません。ppp_input_taskを調べてみると、modem_cntlという関数でATコマンド送受の処理をおこなっていることがわかりましたので、この関数にmodem_reader_taskの処理を吸収させることにしました。動作モードに応じて、従来のmodem_cntlの処理を行うか、modem_reader_task相当の処理を行うかを選択して処理します。
PPPのスタックには、接続と切断をphone_taskにデータ・キューを介して通知するコードを追加しました。これにより、PPPの状態変化でLCD表示のアイコンを変化させています。
電源を入れてすぐだと、W-SIMの準備も完全には整っていません。基地局を見つけて自局をPHS網に登録するにも、いくぶんかは時間がかかります。実際、ブート時には電界強度表示のアンテナアイコンも圏外表示で始まったり、安定しなかったりします。そのため、ブート直後のPPP接続は失敗することもあるようです。TINETではディフォルトで10秒間隔で2回 接続の再試行をおこなうようになっていました。この機能のおかげで、自宅で実験している限りにおいては、確実にPPP接続に成功して時刻を拾えるようです。
最初は音声通話(DTEモード)とデータ通信(アダプタモード)の変更をおこなう際に、担当タスクを起動し、他方は終了させることを考えました。しかし、ppp_input_taskはさらにnet_timer_taskやppp_output_taskタスクを起動する構造になっており、各タスクの管理する資源を正しく解放してやらないと、再起動がうまくできそうもありません。ppp_input_taskを調べてみると、modem_cntlという関数でATコマンド送受の処理をおこなっていることがわかりましたので、この関数にmodem_reader_taskの処理を吸収させることにしました。動作モードに応じて、従来のmodem_cntlの処理を行うか、modem_reader_task相当の処理を行うかを選択して処理します。
PPPのスタックには、接続と切断をphone_taskにデータ・キューを介して通知するコードを追加しました。これにより、PPPの状態変化でLCD表示のアイコンを変化させています。
電源を入れてすぐだと、W-SIMの準備も完全には整っていません。基地局を見つけて自局をPHS網に登録するにも、いくぶんかは時間がかかります。実際、ブート時には電界強度表示のアンテナアイコンも圏外表示で始まったり、安定しなかったりします。そのため、ブート直後のPPP接続は失敗することもあるようです。TINETではディフォルトで10秒間隔で2回 接続の再試行をおこなうようになっていました。この機能のおかげで、自宅で実験している限りにおいては、確実にPPP接続に成功して時刻を拾えるようです。