01. 動作フロー
SPRESENSEの動作フロー概要を説明します。
以降、"Spresense"を"デバイス"と称します。
図中の太枠は、動作モード説明の開始点を示します。
デバイスには、大きく分けて以下のモードがあります。
スクリプト実行モード
デバイスの基本動作で、動作スクリプトを実行するモードです。セーフモード
動作スクリプト実行中に、throwやSyntax errorなどにおいて例外が発生した場合、動作スクリプトの修正を待つモードです。ファームウェア更新モード
デバイスのファームウェア更新、及びNEQTO Machine Driverを使用してユーザーデバイスのファームウェア更新を行うモードです。
以下に各モードの動作フローを説明します。
スクリプト実行モード
通常起動動作
動作スクリプト実行モードは、デバイスの基本動作です。
デバイスは、起動後に初期化を行います。
初期化後、ネットワークに接続します。
ネットワーク接続後、NEQTO Consoleにアクセスし認証を行います。
認証が完了すると、動作スクリプトをダウンロードし実行します。
ネットワーク未接続時の起動動作
デバイス起動時にネットワーク接続できなかった場合、ネットワーク接続をリトライします。
この状態では、動作スクリプトは実行されないのでご注意ください。
ネットワーク設定や電波環境などを見直し、デバイスを再起動してください。
ノード未登録時の起動動作
NEQTO Console 上ノード未登録の状態で、デバイスを起動した場合、認証で失敗します。
この状態では、動作スクリプトは実行されないのでご注意ください。
ノード登録を確認し、デバイスを再起動してください。
スクリプトの再ロードの動作
スクリプトの再ロードは、一度動作スクリプトを終了し、更新された動作スクリプトをダウンロードして実行する動作となります。
基本的に、メインルーチンが全て完了した状態かつ、タイマやnqMQTTオブジェクト等、コールバック待ちを行うリソースが全て解放されている状態の場合、再ロードが行われます。
一方、リソースの解放を待たずに、再ロードする方法が2つあります。
NEQTO Consoleからのトリガーコマンド(プッシュ通知)契機
NEQTO Console上からトリガーコマンドを使用して、"スクリプトを再ロード"を起動します。
デバイスはNEQTO Consoleから"スクリプトを再ロード"の指示を受信すると、強制的に動作スクリプトを終了し、スクリプトの再ロード動作を行います。
動作スクリプトを更新する場合や、遠隔から意図的にスクリプトを再起動させたい場合等に使用します。既定のハッシュタグを含んだthrow文契機
下記、throw文を実行すると、動作スクリプト内から自発的に再ロードを起動させることができます。
定期的にスクリプトの更新がないか確認を行う場合や意図的にスクリプトを再起動させたい場合等に使用します。throw '#nqEXIT';
throw new Error('#nqEXIT');
Expressモード有効時の起動動作
通常起動動作では、スクリプトが起動するまでに、ネットワーク接続、認証及びスクリプトのダウンロードが必須となります。Expressモードはこれらの必須条件をバイパスし、スクリプトを起動することを可能とする機能です。
デバイスは起動直後、ネットワーク接続から開始しますが、無線環境等の要因でネットワーク疎通までに時間を要する場合があることが想定されます。しかしながら、スクリプトをできるだけ早く動作させる必要がある場合にExpressモードが有効です。
Expressモードを有効とした場合、ネットワーク接続待ちタイムアウト処理が有効となります。
タイムアウト前にネットワークが疎通できた場合は、通常起動動作が継続され、認証、スクリプトのダウンロード、スクリプトの起動となります。
タイムアウトが発生した場合は、認証、スクリプトのダウンロードがバイパスされ、デバイス内に保存されている前回ダウンロード済みのスクリプトが起動します。尚、ネットワーク接続待ちタイムアウト後も、ネットワーク接続処理は継続されており、ネットワーク疎通した時点から通信機能を要する機能が使用可能となります。
Expressモード設定
ExpressモードはNEQTO Console上から有効/無効を切り替えます。こちらを参照してください。
ネットワーク接続待ちタイムアウト値
タイムアウト値はnqService.setExpressConf()メソッドで設定変更が可能です。デフォルト値は30
秒となります。0
を指定した場合は、実質、ネットワーク接続待ちを行わないため、即座に前回ダウンロード済みのスクリプトを起動することができます。
システム時刻について
デバイスのシステム時刻は通常、ネットワーク接続後、認証シーケンス中に同期しますが、Expressモードによってバイパスされた場合、基本的に現在時刻が設定されていない状態で、スクリプトが起動することになります。時刻同期が行われるまでの間、システム時刻は初期値1970/1/1 00:00:00
から開始された時刻となります。時刻同期についてはこちらを参照してください。尚、rtc.getInitTimeCorrVal()メソッドを使用して、時刻同期前に取得したタイムスタンプを時刻同期後に現在時刻へ変換することができます。
スタンバイモードの動作
Version 02.00.00以降、動作スクリプト上から下記メソッドを使用して、デバイスをスタンバイモードに遷移させることができます。
スタンバイモードは、電源オフに近い状態でデバイスが待機状態となり、待機電力を最も削減できます。
レジューム条件が発生すると、通常起動動作から再び開始されます。(通常レジューム)
sleep.setStandby() <推奨>
1.ネットワーク通信の正常切断を待ってから通信モジュールをシャットダウンし、スタンバイモードに遷移します。
sleep.setStandbySync()
2.ネットワーク通信を強制切断し、通信モジュールをシャットダウンして、スタンバイモードに即時遷移します。
スタンバイモード遷移時間に制約ない場合は、sleep.setStandby()メソッドの使用を推奨します。
スタンバイモードのオフラインレジューム動作
上記、スタンバイモードメソッドには「オフラインレジューム」オプションがあります。
レジューム条件が発生すると、デバイスは再起動し、ネットワーク接続をスキップして、保持されている動作スクリプトをすぐに実行します。
オフラインレジュームでは、通信機能を要する機能を使用することができません。
throw '#nqEXIT'
等で自発的にスクリプトを終了した場合、オフラインレジュームを維持した状態で、スクリプトが再起動します。スクリプトで例外が発生した場合は、自発的にデバイスがリセットされ、通常レジュームで再起動します。
スタンバイモードのレジューム条件
- RTCアラームが発生した時 (
Cold Sleep
/Deep Sleep
) - IOポート入力割り込み設定されたポートでレベル変化を検出した時 (
Cold Sleep
のみ)割り込み条件 動作 立ち上がりエッジ ポート入力がHighでレジュームします。 立ち下がりエッジ ポート入力がLowでレジュームします。 立ち上がり・立ち上がりエッジ ポート入力の状態が変化するとレジュームします。
※ (***
)は使用するSpresenseのスリープモードとなります。上記、スタンバイモードメソッドから指定可能です。
セーフモード
セーフモード動作
動作スクリプト実行中に、throwやSyntax errorなどにおいて例外が発生した場合、動作スクリプトの修正を待ちます。この状態をセーフモードと呼びます。
動作スクリプトを確認、修正し、NEQTO Console上からトリガーコマンドを使用して、"スクリプトを再ロード"を起動します。
デバイスは、NEQTO Console から"スクリプトを再ロード"の指示を受信すると、更新された動作スクリプトをダウンロードし実行します。
また、デバイスはセーフモード中に自ら動作スクリプトの更新確認を行います。
確認を行う間隔は、
1分、2分、4分、8分、16分、30分...と延びていき、それ以降は30分間隔です。
ファームウェア更新モード
NEQTO Machine Driverを使用したユーザーデバイスのファームウェア更新動作
デバイスはNEQTO Console からMachine Driver更新指示を受信すると、Machine Driverスクリプトをダウンロードし実行します。
Machine Driverスクリプトが、ファームウェアイメージファイルのダウンロードやユーザーデバイスのファームウェア更新を行います。
Machine Driverスクリプト処理が終了すると、動作スクリプト実行に戻ります。
デバイスファームウェア更新動作
デバイスはNEQTO Console からファームウェア更新指示を受信すると、ファームウェアをダウンロードし、ファームウェア更新を行います。
ファームウェア更新が完了すると、自動的に再起動が行われ、通常動作に戻ります。
尚、既にデバイスのファームウェアが更新済みであった場合、ファームウェア更新処理はスキップされます。
注意: ファームウェア更新中は、デバイスの電源を切らないでください。
システム時刻同期について
デバイスはNEQTO Consoleから時刻情報を取得し、自動的に時刻同期します。
時刻同期が行われるタイミングは下記となります。
フェーズ | 時刻更新タイミング |
---|---|
NEQTO Console間認証時 | デバイス起動時等、認証シーケンスが実行された時 |
動作スクリプト実行中 | 定期的に1日1回 |
nqServiceオブジェクトの時刻補正メソッドを実行した時 | 任意タイミング |