From 5a008b30521f012dac8952f0a069f84387015c79 Mon Sep 17 00:00:00 2001 From: arofarn Date: Wed, 15 Apr 2020 00:14:13 +0200 Subject: [PATCH] Initial commit --- .gitignore | 1 + boot_out.txt | 1 + code.py | 120 +++++++++++++++++++++++ lib/adafruit_adxl34x.mpy | Bin 0 -> 5668 bytes lib/adafruit_bus_device/__init__.py | 0 lib/adafruit_bus_device/i2c_device.mpy | Bin 0 -> 2225 bytes lib/adafruit_bus_device/spi_device.mpy | Bin 0 -> 1274 bytes lib/adafruit_matrixkeypad.mpy | Bin 0 -> 1241 bytes lib/adafruit_neotrellis/__init__.py | 0 lib/adafruit_neotrellis/multitrellis.mpy | Bin 0 -> 1894 bytes lib/adafruit_neotrellis/neotrellis.mpy | Bin 0 -> 1468 bytes lib/adafruit_seesaw/__init__.py | 0 lib/adafruit_seesaw/analoginput.mpy | Bin 0 -> 769 bytes lib/adafruit_seesaw/crickit.mpy | Bin 0 -> 573 bytes lib/adafruit_seesaw/digitalio.mpy | Bin 0 -> 2997 bytes lib/adafruit_seesaw/keypad.mpy | Bin 0 -> 2050 bytes lib/adafruit_seesaw/neopixel.mpy | Bin 0 -> 2544 bytes lib/adafruit_seesaw/pwmout.mpy | Bin 0 -> 1365 bytes lib/adafruit_seesaw/robohat.mpy | Bin 0 -> 552 bytes lib/adafruit_seesaw/samd09.mpy | Bin 0 -> 552 bytes lib/adafruit_seesaw/seesaw.mpy | Bin 0 -> 7251 bytes lib/adafruit_seesaw/tftshield18.mpy | Bin 0 -> 1939 bytes lib/conway.mpy | Bin 0 -> 983 bytes lib/neopixel.mpy | Bin 0 -> 3814 bytes lib/neotrellism4.mpy | Bin 0 -> 5510 bytes src/conway.py | 61 ++++++++++++ 26 files changed, 183 insertions(+) create mode 100644 .gitignore create mode 100644 boot_out.txt create mode 100644 code.py create mode 100644 lib/adafruit_adxl34x.mpy create mode 100644 lib/adafruit_bus_device/__init__.py create mode 100644 lib/adafruit_bus_device/i2c_device.mpy create mode 100644 lib/adafruit_bus_device/spi_device.mpy create mode 100644 lib/adafruit_matrixkeypad.mpy create mode 100644 lib/adafruit_neotrellis/__init__.py create mode 100644 lib/adafruit_neotrellis/multitrellis.mpy create mode 100644 lib/adafruit_neotrellis/neotrellis.mpy create mode 100644 lib/adafruit_seesaw/__init__.py create mode 100644 lib/adafruit_seesaw/analoginput.mpy create mode 100644 lib/adafruit_seesaw/crickit.mpy create mode 100644 lib/adafruit_seesaw/digitalio.mpy create mode 100644 lib/adafruit_seesaw/keypad.mpy create mode 100644 lib/adafruit_seesaw/neopixel.mpy create mode 100644 lib/adafruit_seesaw/pwmout.mpy create mode 100644 lib/adafruit_seesaw/robohat.mpy create mode 100644 lib/adafruit_seesaw/samd09.mpy create mode 100644 lib/adafruit_seesaw/seesaw.mpy create mode 100644 lib/adafruit_seesaw/tftshield18.mpy create mode 100644 lib/conway.mpy create mode 100644 lib/neopixel.mpy create mode 100644 lib/neotrellism4.mpy create mode 100644 src/conway.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/boot_out.txt b/boot_out.txt new file mode 100644 index 0000000..6746b57 --- /dev/null +++ b/boot_out.txt @@ -0,0 +1 @@ +Adafruit CircuitPython 5.1.0 on 2020-04-02; Adafruit Trellis M4 Express with samd51g19 diff --git a/code.py b/code.py new file mode 100644 index 0000000..72c741d --- /dev/null +++ b/code.py @@ -0,0 +1,120 @@ +import time + +import board +import busio +from adafruit_neotrellis.neotrellis import NeoTrellis +from adafruit_neotrellis.multitrellis import MultiTrellis +from neotrellism4 import NeoTrellisM4 +import conway +import adafruit_adxl34x + +ACCEL_THRESHOLD = 100 + + +#create the i2c object for the trellis +I2C = busio.I2C(board.SCL, board.SDA) + +"""create the trellis. This is for a 2x2 array of TrellisM4 (first row) with +2 Neotrellis (second row). + + [ NeoM4_left | NeoM4_right ] + neotrellis0 | neotrellis1 +""" + +trellim4_left = NeoTrellisM4() +trellim4_right = NeoTrellisM4(left_part=trellim4_left) +trelli = [ + [trellim4_left, trellim4_right], + [NeoTrellis(I2C, False, addr=0x2F), NeoTrellis(I2C, False, addr=0x2E)] + ] + +trellis = MultiTrellis(trelli) + +#some color definitions +OFF = (0, 0, 0) +ON = (100, 100, 80) +# RED = (127, 0, 0) +# YELLOW = (127, 75, 0) +# GREEN = (0, 127, 0) +# CYAN = (0, 127, 127) +# BLUE = (0, 0, 127) +# PURPLE = (90, 0, 127) + + +I2C_ACCEL = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA) +accelerometer = adafruit_adxl34x.ADXL343(I2C_ACCEL) + +# Init universe +univers = [[False for x in range(8)] for y in range(8)] + +universe = conway.GLIDER + +#this will be called when button events are received +def genesis_callback(xcoord, ycoord, edge): + #turn the LED on when a rising edge is detected + if edge == NeoTrellis.EDGE_RISING: + universe[xcoord][ycoord] = not(universe[xcoord][ycoord]) + if univers[xcoord][ycoord]: + trellis.color(xcoord, ycoord, ON) + else: + trellis.color(xcoord, ycoord, OFF) + conway.draw_universe(trellis, universe) + + +def evo_callback(xcoord, ycoord, edge): + pass + + +# Init. all the keys for Genesis +for x in range(8): + for y in range(8): + #activate rising edge events on all keys + trellis.activate_key(x, y, NeoTrellis.EDGE_RISING) + trellis.set_callback(x, y, genesis_callback) + +trellis.sync() +conway.draw_universe(trellis, universe) + +accelerometer.enable_motion_detection(threshold=ACCEL_THRESHOLD) + +# Genesis +while not(accelerometer.events["motion"]): + #the trellis can only be read every 17 millisecons or so + trellis.sync() + time.sleep(.02) + +print("The end of Genesis, time to evolve...") + +# Init. all the keys for Evolution +for x in range(8): + for y in range(8): + #activate rising edge events on all keys + trellis.activate_key(x, y, NeoTrellis.EDGE_RISING) + trellis.set_callback(x, y, evo_callback) + +trellis.sync() +conway.draw_universe(trellis, universe) + +generation = 0 + +#Evolution +while True: + new_universe = [[False for x in range(8)] for y in range(8)] + ext_universe = conway.extend_universe(universe) + for x in range(8): + for y in range(8): + n = conway.living_neighbour_count(x, y, ext_universe) + if n == 3: + new_universe[x][y] = True + # print(x, y, n, "alive") + elif n == 2 and universe[x][y]: + new_universe[x][y] = True + # print(x, y, n, "still alive") + else: + new_universe[x][y] = False + # print(x, y, n, "dead") + generation += 1 + print(generation) + universe = new_universe.copy() + + conway.draw_universe(trellis, universe) diff --git a/lib/adafruit_adxl34x.mpy b/lib/adafruit_adxl34x.mpy new file mode 100644 index 0000000000000000000000000000000000000000..f15c7c837d4f7851c029173c41fd459d7ba21e07 GIT binary patch literal 5668 zcmcIo+jA4w89zs|WXZBk6vW#2h8Q-+#*ER$GLWHwf?Z>7acu`e1stulD|>@(?5+$h zOtS*p;Sw5X`;vAtP1?>R?W7q?Zh7j9&9r|(AIei0%2OYB$@HZ!>38;`i&+z>Cw`E> z^PTUU^L@YXa=x=C?Y3=&gHDX#uOotdxUfZS4UFwLAL$kjzp=3MPVb$~zqTRtt;*a& zV|eBtNW6vETPUP542JO*EHap7aOjW^sf>rRTCnKBtOtjNB3){r{T%vw?-mv0waHE9 z4kJ6e zh`lk_fpnJ7r-Xx>Ii5>Oc~K!8ef;vz&6a#=!JNp$Gl6XAgfIXMy|xLP+JuH@ZE&Uu(f{> zTJ3(sZbRU6mPH@2Z{eS@NAO*C2!F^9<2&pR@ojbl-(rvAo9rn5fIWs6+2eSDJ%Q)h zllTUE3SVd6#szi^tL%?xG?<7~99oG6fH=dY1wtAK(SrtHHy1P#aw*THbb-e4=;Sa7 zhXMg|^vC)jIH(Og+RVNxdZ3Ed7w9rUjo+ZjN9aB}8H!Z43=ule#Ro|!VxAQy!Ei;2 zL{V@VH|%{4w_n4Z|3UEveE>&#fO?ABpCZa`)CTb;R>bjU_7aY7Vv{)j8hZf%HWTn= zAvWb}K!#uzGf?b^D+jerkd(PbE|CyYg2X9MP|94VFe_vf*{#e-f;^K=@hw7zn@S0g z0aOlZogySC)yj*qIYmI; zlMuRggqvIGHTy;XvEI>ch~*9jcb&tOPN`x-Q^9-Avj-l=w;o zVgfC76HI^Ow9c8{w~C>v+sZu}Ix?i)aCHQ3J2%yZlO%4go=oMFNkOvI){?oI=zifV zz{pKRi!LH7oRXIjs*{CO(hdjJb3706CcoW)5R{;14$`}@>>u2S3|8JZ6v8#JH91#i^>z*VWq`<+^7Hc0^7{knM18&#OC6n)tzD;jVbNHiqB zMgT|>hrF?Mua6C5Vx_-5m(A7MFyR81+mKhLnm4K5qrJUiwZ|XUc>D{~&3~YtU7mle zPcN6cXJ2rwZx{wE zJE(8h+EVEAfO{RNeU@q;R<|DQ72yW$?%mx@6Z^!DN^1YT#?gQL09;BrpHN3r;xp>x zBGkxs^#Rn#$GZFjU>39lPvM=BH`U_xM|=BJD*xL*8w-E;7a$&dTD9PMd4XH)kWh=0 z$LHX3wrpTF4AllB#&WqO{7{E2g=xl~@zp2t}46<(z;ln;Ss{xm$O{ZoQJ z;8(JKqbc0&5Bif?$uEnU>6G9HvE6 z9I?oRl%5IJP3VR_YY7)50lg88T<&scb=h-`s-E@t7~%e960a0LdKRnnxUZs&v3EPb z0v~zY+TM9>=L`5tS|GjOv9V=D7`xhMxzsj8>!;B3-kbJKqNOK<^wpzpgD#v}7fm`AA3hk|1q;9!u z>JUic*bBR*S5d)$bB9ZJ(j|J*JvfQ>(ATvdx>%qsw7NaEUZ-JooY5!S4ot1-l8y6R z<>yNihIb2Uf?gfp|3zQVzyKUxgm>|?rOxwM-MQ2m!#{|ihs#~_m~xo^!l%HGQ6V{x zL(5$Y)w~krX{$=_+P24rya%J+*qY<5bT!{9+7rg1y{=4_1704IViz(zD9rKjWXnE3 zWpdV<=1d8hX=UcPZeimEYT>W?`e<@h8CWuHE$FtkJZI~5YL{+}Wx%}1CR4W;+O}44 t2jo^>=+eLKxEDe1Pd)>sjZbNd^utK`D?`}obgM66##e@L%~uA5{s+BmM@;|# literal 0 HcmV?d00001 diff --git a/lib/adafruit_bus_device/__init__.py b/lib/adafruit_bus_device/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_bus_device/i2c_device.mpy b/lib/adafruit_bus_device/i2c_device.mpy new file mode 100644 index 0000000000000000000000000000000000000000..85c40e187097aa6ca1c848c8961a008eb11f270a GIT binary patch literal 2225 zcma)8&2Jk;6rb@&Y$tJQr-^MP{@5m4yDgC&8LUVtY7&|daR4eMAVeyS*WTG?h2u4| zvuS)NtWj0Lfj@wMfD4B@9}Q;&;>6zo{{-T|0eCZO$7x6u`(Vw!eKYfZAMe@k`+d0u zKN6p41x?{jqPm)=2>qK#V09WNk($Ix6(>?y_o*oy-wD6HXX#FZKDednn!y~ClbT}_ zo$i};S~AP^-m=(g2j42bSzH_=WS=tIw3>v331PHl5fXW?{BT`v8LTk2S9dvY*~_KU z6O->cwPM}cEA_7_t@ZDFXtFxo`>4%#;m~&++dHWUn>z7;#4?k@Q}|oO&3qGK?!;3! zmiy{HU8M>Dn^lmSLjXus(c~kX(vX@$sV(Ft{zlvJ#CK?0!)gw{7MV=^17V*!=YK`7GD?U?^LeVq3HjX7 z8eRsZnoS^|1Z}P{?x#&X%&4ZDO>PZB0h?Q`;8SLD8nGNsWNt{TM84Vd0wb`1XPJCc zCKJ9(o1m31v~s(&p#tBB-TVwr zzeL^43{D1gUpJq@N8S7^K3)pB-E0;cs0_C1!?~U$KbS1EtJxaoOssDZcpzTcqT&h9 zi$v3PMs53&N-+x9v|)(N7m|Y#lszp^~tF!5j=L-PuIQ~1} zNdJZob^Noyn7xI&nOS@Yb~*w#9UISm0$-oYA@DV5Q3|>-QDZ?8cwxdJ= zA49XAK(D@nRy{So_LnPpaNeBM=omCQ0pKy?1ul29IeY}dy@KGW@f-sam-WMtynv3Q zA8QSVZZKxCi#8P!U+%LDBwpXRo>~L-C8cMM8^n9Q9~J!%b}=Z6KX!;J^~&K67* zWzVs>QlrYdTEnJA4{)`LR;J|O%X*!b#D=fDUfFaP z(@)SJOAp-g$_z?>fjT<=>HO@FS?ONZO}8uz?h{kxFX8fy3U=4z*Lr+_cP+ki$*3C+ z`Wdgnlvng}=)*1P<4COy`ZA`quN_kTE$6!6g15yHJ>GrZ9IGKa{eh*x{{zLFr5FB@t^%+ZYm}Py!)$g#r!}XX(TvUPd713f z^Lo#9OJjA5O)A&lQRYQ6nN zxU4!AOQj@i8g*Ek z^IDhN46r6&>H7z@nr>p7)QLv_rv-akr&kbQGke#dYQoSdyRCXdl)dQ6CL4{p` zud=|lCt$tXhbvN|Rul79avu@RXjJtL$0A)9|D@orIJ862OQ2V`QSrMwxORt_KqxA3 z=bAD-qsYo#Ny*PL`yD@HfBdAt{Z@G5CU#M)0-vL;y(3rg#1yb9i|e?g?&q(rqW nwRvIt!UJaz+Gf8I;i}(haOfQVvU3OGzF?LTeS;ba#Em(3?bxc-XD7K_3`T!VMo{RShEo2MX{CP@u zm}y}!rC~}ds#oIl3BX#e*|uTb%;m67&3T@!==EHWT<&g<<+5T{kZq}9 z*D$%C(NCDgxO~7@q?5>22nsAPO}&)2KJyy zbw=qqN`2w}ZYM(NYe!OjFLYNll$3@IQ#Y7tHzJ0~EQ`q$^|eTVMFxS=`^xUekNTR@Y|8$+x4+#@+FA{Wq1bNm1UkBB5>fr`vW-S!o}}~1l?8wBxo_UIs~=m za5RFeiQwNZLDre2&D!p7l)SLNFuGcI^ z@z717YxKm5x|48oxqj2l{Gn?fr1&T-U2Jxyb`d)w-PA#<3We73!s3^uuX}}pU$URf zuX}P#gYWka{W{yHuEo$PomF?Rd7+1oOPd?GoqsNCV6zl7aB1C1_Jap8qwAX+7&Jio s(fwbc9Z7YV7vGzAfABswDj5dTWbYOXQu}oJY0mQMLmolg0{8m-20fIAR{#J2 literal 0 HcmV?d00001 diff --git a/lib/adafruit_neotrellis/__init__.py b/lib/adafruit_neotrellis/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/adafruit_neotrellis/multitrellis.mpy b/lib/adafruit_neotrellis/multitrellis.mpy new file mode 100644 index 0000000000000000000000000000000000000000..a0b454cf6bee3f9e8fe237bee355b8a6b113a1b4 GIT binary patch literal 1894 zcmbuA!Ef7C9LL`;PTFn>5}mfR5lNSb*JLYF;u=a3OwejfAf~C6;DUO1cH)=Tnqvps z>6+8rkx8u(5)w!L0Io@scI61P10-%BZKvJ1PDByC!h3d{rYeVMixTVi^LzQd&+qs9 z{_HzK=&B(g{<*S%F2iy=|@i^csFop0GxbXz6!p1ac3BU=E-1shH z{+~$OMR*r6Kgri`fR+TD1W5)w19AwbAuS8>45%TTfyuRr8x>Qn>Gb{A6;&x)HO(Og zH64rUx@H$DHQmwrPQF@?%;)FxVw8|gYT24;5HdlCMXM$u5nHFU8g{e__09gZWE!>; zt!O37tk#_k(};L?{OiPRTEDeP4JST0+@{o4?&a^&dR0*e>jNW9*h-Z6ySN>@!x2C8 zdCxc?*vlJ^Q?=hM6xKCoqgKq9%t|3RsjwX6dsDMYEbmnhZz%gb`xlNN1PEQ20oIKi z>p=1lv2U~Sj|w}zX5*x*!kPy)O8o@QaQF|Q@YbfH2f@=k_#3CecUbU7uesv|A5QiK z&iF9I)r2l(*co3Jmgv&%#fRe$$Jt@8r4hc0m=Z8XGQ!j7(ke_VfOA|Wd5{Gxf*i&Y z6Umvnjsn4CVJH-X@%{&Q9_XdYYIy%I?YE!nw?|Gw3=BA$=^{+g=Tivv)l}~vs~jr{87-yiLZA- zr$&TW<~`fD7=X?CW>dZV>gj|K#j=$8N(`Y0f>(09k&E&YmN-)58 zx1($Up;(^7FAvy{&aof2{~tb8fc-|V)6FsP;hwz=_=TYHLCrb!M7d@#ftW^sEOO+J zUj%u6fb1*lWmw0m+7=y%gM<1pw?B`2508YzF;~)apIo24mc`eyZ>6uVh$53nGc^nD z!uPKDV>6Xy*0-+s6R&YAvzPg~o%#wLB@-|ODo7po>7wm+9(0e|Gw(pB49EK)-7KQV z$s{DxaPZ*o%O5;f;o!^XYUr0osrTTUCyUE&n{|denaO8=EJ`kGDEGMFT8&=!*T84u z+++T4gY7>YK1$7jDo6|8-QWIe{>>+Euiuv>-};nUlWX1}j#4v!f+B=ZPasZKotokJ u?}w;G6_ro>@Y8Y;ywEB?HBZks1`@W-}1Cgw#^T=)-%i-L{- literal 0 HcmV?d00001 diff --git a/lib/adafruit_neotrellis/neotrellis.mpy b/lib/adafruit_neotrellis/neotrellis.mpy new file mode 100644 index 0000000000000000000000000000000000000000..51dae5046421735ac613192c7911c01812c83127 GIT binary patch literal 1468 zcmb7EU2hXd6rG#3jU9)ou7cx~H8$$9vio3fEJ8#DArXqIsx38$r}|;M-WlT&>)q{s z1pER9@{p)fm0wbMlT_+sY5NaaseS5CKt)k`r8B#UZIF z2_!yCt7s9PoEsL@Els=X4CiT?mJxcL&x3LfmXNXp!~8Ndp;rL549YSzhWS0j*MB0m zhm<|U*D~ab(46aC2PT6e11o}36pkekxDKoYN(mZmP*iBoDHSNUrF<36%RnTh3b|JL zTHhvtN!KsxMDMx*^RY#3-=(I>y!ynfIfLX%ZKbAVG2W)G$7~DZG{!DbnhNvV_Y zS)az{$oBoP9HGAeM^H#yJp&xn6VJO2^bJs$16dP$%a z)is+5iCMn*A(VKyt(&LN6#>09f!^iNJIABl2zt8P_s(!5mh1;rp5cctHu~+oG*|HJ z^JS!z5Z9BUpbvk{HKoGHK%f-RM@=Z`pfrT$uE3}@HO$$$xvDI^PcfdyI2I>2C;Tj6 z{9T}%u?zQQ7S}9Z&<&q$>pm51CcJ@VAZa~|Pzp&41#!^6s$Z&#(Ma$y3QGlaaP(7G zY8-}Y9dfr}|2R}NkV_Cg+b2?}u85;?iaopJq!&2U9S7t%H`H|l$H&ytJ0>L=LpRNi zZru0A8capn^tdWMO?cGoo?#6GcLFan4o>KVxC!Et!6z9`HG*tIFnp)I!5bM}SOr;y zkifwqZzR`xV*;~F&UlnpC(d0YI*u=jki_&TxkpoR;g8Nns$IMy5`VjKsiGVrT zji{jbJ$f!L!x9i^gu}nrZVkhyFQ1PtT!pX;zaD&k^E&!XE`nTv!>9i)-grUa@YxG8 z_xn-t8tnhICJ#qN4aDMN?w>!_&Q6v`9B}oQ$GKKS8oX0 Z{3$Ewcc?pI@X|heNa;;|Qz~nl27?^ct3q z{aO3nD)x$yKa7>9{Im#i%9u0t)lrcO<3$i9MQ$gX)(iW!ecmNnbD9NlMARlqIf;q7 zSG&%SW#@5?n7v=-d6K<#oJEi?i!b&(UO5LI=juRs9i($1{=CVT0$kDCGI8D58R_Xb z!0%7Kwb|sGOYw4Qf;9p0U|HaTrGtys7*BtJ+wjop?J7+wQ~VtZs<9}BBDG?o4p9}# zzuq1Y-4-gWdZamsBrH1dxGdU98Yi6Qo7P%|1^>PFQ}#LKXwI~b!(1&GnnnvicGS_! z1wDHzj(%*XXZUkFHOh?~kZa`L+b7keB!~c-8HfH!6`m$9k0d+b>YwC;u literal 0 HcmV?d00001 diff --git a/lib/adafruit_seesaw/crickit.mpy b/lib/adafruit_seesaw/crickit.mpy new file mode 100644 index 0000000000000000000000000000000000000000..981f631ca4850f6d8209ebca2227cad518ea35a6 GIT binary patch literal 573 zcmaKpO-~a+7{{Mk(3G|z3QbGkK#dbGCcCsyNQk@zId~x13#XbqU3XV@q`R}s&Qds- zEGRDvRsj?I3W^s$jCVhZPT6w7ggHI)&pb1~=QryE+GO(~0kuXNP$K)4*7DQ$@2bxZ zp9B0|DnU|C!6e>qU@6cP>Mt9k$<)Ma_%oMJ>Mf$8wFXI6$`wM(qylt|R9jlPMjVaS z$m3@2h0mS1?Jka6j`dc=Ok(7^k<~G5!R#$2^>FWj&4Wl5d}a$C?n#daS<=s6`5_l_ zO$aXfc}<_yrwWKWu80^95Oava4LRcQYIZA{Eby)H&X#D=f+uAd%^SuhlV1Erx4CcJ zk{K(vh^tK43e~)U=>zMkV?+Z`u7=W{sV7R%uV#jH&vdF|*DUq~!=oB0k?uyf;Iy`r zVbwlS1v&}J7Nv0T;roxX)AYp5(KiH!);EG!%Ax>@Y`qxn9+a@{-54cT)oV E0}p+;0ssI2 literal 0 HcmV?d00001 diff --git a/lib/adafruit_seesaw/digitalio.mpy b/lib/adafruit_seesaw/digitalio.mpy new file mode 100644 index 0000000000000000000000000000000000000000..c2c9bd6cd9c2f77feba87e0e5761c1fff93cfdf5 GIT binary patch literal 2997 zcmd5;TW=ai6rQtO4460&#W&%#*Uo}XQZKe+?4&ml#gURGj*%MLs8kv@W(jLymMn{{ zyj1w153S_?g8OfphraYT^tnAVv+G^ki1HXD(9F@9*>k?jS@uKHQZYo>XR1iQ4X-=2aHAt6XP7kT; zkolX`!gWx$A+rtgKcp5B8w^Krm4Zx)hbP1a!!catA(Q9fxY%Ggfh!F%8V^tMO}gr1 zFcM=#udN>&lqM(@oCJYPQu?8%w?qb}nr&o?M(YM!_@u=5Z1cp}x9Uc`T>1VvEmvN> zN_9_7=dei~i&{OW({pb70ke(!SjV{s$cf(S8RFN? z5}V76M4eT`x-kMvH#ZQuJP_{mS}p$LCh;{%K8p~7@}8Pw+San!_4O?Bd@;z$@W&vx z2n!yygWM9|+yhyKL2d=ogIpF;gItbj-Ggl;4->BD!n9*D99$O+Lw1t-4F)qk6eBNQ zmn&})^b*zxWer9tM~;wi*Jw4cQ|7l2KJ5-F90-Z8qQcL1u)}oKWq4%8?nQeO3?%8+ z8aw@1DHa$;16hW}`!J9f@hgM;02J71se6ojC42$P9bI`nK z^q}$v`}elDTrBCSZ8`?e3<4;yaeEO$3P|LaC?OJo+v}{klA=A*-WHhz81n^?H{j3R zx&HNLH(9gAulior*3hhnJZt*KX_duMV_B5Wb<2!I#g{_3%=El>@Z)O_gyBd{aiMUx zvgB(QNR{&F<4OPc|D_5^Ucs7sY(_{gvCZ&(sc_}2Kou)-C&I{%0}^)$tb`d~WQyNc z*6wTH(=jz z@rJ&K zPz;0!sxAjrF5DtFWCN<=u5ke$)_~irJ7_%dBs~M#hF<6X^Cky3ms_a5l`kMw{fmw5 zPmd%0vrk2-|8Q$3K*qK4f!wg^I!@I-f?iEShJstQ3v38ymAtNQv9%GEb{jtX2YX2hr*N{=lhhb5OAjBM*9;2^-O-876>WSmn y=DVIFyya(puG2Fx2qfWtPJdT9)Z1;#QScv=!rt?W)mHSjBK~wK_=>!$uI&pp52@0{}}BwYVG z3Iw0mCrKaF`<0o&Z#KoHq1~SSR|)z1{XXKR_Q(=!{7CdYBJGjF+~jNSSZ0;{Iu&;d z3Sek{65Lrgl?MFmF6e2H(ojfU1?dX(6Db3tBBTaE6Qn^jL#biNq(KWw!_d3Z{Z7Ty zoHBjyimIvW%+YPxqSR8Kjy|Eas;cFywaA)jSazbKuQ9V)vo}n`j|A~zrD`&Jo-vd8 zk?69QAoWthyq`CC8~jDa^SAS330dBv%+gImmb+z{(W;5Y2edZ7MGgDdh++gwI?CXC z5VGFgu(6b22$Q! z@o{u!1P^?5!xN1p2B8n0Pbdl=%!ov~PLOFyA_|ex1nE5j(K#6cHq;80<+v>STAae( zBg4n^2cV zU|V_%cBEU-=N5aHgtW>@$^1qX&_Ei8%s5>8iztHcU^s-#V+Omc*#4B+ zwO(Y2GUilmnHp-TOttfos6}o3==_W0EZAd?Vf(+q*S-_OqcY`!HHs=Fr%GQ$1oi2qqxs7-JF}>?LeLD|G3FHM!(i zVO7&uSYui(<U`b9EB`^6GBgGriBfOxMyu2j* z^21cj9blv%`(_nd9C2&v6}Oo!Kx4a(BuvJAXNNnz|Er+*r)t@u-Y&bKw&+u)+jKhk z1Aj&$Tl|QXJ4c*YaV%RbQSlSzP|;-KeYI@St2ns0IpX_#a5p^GvTsA<+jW6&9qfqC zY(;oGOb2>o!X7~}FOR{SVJ2Xt_g@oTnze1FmmJ$idKO61t3uQ*kzXg8M!8ms^Ufp5 z39huIC?hv-6?4)J-dea*z(f2Oa#_G`x zR8!YPz5|E4J%)RxIqF>{=PlW1e93;-%-(@Uqm7lfS56OU=h{!I40Boo5&3@o2lteL AEC2ui literal 0 HcmV?d00001 diff --git a/lib/adafruit_seesaw/neopixel.mpy b/lib/adafruit_seesaw/neopixel.mpy new file mode 100644 index 0000000000000000000000000000000000000000..f7e4595fee657b5a15544dda759d56f06f9ed4e0 GIT binary patch literal 2544 zcma)7O>7fK6rS1L_%{VY5<4h1F|c-Q>^P2%F{#=RD2O7|HqcbGN~N`9uj2*V>#o-& zITXeTk;s9n$6hP--i`CesfUuE-rEXA>d&F-wSuCa+c&#w?4Z`dlC^K%%zHcUd*Ao= z9hMoYk618*pErs6aNV7rJoUlIsn2ft0?XY&U(grwh0+N9bG{pqoI1r=_g$Sn0I40;*Vic zUz}q36Sz+3^CVp_O>z7w>YxUXeQCz!$2o@gdMOHs_HCBSw*fas0F!fcuap= zpy?lr#-jG0J z0U`5shNDeJgMQqHA5N0)2i6)nd~5QdRTP&);<6KR4f+s2gaB%uM+5JpCD&;@?MALJ zo<8b|;OQRM2%gShegF;rj?zpH^I<#~#@@eCn$;I+jz5RfUAzaSEqoBAt$Z&^+xQ8b zw(}|4x+Wf-E(>^;GbK?F9D-nU8Zd4Kb_>EMwM@}Cz|K}Gj#)*TE2w3$T6JV3hCn}InDg#LbTLoGyD(XUeOe@?{6;)MK+BPjYkw#htp(sM5q3Li0vX^vw zu4!|5saWKy1^EuP=h?AntbXVavT+>h9iUD6&`*Df>!Fc2K)k92qPU?2M)A59h~Z5w z5W#C&U<`YHLY^PchTE27-1Z!!1>$(C=hu{lcz6ub+R_3E?752?*KrPiuX&^RcoKhJ zf0SqAo_>7%XXH8ydAu?FJkPw?UZUFodlP|9uv<-%aY98Za{`67g(oAF*^&hR%)C=* zL8gdrNl5~H2SpaW}r{3 z(I?Ft!6_@zj;C-Q0p73pzW+kB4Rf7QCMsYUJYHH^9`MZ-^J6BNF-DYhr^+3 zBRY0>(IVyOvmAa*S^JC5TC!^JmWzA7MGem*lw(p}()jY}cH@huef4{P?ld0g&)o)H z?In*98nCpVvXjO~?9T39(h3F##x~u!zn}7vjm_AZ{qZicwVz~2BAz-#*2#X#MmDy| z4%sDpnm3Hy?32_uffsJj)$<(Q0ejQ5cfsB=Z8)u`?WTvTrlfYxv4ORRF&ZCmMLdN z7X12QL)tA3(~UNIbzbVhFC96c|Nmd;p$E1P>i=ctV?%-LZE*oUa79_kbFt|7_)*{+ zP}kl|Dfg95dO+>PEbfGw$y%E6nqALwWP(cP>q)==bd;wAr49M+2%X8AcMOxHjl>?W zYHP#wKgJSI&i-{T9&faS4pTe=A2ogacY1GIWo;(NNLP59%efgc5QcZ{CQZ|DC@OJKzTDsjRUpUxa3v5$L4Xj4ik|2pmDX;&X^Uj-no~ys)QSf=BqE&n)XzeCN=&o4A z(i1EoNx-6pizRGuQVFkga&HE<;rHp=r@Eo{T;F8Gqtw$cTh8Uc_L=MqGn?|RtSl39 zL0!+ZEkbgHxYV%;$sQc;fALxTgR!@F%9!K5ZnaKKcIqF?U3<`)7H++pc6e{PUFdW$ zWT#Lr>L`eZ3z& zhCI^(0ZGnrZHKySxYTp$xlgTb>Xh{;W7M5JO0x5Y&xWKs?DlEu80V)V$qTujt9Kc! zBss*%$sH|jWDo*F6iR^`r1kZ6P;xSER`Abpvx-OKW-a)t2UeJlKVON(cv%a?F)f}L z-8@MM5nAwQzXuZp_TeF+24W;_zv_LTeso>i zO{jHC@7pKj(lr@PHi@J4WiEnz@A1CxG4Ys+ipXqnS5>#wGPo$%rWD|Ri0Ad1TNGeI}-SRRDgf*5w83~lc3!n1CN`Hz_3&M|EKE= bpEoU*8iG&r_IO2BdiD0k+ZvNVNeqe9LsA?(?j|8ok!qDT2PuKQc}QV0*=(~@vODYStkHw8 z1+{KPQ2Pz^qW01c(|bQkJNXBCaZW#eyf5>-Pjf~qwq7AnFI$Hk`c`OfEggL=EuT~X z{=LsZl#jtg&L3bg;25eO>+?~0@iY8gO-9u=QdOglqV0SE;XEn;UO=U`man0%hHEI( zO1yJxHoPl{f_H%Asa$) zG3hJ%ie63;vTuukagUG$A;R`KA<1U5LQLkl)PEF_7Hl|D`oX$k^q6$Qj&5<+m=YP= zQ?w6ESPIb`K}d`*$5ubU%oIh~MfOVyl7^Y#BlsvSYQ3Uu8nwYI1 literal 0 HcmV?d00001 diff --git a/lib/adafruit_seesaw/samd09.mpy b/lib/adafruit_seesaw/samd09.mpy new file mode 100644 index 0000000000000000000000000000000000000000..15995a4098c31b53d5b99bc0d8511e00ec834f24 GIT binary patch literal 552 zcmZ{g!A{#i5Qb+BEg>m~hA5%pfK!$p?Enf0L<^zezyZlpk3kx5ZG#uZUb9{kI3NW| zT72MLco^DUw{F>2z^BqhW3!RSy^eZ=^Lau7=&f?{X`E4)*@U&flel-V& zgb%=TpgF9xo3s7K{2@H97yBzN(a~O$^jp;$p;b}?I!8>`sMd*Z&^r0tDQrc;&$_{n zFU)60GUE!$ eSyvom!sB#0=|$M%z6uM&Y8Vxj$h`2S1b7BXUZw~D literal 0 HcmV?d00001 diff --git a/lib/adafruit_seesaw/seesaw.mpy b/lib/adafruit_seesaw/seesaw.mpy new file mode 100644 index 0000000000000000000000000000000000000000..7efd3afbef9934374f36afcccaabf5b63e99a85e GIT binary patch literal 7251 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 xgSkA7h_B$#meB-VxTPZs)W#+*9_%G&FGYbF! literal 0 HcmV?d00001 diff --git a/lib/adafruit_seesaw/tftshield18.mpy b/lib/adafruit_seesaw/tftshield18.mpy new file mode 100644 index 0000000000000000000000000000000000000000..18aaed12a4c239c42526b8c2871197a171ec7b1a GIT binary patch literal 1939 zcma)7UvnB&6u)PI@Gm%%h`#Iw7gq;^DR*t_@Kd+t5IKlkoO4sNy+o&bWs zP=*Ad6E0>K_U69)l+V9&K2;;+svQbJ9;$DF5&|Iv>Go7L3_=)g2T42BB{=jOQMyFv zlJr*Q&Gtg{A^CmT*G?BX3~gtiz0nRu%@uY*iGmP?bZ7>I7=(!shiC{w^AHA^6Xt<0 zIzkDEMnQH6379(atkpERsnYehBuf>&sW8!?)R4|ntip_{LREQjCD~~C>Qar$tl3bh zzpSY$Ei*-{8zbS7S64}sbb0VB<22^4DP>)2v{+TEyR3-)^zYXin$EU$UDNHz#C>b~ z&@1I6?WzW&gT}R(TuLtZMez~U4J=0#J))@7h9-(5)wnmCjA0SO)?e5u+#ettEHoP8 zIOBsVV+~_9l{!{fwOLA*wOVRePikYxQ%=##$XDJ1HDE1?8OE%x99J1HYiD&{r4`0E z8@xeH%6N${@#Sfb5OjmLYkEOI`Flq;_Awe@)@L2JZKOy7g7AIz#`YX*Pu@Aro_o)| zN)gwJ@ZhAFQnkMp9DKU7KKIF$^_9r4fKz{oep*$W5_a4Gz{_gphAAi za}kLXBBbaLR-xz=)?qpi5y>TFA^Ha?PRJnS&^V)%jj0<&G2Mfrh@$N_Q5;R56vfk~ zq}p==;^s!~&cXifUO~Kf_l?os&d#J*va}Ryl5yfKv>McM&b6>@JI8)Hhx;mZG_)8n zC=*Lk`9w8^nZDK&D>^;(qS?_nIN)iZO{vaWZhI$#bCtNOs}f3p+m7iZ%*pT&`pfQiZ{`+coYl!MjX~oxo!en|(^&zO(gb50KSrb&vJoCNyCOqw19{b11W2y_t3f@(c zDq6e_{Nd0IwlZnmPJtXQ|AZA2b6eQQEw(K)S6~ie^UyB=bT7U>|K{88e#m=dh){Ag zJTYT7o*HhfQ%U}}ZHKos0n4#B{FZ{=Wju7<&k^g#q`#XBkY{g`&gGxafBhtwdGYwj Ux27rv!)v-R?mLE9ZoYuW6uplT7_bD2Rj~p(=|~A0BqT#!5M#8ZG0_5Ux?lmw3`nFiWD0Fr@y4Xl zHt~nJgBeZSV&NCKX#4?gOkCK7TYYc%8jW4}G9Ty6x$oxOH|Hs1yP*ZVK-c9IETh{o zb7iAjhwj4wz%Soq%pD%toLS}d^X9Yt(6r2DRlBJY_iiH$Te8R#i zPMq|0&fwO(xEEeQx)BVaDw7lzrZh;Y_BHY5H1)YV0mE)`vGAvzxoLYvX(%f3I|kG| zfU~7ajYfT!o!Zw}VhaHTcxvnF&6kl#PLo+%6=kPs`J47hI}{7C zW*;Z*GwtGpfsbtddCq3CA*Nk(0WbiUV)V@JK3KUEkH-`7M9%DSVuU-O_qaY+Mae1F zepuNn3nPl9k}|7GutlZJ+KKXM^;_^)QQ@5Q&Ck+NZZ=6=|NBKkL{kiogNmZ4qN8KJ K7D)JK$^Q+lW-A6Dvy-ELpgb7yQkWJ#rh zm^t^{bI-YRzVpYoImh6JldzxO1nGgY-*C?jFGT1tKg^HtBPl|j8eOaBK{yZi_JQC7 z!{>(uSoMSK2f+_<-wPo0f}aR|V3hAJa6&(n4fYPO^}PkBFu)j$2m+r1-yld1VGz2O zTd%DZq*9)~*rw1zQC_F{SaHL-meyCzhewiEWIdgi3r(t{At}DA$~yhOmaatXQf#tK z6z@<~lM9L{wu+)kiv>~SUYnifW?!3j;`^2piCe9&(82<{(lG&`y|k+9MeXXu1m0`4 zl!;{vYZGZHol{G)KJm>uA(*^Xb^hf{kSnQTr$pXxhbVv zk*&_HZu<7i@4L6Wl)1g1C&C~>X9)u7y-Du*La^i~J^_}xePLMY@7*$|D3w|KCW;E1^2*7hvEkl4>&-sdnK8q|OMl zkm?Yo87hq%+fhMJDd{yTie6E)Ktt~}1lvXNol-h)32>QW(VJ1_l~rA#n&wTH^nwLe zn+dU4P$jCOK3S1I&vJwNZIWrt(=qe^s=0IYkV>s ziOz+`)o>Vr3HTrwg=!8eks-jvzz7Ungv!7WM24YOiCloau0JQw8i626jKX#$5`sjx zvBwsHUz5tfC`h;yg1`@OaRE<;;7i6CgU(7M3_F#G0K1GrEE;aIW6{ip_Ul%L%qy>! zbgn2X%`MM$S*2MW!@T9y*OwMvU#f4{nV^_a?lQq(kku)4W0U8}Z0Izts_6|-m<*RG z+{|1xhOROaZN}t%gDtAj z@~4+Be?0a1W;`D7n?5&X9C7CU;5g(+ylc50Qg)Yd_+9Mw?C+VH!7gfU;k$ma{t4X< z^IDz`76f_~PKZ48dQL6jUV0!I3WkM=Wx%v|;wxO~SHc zjCa0WKxp11VB#crEOkj#_amlmkyK`9+R6REQ&N@SR!`z+bJ=?>FKaqhyW)vb&1t%d zr!U^Uc7_m+kl`r?;AUiGA{@PdKVy**VK|aWAQ>JEjn02-J{F6OppB~WanfT{8N?EN zdcVrj;7?O62IISoz+2=EKpv*WLu21~WIQ$w0zW6Uz(+)KBxj7;kDuV_fJ*$F1aCm? zgD3m7A3o_RZ~p61jXhDE9e(dH*<T=P6-`eoS<1R35eo+Zd!AG?ZhjNa1;aD<~xTje{XjzG#C=*N*5v* zC&QSWgmc>bK4&bF2k5lA_xp%hlJRBwzn7BPnGgwawct7lv_fS&<8Yv~xi7)Agiz%m zp7`TtZJFh^*Ub4oVkSKbeLd^VlV66MOxaF`dsf-9z3ba6+t)C#oOv1&E$L#BDw4~L zPfN^fZl@*OvqHpS7ELQJ679r^RnK#kmCm1Gxc1h1duIaVA%4Ud^nvv)_{1S#=xFH8 zc;c^{nC{nBs6y9^>d8`SHm61#W<{0#PS`E%H!S$<7LIlQ^MC5L(z>B{5U7vx!r$Yc>rzZZbA$4t;a& z=4Co>u&?<&9}dT&0=p42|G=Eguzp~_nw@FG!trpwTG@^!zSyiaO9T#oY-lrwO8b}F zZeb&viErk#ZKv)XSC-Y$J_{@FEW6fU*nbAc1<4v*?UqbU_2Y}ypwKam2k-tP_44S= z5N7vNj7I_d@Q36%14k%a4Y3CnRjhyg$1FCRW*qe$%wpWd4`U;;-JH#j&zY)DVK=8r zHgG6pt-ULI8(C6! zSAeI@cnxB}WSG+DzVOuNl}yv5PX*GndC9bsb|BLxZ@iQgLTEeFr}o_4m9&zL0tUY&>&6|M48n77ds46D6;WY`D88t*6>j$+TEb961qr{ltL z|FS48r$r^TuB;{#Y(hvXk`RxJ^4dUOYTd=Mmjp=`;R)+xSxHDGS+;5^$w|ENS<8zn zqQb?+WN}oroJ`1yYfW61l7?ABVthK^64oa!2?@o^@mx%Ttyx(RWbSg`d%}8(;|tFV zgFSPcB8gX6P=x3E3TkV**w89nQ#x~=5t8%b6(Q~f?^61pAjuCLEZA|GCn4i{R!Lf> z4eWU%EO~_;g8KXlVtoWxwMk(3&~TfijtCt`}-lVtLde_ z<>XpFCnaN?l;|HXxh!)wzsuEuE?tEXMyS?@Atxsx|9m+F|Fz7&d3^Jwmif;M9xv*C zSIz;um{7rn!O2TGcUE9x>;)^-^jY(JaikeK5JOlw9LOUFUe`k zF6H|zn`fSO=h7EV?T%K{RkixL;$HK z1d!^*(JHzJV6)@aD<1(Mli=0_maSu118*$5!-ShUQSKA(wj3&tP4E)U3uF#M>GZB=nF!#`pM_M}t8I&NCBd=VvZX z%+`@qW-m){{JJGcTv=5Tf-Ktsd--3>iW)WB8Sw0kw2Q{ zOnT_equPNdfYjnisU6bR23Tt%=UIl+lpUs>>|VITH{9K_+oV(9r=gd?BNpxKWDe8B zdE)DX26BOF#HofJX0`3E%_pHdj|RWn2OhI)MBxT*5k|4PSo>UDP*{=GVNN(B!Iw0Tg?C2jp z$1u$B5W~z)&vY;yOk@Gv0JH`10(wYtHS>aeMi@2piEl3s9L2t0A;7J700-`(doifl zG5q`Oz$NtS7!GefIdb&T;9oYv;VfYMn7V*8rXQ}oTMd0$qCG^kKQy%ep!xeT82F8D zAe4DD_~(r0qtRVw63KaSMuG6#_@pg*dS9@t_5eWpel z;G`dexy-$nAHFD<{KrQ4BM^RE5d3K)>}v)}fxSQC?HV)u`pl9?Uisf*m*GBbbRIK_ zvuULUu*E5gWVR;bXJ>!-h*$V{=1y$2j-8)=7 zElfyKQYt*M$jnvdpR!gYe~KE`=w56F>FM-VFeV4*L|GOSD^z|t1r3=(fkTwCDo{G3 zQiKQPF!`i7X@vsZq~kobBv2tLNQhEj&`p8P02M5%bRPgz0Zd&Z1g5`KAzOhyhOvJH zFP5ZoW!&T)C{ZzSyZHkHxYQ^CZf=aG>C;x=~vQvRrYWQy?S_87IN_ER@e-#9gvK25dSV&XZ64Ii4fg6(_FJa2d$#kf-kvkv-G{mf zg#m3GP*p-?K6u>#9y*DA@Uj5|4~`sFGv<@KUK(e-ojB`1iTMn)8~QR`*bhPv27cf( zx|X_t@4VEQQ`q+u5j*2h%a370cpCeDrVA&q$B<0EIiKw4zN+;X0=bOxt04#wp*;KS z&?;+3Oe4G7D#f;Gxq$V;PWtu8cDSi}b~!Cca9ONgS&EreNA89d_!U8}U0PQJPLjCw zy@l0=h1z8<9$(^?-;+%=7Q3b<1Nn7R1o@wn0^P8N#|9Ht!7D~ukWXEJ*BxNMVJeZN3gDnF!z&SGzDH4W1C()1RB%mz zw^yFxlY$Hi$|`7fcNp!6Ym4+`UybQ)Qec|&g1%3Y=AVFeVbOp`Wsgf>Vvh@n@`#%u z@tGmf_j^L3>pP)`LXKFMQZx?P?M_pPvLC)X72en`lu_? zXo`LgvVT4^gr3DBfmDu_r3_kzH3s*{ulj2iLDEh;NOo5n94H^uGnz7H)LI%!Ae6WB zQd%HYZIX-2g6tL(kTD`p5ycUs4R_Cyi2Qe~V+5iR*#jO;kmjd(a|2qFY~l7F4?fu- zk389nHfYc-WLVkB^7}U{{cfpIzSK+=dm_EIIqA~taLY6t_7{knJH#CBJ={CjIm3iQ zBzc}fk^(o5K%U;WvS4;&F6TL zP1VQ|H3SAv;at0Jvi;l5XG5*3uMOT8@zv*s>>FrR^)PN5{T;kpe6|5-FM&tpz!7pY z`L3jG*p=Z5Wz@oYWz1-;sjpsDQifl>?A45#PumjRl5dABPs(rHOb+wn1GNOQ*tJ0J zd|#CCrWTmN+1z%_PGV^-!j)rLL}Wgv%F(k&PcP3ovQ=BOlc9smzz@lW{w;Jrt3Dn& zqh_zZxUU6faW;k@