R2P2ESP32

ファイル転送

デバイスにファイルを配置する3つの方法 — Webターミナル、Rakeタスク、ビルドへの組み込み。

デバイスにファイルを配置するには3つの方法があります。

  • Webターミナルで配置する — 既存の接続経由でブラウザからアップロードします。 再ビルドや再フラッシュは不要です。
  • Rakeタスクで配置する — ホストのコマンドラインからアップロード(ダウンロードも可) します。こちらも再ビルドや再フラッシュは不要です。
  • ビルド時に配置する — ビルドする前にプロジェクトのstorage/ディレクトリに ファイルを置いておき、ファームウェアイメージ自体に組み込みます。

Webターミナルで配置する

WebターミナルのFile Editor(または任意のシリアル 接続)を使います。クイックスタートでhello.rbをアップロードした のと同じ方法です。素早く試せますが、この方法でアップロードしたものは、デバイスを 消去して再書き込みすると失われます。

Rakeタスクで配置する

rakelib/picomodem.rakeには、ホストのコマンドラインからシリアル接続経由でファイルを 転送するタスクが用意されています。picoruby-picomodemに同梱のPicoModemクライアントを 使います。rake setup_<target>でビルドされたホストのpicoruby(または環境変数 PICORUBYで指定したもの、PATH上のもの)で動作します。

# アップロード: REMOTEを省略するとLOCALのファイル名になります
rake "picomodem:put[hello.rb,/home/hello.rb]"

# ダウンロード: LOCALを省略するとREMOTEのファイル名になります
rake "picomodem:get[/home/hello.rb,hello.rb]"
  • シェルが[...]を解釈しないよう、タスク名は引用符で囲んでください。
  • シリアルポートはrake flashと同様にPORTで指定します(クライアントの デフォルトは/dev/ttyACM0)。例: PORT=/dev/ttyUSB0 rake "picomodem:put[...]"
  • デバイスのシェルがプロンプトで待機している必要があります。また、シリアルモニターや Webターミナルなど、他のプログラムがポートを使用していないようにしてください。

Webターミナルと同様に、デバイスを消去して再書き込みすると失われます。

ビルド時に配置する

プロジェクトルートのstorage/ディレクトリは、そのままデバイス自身のファイルシステムに なります。現在は2つのサブディレクトリがあります。

storage/
├── etc/
└── home/

ビルド時、main/CMakeLists.txtはlittlefs_create_partition_imageを使って storage/ディレクトリ全体をLittleFS イメージにまとめ、partitions.csvで定義されたstorageパーティション(1MB)に対象化します。 この呼び出しにはFLASH_IN_PROJECTが含まれているため、idf.py flash (およびrake flash、フラッシュとモニタリングを参照)は このイメージをアプリと一緒に自動的に書き込みます。特別な手順は不要です。

起動時には、main_task.rbがこれをルートボリュームとしてマウントします。

Shell.setup_root_volume(:flash, label: 'storage')

これにより、実行中のpicoruby-shellではstorage/homeが/homeに、storage/etcが /etcになります。クイックスタートで見た/home/hello.rbというパスと同じ仕組みです。

デフォルトの/home/app.rbを同梱したい場合(mrblib/main_task.rbを参照 — /home/app.mrbか/home/app.rbが存在すれば自動的にloadします)や、ファームウェアが 依存する設定をコミットしておきたい場合に便利です。

例: Wi-Fi自動接続の設定

rake gen_wifi_config(Wi-Fiを有効にするを参照)は、暗号化された storage/etc/network/wifi.ymlを書き出し、main_task.rbが起動時にこれを読み込んで 自動接続します。これは上記のビルド時に配置する方法の具体例です。

注意: ストレージイメージはFLASH_IN_PROJECT付きでビルドされるため、 デフォルトのrake flash(フラッシュとモニタリングを参照)は アプリと一緒にこれを書き換えます。実行時(Webターミナルやrakeタスク)にアップロードしたファイルは、ローカルの storage/ディレクトリの内容で上書きされてしまいます。アプリだけを更新して デバイス上のストレージをそのまま残したい場合は、factory/appパーティションのみを 書き換えるrake flash_factoryを使ってください。