フォントの問題以前にもっと大きな問題があった。

tinyREPL.jpg
何となく動いているtinyREPL

本当はフォントの問題について熱く語って綺麗にそこそこ動くシングルライン限定REPLを出して次に続こうと考えていたんですがフォントがどうのこうのいう以前に大問題が。
ので、一応使えないこともないものをtinyREPLとして公開してここまでにします。

とりあえずコード 

main.py
from machine import *
i2c = I2C(sda=21,scl=22)
cb = bytearray()

def getKey():
    return i2c.readfrom(8,1)

def repaint():
    global cb
    lcd.clear()
    lcd.setCursor(0,0)
    lcd.print(">>> ")
    if len(cb) > 0:
        lcd.print(bytes(cb))

repaint()
while True:
    c = getKey()
    ci = int(c[0])

    if ci != 0:
        if ci == 13:
            try:
                lcd.print("\n")
                exec(str(bytes(cb))[2:len(cb)+2])
            except:
                lcd.print("error\n")
            cb=bytearray(0)
        elif ci == 10:
            pass
        elif ci == 8:
            if len(cb) > 0:
                cb = bytearray(str(bytes(cb))[2:len(cb)+1])
            repaint()
        else:
            cb.append(ci)
            repaint()

無駄もたくさんありそうな感じですけども駆け足で作っていたのでゆるしてネ。
改善点はいくらでもあるはずです。

とりあえずこれをM5CloudとかampyとかでM5Cloudファームウェアの書き込んであるM5stackに転送すれば写真のみたいなのが動きます。
命令1行、エラー表示曖昧、結果表示もスクロールすることなくさっぱりした感じで。

でも一応使い道があるので。それは後述

問題とは何か。

このtinyREPLでいろいろやってみます。

>>> lcd.print("hello world")
hello world

>>> 1+2
#何も表示されない。悲しい。

>>> lcd.print(1)
error #仕方がないからprintでと思ったらエラー

>>> a = 1
>>> lcd.print(a)
error #変数に入れても同じ。数値は表示出来ないんだそうです

>>> lcd.print(str(1))
1 #やっと表示されました。めんどくさいなぁ。

>>> dir(lcd)
#...

helpとかdirがつかえないのは大変きっつい。
lcd.printの仕様もちょっときつい。
なににしてもREPLとして使うにはちょっと厳しめ。こんなんで計算機代りとかしたくないし。

ということなのです。
でもこれで十分役目は果たすので無駄ではないはず。
では役目とはなにか。

ダメダメtinyREPLでも役に立つその役目とは

次のどうでもいいスクリプトもM5stackに転送します。

test.py
from m5stack import *

def run():
    lcd.print("hello M5stack :-)")

その上で、tinyREPLでこうします。

>>> import test
>>> test.run()
hello M5stack :-)

お分かりいただけただろうかー。
ようするにランチャーに使える。工夫次第では何でも出来る。
ということで。一応つかえる! わけなんです。 言っててなんか悲しい・・・。

シンプルなラインエディタとか作ってやったり、このtinyREPLに簡単な命令を追加してやるとかすればシェル代わりに出来るかもしれません。

なにかこう、便利な感じにまとめてゆきたいところです。

追記

python自体のexecとevalの仕様とかM5stackのlce.printに翻弄された感じになっちゃいましたが(microPythonというのも理由として大きい)

たとえば、
画面に何かしら表示する為にこんなファンクションをつくってmain.pyに追加しておくとか。

def p(val):
    lcd.print(str(val))

こうすることで tinyREPLから

>>> p(os.listdir())

だの

>>> p(1+2)

だの出来るようになりますよね。
いろいろやりようはあるのかもネ。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.