前回、Webベースでグラフィカルな開発環境、UIFlowを使ってM5StickC上のMicroPythonのプログラムを作り、シリアルポートからMicroPythonのREPLに接続できることを確かめました。今回は、そのREPLを使ってターミナルエミュレータからMicroPythonのプログラムを直接流し込んで動かしてみます。
※「モダンOSのお砂場」投稿順Indexはこちら
まずは、M5StickCで「とりあえず走らせておく」プログラム。実際にはBlocklyで「描いて」いるのですが、生成されるMicroPythonのコードとして見ています。
実行すると、左側のUIのように、ラベルと白丸を描き、USBシリアルへ毎秒インクリメントした整数値をprintするだけのものです。
実行し、ターミナルエミュレータ(TeratermPro)から接続してみます。
10から17まで数字が並んでいるのは毎秒インクリメントされた変数がprint()されているもの。17のところで、エイヤーと掛け声を(心の中で)かけて
CTRL-C
を入力しました。すると、キーボードインタラプトが発生し、MicroPythonのREPLが呼び出されてまいります。ここで、スタックダンプの先頭行を覚えておいてくだされ。
flow.pyというモジュールの42行目
で割り込みが受け付けられていることが判明します。さて、実際にflow.pyというものを調べるために細工をいたします。M5StickVで、ファイルシステムなどを調べるために作った自作の極小cmd.exeもどきを使います。まず、行頭で
CTRL-E
を入力、REPLをpaste modeといたします。以下のようにプロンプトが変わります。
PythonのREPLは、インデントが必要なところで自動的にインデントを入れてくれるので手で打ち込むときは楽でよいのです。しかし、そのままの状態で端末ソフトからファイルを送り込むと、勝手にインデントが入ってぐちゃぐちゃになってしまいます。そこで paste modeを使うわけです。この状態では自動インデントがオフになります。
どのターミナルエミュレータでもファイルを送信するための機能はあるでしょう。TeratermProの場合、
ファイル>ファイルを送信
で、所望のファイルを送信(手で打ち込むかわりに相手にそのまま転送)してくれます。私の場合、ターミナルエミュレータの改行コードは送受ともデフォルトのCRのままなので、ファイルの行末は CR+LF にしておきました。そうでないと送信したとき、ファイルの各行が画面上でずれてしまうので見ずらいです。なお、文字コードはUTF-8です。転送したファイルの最後の方はこんな感じ。
転送完了後、
CTRL-D
で、通常のREPLに戻ります。早速、転送したマイクロcmd.exeもどきを起動してみます。といって使うのは、dir と type くらいのものですが。
上記は、/flash直下のファイルをリストしてみたもの。DIRにはD, ファイルにはFと書いてあるので、単に uos.listdir()を呼び出すよりは多少まし。なお、M5StickV上のMicroPythonの実装とM5StickCでは多少差異があるようで、
M5StickCでilistdir()を呼び出してもファイルサイズは得られない
でした。そこの部分は変更してあります。こんな感じ。
def cdir(pth): for item in uos.ilistdir(pth): if len(item) < 2: print(str(item)) if (item[1] & 0x8000) != 0: print("F ",item[0]) #NO item[3] elif (item[1] & 0x4000) != 0: print("D ",item[0]) else: print(str(item))
さて、/flash直下のファイルが見えるようになったので、端から眺めてみます。まず、main.pyを見てみました。UIFlowでセーブされるファイル名はmain.m5fだし、main名で書き込まれているのかな、と早合点したためであります。
しかし、違いました。先ほどUIFlowから書き込んだプログラムではありません。何もない時にデフォルトで走らせる?ような感じのほぼ空のプログラム。
それでは、先ほどCTRL-Cで割り込まれた筈の flow.pyを見てみましょう。割り込まれたのは42行目でした。1行だけ引用させていただきます。
m5cloud.run(thread=False)
flow.pyの実質末尾の行でした。名前からして、m5cloudから得たプログラムをRunする関数でしょう。どうもWeb上のUIFlowからダウンロードされたプログラムは/flash配下には書き込まれておらず、そのまま実行されるように見えます。本当か?
まあ、でもこれで、表でUIFlowのお手軽を享受しつつ、裏では泥臭いこともできそうな気が(気持ちだけだが)してきましたぜ。