From 27f1ecb596013356b1fd1807bdf96b8c97b0ade6 Mon Sep 17 00:00:00 2001 From: jon Date: Fri, 17 Jun 2022 15:42:20 +0100 Subject: [PATCH] Tufty2040: Tidy up examples. Wavy Message. Co-authored-by: Phil Howard --- .../tufty2040/{game.py => awesome_game.py} | 0 .../tufty2040/{buttons.py => button_test.py} | 0 micropython/examples/tufty2040/main.py | 151 ++++++++++++++++++ .../tufty2040/{namebadge.py => name_badge.py} | 0 .../s4m_ur4i-pirate-characters.rgb332 | Bin 0 -> 16384 bytes .../tufty2040/s4m_ur4i-pirate-tilemap.rgb332 | Bin 0 -> 16384 bytes micropython/examples/tufty2040/scrolltext.py | 46 ------ .../examples/tufty2040/sketchy_sketch.py | 83 ++++++++++ .../examples/tufty2040/sketchysketch.py | 89 ----------- micropython/examples/tufty2040/textwave.py | 48 ------ .../examples/tufty2040/wavy_message.py | 64 ++++++++ 11 files changed, 298 insertions(+), 183 deletions(-) rename micropython/examples/tufty2040/{game.py => awesome_game.py} (100%) rename micropython/examples/tufty2040/{buttons.py => button_test.py} (100%) create mode 100644 micropython/examples/tufty2040/main.py rename micropython/examples/tufty2040/{namebadge.py => name_badge.py} (100%) create mode 100644 micropython/examples/tufty2040/s4m_ur4i-pirate-characters.rgb332 create mode 100644 micropython/examples/tufty2040/s4m_ur4i-pirate-tilemap.rgb332 delete mode 100644 micropython/examples/tufty2040/scrolltext.py create mode 100644 micropython/examples/tufty2040/sketchy_sketch.py delete mode 100644 micropython/examples/tufty2040/sketchysketch.py delete mode 100644 micropython/examples/tufty2040/textwave.py create mode 100644 micropython/examples/tufty2040/wavy_message.py diff --git a/micropython/examples/tufty2040/game.py b/micropython/examples/tufty2040/awesome_game.py similarity index 100% rename from micropython/examples/tufty2040/game.py rename to micropython/examples/tufty2040/awesome_game.py diff --git a/micropython/examples/tufty2040/buttons.py b/micropython/examples/tufty2040/button_test.py similarity index 100% rename from micropython/examples/tufty2040/buttons.py rename to micropython/examples/tufty2040/button_test.py diff --git a/micropython/examples/tufty2040/main.py b/micropython/examples/tufty2040/main.py new file mode 100644 index 00000000..f8c56e19 --- /dev/null +++ b/micropython/examples/tufty2040/main.py @@ -0,0 +1,151 @@ +from picographics import PicoGraphics, DISPLAY_TUFTY_2040, PEN_RGB332 +from os import listdir +import time +import gc +from pimoroni import Button + +display = PicoGraphics(display=DISPLAY_TUFTY_2040, pen_type=PEN_RGB332, rotate=180) + + +def hsv_to_rgb(h, s, v): + if s == 0.0: + return v, v, v + i = int(h * 6.0) + f = (h * 6.0) - i + p = v * (1.0 - s) + q = v * (1.0 - s * f) + t = v * (1.0 - s * (1.0 - f)) + v = int(v * 255) + t = int(t * 255) + p = int(p * 255) + q = int(q * 255) + i = i % 6 + if i == 0: + return v, t, p + if i == 1: + return q, v, p + if i == 2: + return p, v, t + if i == 3: + return p, q, v + if i == 4: + return t, p, v + if i == 5: + return v, p, q + + +def get_applications(): + # fetch a list of the applications that are stored in the filesystem + applications = [] + for file in listdir(): + if file.endswith(".py") and file != "main.py": + # convert the filename from "something_or_other.py" to "Something Or Other" + # via weird incantations and a sprinkling of voodoo + title = " ".join([v[:1].upper() + v[1:] for v in file[:-3].split("_")]) + + applications.append( + { + "file": file, + "title": title + } + ) + + # sort the application list alphabetically by title and return the list + return sorted(applications, key=lambda x: x["title"]) + + +def launch_application(application): + for k in locals().keys(): + if k not in ("gc", "file", "badger_os"): + del locals()[k] + + gc.collect() + + __import__(application["file"]) + + +applications = get_applications() + +button_up = Button(22, invert=False) +button_down = Button(6, invert=False) +button_a = Button(7, invert=False) + +display.set_backlight(1.0) + +WHITE = display.create_pen(255, 255, 255) +BLACK = display.create_pen(0, 0, 0) +RED = display.create_pen(200, 0, 0) + + +def text(text, x, y, pen, s): + display.set_pen(pen) + display.text(text, x, y, -1, s) + + +selected_item = 2 +scroll_position = 2 +target_scroll_position = 2 + +selected_pen = display.create_pen(255, 255, 255) +unselected_pen = display.create_pen(80, 80, 100) +background_pen = display.create_pen(50, 50, 70) +shadow_pen = display.create_pen(0, 0, 0) + +while True: + t = time.ticks_ms() / 1000.0 + + if button_up.read(): + target_scroll_position -= 1 + target_scroll_position = target_scroll_position if target_scroll_position >= 0 else len(applications) - 1 + + if button_down.read(): + target_scroll_position += 1 + target_scroll_position = target_scroll_position if target_scroll_position < len(applications) else 0 + + if button_a.read(): + launch_application(applications[selected_item]) + + display.set_pen(background_pen) + display.clear() + + scroll_position += (target_scroll_position - scroll_position) / 5 + + grid_size = 40 + for y in range(0, 240 / grid_size): + for x in range(0, 320 / grid_size): + h = x + y + int(t * 5) + h = h / 50.0 + r, g, b = hsv_to_rgb(h, .5, 1) + + display.set_pen(display.create_pen(r, g, b)) + display.rectangle(x * grid_size, y * grid_size, grid_size, grid_size) + + # work out which item is selected (closest to the current scroll position) + selected_item = round(target_scroll_position) + + start = time.ticks_ms() + + for list_index, application in enumerate(applications): + distance = list_index - scroll_position + + text_size = 4 if selected_item == list_index else 3 + + # center text horixontally + title_width = display.measure_text(application["title"], text_size) + text_x = int(160 - title_width / 2) + + row_height = text_size * 5 + 20 + + # center list items vertically + text_y = int(120 + distance * row_height - (row_height / 2)) + + # draw the text, selected item brightest and with shadow + if selected_item == list_index: + text(application["title"], text_x + 1, text_y + 1, shadow_pen, text_size) + + text_pen = selected_pen if selected_item == list_index else unselected_pen + text(application["title"], text_x, text_y, text_pen, text_size) + + start = time.ticks_ms() + + display.update() diff --git a/micropython/examples/tufty2040/namebadge.py b/micropython/examples/tufty2040/name_badge.py similarity index 100% rename from micropython/examples/tufty2040/namebadge.py rename to micropython/examples/tufty2040/name_badge.py diff --git a/micropython/examples/tufty2040/s4m_ur4i-pirate-characters.rgb332 b/micropython/examples/tufty2040/s4m_ur4i-pirate-characters.rgb332 new file mode 100644 index 0000000000000000000000000000000000000000..5c93e9baf9e96829c2bb4e103273a1fcc81ffa42 GIT binary patch literal 16384 zcmbW8KaSfx6UM2Vuvh~@uz;_i!i~?ct>Mzu9zlmm;eM;FQ~M5X4Y;)$eZS`!QkG;p zU-B}EhNLJyGegcFQBF!Z=j8JC7WDsK>jQP*vR(WCiss9?%NqIi_VuR+8cN*HyIpo| zyER#~n-t^Tiaf{{!##L%aeqEj!~nyeDy`f8o%=qkd)N0OD%n>qr#>|+kejqJ1G2}SzKOXZifY&1pG+$YgTTbuqKYqNw zr)J&vz2rv=!!ru;C@Oeu3Q~-0? z9!xTNQcr(E`;x!!k=x54zHe9Xc@A}H!Dus)+MjP*jo+_UjdsA>f#=bO7g!2?|Ll9@ zw*o?b@4I}=JML0;X=928ppr!wZ9l~3F(wusniJnJz`to*lY9Kh57hk(16B_V#DKRq z&6m3z-Ko;2+rL>+7~eF5wjs~8ZI_`<_w#3`j#8R|A=5S+R?X&v1ySYuo#j-=aPTlD zYBTNX0N%d7WG{ne|ERzXyo4c+BH+R_oK!yDb7j&G>PWn8_Tn%ipZibJKCih}I zr>;kSF(!O2O(zc3t_6IW`U}2qc>Q5O`!DybKNl*;qu@vT|GeE~fA8<7Q*0PdX!$Rf zCS{eB4Cgy>0e{zQ3=?+L9CyvJNqcNj`|mydU`oc;eVUP96JbHc0n~63=ASU@Q_QU^ z_=DgR)++aRhbwj~aW`UMm(pg#1HwPz4h)}I`jE!>awM_*OjsO%o)bIx#OeTIL4t{< z*ps5&W|LXoo#E21`i&U3xO(-~SFCTmeaE*J=znVe@54r|MYvzK8wTm01G>jY_*FHE?=p}31%D9(FYMnduPGIPFk`_@!|y|z{pJKf z@&E89n8+{2_#g3?{@V>Z3jYIT9a%}02){BcwG6EIcT)gXygi**fB3~;zCE-R{ri63 zMEpOz*}a_ss`39Ge{YH-n112!NC|kUL-GF;`)^jg#ow&(e-b|7-|>GtMEq6!$MR(VN`Qv6Ju2Si&+9eppB+p5SNxS9TMztcuvRHR z2D0mq=nLy*BDJ?~Wy0$0V}fJGrGSSp8_3fBHJ#vb+K#UP zZtNcb*LscV0N}!J8sY*^)cwqEqA<{_1LY?3@f`YB|BI5z%Xn^#e?;H4;=2M@n{mL3 zzwlp6w~YS>1~6XXfBzBTU-~C7kMTd(hfUksawQ*GS;aZRzt+FtJN|cP_5b{-8!WtD z1H{fxty78r%>jOY9-5Ezn*<^`3VkB@7kufzM{t=F_Jtr3|DAud z-GKQUo-}Ac1zhN96N_*B#<`CkBm5yh@t?qr^OXKOIVtHMewyo5>4Q_#eWO9Y?JTd@Fwv;>?)_v^8P=G|3k!o)`34N5?nQ|bVZTiFrf5D z__|FgHz96L+DbSTf8}OLfMj4!Fu;cci|_Y;ygP-xJlN2c)9y4)-k4BxvEJGCc4ylD zH_jjY{u}v{;=kk|3^-r$`+vb#0%m;e0P-JR?C<~1$*-u}<=7r;$s{FC^P zBWCy_{(FHK@AwBT8@l+PSU|dy##L%dbbE~d+BZBp#{WkC1BH~*IQ~yNNDmbMSBihD zMEK!ANd{2%KNGc?ruM%KZ${++qW_L>MG$|5OZ*ox110{_z@@Dn|A~jq;U^2G_^bWs z_%HQ8#(!-f8J?-mpVY<>Ou1p$(3+}5ev0vd>$(KI5&+eSiR*~}oCgSgedzD;-{*gm z_^FASUENkJAy%xSwNwY?U;FjUlcK;M z_BYaD+D@y(t$-H}Zim4C$A0#(;TLp@pKqw)HWYq>BIp5A-0#0A`#sfw|Hpp46Z#m; z6h;cg)Uh`#9oV2c5U*_qWHWH^w}vlRsqn$T-}ZA3#yRdDI~GL~rik0i&tm^bi`%2P zjb9Lrow3><1am_>Ux&lKZYSPs)PGL=ebR4bkNq5kv5cI@nZieDCqW9vN z|ENqD_}BgdH79!ira0bV_@ZMzAV)v}r`q2V|L^-3cArXH-xFHF11y0}Yy2+@uo}Lq z|NEND|A&6kzRP}9$B*m1*at1IzuLeNhsA*7aKa%t{#$i!P}1~jn?yZx#CbLi0@BaN{6fxpXoLTqeYQ|mvKDSq|$mDc?*zW;-e10{&qC>_!L z&)1HfJ$b0w`;tzE%&LE(|M_N|J^iFn-q)YpdDd0q^5mYJf+ubO8iYa zclOf@KJY)S`WN&Oe*ym`r>OlctJDOmni#RuqiuS-Ds%}x7^r*{HpX*59|YfR|-I)O>V7c^%YqoDQ%B z?)bq+m47?{td5`+A1%(H#{bpzdJP5wzBUUV+INC^MYZ*10!TmT2M!}G=0Luu_ddOE z&!}cp5q!a4wC{+%@#hO)t0_l)RneChe_atpP$!;`6jR{t>iX-~uPUJ+Rx3KhP_=*9 zQ$IpJr@r}sdnDcFA2%c3KGN3T0l=Rr!0Hgb4Umm@)d0c&>VBElwjK*?U6EBKRougthAHJcz?sAZX)FG?{HSCV_CKul=8r>m!Gkxp*>r&)WQprjM17~OR<@um z#wZ4)ZQx+=vuyw9!1sRH0qn)zHSIeTfdcks7wT>pD*SEutZ+fzVFTR^qL(vNVRnby z_54rUenXq@5cUUm`NRH0|Hv<=BMYqfX6x68Tk$JD$0LT$2hKZH^BDLrU_L~J4+By^ zA0i~bBw1DazvI&de&E1Ls3pur+r#o#_EzAUfuMyC;lC{PJAfw!tNP#Cc9(ci;qD9S z;~(yWr6Ov%gCM{CESClKzWA#I3_&f#E9#q1E<;$qp|A`#t!{gVCks*Eco7&=r$d!N}N_`0BTRf)VUb z_`I$1{rm_Spy7Z0-NSxRXwo}Zho2p_=lD95Q2Ya)clv9xOT7LPzHD&9hvWzU+zlOw z%0F zQaCH6M4ves*IzG&S`y$rVx+YnedxX!zyQUE?A`<_@0YnPEoiw#>6(;sd^jhm?*GZa zc{SKEW4=)UD{iIphn}?f^_u0Ik;ypZoV4y$?Y?_C4mecet>S>%eW;Ewp=o{T!dt!)LG%LfdI3UEq0+S=ige?eJY+yCAF%<&B`1r+~N<*m4t5@%72 zzI#7V8EeZiZ_)pfM*1!B~8RKtlSG*;4+RX>|XY{BK@!(nk3tHEIjQiGu{EdqEy%V*UxV4P};(Pyd zO8k*S@%qnc-T%6+`%9{h`WTgpx1@GBSp#uA544=W>2@vHoU<0$o{Ae$tyfu*N~O_y zajoy!Pw6B67Xo;uf_rQq82A_h_+xF#uU1RPf&=nPq#n=T759{XR9e1EEFO}xGNO|R zZa%=Lf?Fx*A4)b(5$-BYWY;|YnD;~;1SgKeBYa)o(m^H{wFmqUekmovKlr_zsTe5! z_Ws^g?U3*3#97Hbr~X|+BnE-AB29`H-Z^gF2hlsl<@aL3hnw{}4ZMJK@_&BuFdyjS zME*&lu~YsDRT8Q^RBabeI^W+T&dbU||9po1SQB>j!bkk^`^RRC1E~T%Q0XJfu1X+( ziMPD*h|fAi*q^?C*bM8K<4dPOx{OTgyXTy=vJjN4L(WNcWzW$$axFztVqqk3LsR{H5$1^f0l*pT^Nt zB+{n{Z%?=3NKF{xSGN4lmOrJGDyHZEHejUb<(=1D1J|D`)bL*i>DXzweF14a$txtC z2Ju%65t*W;W_N4bE8m87x~M|++P3`gbBh#l9$97%dG#|H{XZf2D2&WCU_1`ItN;NB z9(E+L7l0n|<2%d@etem}uL2#nPVi>HKMP=Bk+{KsX&9Y|7UAo8qe%6BwpG-`2~q+4}5DX2R97o(f-wz!NniVfg)!1 z{~Uj`zkuah?Vn@jiT#5M@JaZl5B3jU;is;;*pcX7kXQ0o`}5C&#lvX-XXAf<53aP1 z8!h@*X_<9t|ET&)*|2V@n4NJ0{sG_qr`rAd=lQIammNy}&+l{KpN>awzd{8dC;`+h zhrx|_x;3-^7wa$c`}_Bq|Ej3C91ei@jH4$9_IjoU8>Z3btK;#A!HxLg50#SPhF<3%SACX~0zytv zIRF+N2N3w-08)EvJvp#mvN>JKU)*uTU>MN)>u7dTXyX4<6<-d3g+}iPZhpM(l`p*@ z7$1&}Kc|zW_9$6jaX?bR>UI8E_TPx3_0|-1|JQYiX}N~@k8~VRDoTjLAH$pzPd1_4 Mm`bU7BWe8q08foQ761SM literal 0 HcmV?d00001 diff --git a/micropython/examples/tufty2040/s4m_ur4i-pirate-tilemap.rgb332 b/micropython/examples/tufty2040/s4m_ur4i-pirate-tilemap.rgb332 new file mode 100644 index 0000000000000000000000000000000000000000..1fabfa955c843bead7cb4991a0b46fda1538a947 GIT binary patch literal 16384 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 30: + position_x -= 1 + + if button_up.raw() and position_y > 30: + position_y -= 1 + + if button_down.raw() and position_y < 200: + position_y += 1 + + if button_b.raw(): + draw_area() + + # draw the line + display.set_pen(display.create_pen(50, 50, 50)) + display.circle(position_x, position_y, 2) + + # update the screen contents + display.update() + + time.sleep(0.005) diff --git a/micropython/examples/tufty2040/sketchysketch.py b/micropython/examples/tufty2040/sketchysketch.py deleted file mode 100644 index 1964edd2..00000000 --- a/micropython/examples/tufty2040/sketchysketch.py +++ /dev/null @@ -1,89 +0,0 @@ -import time -from pimoroni import Button -from picographics import PicoGraphics, DISPLAY_TUFTY_2040 - -display = PicoGraphics(display=DISPLAY_TUFTY_2040) - -# Tufty constants -A = 7 -B = 8 -C = 15 -UP = 22 -DOWN = 6 -LED = 25 - -WIDTH, HEIGHT = display.get_bounds() -display.set_backlight(1.0) - -# Buttons -button_a = Button(7, invert=False) -button_b = Button(8, invert=False) -button_c = Button(9, invert=False) -button_up = Button(22, invert=False) -button_down = Button(6, invert=False) - -# Pens -WHITE = display.create_pen(255, 255, 255) -BLACK = display.create_pen(0, 0, 0) -RED = display.create_pen(200, 0, 0) -YELLOW = display.create_pen(255, 215, 0) - - -def draw_area(): - display.set_pen(RED) - display.clear() - - display.set_pen(YELLOW) - display.text("Sketchy-Sketch", 90, 5, 0, 2) - display.set_pen(WHITE) - display.circle(55, 215, 15) - display.circle(260, 215, 15) - display.rectangle(10, 25, 300, 170) - display.update() - - -position_x = 15 -position_y = 30 - -last_x = 15 -last_y = 30 - -draw_area() - -while True: - display.set_pen(0) - - if button_c.raw(): - if position_x < 308: - last_x = position_x - last_y = position_y - position_x += 2 - - if button_a.raw(): - if position_x > 12: - last_x = position_x - last_y = position_y - position_x -= 2 - - if button_up.raw(): - if position_y > 26: - last_x = position_x - last_y = position_y - position_y -= 2 - - if button_down.raw(): - if position_y < 193: - last_x = position_x - last_y = position_y - position_y += 2 - - if button_b.raw(): - draw_area() - position_x = 15 - position_y = 30 - last_x = 15 - last_y = 30 - - display.line(last_x, last_y, position_x, position_y) - display.update() - time.sleep(0.01) diff --git a/micropython/examples/tufty2040/textwave.py b/micropython/examples/tufty2040/textwave.py deleted file mode 100644 index ffa90fc4..00000000 --- a/micropython/examples/tufty2040/textwave.py +++ /dev/null @@ -1,48 +0,0 @@ -import math -import time -from picographics import PicoGraphics, DISPLAY_TUFTY_2040 - -display = PicoGraphics(display=DISPLAY_TUFTY_2040) - -WIDTH, HEIGHT = 320, 240 -display.set_backlight(1.0) - -WHITE = display.create_pen(255, 255, 255) -BLACK = display.create_pen(0, 0, 0) - -display.set_pen(WHITE) -display.clear() -display.update() - -message = "HELLO WORLD!" - - -def calculate_text_size(text): - size = 20 - width = display.measure_text(text, size) - while width > 280 and size > 1: - size -= 1 - width = display.measure_text(text, size) - - return size - - -size = calculate_text_size(message) -length = len(message) - -while True: - display.set_pen(WHITE) - display.clear() - display.set_pen(BLACK) - - t = time.ticks_ms() / 10 / size - - left = int((WIDTH - ((length - 1) * size * 6)) / 2) - top = 120 - int((size * 6) / 2) - - for i in range(length): - step = t + i - y = top - math.sin(step / length * math.pi) * 10 - display.text(message[i], left + (i * size * 6), int(y), 0, size) - - display.update() diff --git a/micropython/examples/tufty2040/wavy_message.py b/micropython/examples/tufty2040/wavy_message.py new file mode 100644 index 00000000..c9777423 --- /dev/null +++ b/micropython/examples/tufty2040/wavy_message.py @@ -0,0 +1,64 @@ +from picographics import PicoGraphics, DISPLAY_TUFTY_2040, PEN_RGB332 +import math +import time + +display = PicoGraphics(display=DISPLAY_TUFTY_2040, pen_type=PEN_RGB332, rotate=180) + + +# convert a hue, saturation, and value into rgb values +def hsv_to_rgb(h, s, v): + if s == 0.0: + return v, v, v + i = int(h * 6.0) + f = (h * 6.0) - i + p, q, t = v * (1.0 - s), v * (1.0 - s * f), v * (1.0 - s * (1.0 - f)) + v, t, p, q = int(v * 255), int(t * 255), int(p * 255), int(q * 255) + i = i % 6 + if i == 0: + return v, t, p + if i == 1: + return q, v, p + if i == 2: + return p, v, t + if i == 3: + return p, q, v + if i == 4: + return t, p, v + if i == 5: + return v, p, q + + +display.set_backlight(1.0) + +message = "Tufty 2040 is a hackable, programmable badge with a TFT LCD colour display, powered by the Raspberry Pi RP2040!" +text_size = 10 +message_width = display.measure_text(message, text_size) + +x_scroll = 0 + +while 1: + t = time.ticks_ms() / 1000.0 + display.set_pen(display.create_pen(50, 50, 50)) + display.clear() + + x_scroll -= 10 + if x_scroll < -(message_width + 320 + 100): + x_scroll = 0 + + # for each character we'll calculate a position and colour, then draw it + for i in range(0, len(message)): + cx = int(x_scroll + (i * text_size * 5.5)) + cy = int(80 + math.sin(t * 10 + i) * 20) + + # to speed things up we only bother doing the hardware if the character will be visible on screen + if cx > -50 and cx < 320: + # draw a shadow for the character + display.set_pen(display.create_pen(0, 0, 0)) + display.text(message[i], cx + 15, cy + 15, -1, text_size) + + # generate a rainbow colour that cycles with time + r, g, b = hsv_to_rgb(i / 10 + t / 5, 1, 1) + display.set_pen(display.create_pen(r, g, b)) + display.text(message[i], cx, cy, -1, text_size) + + display.update()