Python
micropython
M5stack

BARRAYクラスを取り込んだTBARRAYをつくる。

なにをしてるのかはっきりしておこう。

M5stackでmicroPythonを使う場合、現状かなり実用性高いのですがM5stackの採用しているLCDのデータをメモリに保持出来るほどの余裕はないんです。
ArduinoとしてM5stackを使えばその余裕はあるようなんですが、少なくともフルカラーで利用する場合320*240*2byte、(153600byte)必要です。

どう足掻いてもmicroPythonを使っているとそんなメモリは捻出できませんから。
で、考えたのは 速度は犠牲になるけれど色数を減らしてやればメモリに収まるぞと。

モノクロなら 320*240/8の 9600byte

これならM5stackというかESP32のmicroPythonでもかわいーもんです。
でもモノクロでの表現が厳しいってのはGamebuinoやArduboyに学びました。
モノクロで作れるのが一番いいんでしょうけど。

カラー以前のゲームボーイは4色というか3色というか。とりあえずそれくらいの階調ですけれどもかなり表現豊かでした、4色くらいあればいいかもなーってことで4色。

ということは2bit表現です。
つまり、 320*240/8*2で 19200byte
フル画面でもどうにか扱えそうです。

ということで、前回改良したBARRAYを取り込んだTBARRAY(2bit array)というクラスを作ってみることにします。

クラスの継承?

いやいや、そんな立派なもんじゃないです。
でも取り込んでつかうことですっごい楽にはなるんですよね。

ではコード。

tbarray.py
# 2bit values array
# MIT License; 2018(c)sugarflower

import barray

class TBARRAY:
    def __init__(self,len):
        self.ba = barray.BARRAY(len*2)

    def get(self,idx):
        return ( self.ba.get(idx*2) | (self.ba.get(idx*2+1) << 1) )

    #val : 0 to 3
    def put(self,idx,val):
        self.ba.put(idx*2, val & 1)
        self.ba.put(idx*2+1, (val >> 1) & 1)

みじかい!
そう、めんどっちーことは親になっているBARRAYがやってくれてますのでこっちでは2bit分の処理に集中すればいいだけ。

とくにバイト列を意識することなく2bitデータの配列を扱えるようになりました。

ではテスト。

>>> import tbarray
>>> tb = tbarray.TBARRAY(10)
>>> tb.put(0,3)
>>> tb.put(1,2)
>>> tb.get(0)
3
>>> tb.get(1)
2
>>> tb.get(2)
0

しっかり動いてるみたいです。
概念的には継承してるようなもんなんだけどコード的にはただ利用してるだけですからねー。でもOOP解らないって人にはいいサンプルなのかも。いやそうでもないかも。

ひとまず目的は達成できたのでまた続きがんばりましょい。