From 7d142a2c4272653ca2c7d81edc553a3f03823452 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Tue, 27 Feb 2024 12:44:49 +0000 Subject: [PATCH 01/15] Both: Add PNGDEC library for PNG decoding. --- firmware/PIMORONI_BADGER2040/micropython.cmake | 1 + firmware/PIMORONI_BADGER2040W/micropython.cmake | 1 + 2 files changed, 2 insertions(+) diff --git a/firmware/PIMORONI_BADGER2040/micropython.cmake b/firmware/PIMORONI_BADGER2040/micropython.cmake index b1207d4..10c87da 100644 --- a/firmware/PIMORONI_BADGER2040/micropython.cmake +++ b/firmware/PIMORONI_BADGER2040/micropython.cmake @@ -22,6 +22,7 @@ include(picographics/micropython) # Pico Graphics Extra include(jpegdec/micropython) +include(pngdec/micropython) include(qrcode/micropython/micropython) # Sensors & Breakouts diff --git a/firmware/PIMORONI_BADGER2040W/micropython.cmake b/firmware/PIMORONI_BADGER2040W/micropython.cmake index 2901f6c..54dc032 100644 --- a/firmware/PIMORONI_BADGER2040W/micropython.cmake +++ b/firmware/PIMORONI_BADGER2040W/micropython.cmake @@ -22,6 +22,7 @@ include(picographics/micropython) # Pico Graphics Extra include(jpegdec/micropython) +include(pngdec/micropython) include(qrcode/micropython/micropython) # Sensors & Breakouts From c743d246c2b54fc0761ad822c0a5d161374cdb8c Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Tue, 27 Feb 2024 13:28:45 +0000 Subject: [PATCH 02/15] CI: Bump to PP and MP v1.22.2. HACK: Use 1bitpng version of v1.22.2 until we have a new release. --- .github/workflows/micropython.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/micropython.yml b/.github/workflows/micropython.yml index 2f2544b..4fc00ba 100644 --- a/.github/workflows/micropython.yml +++ b/.github/workflows/micropython.yml @@ -7,8 +7,8 @@ on: types: [created] env: - MICROPYTHON_VERSION: v1.21.0 - PIMORONI_PICO_VERSION: v1.21.0 + MICROPYTHON_VERSION: v1.22.2 + PIMORONI_PICO_VERSION: v1.22.2-1bitpng WORKFLOW_VERSION: v2 jobs: From a70296095d063c3d208d522714dffc58d95bd3d2 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Thu, 22 Feb 2024 11:48:31 +0000 Subject: [PATCH 03/15] CI: Update exception handling patch. --- firmware/micropython_nano_specs.patch | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/firmware/micropython_nano_specs.patch b/firmware/micropython_nano_specs.patch index 098c0bf..9a2bc62 100644 --- a/firmware/micropython_nano_specs.patch +++ b/firmware/micropython_nano_specs.patch @@ -1,11 +1,11 @@ diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt -index 094031c6852a..5f268414c08f 100644 +index 281b0c3bc..7e04bb549 100644 --- a/ports/rp2/CMakeLists.txt +++ b/ports/rp2/CMakeLists.txt -@@ -374,6 +374,15 @@ target_compile_options(${MICROPY_TARGET} PRIVATE - target_link_options(${MICROPY_TARGET} PRIVATE - -Wl,--defsym=__micropy_c_heap_size__=${MICROPY_C_HEAP_SIZE} +@@ -453,6 +453,16 @@ target_link_options(${MICROPY_TARGET} PRIVATE + -Wl,--wrap=dcd_event_handler ) + +# Do not include stack unwinding & exception handling for C++ user modules +target_compile_definitions(usermod INTERFACE PICO_CXX_ENABLE_EXCEPTIONS=0) +target_compile_options(usermod INTERFACE $<$: @@ -15,6 +15,7 @@ index 094031c6852a..5f268414c08f 100644 + -fno-use-cxa-atexit +>) +target_link_options(usermod INTERFACE -specs=nano.specs) - ++ set_source_files_properties( ${PICO_SDK_PATH}/src/rp2_common/pico_double/double_math.c + ${PICO_SDK_PATH}/src/rp2_common/pico_float/float_math.c From e5dd28747fa73125a55b8c97d7eaa2aa69a35a9b Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 27 Mar 2024 13:29:17 +0000 Subject: [PATCH 04/15] Migrate BadgerOS to use png. Update all app icons to (smaller) 1bit png files. Prefer png but fallback to jpg for app icons, so users don't have to convert their icons. Update image to support both jpg and png. Replace jpg icons for Weather with (smaller) png ones. --- badger_os/examples/icon-badge.jpg | Bin 1793 -> 0 bytes badger_os/examples/icon-badge.png | Bin 0 -> 195 bytes badger_os/examples/icon-clock.jpg | Bin 1928 -> 0 bytes badger_os/examples/icon-clock.png | Bin 0 -> 232 bytes badger_os/examples/icon-ebook.jpg | Bin 1623 -> 0 bytes badger_os/examples/icon-ebook.png | Bin 0 -> 172 bytes badger_os/examples/icon-fonts.jpg | Bin 1195 -> 0 bytes badger_os/examples/icon-fonts.png | Bin 0 -> 104 bytes badger_os/examples/icon-help.jpg | Bin 2151 -> 0 bytes badger_os/examples/icon-help.png | Bin 0 -> 252 bytes badger_os/examples/icon-image.jpg | Bin 1367 -> 0 bytes badger_os/examples/icon-image.png | Bin 0 -> 168 bytes badger_os/examples/icon-info.jpg | Bin 2062 -> 0 bytes badger_os/examples/icon-info.png | Bin 0 -> 254 bytes badger_os/examples/icon-list.jpg | Bin 1548 -> 0 bytes badger_os/examples/icon-list.png | Bin 0 -> 182 bytes badger_os/examples/icon-net-info.jpg | Bin 1485 -> 0 bytes badger_os/examples/icon-net-info.png | Bin 0 -> 198 bytes badger_os/examples/icon-news.jpg | Bin 1987 -> 0 bytes badger_os/examples/icon-news.png | Bin 0 -> 281 bytes badger_os/examples/icon-qrgen.jpg | Bin 2593 -> 0 bytes badger_os/examples/icon-qrgen.png | Bin 0 -> 246 bytes badger_os/examples/icon-weather.jpg | Bin 1591 -> 0 bytes badger_os/examples/icon-weather.png | Bin 0 -> 226 bytes badger_os/examples/image.py | 20 ++++++++++++++------ badger_os/examples/weather.py | 16 ++++++++-------- badger_os/icons/icon-cloud.jpg | Bin 2405 -> 0 bytes badger_os/icons/icon-cloud.png | Bin 0 -> 206 bytes badger_os/icons/icon-rain.jpg | Bin 3324 -> 0 bytes badger_os/icons/icon-rain.png | Bin 0 -> 256 bytes badger_os/icons/icon-snow.jpg | Bin 4008 -> 0 bytes badger_os/icons/icon-snow.png | Bin 0 -> 276 bytes badger_os/icons/icon-storm.jpg | Bin 3055 -> 0 bytes badger_os/icons/icon-storm.png | Bin 0 -> 290 bytes badger_os/icons/icon-sun.jpg | Bin 3117 -> 0 bytes badger_os/icons/icon-sun.png | Bin 0 -> 275 bytes badger_os/launcher.py | 12 +++++++++--- 37 files changed, 31 insertions(+), 17 deletions(-) delete mode 100644 badger_os/examples/icon-badge.jpg create mode 100644 badger_os/examples/icon-badge.png delete mode 100644 badger_os/examples/icon-clock.jpg create mode 100644 badger_os/examples/icon-clock.png delete mode 100644 badger_os/examples/icon-ebook.jpg create mode 100644 badger_os/examples/icon-ebook.png delete mode 100644 badger_os/examples/icon-fonts.jpg create mode 100644 badger_os/examples/icon-fonts.png delete mode 100644 badger_os/examples/icon-help.jpg create mode 100644 badger_os/examples/icon-help.png delete mode 100644 badger_os/examples/icon-image.jpg create mode 100644 badger_os/examples/icon-image.png delete mode 100644 badger_os/examples/icon-info.jpg create mode 100644 badger_os/examples/icon-info.png delete mode 100644 badger_os/examples/icon-list.jpg create mode 100644 badger_os/examples/icon-list.png delete mode 100644 badger_os/examples/icon-net-info.jpg create mode 100644 badger_os/examples/icon-net-info.png delete mode 100644 badger_os/examples/icon-news.jpg create mode 100644 badger_os/examples/icon-news.png delete mode 100644 badger_os/examples/icon-qrgen.jpg create mode 100644 badger_os/examples/icon-qrgen.png delete mode 100644 badger_os/examples/icon-weather.jpg create mode 100644 badger_os/examples/icon-weather.png delete mode 100644 badger_os/icons/icon-cloud.jpg create mode 100644 badger_os/icons/icon-cloud.png delete mode 100644 badger_os/icons/icon-rain.jpg create mode 100644 badger_os/icons/icon-rain.png delete mode 100644 badger_os/icons/icon-snow.jpg create mode 100644 badger_os/icons/icon-snow.png delete mode 100644 badger_os/icons/icon-storm.jpg create mode 100644 badger_os/icons/icon-storm.png delete mode 100644 badger_os/icons/icon-sun.jpg create mode 100644 badger_os/icons/icon-sun.png diff --git a/badger_os/examples/icon-badge.jpg b/badger_os/examples/icon-badge.jpg deleted file mode 100644 index 0b86070d49d70bde119e5820f1fe26cc408e48c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmbV}dpz6s8pnT01WAbeG$HC%w`?e_N;B$K6(VkROX*Qrrdc zAuTFFGKA`tBE=k1?c7RLx|NL5uBAp@MwWJe?3_Q(dB2{2p67Xe-_Pgu`YI+AzW^8? zFRB*+QL-Dd8vqo~0S^EMg?=n0D$0VZ!{I6_aHN`=s=5YJLj#3Gp)}Fj7)>;YMxih| z7;py`hr?-T>Ed;;cx@~W`%wacDc`8T5pXyHtBKOY{?91708kwu0z?=D1fU=U20|1) zfF1zAlv#nlQBy|%s&M6si~%4}7#t2$L%J*gtmzs`oo%2lL)_##JWuJi`DJ|!n^tsMhk^-`Ho;r(Wzl)jWKl zItw(WJ=`aq3!t7v688AA%7XlpTArPboc-1SI#gn6D;@H|IxXYu2mrRbB_8s zv>3!+7QIug$hqoHtu-)udFcjy>fqbT3HmLzUfwBxZ2|cK&RIGHdG(yTm6yd+0A1qL zaN=YJ<7!HGyh+NK!NsP+ivG31&G&a5!c3$W@S8K0MdpaJx}Lgr0d*Zo3zeDt+kI0u z?k+jZ;(vnOM4%KR)iGUb8$S6tFU&j>_(!cWTs zX|V%t2ty4KUose^1nW)3dLu9_7OMn@!RWZygb8pj(6E>+LJlZTkE{nX+lvI2H9!_?5tjH`d~EX?-by7?CNpyY}kWv^_X;_ zUJ=Ha6u}s$=9XjP0>!KuA=A*_#Pit0I@$37>%7{x(>!KFjFx5WD!qJm*`3$Nbi>xy z%O*)PhYAr^>ZtIBfdir#y2aHY=kFE6$ZY_)4ZrF*#q!W#qzHeJvez_B$xh(ieT-DFBNr+!D9+bz-#n?tD=ujuJZ&8>uM68Tfl!-Zdf;bZ4W=V!PY!4i8-)f&2O>B0z` z96&l`!)`jb-vT|2H{l+>b%?^a;t&lNwi@0Tnnul)&s_(D2k{dQ!t`~jjyEi{<*9&F=L3R@RZ_K5Zn5EE=gs{M1 zxcRV9J>ikD{`G15ttBS~P~DZ;cjjWM&zWu>)hdSTP;b!^qhj#*tIjXh>I5@%_qmiJ zQ@sT{(@}5Mz1jM*3CGC1Z4vEoN8*X9Y_SD5C5_lC{f#CRSq((@&)3&F=&U*Go8z0+Oa%~de369S=1khL@{BxD=C#(28E%A}vAbNK`BWCs z>A)qwRuZPp?0ZmK&I`Sg{+hmWA!u*kAAZ{&_KQyewDZzjV%Sg)a<=eB+_l7Dzq>}- zsP8Dv?Xte^`xzg?F@D)MkJo(v>t#l$uNtlS#8_9Q75Q)okFP`OXQ4nB#kZw`1 zRm6IOD))^P^NkGAi$uI;D6=zJ+b1+tO=_u`o|quFVi(8OwDfPXA7yzWe5;b#IQj%! zb2wf#&9|EWuE<~P=RL=FOP8J0x%b4hLZrqeU#$Gm=@#lV<-rEkC3BX8gR#A^9NJdAj literal 0 HcmV?d00001 diff --git a/badger_os/examples/icon-clock.jpg b/badger_os/examples/icon-clock.jpg deleted file mode 100644 index 48c37df12de2b55db3de3b0ae6202c9459f34ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1928 zcmb78c|6pM9{tUXVT_r{tYms(Y{}Th(sHv4SsG)>-X*1GQ1Vd560%m96h=bXcew@= z%98EcuVE~MycS$ux>}^jT;2D_d+*PCKIgCVJ?DIna9X$sNLpK*vH(DPAcM#NAQS** z00a#F!99rV5ekDsMMR)*F)>jX0**jPz$GM*D2yZ$g+@t8ND?H`SR5XYN9>c5Cg7wo zI6Ur02?(;65rK+Bq2f5C1QPeRA?yIqFhCd3g@Dii7!87;LBei81^~bi5D54$VB&zN zm-VO*FFaj8|F{HJ9Ey{S_yxj|Y7mu3HK&s_gx=;~%W3%pR+cr6n zhFj96luVp$(4}0Q8Cs4Q-5A=(uY2pmc?!)XURxfQC3Bw$+Wj|%oP+4Gt^d52;WTk@ z0PcNG>Hs)8=?lC|2y`E$jjkHr`?`B@&1o)t>v?2UUF${e%d`azvC*A2o2X)SclvyT z3nxO=Lap|?%jB~H{2XEh{#z84)x+Z1b`*1qmv23$FJqo&S!f|L zlX6{m7}G6%zw^Jvkc6STaAkd2f1lt2DF{NWNeBe)_^NgWGV7}d?X^)Zsm@6<)gDgq z#YC>NQ~buq@ayJr%NeIsM9xylrk&;A5I0LvWgC~PgJgDE(U00ZYB(wx>Fv;D7oI*ISGZB)Tl4(j>igbsO)e5=vIJ<3vGsh9p@-wm94F?(V)vcHg!w^6Oh` zfAdlKnab={pE@2PUs&vBrC@1VQU27SGe$zO3ea96EA-C)E!yP;C9jKPO+(b&>E%|}xcPS#s| zP?VttMA5$6ue_A_B4t!DfAyulk;m4q=9PD&8}~NRnAcVz?eZ_9b{$m)$3QJ71Hy8z zvFj{Ohip1l3~FAnotUT<>21lXxKD#Zo0U_o<;d2WDSZYA?;p!iqy+ukYFO?NevwJC~9#1urox532a3H|k?hFNCI0MlivMPO%D zrfXd3f&cU_vsU>UC7~jz_ej2)>aM6CICJI&;pyw|ihP%;@hw%&9K8!&3!`$`dEiPW z-JsCV@(capPXyi{F9S=Jjs4eWO0$P$SC7D_PBm@jGi9$D*XMzs1*oHYy79-0Uy#S^rwt!Vd+O1gqI6T<@_8HnlTiNgjk?g~3Zm z$FXp?(<;6rWal%sX~S3g$&;Run`_?b2r$ZASl-6aui3*RN!>AqO%52U z|Ew*aSj~L`x46z04{T$KG~8dDH{Gn6U{=kiHRsER)W|4#bsBGbZ7|qDhf6RHRsna| z?N@IUfC^Q#;} zHS+Td^cfyz0rhtZOVt^qmtCd=Kk%X`iF-ZU*!GaZZ$7K_z3jB%M<--xqJuTesZqjq#j8Lt9Hyw z>wvgP) zu@S={5Cp)}C?J$Opapk8OYT7OxG_9xgv{xO1Pt#3^itr&3bZ8r+#k^X2~_hmj0nvN zxMl{XrU31y(NzSx1&yBahAe{0+u2d4T4`B0b{1q$p8^T$HD0EbrU#NzxqLVC{l~po z?s#=?|L6|q!>!3VDU?1p`!T<`q0W>!bRT*2(_DFAPUhAlf7kZ1J#BC6!FoA+vfivm i>(zR;-p_aF@A3sy7XuVVF%Y=`0000MgbcPqQH(QPCYM5s znN-CQHkR4x?4CXQ?>^`G>wVwnc|Xe6%27bv#dYNZm`cVl zV*r$cz!@Om@XuBWsWJ+KLLreT92%{LQOBvP<8gRAL4!;rXpl7Ucp{ZZ(t;=yin^xu zIx4h|3{jxZB`}04gG6CbC@e(46QKVsWfLG_01L1XFcN^1Up1xF&$e;>eA6eu+knhY>lEgD3p>RY8yw9Ts5Gt76!RJAy&LePJ^ z{x1DICH?2aKhpuAj)1915F}s^ZfaK)3I{@W1>X|+Rek4`GyQCRU1rIQ^WkA0o!d1; z<1mO8gL$L;gb%TR;9HWtjU_B=KPB0F@%Im#zS?M&as8tYoy_B-eFKvowa1z=$a|Pf znQTti>sr*aLY*gkVbGnDXwlTJd9$1g?uzdH(&-l2;BjO@XaHkNYhPC;g`>UU!sdYb zuy)-`PMN;7)2x*<67BFaa?cEs{9f&4^mpfr^`$hZ{gXR;RgmakI=rXun5_4R$5`+w zkzVSD$~P@PbV{EQrQ%}iL8OL;$D^dJ(gQp`MLTi!{ig7Ry&iIRznYWWR~f7PF$pgJ z3)zrsr*(zV!2wR3;~1UQBtC0+*fTO&To5p77Z<&p8@-5r`!bi?Q1JfwdRLdbYWbyCZ&7Tb%sYa!R{rr8&LvEe^xi*8!^V99-KHM(5 zeJhSW#@F7s5kG>;$QvCMWl<&T2XR;9p5B`5Et}V3-1RDcFs2h{_j_uJ4w+nN=k%k* zG|}jsQv}oS0NsE-R~a8poobBo9R+7R8 znwGlE(U0TurK}tu3xzU0Z_}&*5r3_ZIr^S@~9R!U}_LvamH-tFP)* zB;4OUy8RU}di!`X#9Ij-8`)1hY})Kkuz#3vSP2>vOKsrgy;>6j54--AJQc&7T7{cM z>4lC)bFcFSLnnf@j`k$@j2z5*{q^RC%8|er>^0oz4T_&Mma{5oJ~!?)EkWg!wNB=I zO%GyiGE1lXKQ*?QcG+Dixhp=3l&A2VSsXr_-s)*n)9H=Z_hM=8n-LDDMEGVi;w8Kv z9C4@4Gl|`eP;O}3ev81iUqfm+KQ@V(hRhjI+V#lledcN04~1boj`E$qoK>vMqI~)bw#{ca+TIV7fWmmA4TY z>7s+B2N9cg`6nc5k~=^HhP|*(3}WaZl4icvFjYiydd(D&F@6d4$F)(rN3f_y&h;X`=dhb}fnL zl?Uc-2F+Wkx%Z9Tc09fe3E2dCm0p@&OdB&JtCXyL!q8-CO#foO)Gv(Dd_W76nu=KE zOpV{oP6&vyyoHHwkO@d%9@<-eq7t(-}rB3GOWBRjs0SuS#~ zG2UV?b$6T8ZOw5jE;g*bJ7<_z!FLF`J-lw=CxvvZ12_q8$U81W@cmKW@}?=V`CE#Xt?B%@V~)P?nL6h|Lq_D%M1MNm-YJ0uer;S z&xe_@zL{snv*uqDni(Z;$TI}@IviDa_VfRL$$$R^7+P;X{QsZV;Y;zPLy}I+3=9o7 U4(q*p+zoPur>mdKI;Vst0Qn_B1^@s6 literal 0 HcmV?d00001 diff --git a/badger_os/examples/icon-fonts.jpg b/badger_os/examples/icon-fonts.jpg deleted file mode 100644 index cef072f6b9265f726baf5057625ed639787a5fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1195 zcmex=``2_j6xdp@o1cgOJMMZh|#U;coyG6VInuyV4pa*FVB^NNrR z{vTiv{LcZ1_a>bU}s?kN|^~TFfg;RFtM|F1D+1Ld+goH&n6-C7)3@uu>N-C)u8HZ0351V@V%2J>{5fszF=7K~8k?nwp-eTZk zW(2y0S&+e=VO0(rU$)qht8xvl@ro0z)+--gVG=-f7?*P8I{v` zUO+wK&Q8hpGXmjjZV5_6UzCfzb}CVElZK;~itzqM6?eLR{=$xnh z)O*H*DW9uZdwechGO?aH

+P|t_!|Tm=mK{Q+nCn_{;Ha+&>N^oDhB8#;S9~HKOl|WS_l-rQ2dDsTWT7WrNH0 zCUGu^X|>*XMqJBPaA*6B{(>Tg2@$6kZGbxa@fF8!-0U}B=!*n&*+_?;Wj#CRh$5Gn z(K3dO&J)-xJ`3EMVe+ui+fcCWq}_rug+C9TGL^WOy^y=6)c4LV|85MkFaL3PvRo?r za8&w~#I8O1ybaC@1HgOUP+_}&KV8EWa=^JPoUpZRO} zw&|aN1djlJmwDf=nNR1YV|{+z$e zc0>FzX2xcQNBynlnO?7rL+Y=}tt+{9{o&mByBRNbEor}cSJ?E+=9+~$*Pds0WX;hF zICr*0D{{H4`8B)NyEXoqTd!TK3awu{=V$Kf>CdE}?$^G-*kvVoE2!1y%Hw6fc3zH- z?|f?>Wu@<_|7G)J(=VI;9L%}?JewmmN3USno9nTuv-*E61{-C(`gd$@dT79}-HV@Y bTbDm2f7+e(1-yR_Bmh0c#?07o@c&H!2*S-B diff --git a/badger_os/examples/icon-fonts.png b/badger_os/examples/icon-fonts.png new file mode 100644 index 0000000000000000000000000000000000000000..40cd1ccd8e59ecb396d872e829f912f4a9b09ae0 GIT binary patch literal 104 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 diff --git a/badger_os/examples/icon-image.png b/badger_os/examples/icon-image.png new file mode 100644 index 0000000000000000000000000000000000000000..914cdb775774f7fdac71c17401b137b943ad3073 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^CLqiRBpBW@tGNNGd`}n05Q)plKls_?B@8my6dwFP z@PXOIxGv!b!y-w8m+T3<8Xh{@2Hb9Tbo}3Zss5GX7yfF4+W*Wg@BS<0}DsbQcj2|I@KnMy53L=FtD5MZtNKg=kL!m{mqN1V*VKH$W zRvd#B#r`w_fq6R+C>#ofW08VL?Ej7Z4gk#$XaQPa5E|e^gTQFeem5Y&iwb~w^*_M* z0oVa3gx6C=0epPCySxHJ|2@G620@@OH0A(5Tm--pMDem>GU_;SqDDv}Zyx(koB#Oz zRMG!1|F1d)AiyAA2rwGZ1#HhijNgl8sfcp^%Da_4>|0a4lW?9@a^<<&xG`qfWmVNv zh^64h-)~D%?<@?UAPjE=asAfQ+bsX`nQBc!7QfruDWQ*xOND=J|J}VZiHzjr~Ym%TfZ z=Y1sQah-d46~QY^y-Pzw9~q!E<)ruItOxx(eN=ZOe#}ET=b*6sxH0 z2MWsOC9!uqW3swru6u%iOC6xRb}yUT$WfXLX|l%oy)7N~bEb()yNVBX!V%q_hJ$1> zIU3Ynlf{02G`rtXc71%v_jZ`Y3)HZugB2-X)ckh#1vQXoR^!o>f_B2cJX2w$V?BVS8^3Wlu?A0_Sw>2EOw^_iPk>*OBaD(Udk@@?iKkx~C z5&ctk*?FpT*-Q1gXQQ)upnS_9W+yB~iQx}=%b&_7H=W41X;eqrl>J4XX>1!;#?A9- zue;B+R4R#?ie2B}y12ZFV_L2dOoIx^V{G+fDrM;$=UP0xcGkZJ~-7}xy|IVyBmf?mCd2cF^ z`PiFCkiHX*twQ7VMUF1u4&$YyIgN(@Y#VvPx8z$t|^~&3PPZxR{?=tdE;@I0kPuU{)W;c2`3Ks?%>YZ}haJMjs`^+?jqy{+j-BEcgy?%oF2dgLa8nHD@SkhtAkJWrc z(ezHj)o6W`wERp)+33DtY;pPoy+sw*>VpAZgN% zEeP&JkC?Byyw?HbZg#zGXdN2aGd`>3<$uuDcZJHGpe-}Bm7nq9ilpr!(f5&lMXrVC zs$5OKS!E?&=LDJDe{&`2Qw)SLe)01}&ykgpYZ4EfR3?4n$rDB9^XwFA#^XY15&;JO zuvB8MmhZ91Dje3yIJ9^C>V3ub6p%!V@yzHKjJV%GI#6^uHU0sow*$9Dy0s?K6Gy3> z{~UgOQHnlXRN1U>IGv?(O$h2>n3X9hLp(`NlKGB$fa;XG85O^o!}$1L=_=lo zu)Ae_|A34&_u4Cu+y-|XL#KI{`z*xg5k0mZJ`-#J(eG0%=~Yb|v)`&Bk9k-_ZMznI znrvR_+-b3bsMTHNyFfCde)O8l{hEcBe&W>lqvACyMwF zIde`)dfnSzpS({hS-iVF*3^#|g4Jg{&!(8)!=z^CRo6NTz`t&`$d#)=H}fKp#D!(Jx;2~i8)lK&5pC{>^!?4?=XV=15y|En!tApmH+?%07*qoM6N<$ Eg2zd7oB#j- literal 0 HcmV?d00001 diff --git a/badger_os/examples/icon-list.jpg b/badger_os/examples/icon-list.jpg deleted file mode 100644 index e9552dda805da9fbda03a7d5640139954aab2167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1548 zcmb7@Yc$k(7{~u}Gc#re!we?Wy2QjJqO6f^Fz(vi#wEM5n;J^SxD`?^$z|hEky~@r zm{DU<3{r`4P)bSTQY48mMlMUpZFcOw*zLu>*w1;+bI$L1&hve~FMf~YjpPHM;AH1$ z2Y{rIKqLT=3<5R)1PtB^DNt#^5HJ`N3X_GyWe{jtG#Vv~LSf_-6)z!94w4$eQxV2-_aoo46TMAoM>^Hmqsty2X2uNxPf&~r&pPBU9-XeAtFIH~mj%v*M zfWtDdz8Src*|KljAkTQW4l%9h7Ewp-h4}pD$ux>qB~;wy5x5hgTxc6yJ^I*9{s7FS1%5y1n9`>vJO4&xPO1 zNKA_u^3;%5>p}z`p+$t$P(3GUJ&D}2UagIm8De&Fg=i%xo%vfE$Rv+C&Vg(Lpra1s z4p~{(ffNC?()k>IciR5IycqTo&RRf%&B7IO@ait zQ1G<~0{#>h9C7~)?-tMEF?(aj4O=Vq#z~gP<@6qbTBt&B%qXt2@N@*VYe?MTZNzAQ zQF6T7NMW9tJ$DZ~OEOhEO#aTzkbPpRZa{xLFq1zba_M&tY_#Sjl(dB!1fzEj33{Rk z^Fp7Bkd9I`IT>pbk2S&lblt}0Hth)w55kiXPk|QYs`=CdZA+cv$pX*Fdd(k8nbo)L z#}$`cjxz_wUE7H*1z7EhtZU3#t>=FB<$968zG#DUq+ZK~j8#=NX!)h8;>*L2qv(^J zAsGK-2Pfz&WgB(yP1!oe+7AEXzUnWjB8G-;w3{GY561SJws_RvYR>Yz%oiPQWW^JR z#QoL3v@f0z`r0nJ@6-8sT8~3e3O^(}{&^~jlHK=%Qgjkep8^#vJ{U;I;{>^>B9rC4 zk+Fk^s&b~<=k*E6J^cD8q}iR~;JRvn>Xw)oVzo_$hH@8SFtd1}wI1|m401r8;?eI{ zlTpXn<>+!CiIGc>Ur(QY$wPX2zwBu{=I37xsINURuNS#faW*u!{L{4LEy(FE{QZa|^Bk<9;FYs6lb%Y!ot%O}yD^mB&RSrcjQ4+BxcV2f;kT!n z<|b#&1I(uwP1XGuM!MgJ3!0Di3D<bp zGto^^G4@aK=ZGk;GP6x#Hr69{J6DrDu)B~Ol=X3+9Ac82f;~!hkWn&`pMF)BeMiYv XWZLQAXgz#a8QkoH0tJwENZ$SlG0}>b diff --git a/badger_os/examples/icon-list.png b/badger_os/examples/icon-list.png new file mode 100644 index 0000000000000000000000000000000000000000..c31696bdbdc6d9c8de12cb9560141363c9b72c4c GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^CLqiRBpBW@tGNNGT2B|p5Q)oEFP!FVFc4t5AjrRy zBdQ^RTTJ1`B-RR!8xdZfoFCOB{=8LD=<2GjTz=D+ZFSG#(Ei#W_UaBkw>1loK6+Mg zCN!fmnxX=yW{xMlAtTkOI9A5`|bSiEmi;1KdfAS fBl*qOmH!{G{n~xDa1yhJBFI6Wu6{1-oD!M<(?v=i literal 0 HcmV?d00001 diff --git a/badger_os/examples/icon-net-info.jpg b/badger_os/examples/icon-net-info.jpg deleted file mode 100644 index f581777378dd81ed0b3fe74548a16f4c7ef65d05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1485 zcmb7;eLT|%9LIm#{A}3R*gV9o%uJNh>~wk&V;*0gCPNgZNOP0PLx`8hS6HUGJanCh zlEqxnbxa6_Jl*8^F-~PJ$wMI}+Rfb`clYOgzTdyT-`D5!c}vD5GXUDr*1;BlKp=pR zbO6aDU=6^a(4Cb^M!FyZ1Z8AEc{p4afs{ug7338ZP>RZElp;n^K>@9b#;9O%I2=+* zO4lE zRC>l@{$21_lw<-x!XQ!*7zVHa1{?VAZjG(!Ga9%LU4?J@*{eg$oMcK=I1wUh^}x)g z+nD+ba`fivQ_-U7Wz(9ESM#;UJcrMO`JbO_4>I!`21jxm({COIrrlNONasYG&jxA; zQ|P$o^6^F`Mv$q~!=KY51}}B*k74tVt~%=|gaTthlT81jn{|W<2e`uk=&uPmN>w1PeU&I-Xk? z`^N;Hzh$%-!kJvMGyVGG{q*+oDm-J$s540dq!3?ya{djpamD#j)IO#Z`92Mj0PCa8 zxLw3gI8NpV?wZhjjNr}NYo(qd;%0ak0%9yF>d(Uh?qKT9^;XMUiTNf4yCu)m+&tEY55Vv6G z)q$*gzxgz}W4otUUEH$TtKZ_-)UB!WRjb-!ct!&BP;I6km&HcZS2)x7zUv&*m6&hz zhkSaL%w|e*_AzsYSK2*zF_u=d$C7Dctg%p_I2w0rP-IXRKH!&Kr|Kl@=p-onwppf* zg%IA%ZX@VYt&BfYTyDc?=U%&Zk_t`MUk-~bLRG=aK##+jxym8;$`UH9Dm;l4W^$m` zZ1o#4H`tzgHh@dGm<*(|Op>DB`d69Xoo6~R<9m+rPSl-@Yg=p%y>zxW{V3&P*B(@# ztqpCm9eFLALRY5gqAjcZJ~nWU3I_AI(-Uh)nB?Ty*uep&tI8uaBG-i7568)LfF2%< zt{9qS_V&8w)TU3%c2o2!MeVC7y8PFD2|2QJS5#6iVj^s>O2@&U0-!E%5jn35>aeIh5n(rkls6;XD3 zSq2|EDq1vb`jXZVY5ygSZ2s6Ga^5{~I@^UQV8Ac>X|e7^_=OdcpX)U`rsU*5Pu$aQ zcx$nyTGLvihS`}NJ;cjbk1CB8cx1fPGZuSO>|a^8WU5niGuhpPur~98mo}r==NAT|^^R_g}Ui&TFYhO8Npq&|q zE+YJj3qnj1`*y)BgE0vU=K3eMX{`1d_BeH^#`oYz<06EA{f_JD zwR7at^aK~-d_VoZDI4+NL>sk5ly!A+qj9pUZfzkvJ~zz!`d!o5$b{L_P7YoNT5&`E iJMFp17@BHYjIO^RUAy24byM1bf|O8Xcj~B;@jn4Im0#Qd diff --git a/badger_os/examples/icon-net-info.png b/badger_os/examples/icon-net-info.png new file mode 100644 index 0000000000000000000000000000000000000000..fe1349f1a4642cdbbe846cf810e26afe362a5739 GIT binary patch literal 198 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 diff --git a/badger_os/examples/icon-qrgen.png b/badger_os/examples/icon-qrgen.png new file mode 100644 index 0000000000000000000000000000000000000000..d67cbd6073237a08f40f8a4befc7ed1ace3ba46a GIT binary patch literal 246 zcmVRc-n&odD|2uK_u?A&f!ipU5pvLCs)Ai@ zK^zjd=~@&G+1iHtj`bTi@SbO#lD@07*qoM6N<$g1rrC82|tP literal 0 HcmV?d00001 diff --git a/badger_os/examples/icon-weather.jpg b/badger_os/examples/icon-weather.jpg deleted file mode 100644 index 35d3bd0032c2eb93c546df0261b2804873149b99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1591 zcmb79Ydq5n82Wt2EO>wG%rd^^wketO>LeV^x*zLib@XeURCBLIRR;3F$Q z`VO!Mpb*H9mO)O|Fa;P)P7a2E!{rrF2ows5Kq8ftv1lb_j4~35RzqV{ad06+mK2>b&I ziZFRNLN+6y0f@{N0?Nt4|1AI^viS0F1q>EYRm7=j>*96v%*=P#$;9{{FaH}58I8mI zmj$Gw07~Wv!9X#9El_bP)FYx}f%$@bhPy(rD9T{6<6Q5SFLq$p>z(5uEfMAO#aFr~ zRDaV(E}s?Kan58u{$Q*=H8goXtgv;sBcwdXo=R8o#uPMo{y8}3y|EFzxH)!{wSIjn zbJ*Fle=)|8rTZkBaNgq7FPxPdNnJJ^jSz`b`@%JyS0%^B%q^*c{qu&71xX_wg2v+t zJ0i>{bEg?vUN-!1+T|_2Ie5))0pgcVo)1Fy`ymYouL7zAYlSKUq3-!tnOv*5q9p2M zuHOP8EV$;p|4)ucs(Y`F7?C%nvNWqM`8;{pjC4m(7{rgr?xjhZnO!(b#D-gRvM9|H z>$v7C?@vpeOwqm71LyU9RXo}!;s&YzIbyzQ)UMOg@$0y4_RjBG_boy`H!V0ZB+A}F zGtQQ?M^qc)=H904UH289k_b=rJ!iX{Ol-%!T3zS#<@?mfft+{R*Kz`)sLRcD;mx?0 zik*+1Ribih!>Br0fw~QB|Gig6kB?Z+&@^5Myj@Q=^Pl7qo3382t{YV4gyd>aP}SvV zUXGnyqGp(6*{kNX6sXP*Eq?!Lkv2{^D0CLkg~e{VY07;UwBBIJTIY&eT)M@sse`Lf zUgXYzy3x7bVL$QgvoF+&(Le^9U}Vx18@XXj2WwU6;cDVV3*NsKd+@-88x>}C`W!|= zeSIN)&xws{6~da5;op7Yk{(C_yo-+)cWXv~M^V2Ae469FDAB&))rZdPEP4*^oY%}M zO)48(YA=f&JsXg=CZyQYNlPoYruZ!3k*nz_jeSJ66ks~*#|I@x1@Nd7VaeL>NImiI zs}hnjkY}xheAgHb_a6V9;m^1cW8KE~?pEg4^fLdw;F>>iwiTbN3p3%B`mA4&qzUB< z=}oM-H-pV5A7%%!ka_wUB_G^iwr$0`r9hOXK#6$ZJ%q5o59`H?))%TKBWoPOk716U zQAalxJGfsNlmh;8=r<&lm`52SXR?_E!sE$)aomqqC7EiqKBo=9Ert{J>xI}Qk}^f_ zp4rjRAoaWXqVVpys6OwiLMK6AL0pN_T4DPN zYrP-Krx+0r118a)JEul4RhIuL3W&D#P=H|hg))u`ztI&?kn=S$KD!{yc zd;gtj?cpp_XPx>(o_2Xtb>++ObUi!QW1?xEQ*~M6kVBARCktI@<=^9lHO@$Fk0xw4Xltw5%XVr(mF^(SXFN~DHb$ud)zJDyttd^x=99FUr9ihOEW(&pSh-sC%GG9DK4 sWSkOJ!NJ8!OyPHLr*Ado_MD|shb0D|DK5V4`Z?U);DjbPkt`Mb1%MZyBme*a diff --git a/badger_os/examples/icon-weather.png b/badger_os/examples/icon-weather.png new file mode 100644 index 0000000000000000000000000000000000000000..9658a3dc42c36b07d46fea557ca30d374c2b3557 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^CLqiRBpBW@tGNNGm7Xq+ArhBcFKpywHsoQwkRP*S z50AhHF3sSh+Oad03fLtTv@=EeA6zFb@G?p%HP_*?F;WQ`T8v`=WIO{lbtIXn54M^30%u$lsj a|CM+9$z8^Ow6t!69PjDs=d#Wzp$PzUSzA5; literal 0 HcmV?d00001 diff --git a/badger_os/examples/image.py b/badger_os/examples/image.py index ab72e91..6261fbd 100644 --- a/badger_os/examples/image.py +++ b/badger_os/examples/image.py @@ -3,6 +3,7 @@ from badger2040 import HEIGHT, WIDTH import badger_os import jpegdec +import pngdec TOTAL_IMAGES = 0 @@ -14,11 +15,12 @@ display.set_update_speed(badger2040.UPDATE_NORMAL) jpeg = jpegdec.JPEG(display.display) +png = pngdec.PNG(display.display) # Load images try: - IMAGES = [f for f in os.listdir("/images") if f.endswith(".jpg")] + IMAGES = [f for f in os.listdir("/images") if f.endswith(".jpg") or f.endswith(".png")] TOTAL_IMAGES = len(IMAGES) except OSError: pass @@ -32,18 +34,24 @@ def show_image(n): file = IMAGES[n] - name = file.split(".")[0] - jpeg.open_file("/images/{}".format(file)) - jpeg.decode() + name, ext = file.split(".") + + try: + png.open_file("/images/{}".format(file)) + png.decode() + except (OSError, RuntimeError): + jpeg.open_file("/images/{}".format(file)) + jpeg.decode() if state["show_info"]: - name_length = display.measure_text(name, 0.5) + label = f"{name} ({ext})" + name_length = display.measure_text(label, 0.5) display.set_pen(0) display.rectangle(0, HEIGHT - 21, name_length + 11, 21) display.set_pen(15) display.rectangle(0, HEIGHT - 20, name_length + 10, 20) display.set_pen(0) - display.text(name, 5, HEIGHT - 10, WIDTH, 0.5) + display.text(label, 5, HEIGHT - 10, WIDTH, 0.5) for i in range(TOTAL_IMAGES): x = 286 diff --git a/badger_os/examples/weather.py b/badger_os/examples/weather.py index c5692fa..f2f7e8d 100644 --- a/badger_os/examples/weather.py +++ b/badger_os/examples/weather.py @@ -4,7 +4,7 @@ import badger2040 from badger2040 import WIDTH import urequests -import jpegdec +import pngdec # Set your latitude/longitude here (find yours by right clicking in Google Maps!) LAT = 53.38609085276884 @@ -18,7 +18,7 @@ display.led(128) display.set_update_speed(2) -jpeg = jpegdec.JPEG(display.display) +png = pngdec.PNG(display.display) # Connects to the wireless network. Ensure you have entered your details in WIFI_CONFIG.py :). display.connect() @@ -72,16 +72,16 @@ def draw_page(): # Weather codes from https://open-meteo.com/en/docs # Weather icons from https://fontawesome.com/ if weathercode in [71, 73, 75, 77, 85, 86]: # codes for snow - jpeg.open_file("/icons/icon-snow.jpg") + png.open_file("/icons/icon-snow.png") elif weathercode in [51, 53, 55, 56, 57, 61, 63, 65, 66, 67, 80, 81, 82]: # codes for rain - jpeg.open_file("/icons/icon-rain.jpg") + png.open_file("/icons/icon-rain.png") elif weathercode in [1, 2, 3, 45, 48]: # codes for cloud - jpeg.open_file("/icons/icon-cloud.jpg") + png.open_file("/icons/icon-cloud.png") elif weathercode in [0]: # codes for sun - jpeg.open_file("/icons/icon-sun.jpg") + png.open_file("/icons/icon-sun.png") elif weathercode in [95, 96, 99]: # codes for storm - jpeg.open_file("/icons/icon-storm.jpg") - jpeg.decode(13, 40, jpegdec.JPEG_SCALE_FULL) + png.open_file("/icons/icon-storm.png") + png.decode(13, 40) display.set_pen(0) display.text(f"Temperature: {temperature}°C", int(WIDTH / 3), 28, WIDTH - 105, 2) display.text(f"Wind Speed: {windspeed}kmph", int(WIDTH / 3), 48, WIDTH - 105, 2) diff --git a/badger_os/icons/icon-cloud.jpg b/badger_os/icons/icon-cloud.jpg deleted file mode 100644 index b1b1e706f20d5c30ead97beab47c45e66c1012c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2405 zcmbVL2~<;O7QXK#k1VW#u*eaJfM^MfD5z*rHVXn;AOzV|3IPNLB0FdWg1EFgpuz-^ z)Z=k|DAj9_ve21=90bS z6VPyXadQC-!ypiSfRy0Z+?<_*y?CB3ZreUW0Ra45j373VY6TE0OiJLnI&u610y(tj zfWZ<_0~~Zi1c`CmeO&nPUYmZ1vXR}hRNVF6wErGZ4GT{c0AL&xb`ZoRBq96>!s}9# z;uN?LVYVPLBn;sz2wNne0uk<2_(R{~Q3c+!fN=zYoxtZgBW-MiIeUJELw|(@kqNOV z#|Gt?hQ$ie{kZ>I9Hzhr6gV~}8P&F63WX}+LSG+rnxc0pxPlvO2QT12C?rD^#6S{Q zqEm=GiNHf~r}yyn7x-R?6^d9Quoq$>WPuNg8K4|wi@i;ZuwJv^!c?39hyjwE zS`I+V2beoal5a{#a_&3;o* zNJ7ZM?@-V;9uWaBSq`8Y0HD+0#S^)%VqY{exQ1#zeZgCH1eRb^H7Z#J?4Safgz2MWdloP|+X7})|w=#NOC z{Zg#h&xYZsMkN}Z!Bj>G)f#|f6beqID5^%;=_n3V7NNOpwWE@jcL>cmp1mgPR0-Y0 z>3X9!@B0Z;>(GRQ45p5*-V*)gW-C^HU~aQ^-Fn*%8=bd&Db;=Zs!*NudOm*%@)r(6zCjhBw3^9C4s0T#lS zT;j;EZ`SIsa;b4wlo+l%8f`y`bD+KO8{I$xVK6a17L+icB_j^kXU`iqGusW0?bNM# z@IasxW$6LF;_T~L$JewSQRf6OAzkc102{n$5}Kkk!%NcQev#bJfBw7ka>I_5mZguc zKKD#jS#RxmGV8Q?m+Q4kY)Gj0hbGZx9n=NOsEyUrSrvWJ`@_dt&t3}Hc6wcHL0*-Q zqq$YsDTA%%9Ss@{2kBHVqMj|U+$pAe*Nr%O|5RHImMzT@3!+2 z-8-5cCrt3a1ey8UxQmP~@v%t~#@gS+%TuSFCZZehMZ#(9yU8Xn;~zj$mlX!av(rP^E)v*vw!%-S<6~(dJ%!!avopInyus6&WsT? zLc4s2r3+)k6w}0B`i(As;~kuFr`RwlHc-l|tDX4xvQ5h7<&}PW%{+E=Ty5sKT09(` zj~?AM#BHT();QSRlg>1D`b=la??}Eo+W$>)GuGw>;)}-eB0*{fx*ZpL0ZkW}!dQ*O-co z3I;wvE8scbz1yfqc*VkQS-HHZ+u-Kf?W=;SJoZhNbKER?YtXMdob218sJrbowj_=fg=5&#fXMFOu@Ie42rZNsP+8QU8TxP|vem{)HrF tAk1o4-@iWHWJVElW5Rp|7RP6X&C9rY_lbdSQTpY#+qEzjv}9!8zX6q%Nyq>I diff --git a/badger_os/icons/icon-cloud.png b/badger_os/icons/icon-cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..ee4126c37c18aa6b82c772bfd9ddafb27abe1d4b GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@)$Hlw z7@~20>qTq6!wLc|59I>`idgz4EpA<0C?bDwDR)cr_eAfFBATtsf9;xibyIW&L$-m* zJuZzV#>fkboMs(OqE5yKvXd+WWGWZQdYB)%zoM;ip|zRgjfv-Oo?4_~;##J%N-1tb zi}XLAzfK=6314h?oj)t*Pt1+l&mXkEl*v`Dd&a!u%D0Wl4cQq$=P-D>`njxgN@xNA D;!aVz literal 0 HcmV?d00001 diff --git a/badger_os/icons/icon-rain.jpg b/badger_os/icons/icon-rain.jpg deleted file mode 100644 index e0d536d5ad20963d36852fc17c062aa7088b89bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3324 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 T8mhDetU><2@KA6Z8GigPi%&B2 diff --git a/badger_os/icons/icon-rain.png b/badger_os/icons/icon-rain.png new file mode 100644 index 0000000000000000000000000000000000000000..6865329bbc50398e3db2c8f53df15af184972bed GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@wbj$b zF+}71+KU?n4=eDn2K>~BF=D#eGS$ej9hfa7 literal 0 HcmV?d00001 diff --git a/badger_os/icons/icon-snow.jpg b/badger_os/icons/icon-snow.jpg deleted file mode 100644 index db18190d91d3ee3b13eb11bc6bb73fc0d3846536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4008 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 C5O>)C diff --git a/badger_os/icons/icon-snow.png b/badger_os/icons/icon-snow.png new file mode 100644 index 0000000000000000000000000000000000000000..077c170baa8b42b618091700d9a78e3ebd40cafc GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@b<)$t zF+}5h?WBXe%?3QK^+y@`R-`qrIj~WEQxLnuqQ!<>%0FH-yS@r22;uAyso+ZZ_unkY zOX@AtZK1M+T}*Fp?`SOX{lQqkXvO4gGJ#Q|nbF-Lv-!Mo^S8uxOL`}$>1-`w>^Y#K zz?}3bc!E5OhSoAkLC%DxyFB;K^Kg~$zL~i4q;~i{G0_QCY^#pG@+ou6KEuW@u5Ix5 z@VnFT-_HAM$=jDo>YZ7-t73a`^3CLr3%+c1f1Wt4!nPp)pzmxi?Y%qAnFHEVq-X1U X^fFE9`0iN>^b~`qtDnm{r-UW|FEwhk literal 0 HcmV?d00001 diff --git a/badger_os/icons/icon-storm.jpg b/badger_os/icons/icon-storm.jpg deleted file mode 100644 index b01a93712ab8beee8b2210795a688a880e44f54f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3055 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 UXUEN_Tjk=|n0FGQtOy_f6Fh^dAOHXW diff --git a/badger_os/icons/icon-sun.png b/badger_os/icons/icon-sun.png new file mode 100644 index 0000000000000000000000000000000000000000..709eecd37f451e66edfd2041a735faca5cb3cfbd GIT binary patch literal 275 zcmV+u0qp*XP)Np1gwMwSKy8jnLF7NZoq|5Dg@fmYv7HQB83TC zg_-^junv-Btm}GEF62~UC@_Vp;FZoP!IrX$ptAHreb?}>7WBsTR;sybw+7%d5*m^^ ZHg74+ Date: Wed, 27 Mar 2024 13:43:24 +0000 Subject: [PATCH 05/15] ebook: reduce size of example book. Copying this file adds an extra few seconds to production flashing, cut it down to size to speed things up. --- .../289-0-wind-in-the-willows-abridged.txt | 861 +----------------- 1 file changed, 10 insertions(+), 851 deletions(-) diff --git a/badger_os/books/289-0-wind-in-the-willows-abridged.txt b/badger_os/books/289-0-wind-in-the-willows-abridged.txt index f6243fd..a488143 100644 --- a/badger_os/books/289-0-wind-in-the-willows-abridged.txt +++ b/badger_os/books/289-0-wind-in-the-willows-abridged.txt @@ -1,46 +1,8 @@ The Project Gutenberg eBook of The Wind in the Willows, by Kenneth Grahame -This eBook is for the use of anyone anywhere in the United States and -most other parts of the world at no cost and with almost no restrictions -whatsoever. You may copy it, give it away or re-use it under the terms -of the Project Gutenberg License included with this eBook or online at -www.gutenberg.org. If you are not located in the United States, you -will have to check the laws of the country where you are located before -using this eBook. - -Title: The Wind in the Willows - -Author: Kenneth Grahame - -Release Date: July, 1995 [eBook #289] -[Most recently updated: May 15, 2021] - -Language: English - -Character set encoding: UTF-8 - -Produced by: Mike Lough and David Widger - -*** START OF THE PROJECT GUTENBERG EBOOK THE WIND IN THE WILLOWS *** - -[Illustration] - - - - -The Wind in the Willows - -by Kenneth Grahame - -Author Of “The Golden Age,” “Dream Days,” Etc. - - Contents CHAPTER I. THE RIVER BANK - CHAPTER II. THE OPEN ROAD - - I. @@ -524,818 +486,15 @@ running water; and with his ear to the reed-stems he caught, at intervals, something of what the wind went whispering so constantly among them. +---- +NOTE: This book has been abridged to one chapter, you can find the +complete work at: https://www.gutenberg.org/ebooks/289 - -II. -THE OPEN ROAD - - -“Ratty,” said the Mole suddenly, one bright summer morning, “if you -please, I want to ask you a favour.” - -The Rat was sitting on the river bank, singing a little song. He had -just composed it himself, so he was very taken up with it, and would -not pay proper attention to Mole or anything else. Since early morning -he had been swimming in the river, in company with his friends the -ducks. And when the ducks stood on their heads suddenly, as ducks will, -he would dive down and tickle their necks, just under where their chins -would be if ducks had chins, till they were forced to come to the -surface again in a hurry, spluttering and angry and shaking their -feathers at him, for it is impossible to say quite _all_ you feel when -your head is under water. At last they implored him to go away and -attend to his own affairs and leave them to mind theirs. So the Rat -went away, and sat on the river bank in the sun, and made up a song -about them, which he called - -“DUCKS’ DITTY.” - -All along the backwater, -Through the rushes tall, -Ducks are a-dabbling, -Up tails all! -Ducks’ tails, drakes’ tails, -Yellow feet a-quiver, -Yellow bills all out of sight -Busy in the river! - -Slushy green undergrowth -Where the roach swim— -Here we keep our larder, -Cool and full and dim. - -Everyone for what he likes! -_We_ like to be -Heads down, tails up, -Dabbling free! - -High in the blue above -Swifts whirl and call— -_We_ are down a-dabbling -Uptails all! - - -“I don’t know that I think so _very_ much of that little song, Rat,” -observed the Mole cautiously. He was no poet himself and didn’t care -who knew it; and he had a candid nature. - -“Nor don’t the ducks neither,” replied the Rat cheerfully. “They say, -‘_Why_ can’t fellows be allowed to do what they like _when_ they like -and _as_ they like, instead of other fellows sitting on banks and -watching them all the time and making remarks and poetry and things -about them? What _nonsense_ it all is!’ That’s what the ducks say.” - -“So it is, so it is,” said the Mole, with great heartiness. - -“No, it isn’t!” cried the Rat indignantly. - -“Well then, it isn’t, it isn’t,” replied the Mole soothingly. “But what -I wanted to ask you was, won’t you take me to call on Mr. Toad? I’ve -heard so much about him, and I do so want to make his acquaintance.” - -“Why, certainly,” said the good-natured Rat, jumping to his feet and -dismissing poetry from his mind for the day. “Get the boat out, and -we’ll paddle up there at once. It’s never the wrong time to call on -Toad. Early or late he’s always the same fellow. Always good-tempered, -always glad to see you, always sorry when you go!” - -“He must be a very nice animal,” observed the Mole, as he got into the -boat and took the sculls, while the Rat settled himself comfortably in -the stern. - -“He is indeed the best of animals,” replied Rat. “So simple, so -good-natured, and so affectionate. Perhaps he’s not very clever—we -can’t all be geniuses; and it may be that he is both boastful and -conceited. But he has got some great qualities, has Toady.” - -Rounding a bend in the river, they came in sight of a handsome, -dignified old house of mellowed red brick, with well-kept lawns -reaching down to the water’s edge. - -“There’s Toad Hall,” said the Rat; “and that creek on the left, where -the notice-board says, ‘Private. No landing allowed,’ leads to his -boat-house, where we’ll leave the boat. The stables are over there to -the right. That’s the banqueting-hall you’re looking at now—very old, -that is. Toad is rather rich, you know, and this is really one of the -nicest houses in these parts, though we never admit as much to Toad.” - -They glided up the creek, and the Mole shipped his sculls as they -passed into the shadow of a large boat-house. Here they saw many -handsome boats, slung from the cross beams or hauled up on a slip, but -none in the water; and the place had an unused and a deserted air. - -The Rat looked around him. “I understand,” said he. “Boating is played -out. He’s tired of it, and done with it. I wonder what new fad he has -taken up now? Come along and let’s look him up. We shall hear all about -it quite soon enough.” - -They disembarked, and strolled across the gay flower-decked lawns in -search of Toad, whom they presently happened upon resting in a wicker -garden-chair, with a pre-occupied expression of face, and a large map -spread out on his knees. - -“Hooray!” he cried, jumping up on seeing them, “this is splendid!” He -shook the paws of both of them warmly, never waiting for an -introduction to the Mole. “How _kind_ of you!” he went on, dancing -round them. “I was just going to send a boat down the river for you, -Ratty, with strict orders that you were to be fetched up here at once, -whatever you were doing. I want you badly—both of you. Now what will -you take? Come inside and have something! You don’t know how lucky it -is, your turning up just now!” - -“Let’s sit quiet a bit, Toady!” said the Rat, throwing himself into an -easy chair, while the Mole took another by the side of him and made -some civil remark about Toad’s “delightful residence.” - -“Finest house on the whole river,” cried Toad boisterously. “Or -anywhere else, for that matter,” he could not help adding. - -Here the Rat nudged the Mole. Unfortunately the Toad saw him do it, and -turned very red. There was a moment’s painful silence. Then Toad burst -out laughing. “All right, Ratty,” he said. “It’s only my way, you know. -And it’s not such a very bad house, is it? You know you rather like it -yourself. Now, look here. Let’s be sensible. You are the very animals I -wanted. You’ve got to help me. It’s most important!” - -“It’s about your rowing, I suppose,” said the Rat, with an innocent -air. “You’re getting on fairly well, though you splash a good bit -still. With a great deal of patience, and any quantity of coaching, you -may——” - -“O, pooh! boating!” interrupted the Toad, in great disgust. “Silly -boyish amusement. I’ve given that up _long_ ago. Sheer waste of time, -that’s what it is. It makes me downright sorry to see you fellows, who -ought to know better, spending all your energies in that aimless -manner. No, I’ve discovered the real thing, the only genuine occupation -for a life time. I propose to devote the remainder of mine to it, and -can only regret the wasted years that lie behind me, squandered in -trivialities. Come with me, dear Ratty, and your amiable friend also, -if he will be so very good, just as far as the stable-yard, and you -shall see what you shall see!” - -He led the way to the stable-yard accordingly, the Rat following with a -most mistrustful expression; and there, drawn out of the coach house -into the open, they saw a gipsy caravan, shining with newness, painted -a canary-yellow picked out with green, and red wheels. - -“There you are!” cried the Toad, straddling and expanding himself. -“There’s real life for you, embodied in that little cart. The open -road, the dusty highway, the heath, the common, the hedgerows, the -rolling downs! Camps, villages, towns, cities! Here to-day, up and off -to somewhere else to-morrow! Travel, change, interest, excitement! The -whole world before you, and a horizon that’s always changing! And mind! -this is the very finest cart of its sort that was ever built, without -any exception. Come inside and look at the arrangements. Planned ’em -all myself, I did!” - -The Mole was tremendously interested and excited, and followed him -eagerly up the steps and into the interior of the caravan. The Rat only -snorted and thrust his hands deep into his pockets, remaining where he -was. - -It was indeed very compact and comfortable. Little sleeping bunks—a -little table that folded up against the wall—a cooking-stove, lockers, -bookshelves, a bird-cage with a bird in it; and pots, pans, jugs and -kettles of every size and variety. - -“All complete!” said the Toad triumphantly, pulling open a locker. “You -see—biscuits, potted lobster, sardines—everything you can possibly -want. Soda-water here—baccy there—letter-paper, bacon, jam, cards and -dominoes—you’ll find,” he continued, as they descended the steps again, -“you’ll find that nothing what ever has been forgotten, when we make -our start this afternoon.” - -“I beg your pardon,” said the Rat slowly, as he chewed a straw, “but -did I overhear you say something about ‘_we_,’ and ‘_start_,’ and -‘_this afternoon?_’” - -“Now, you dear good old Ratty,” said Toad, imploringly, “don’t begin -talking in that stiff and sniffy sort of way, because you know you’ve -_got_ to come. I can’t possibly manage without you, so please consider -it settled, and don’t argue—it’s the one thing I can’t stand. You -surely don’t mean to stick to your dull fusty old river all your life, -and just live in a hole in a bank, and _boat?_ I want to show you the -world! I’m going to make an _animal_ of you, my boy!” - -“I don’t care,” said the Rat, doggedly. “I’m not coming, and that’s -flat. And I _am_ going to stick to my old river, _and_ live in a hole, -_and_ boat, as I’ve always done. And what’s more, Mole’s going to stick -to me and do as I do, aren’t you, Mole?” - -“Of course I am,” said the Mole, loyally. “I’ll always stick to you, -Rat, and what you say is to be—has got to be. All the same, it sounds -as if it might have been—well, rather fun, you know!” he added, -wistfully. Poor Mole! The Life Adventurous was so new a thing to him, -and so thrilling; and this fresh aspect of it was so tempting; and he -had fallen in love at first sight with the canary-coloured cart and all -its little fitments. - -The Rat saw what was passing in his mind, and wavered. He hated -disappointing people, and he was fond of the Mole, and would do almost -anything to oblige him. Toad was watching both of them closely. - -“Come along in, and have some lunch,” he said, diplomatically, “and -we’ll talk it over. We needn’t decide anything in a hurry. Of course, -_I_ don’t really care. I only want to give pleasure to you fellows. -‘Live for others!’ That’s my motto in life.” - -During luncheon—which was excellent, of course, as everything at Toad -Hall always was—the Toad simply let himself go. Disregarding the Rat, -he proceeded to play upon the inexperienced Mole as on a harp. -Naturally a voluble animal, and always mastered by his imagination, he -painted the prospects of the trip and the joys of the open life and the -roadside in such glowing colours that the Mole could hardly sit in his -chair for excitement. Somehow, it soon seemed taken for granted by all -three of them that the trip was a settled thing; and the Rat, though -still unconvinced in his mind, allowed his good-nature to over-ride his -personal objections. He could not bear to disappoint his two friends, -who were already deep in schemes and anticipations, planning out each -day’s separate occupation for several weeks ahead. - -When they were quite ready, the now triumphant Toad led his companions -to the paddock and set them to capture the old grey horse, who, without -having been consulted, and to his own extreme annoyance, had been told -off by Toad for the dustiest job in this dusty expedition. He frankly -preferred the paddock, and took a deal of catching. Meantime Toad -packed the lockers still tighter with necessaries, and hung nosebags, -nets of onions, bundles of hay, and baskets from the bottom of the -cart. At last the horse was caught and harnessed, and they set off, all -talking at once, each animal either trudging by the side of the cart or -sitting on the shaft, as the humour took him. It was a golden -afternoon. The smell of the dust they kicked up was rich and -satisfying; out of thick orchards on either side the road, birds called -and whistled to them cheerily; good-natured wayfarers, passing them, -gave them “Good-day,” or stopped to say nice things about their -beautiful cart; and rabbits, sitting at their front doors in the -hedgerows, held up their fore-paws, and said, “O my! O my! O my!” - -Late in the evening, tired and happy and miles from home, they drew up -on a remote common far from habitations, turned the horse loose to -graze, and ate their simple supper sitting on the grass by the side of -the cart. Toad talked big about all he was going to do in the days to -come, while stars grew fuller and larger all around them, and a yellow -moon, appearing suddenly and silently from nowhere in particular, came -to keep them company and listen to their talk. At last they turned in -to their little bunks in the cart; and Toad, kicking out his legs, -sleepily said, “Well, good night, you fellows! This is the real life -for a gentleman! Talk about your old river!” - -“I _don’t_ talk about my river,” replied the patient Rat. “You _know_ I -don’t, Toad. But I _think_ about it,” he added pathetically, in a lower -tone: “I think about it—all the time!” - -The Mole reached out from under his blanket, felt for the Rat’s paw in -the darkness, and gave it a squeeze. “I’ll do whatever you like, -Ratty,” he whispered. “Shall we run away to-morrow morning, quite -early—_very_ early—and go back to our dear old hole on the river?” - -“No, no, we’ll see it out,” whispered back the Rat. “Thanks awfully, -but I ought to stick by Toad till this trip is ended. It wouldn’t be -safe for him to be left to himself. It won’t take very long. His fads -never do. Good night!” - -The end was indeed nearer than even the Rat suspected. - -After so much open air and excitement the Toad slept very soundly, and -no amount of shaking could rouse him out of bed next morning. So the -Mole and Rat turned to, quietly and manfully, and while the Rat saw to -the horse, and lit a fire, and cleaned last night’s cups and platters, -and got things ready for breakfast, the Mole trudged off to the nearest -village, a long way off, for milk and eggs and various necessaries the -Toad had, of course, forgotten to provide. The hard work had all been -done, and the two animals were resting, thoroughly exhausted, by the -time Toad appeared on the scene, fresh and gay, remarking what a -pleasant easy life it was they were all leading now, after the cares -and worries and fatigues of housekeeping at home. - -They had a pleasant ramble that day over grassy downs and along narrow -by-lanes, and camped as before, on a common, only this time the two -guests took care that Toad should do his fair share of work. In -consequence, when the time came for starting next morning, Toad was by -no means so rapturous about the simplicity of the primitive life, and -indeed attempted to resume his place in his bunk, whence he was hauled -by force. Their way lay, as before, across country by narrow lanes, and -it was not till the afternoon that they came out on the high-road, -their first high-road; and there disaster, fleet and unforeseen, sprang -out on them—disaster momentous indeed to their expedition, but simply -overwhelming in its effect on the after-career of Toad. - -They were strolling along the high-road easily, the Mole by the horse’s -head, talking to him, since the horse had complained that he was being -frightfully left out of it, and nobody considered him in the least; the -Toad and the Water Rat walking behind the cart talking together—at -least Toad was talking, and Rat was saying at intervals, “Yes, -precisely; and what did _you_ say to _him?_”—and thinking all the time -of something very different, when far behind them they heard a faint -warning hum; like the drone of a distant bee. Glancing back, they saw a -small cloud of dust, with a dark centre of energy, advancing on them at -incredible speed, while from out the dust a faint “Poop-poop!” wailed -like an uneasy animal in pain. Hardly regarding it, they turned to -resume their conversation, when in an instant (as it seemed) the -peaceful scene was changed, and with a blast of wind and a whirl of -sound that made them jump for the nearest ditch, It was on them! The -“Poop-poop” rang with a brazen shout in their ears, they had a moment’s -glimpse of an interior of glittering plate-glass and rich morocco, and -the magnificent motor-car, immense, breath-snatching, passionate, with -its pilot tense and hugging his wheel, possessed all earth and air for -the fraction of a second, flung an enveloping cloud of dust that -blinded and enwrapped them utterly, and then dwindled to a speck in the -far distance, changed back into a droning bee once more. - -The old grey horse, dreaming, as he plodded along, of his quiet -paddock, in a new raw situation such as this simply abandoned himself -to his natural emotions. Rearing, plunging, backing steadily, in spite -of all the Mole’s efforts at his head, and all the Mole’s lively -language directed at his better feelings, he drove the cart backwards -towards the deep ditch at the side of the road. It wavered an -instant—then there was a heartrending crash—and the canary-coloured -cart, their pride and their joy, lay on its side in the ditch, an -irredeemable wreck. - -The Rat danced up and down in the road, simply transported with -passion. “You villains!” he shouted, shaking both fists, “You -scoundrels, you highwaymen, you—you—roadhogs!—I’ll have the law of you! -I’ll report you! I’ll take you through all the Courts!” His -home-sickness had quite slipped away from him, and for the moment he -was the skipper of the canary-coloured vessel driven on a shoal by the -reckless jockeying of rival mariners, and he was trying to recollect -all the fine and biting things he used to say to masters of -steam-launches when their wash, as they drove too near the bank, used -to flood his parlour-carpet at home. - -Toad sat straight down in the middle of the dusty road, his legs -stretched out before him, and stared fixedly in the direction of the -disappearing motor-car. He breathed short, his face wore a placid -satisfied expression, and at intervals he faintly murmured “Poop-poop!” - -The Mole was busy trying to quiet the horse, which he succeeded in -doing after a time. Then he went to look at the cart, on its side in -the ditch. It was indeed a sorry sight. Panels and windows smashed, -axles hopelessly bent, one wheel off, sardine-tins scattered over the -wide world, and the bird in the bird-cage sobbing pitifully and calling -to be let out. - -The Rat came to help him, but their united efforts were not sufficient -to right the cart. “Hi! Toad!” they cried. “Come and bear a hand, can’t -you!” - -The Toad never answered a word, or budged from his seat in the road; so -they went to see what was the matter with him. They found him in a sort -of a trance, a happy smile on his face, his eyes still fixed on the -dusty wake of their destroyer. At intervals he was still heard to -murmur “Poop-poop!” - -The Rat shook him by the shoulder. “Are you coming to help us, Toad?” -he demanded sternly. - -“Glorious, stirring sight!” murmured Toad, never offering to move. “The -poetry of motion! The _real_ way to travel! The _only_ way to travel! -Here to-day—in next week to-morrow! Villages skipped, towns and cities -jumped—always somebody else’s horizon! O bliss! O poop-poop! O my! O -my!” - -“O _stop_ being an ass, Toad!” cried the Mole despairingly. - -“And to think I never _knew!_” went on the Toad in a dreamy monotone. -“All those wasted years that lie behind me, I never knew, never even -_dreamt!_ But _now_—but now that I know, now that I fully realise! O -what a flowery track lies spread before me, henceforth! What -dust-clouds shall spring up behind me as I speed on my reckless way! -What carts I shall fling carelessly into the ditch in the wake of my -magnificent onset! Horrid little carts—common carts—canary-coloured -carts!” - -“What are we to do with him?” asked the Mole of the Water Rat. - -“Nothing at all,” replied the Rat firmly. “Because there is really -nothing to be done. You see, I know him from of old. He is now -possessed. He has got a new craze, and it always takes him that way, in -its first stage. He’ll continue like that for days now, like an animal -walking in a happy dream, quite useless for all practical purposes. -Never mind him. Let’s go and see what there is to be done about the -cart.” - -A careful inspection showed them that, even if they succeeded in -righting it by themselves, the cart would travel no longer. The axles -were in a hopeless state, and the missing wheel was shattered into -pieces. - -The Rat knotted the horse’s reins over his back and took him by the -head, carrying the bird cage and its hysterical occupant in the other -hand. “Come on!” he said grimly to the Mole. “It’s five or six miles to -the nearest town, and we shall just have to walk it. The sooner we make -a start the better.” - -“But what about Toad?” asked the Mole anxiously, as they set off -together. “We can’t leave him here, sitting in the middle of the road -by himself, in the distracted state he’s in! It’s not safe. Supposing -another Thing were to come along?” - -“O, _bother_ Toad,” said the Rat savagely; “I’ve done with him!” - -They had not proceeded very far on their way, however, when there was a -pattering of feet behind them, and Toad caught them up and thrust a paw -inside the elbow of each of them; still breathing short and staring -into vacancy. - -“Now, look here, Toad!” said the Rat sharply: “as soon as we get to the -town, you’ll have to go straight to the police-station, and see if they -know anything about that motor-car and who it belongs to, and lodge a -complaint against it. And then you’ll have to go to a blacksmith’s or a -wheelwright’s and arrange for the cart to be fetched and mended and put -to rights. It’ll take time, but it’s not quite a hopeless smash. -Meanwhile, the Mole and I will go to an inn and find comfortable rooms -where we can stay till the cart’s ready, and till your nerves have -recovered their shock.” - -“Police-station! Complaint!” murmured Toad dreamily. “Me _complain_ of -that beautiful, that heavenly vision that has been vouchsafed me! -_Mend_ the _cart!_ I’ve done with carts for ever. I never want to see -the cart, or to hear of it, again. O, Ratty! You can’t think how -obliged I am to you for consenting to come on this trip! I wouldn’t -have gone without you, and then I might never have seen that—that swan, -that sunbeam, that thunderbolt! I might never have heard that -entrancing sound, or smelt that bewitching smell! I owe it all to you, -my best of friends!” - -The Rat turned from him in despair. “You see what it is?” he said to -the Mole, addressing him across Toad’s head: “He’s quite hopeless. I -give it up—when we get to the town we’ll go to the railway station, and -with luck we may pick up a train there that’ll get us back to riverbank -to-night. And if ever you catch me going a-pleasuring with this -provoking animal again!”—He snorted, and during the rest of that weary -trudge addressed his remarks exclusively to Mole. - -On reaching the town they went straight to the station and deposited -Toad in the second-class waiting-room, giving a porter twopence to keep -a strict eye on him. They then left the horse at an inn stable, and -gave what directions they could about the cart and its contents. -Eventually, a slow train having landed them at a station not very far -from Toad Hall, they escorted the spell-bound, sleep-walking Toad to -his door, put him inside it, and instructed his housekeeper to feed -him, undress him, and put him to bed. Then they got out their boat from -the boat-house, sculled down the river home, and at a very late hour -sat down to supper in their own cosy riverside parlour, to the Rat’s -great joy and contentment. - -The following evening the Mole, who had risen late and taken things -very easy all day, was sitting on the bank fishing, when the Rat, who -had been looking up his friends and gossiping, came strolling along to -find him. “Heard the news?” he said. “There’s nothing else being talked -about, all along the river bank. Toad went up to Town by an early train -this morning. And he has ordered a large and very expensive motor-car.” - - - -*** END OF THE PROJECT GUTENBERG EBOOK THE WIND IN THE WILLOWS *** - -***** This file should be named 289-0.txt or 289-0.zip ***** -This and all associated files of various formats will be found in: - https://www.gutenberg.org/2/8/289/ - -Updated editions will replace the previous one--the old editions will -be renamed. - -Creating the works from print editions not protected by U.S. copyright -law means that no one owns a United States copyright in these works, -so the Foundation (and you!) can copy and distribute it in the -United States without permission and without paying copyright -royalties. Special rules, set forth in the General Terms of Use part -of this license, apply to copying and distributing Project -Gutenberg-tm electronic works to protect the PROJECT GUTENBERG-tm -concept and trademark. Project Gutenberg is a registered trademark, -and may not be used if you charge for an eBook, except by following -the terms of the trademark license, including paying royalties for use -of the Project Gutenberg trademark. If you do not charge anything for -copies of this eBook, complying with the trademark license is very -easy. You may use this eBook for nearly any purpose such as creation -of derivative works, reports, performances and research. Project -Gutenberg eBooks may be modified and printed and given away--you may -do practically ANYTHING in the United States with eBooks not protected -by U.S. copyright law. Redistribution is subject to the trademark -license, especially commercial redistribution. - -START: FULL LICENSE - -THE FULL PROJECT GUTENBERG LICENSE -PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK - -To protect the Project Gutenberg-tm mission of promoting the free -distribution of electronic works, by using or distributing this work -(or any other work associated in any way with the phrase "Project -Gutenberg"), you agree to comply with all the terms of the Full -Project Gutenberg-tm License available with this file or online at -www.gutenberg.org/license. - -Section 1. General Terms of Use and Redistributing Project -Gutenberg-tm electronic works - -1.A. By reading or using any part of this Project Gutenberg-tm -electronic work, you indicate that you have read, understand, agree to -and accept all the terms of this license and intellectual property -(trademark/copyright) agreement. If you do not agree to abide by all -the terms of this agreement, you must cease using and return or -destroy all copies of Project Gutenberg-tm electronic works in your -possession. If you paid a fee for obtaining a copy of or access to a -Project Gutenberg-tm electronic work and you do not agree to be bound -by the terms of this agreement, you may obtain a refund from the -person or entity to whom you paid the fee as set forth in paragraph -1.E.8. - -1.B. "Project Gutenberg" is a registered trademark. It may only be -used on or associated in any way with an electronic work by people who -agree to be bound by the terms of this agreement. There are a few -things that you can do with most Project Gutenberg-tm electronic works -even without complying with the full terms of this agreement. See -paragraph 1.C below. There are a lot of things you can do with Project -Gutenberg-tm electronic works if you follow the terms of this -agreement and help preserve free future access to Project Gutenberg-tm -electronic works. See paragraph 1.E below. - -1.C. The Project Gutenberg Literary Archive Foundation ("the -Foundation" or PGLAF), owns a compilation copyright in the collection -of Project Gutenberg-tm electronic works. Nearly all the individual -works in the collection are in the public domain in the United -States. If an individual work is unprotected by copyright law in the -United States and you are located in the United States, we do not -claim a right to prevent you from copying, distributing, performing, -displaying or creating derivative works based on the work as long as -all references to Project Gutenberg are removed. Of course, we hope -that you will support the Project Gutenberg-tm mission of promoting -free access to electronic works by freely sharing Project Gutenberg-tm -works in compliance with the terms of this agreement for keeping the -Project Gutenberg-tm name associated with the work. You can easily -comply with the terms of this agreement by keeping this work in the -same format with its attached full Project Gutenberg-tm License when -you share it without charge with others. - -1.D. The copyright laws of the place where you are located also govern -what you can do with this work. Copyright laws in most countries are -in a constant state of change. If you are outside the United States, -check the laws of your country in addition to the terms of this -agreement before downloading, copying, displaying, performing, -distributing or creating derivative works based on this work or any -other Project Gutenberg-tm work. The Foundation makes no -representations concerning the copyright status of any work in any -country other than the United States. - -1.E. Unless you have removed all references to Project Gutenberg: - -1.E.1. The following sentence, with active links to, or other -immediate access to, the full Project Gutenberg-tm License must appear -prominently whenever any copy of a Project Gutenberg-tm work (any work -on which the phrase "Project Gutenberg" appears, or with which the -phrase "Project Gutenberg" is associated) is accessed, displayed, -performed, viewed, copied or distributed: - - This eBook is for the use of anyone anywhere in the United States and - most other parts of the world at no cost and with almost no - restrictions whatsoever. You may copy it, give it away or re-use it - under the terms of the Project Gutenberg License included with this - eBook or online at www.gutenberg.org. If you are not located in the - United States, you will have to check the laws of the country where - you are located before using this eBook. - -1.E.2. If an individual Project Gutenberg-tm electronic work is -derived from texts not protected by U.S. copyright law (does not -contain a notice indicating that it is posted with permission of the -copyright holder), the work can be copied and distributed to anyone in -the United States without paying any fees or charges. If you are -redistributing or providing access to a work with the phrase "Project -Gutenberg" associated with or appearing on the work, you must comply -either with the requirements of paragraphs 1.E.1 through 1.E.7 or -obtain permission for the use of the work and the Project Gutenberg-tm -trademark as set forth in paragraphs 1.E.8 or 1.E.9. - -1.E.3. If an individual Project Gutenberg-tm electronic work is posted -with the permission of the copyright holder, your use and distribution -must comply with both paragraphs 1.E.1 through 1.E.7 and any -additional terms imposed by the copyright holder. Additional terms -will be linked to the Project Gutenberg-tm License for all works -posted with the permission of the copyright holder found at the -beginning of this work. - -1.E.4. Do not unlink or detach or remove the full Project Gutenberg-tm -License terms from this work, or any files containing a part of this -work or any other work associated with Project Gutenberg-tm. - -1.E.5. Do not copy, display, perform, distribute or redistribute this -electronic work, or any part of this electronic work, without -prominently displaying the sentence set forth in paragraph 1.E.1 with -active links or immediate access to the full terms of the Project -Gutenberg-tm License. - -1.E.6. You may convert to and distribute this work in any binary, -compressed, marked up, nonproprietary or proprietary form, including -any word processing or hypertext form. However, if you provide access -to or distribute copies of a Project Gutenberg-tm work in a format -other than "Plain Vanilla ASCII" or other format used in the official -version posted on the official Project Gutenberg-tm website -(www.gutenberg.org), you must, at no additional cost, fee or expense -to the user, provide a copy, a means of exporting a copy, or a means -of obtaining a copy upon request, of the work in its original "Plain -Vanilla ASCII" or other form. Any alternate format must include the -full Project Gutenberg-tm License as specified in paragraph 1.E.1. - -1.E.7. Do not charge a fee for access to, viewing, displaying, -performing, copying or distributing any Project Gutenberg-tm works -unless you comply with paragraph 1.E.8 or 1.E.9. - -1.E.8. You may charge a reasonable fee for copies of or providing -access to or distributing Project Gutenberg-tm electronic works -provided that: - -* You pay a royalty fee of 20% of the gross profits you derive from - the use of Project Gutenberg-tm works calculated using the method - you already use to calculate your applicable taxes. The fee is owed - to the owner of the Project Gutenberg-tm trademark, but he has - agreed to donate royalties under this paragraph to the Project - Gutenberg Literary Archive Foundation. Royalty payments must be paid - within 60 days following each date on which you prepare (or are - legally required to prepare) your periodic tax returns. Royalty - payments should be clearly marked as such and sent to the Project - Gutenberg Literary Archive Foundation at the address specified in - Section 4, "Information about donations to the Project Gutenberg - Literary Archive Foundation." - -* You provide a full refund of any money paid by a user who notifies - you in writing (or by e-mail) within 30 days of receipt that s/he - does not agree to the terms of the full Project Gutenberg-tm - License. You must require such a user to return or destroy all - copies of the works possessed in a physical medium and discontinue - all use of and all access to other copies of Project Gutenberg-tm - works. - -* You provide, in accordance with paragraph 1.F.3, a full refund of - any money paid for a work or a replacement copy, if a defect in the - electronic work is discovered and reported to you within 90 days of - receipt of the work. - -* You comply with all other terms of this agreement for free - distribution of Project Gutenberg-tm works. - -1.E.9. If you wish to charge a fee or distribute a Project -Gutenberg-tm electronic work or group of works on different terms than -are set forth in this agreement, you must obtain permission in writing -from the Project Gutenberg Literary Archive Foundation, the manager of -the Project Gutenberg-tm trademark. Contact the Foundation as set -forth in Section 3 below. - -1.F. - -1.F.1. Project Gutenberg volunteers and employees expend considerable -effort to identify, do copyright research on, transcribe and proofread -works not protected by U.S. copyright law in creating the Project -Gutenberg-tm collection. Despite these efforts, Project Gutenberg-tm -electronic works, and the medium on which they may be stored, may -contain "Defects," such as, but not limited to, incomplete, inaccurate -or corrupt data, transcription errors, a copyright or other -intellectual property infringement, a defective or damaged disk or -other medium, a computer virus, or computer codes that damage or -cannot be read by your equipment. - -1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except for the "Right -of Replacement or Refund" described in paragraph 1.F.3, the Project -Gutenberg Literary Archive Foundation, the owner of the Project -Gutenberg-tm trademark, and any other party distributing a Project -Gutenberg-tm electronic work under this agreement, disclaim all -liability to you for damages, costs and expenses, including legal -fees. YOU AGREE THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT -LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE -PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE FOUNDATION, THE -TRADEMARK OWNER, AND ANY DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE -LIABLE TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL, PUNITIVE OR -INCIDENTAL DAMAGES EVEN IF YOU GIVE NOTICE OF THE POSSIBILITY OF SUCH -DAMAGE. - -1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you discover a -defect in this electronic work within 90 days of receiving it, you can -receive a refund of the money (if any) you paid for it by sending a -written explanation to the person you received the work from. If you -received the work on a physical medium, you must return the medium -with your written explanation. The person or entity that provided you -with the defective work may elect to provide a replacement copy in -lieu of a refund. If you received the work electronically, the person -or entity providing it to you may choose to give you a second -opportunity to receive the work electronically in lieu of a refund. If -the second copy is also defective, you may demand a refund in writing -without further opportunities to fix the problem. - -1.F.4. Except for the limited right of replacement or refund set forth -in paragraph 1.F.3, this work is provided to you 'AS-IS', WITH NO -OTHER WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT -LIMITED TO WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PURPOSE. - -1.F.5. Some states do not allow disclaimers of certain implied -warranties or the exclusion or limitation of certain types of -damages. If any disclaimer or limitation set forth in this agreement -violates the law of the state applicable to this agreement, the -agreement shall be interpreted to make the maximum disclaimer or -limitation permitted by the applicable state law. The invalidity or -unenforceability of any provision of this agreement shall not void the -remaining provisions. - -1.F.6. INDEMNITY - You agree to indemnify and hold the Foundation, the -trademark owner, any agent or employee of the Foundation, anyone -providing copies of Project Gutenberg-tm electronic works in -accordance with this agreement, and any volunteers associated with the -production, promotion and distribution of Project Gutenberg-tm -electronic works, harmless from all liability, costs and expenses, -including legal fees, that arise directly or indirectly from any of -the following which you do or cause to occur: (a) distribution of this -or any Project Gutenberg-tm work, (b) alteration, modification, or -additions or deletions to any Project Gutenberg-tm work, and (c) any -Defect you cause. - -Section 2. Information about the Mission of Project Gutenberg-tm - -Project Gutenberg-tm is synonymous with the free distribution of -electronic works in formats readable by the widest variety of -computers including obsolete, old, middle-aged and new computers. It -exists because of the efforts of hundreds of volunteers and donations -from people in all walks of life. - -Volunteers and financial support to provide volunteers with the -assistance they need are critical to reaching Project Gutenberg-tm's -goals and ensuring that the Project Gutenberg-tm collection will -remain freely available for generations to come. In 2001, the Project -Gutenberg Literary Archive Foundation was created to provide a secure -and permanent future for Project Gutenberg-tm and future -generations. To learn more about the Project Gutenberg Literary -Archive Foundation and how your efforts and donations can help, see -Sections 3 and 4 and the Foundation information page at -www.gutenberg.org - -Section 3. Information about the Project Gutenberg Literary -Archive Foundation - -The Project Gutenberg Literary Archive Foundation is a non-profit -501(c)(3) educational corporation organized under the laws of the -state of Mississippi and granted tax exempt status by the Internal -Revenue Service. The Foundation's EIN or federal tax identification -number is 64-6221541. Contributions to the Project Gutenberg Literary -Archive Foundation are tax deductible to the full extent permitted by -U.S. federal laws and your state's laws. - -The Foundation's business office is located at 809 North 1500 West, -Salt Lake City, UT 84116, (801) 596-1887. Email contact links and up -to date contact information can be found at the Foundation's website -and official page at www.gutenberg.org/contact - -Section 4. Information about Donations to the Project Gutenberg -Literary Archive Foundation - -Project Gutenberg-tm depends upon and cannot survive without -widespread public support and donations to carry out its mission of -increasing the number of public domain and licensed works that can be -freely distributed in machine-readable form accessible by the widest -array of equipment including outdated equipment. Many small donations -($1 to $5,000) are particularly important to maintaining tax exempt -status with the IRS. - -The Foundation is committed to complying with the laws regulating -charities and charitable donations in all 50 states of the United -States. Compliance requirements are not uniform and it takes a -considerable effort, much paperwork and many fees to meet and keep up -with these requirements. We do not solicit donations in locations -where we have not received written confirmation of compliance. To SEND -DONATIONS or determine the status of compliance for any particular -state visit www.gutenberg.org/donate - -While we cannot and do not solicit contributions from states where we -have not met the solicitation requirements, we know of no prohibition -against accepting unsolicited donations from donors in such states who -approach us with offers to donate. - -International donations are gratefully accepted, but we cannot make -any statements concerning tax treatment of donations received from -outside the United States. U.S. laws alone swamp our small staff. - -Please check the Project Gutenberg web pages for current donation -methods and addresses. Donations are accepted in a number of other -ways including checks, online payments and credit card donations. To -donate, please visit: www.gutenberg.org/donate - -Section 5. General Information About Project Gutenberg-tm electronic works - -Professor Michael S. Hart was the originator of the Project -Gutenberg-tm concept of a library of electronic works that could be -freely shared with anyone. For forty years, he produced and -distributed Project Gutenberg-tm eBooks with only a loose network of -volunteer support. - -Project Gutenberg-tm eBooks are often created from several printed -editions, all of which are confirmed as not protected by copyright in -the U.S. unless a copyright notice is included. Thus, we do not -necessarily keep eBooks in compliance with any particular paper -edition. - -Most people start at our website which has the main PG search -facility: www.gutenberg.org - -This website includes information about Project Gutenberg-tm, -including how to make donations to the Project Gutenberg Literary -Archive Foundation, how to help produce our new eBooks, and how to -subscribe to our email newsletter to hear about new eBooks. - - +This eBook is for the use of anyone anywhere in the United States and +most other parts of the world at no cost and with almost no +restrictions whatsoever. You may copy it, give it away or re-use it +under the terms of the Project Gutenberg License included with this +eBook or online at www.gutenberg.org. If you are not located in the +United States, you will have to check the laws of the country where +you are located before using this eBook. \ No newline at end of file From cfcb5898d5f15e7832350ab42078110aa6df9bba Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 27 Mar 2024 13:52:17 +0000 Subject: [PATCH 06/15] CI: Update uf2 manifests to include png files. --- firmware/PIMORONI_BADGER2040/uf2-manifest.txt | 4 ++-- firmware/PIMORONI_BADGER2040W/uf2-manifest.txt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/PIMORONI_BADGER2040/uf2-manifest.txt b/firmware/PIMORONI_BADGER2040/uf2-manifest.txt index 18ef4e1..74e9cb9 100644 --- a/firmware/PIMORONI_BADGER2040/uf2-manifest.txt +++ b/firmware/PIMORONI_BADGER2040/uf2-manifest.txt @@ -1,6 +1,6 @@ launcher.py main.py -examples/*.jpg +examples/*.png examples/badge.py examples/clock.py examples/ebook.py @@ -15,4 +15,4 @@ images/*.txt badges/*.txt badges/*.jpg books/*.txt -icons/*.jpg \ No newline at end of file +icons/*.png \ No newline at end of file diff --git a/firmware/PIMORONI_BADGER2040W/uf2-manifest.txt b/firmware/PIMORONI_BADGER2040W/uf2-manifest.txt index a3f2f44..64f93f6 100644 --- a/firmware/PIMORONI_BADGER2040W/uf2-manifest.txt +++ b/firmware/PIMORONI_BADGER2040W/uf2-manifest.txt @@ -1,9 +1,9 @@ *.py -examples/*.jpg +examples/*.png examples/*.py images/*.jpg images/*.txt badges/*.txt badges/*.jpg books/*.txt -icons/*.jpg \ No newline at end of file +icons/*.png \ No newline at end of file From 698aa0ce60bab0479af55d7de0853e5082dd5ebf Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 27 Mar 2024 14:07:07 +0000 Subject: [PATCH 07/15] launcher: gracefully fail on missing icons. --- badger_os/launcher.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/badger_os/launcher.py b/badger_os/launcher.py index 8bcc0dd..a860633 100644 --- a/badger_os/launcher.py +++ b/badger_os/launcher.py @@ -94,12 +94,13 @@ def render(): icon_label = label.replace("_", "-") icon = f"{APP_DIR}/icon-{icon_label}" label = label.replace("_", " ") - try: - png.open_file(f"{icon}.png") - png.decode(x - 26, 30) - except (OSError, RuntimeError): - jpeg.open_file(f"{icon}.jpg") - jpeg.decode(x - 26, 30) + for lib, ext in [(png, "png"), (jpeg, "jpg")]: + try: + lib.open_file(f"{icon}.{ext}") + lib.decode(x - 26, 30) + break + except (OSError, RuntimeError): + continue display.set_pen(0) w = display.measure_text(label, FONT_SIZE) display.text(label, int(x - (w / 2)), 16 + 80, WIDTH, FONT_SIZE) From 5fb06b5250717deb109115c87cd35f6eb0027240 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 27 Mar 2024 14:44:06 +0000 Subject: [PATCH 08/15] Badger 2040W: Handle WiFi connection failure. Co-authored-by: tti0 <14841064+tti0@users.noreply.github.com> --- firmware/PIMORONI_BADGER2040W/lib/badger2040.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/firmware/PIMORONI_BADGER2040W/lib/badger2040.py b/firmware/PIMORONI_BADGER2040W/lib/badger2040.py index 60cbc56..5eecfd5 100644 --- a/firmware/PIMORONI_BADGER2040W/lib/badger2040.py +++ b/firmware/PIMORONI_BADGER2040W/lib/badger2040.py @@ -241,8 +241,10 @@ def status_handler(self, mode, status, ip): if status: self.display.text("Connected!", 10, 10, 300, 0.5) self.display.text(ip, 10, 30, 300, 0.5) - else: + elif status is None: self.display.text("Connecting...", 10, 10, 300, 0.5) + else: + self.display.text("Connection failed!", 10, 10, 300, 0.5) self.update() def isconnected(self): From abe5c28ead933092ad81cf3773c0b335ebda9d7b Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 27 Mar 2024 15:32:03 +0000 Subject: [PATCH 09/15] Badger 2040W: Handle WiFi STAT_CONNECT_FAIL. Expose some more NetworkManager config to the BadgerOS connect() method. --- .../PIMORONI_BADGER2040W/lib/badger2040.py | 5 ++- .../lib/network_manager.py | 31 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/firmware/PIMORONI_BADGER2040W/lib/badger2040.py b/firmware/PIMORONI_BADGER2040W/lib/badger2040.py index 5eecfd5..b37db40 100644 --- a/firmware/PIMORONI_BADGER2040W/lib/badger2040.py +++ b/firmware/PIMORONI_BADGER2040W/lib/badger2040.py @@ -262,10 +262,13 @@ def connect(self, **args): import gc status_handler = args.get("status_handler", self.status_handler) + error_handler = args.get("error_handler", None) + client_timeout = args.get("timeout", 60) + retries = args.get("retries", 2) if WIFI_CONFIG.COUNTRY == "": raise RuntimeError("You must populate WIFI_CONFIG.py for networking.") - network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler) + network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, client_timeout=client_timeout, status_handler=status_handler, error_handler=error_handler, retries=retries) uasyncio.get_event_loop().run_until_complete(network_manager.client(WIFI_CONFIG.SSID, WIFI_CONFIG.PSK)) gc.collect() diff --git a/firmware/PIMORONI_BADGER2040W/lib/network_manager.py b/firmware/PIMORONI_BADGER2040W/lib/network_manager.py index fb21c2c..aa9a428 100644 --- a/firmware/PIMORONI_BADGER2040W/lib/network_manager.py +++ b/firmware/PIMORONI_BADGER2040W/lib/network_manager.py @@ -7,11 +7,12 @@ class NetworkManager: _ifname = ("Client", "Access Point") - def __init__(self, country="GB", client_timeout=60, access_point_timeout=5, status_handler=None, error_handler=None): + def __init__(self, country="GB", client_timeout=60, access_point_timeout=5, status_handler=None, error_handler=None, retries=2): rp2.country(country) self._ap_if = network.WLAN(network.AP_IF) self._sta_if = network.WLAN(network.STA_IF) + self._retries = retries self._mode = network.STA_IF self._client_timeout = client_timeout self._access_point_timeout = access_point_timeout @@ -53,7 +54,12 @@ def disconnect(self): async def wait(self, mode): while not self.isconnected(): self._handle_status(mode, None) + if mode == network.STA_IF and self._sta_if.status() == network.STAT_CONNECT_FAIL: + self._handle_status(mode, False) + return False await uasyncio.sleep_ms(1000) + self._handle_status(mode, True) + return True def _handle_status(self, mode, status): if callable(self._status_handler): @@ -75,16 +81,20 @@ async def client(self, ssid, psk): self._sta_if.active(True) self._sta_if.config(pm=0xa11140) - self._sta_if.connect(ssid, psk) - try: - await uasyncio.wait_for(self.wait(network.STA_IF), self._client_timeout) - self._handle_status(network.STA_IF, True) + for _ in range(self._retries): + try: + self._sta_if.connect(ssid, psk) + result = await uasyncio.wait_for(self.wait(network.STA_IF), self._client_timeout) + if result: + return - except uasyncio.TimeoutError: - self._sta_if.active(False) - self._handle_status(network.STA_IF, False) - self._handle_error(network.STA_IF, "WIFI Client Failed") + except uasyncio.TimeoutError: + pass + + self._sta_if.active(False) + self._handle_status(network.STA_IF, False) + self._handle_error(network.STA_IF, "WIFI Client Failed") async def access_point(self): if self._ap_if.isconnected(): @@ -99,8 +109,7 @@ async def access_point(self): self._ap_if.active(True) try: - await uasyncio.wait_for(self.wait(network.AP_IF), self._access_point_timeout) - self._handle_status(network.AP_IF, True) + _ = await uasyncio.wait_for(self.wait(network.AP_IF), self._access_point_timeout) except uasyncio.TimeoutError: self._sta_if.active(False) From 170cbbd390cc5a67f018f183e07a4206f8d96ab2 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 27 Mar 2024 15:55:31 +0000 Subject: [PATCH 10/15] Badger 2040W: Handle WiFi STAT_NO_AP_FOUND and STAT_WRONG_PASSWORD. --- .../PIMORONI_BADGER2040W/lib/network_manager.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/firmware/PIMORONI_BADGER2040W/lib/network_manager.py b/firmware/PIMORONI_BADGER2040W/lib/network_manager.py index aa9a428..5211aa3 100644 --- a/firmware/PIMORONI_BADGER2040W/lib/network_manager.py +++ b/firmware/PIMORONI_BADGER2040W/lib/network_manager.py @@ -54,9 +54,16 @@ def disconnect(self): async def wait(self, mode): while not self.isconnected(): self._handle_status(mode, None) - if mode == network.STA_IF and self._sta_if.status() == network.STAT_CONNECT_FAIL: - self._handle_status(mode, False) - return False + if mode == network.STA_IF: + if self._sta_if.status() == network.STAT_CONNECT_FAIL: + self._handle_status(mode, False) + return False + if self._sta_if.status() == network.STAT_NO_AP_FOUND: + self._handle_error(mode, "AP not found!") + return False + if self._sta_if.status() == network.STAT_WRONG_PASSWORD: + self._handle_error(mode, "Wrong password!") + return False await uasyncio.sleep_ms(1000) self._handle_status(mode, True) return True From f7ffafbeb9f175f0dee27d5f70de223cdbb3ef7d Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 19 Jun 2024 22:44:52 +0100 Subject: [PATCH 11/15] CI: Bump Pimoroni Pico and MicroPython to v1.23.0. Include patch/backport for pins.csv fix. --- .github/workflows/micropython.yml | 10 +++-- ...76c6ba64c5a3e68de3324556d9979f09303b.patch | 44 +++++++++++++++++++ firmware/micropython_nano_specs.patch | 8 ++-- 3 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 firmware/932f76c6ba64c5a3e68de3324556d9979f09303b.patch diff --git a/.github/workflows/micropython.yml b/.github/workflows/micropython.yml index 4fc00ba..cf4a42c 100644 --- a/.github/workflows/micropython.yml +++ b/.github/workflows/micropython.yml @@ -7,9 +7,9 @@ on: types: [created] env: - MICROPYTHON_VERSION: v1.22.2 - PIMORONI_PICO_VERSION: v1.22.2-1bitpng - WORKFLOW_VERSION: v2 + MICROPYTHON_VERSION: v1.23.0 + PIMORONI_PICO_VERSION: v1.23.0-1 + WORKFLOW_VERSION: v3 jobs: deps: @@ -129,7 +129,9 @@ jobs: - name: "HACK: CMakeLists.txt Disable C++ Exceptions Patch" shell: bash working-directory: micropython - run: git apply "${{env.FIRMWARE_DIR}}/micropython_nano_specs.patch" + run: | + git apply "${{env.FIRMWARE_DIR}}/932f76c6ba64c5a3e68de3324556d9979f09303b.patch" + git apply "${{env.FIRMWARE_DIR}}/micropython_nano_specs.patch" # Install apt packages - name: Install CCache & Compiler diff --git a/firmware/932f76c6ba64c5a3e68de3324556d9979f09303b.patch b/firmware/932f76c6ba64c5a3e68de3324556d9979f09303b.patch new file mode 100644 index 0000000..ef01ce8 --- /dev/null +++ b/firmware/932f76c6ba64c5a3e68de3324556d9979f09303b.patch @@ -0,0 +1,44 @@ +From 932f76c6ba64c5a3e68de3324556d9979f09303b Mon Sep 17 00:00:00 2001 +From: Phil Howard +Date: Tue, 27 Feb 2024 10:19:35 +0000 +Subject: [PATCH] rp2/CMakeLists: Use MICROPY_BOARD_DIR to find pins.csv. + +Assuming that ${MICROPY_PORT_DIR}/boards/${MICROPY_BOARD} is equal to +${MICROPY_BOARD_DIR} is not valid, because the latter could point to a path +outside the main MicroPython repository. + +Replace this path with the canonical ${MICROPY_BOARD_DIR} so that pins.csv +is correctly located when building against out-of-tree board definitions. + +Additionally remove MICROPY_BOARDS_DIR to discourage similar mistakes. + +Signed-off-by: Phil Howard +--- + ports/rp2/CMakeLists.txt | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt +index f86224a5c067..d3ecee586054 100644 +--- a/ports/rp2/CMakeLists.txt ++++ b/ports/rp2/CMakeLists.txt +@@ -530,15 +530,14 @@ endforeach() + # Include the main MicroPython cmake rules. + include(${MICROPY_DIR}/py/mkrules.cmake) + +-set(MICROPY_BOARDS_DIR "${MICROPY_PORT_DIR}/boards") +-set(GEN_PINS_AF_CSV "${MICROPY_BOARDS_DIR}/rp2_af.csv") +-set(GEN_PINS_PREFIX "${MICROPY_BOARDS_DIR}/rp2_prefix.c") +-set(GEN_PINS_MKPINS "${MICROPY_BOARDS_DIR}/make-pins.py") ++set(GEN_PINS_AF_CSV "${MICROPY_PORT_DIR}/boards/rp2_af.csv") ++set(GEN_PINS_PREFIX "${MICROPY_PORT_DIR}/boards/rp2_prefix.c") ++set(GEN_PINS_MKPINS "${MICROPY_PORT_DIR}/boards/make-pins.py") + set(GEN_PINS_SRC "${CMAKE_BINARY_DIR}/pins_${MICROPY_BOARD}.c") + set(GEN_PINS_HDR "${MICROPY_GENHDR_DIR}/pins.h") + +-if(EXISTS "${MICROPY_BOARDS_DIR}/${MICROPY_BOARD}/pins.csv") +- set(GEN_PINS_BOARD_CSV "${MICROPY_BOARDS_DIR}/${MICROPY_BOARD}/pins.csv") ++if(EXISTS "${MICROPY_BOARD_DIR}/pins.csv") ++ set(GEN_PINS_BOARD_CSV "${MICROPY_BOARD_DIR}/pins.csv") + set(GEN_PINS_CSV_ARG --board-csv "${GEN_PINS_BOARD_CSV}") + endif() + diff --git a/firmware/micropython_nano_specs.patch b/firmware/micropython_nano_specs.patch index 9a2bc62..fbfb947 100644 --- a/firmware/micropython_nano_specs.patch +++ b/firmware/micropython_nano_specs.patch @@ -1,8 +1,8 @@ diff --git a/ports/rp2/CMakeLists.txt b/ports/rp2/CMakeLists.txt -index 281b0c3bc..7e04bb549 100644 +index e058c0a..fd97871 100644 --- a/ports/rp2/CMakeLists.txt +++ b/ports/rp2/CMakeLists.txt -@@ -453,6 +453,16 @@ target_link_options(${MICROPY_TARGET} PRIVATE +@@ -455,6 +455,16 @@ target_link_options(${MICROPY_TARGET} PRIVATE -Wl,--wrap=dcd_event_handler ) @@ -16,6 +16,6 @@ index 281b0c3bc..7e04bb549 100644 +>) +target_link_options(usermod INTERFACE -specs=nano.specs) + + # Apply optimisations to performance-critical source code. set_source_files_properties( - ${PICO_SDK_PATH}/src/rp2_common/pico_double/double_math.c - ${PICO_SDK_PATH}/src/rp2_common/pico_float/float_math.c + ${MICROPY_PY_DIR}/map.c From 0faeede0e8ab9b2352fe83f58d877431134b2703 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 19 Jun 2024 23:10:52 +0100 Subject: [PATCH 12/15] wakeup.c: STATIC to static. The STATIC macro was dropped from MicroPython v1.23.0. --- firmware/modules/wakeup/wakeup.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/modules/wakeup/wakeup.c b/firmware/modules/wakeup/wakeup.c index f570f64..22b96fd 100644 --- a/firmware/modules/wakeup/wakeup.c +++ b/firmware/modules/wakeup/wakeup.c @@ -1,14 +1,14 @@ #include "wakeup.h" -STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_get_gpio_state_obj, Wakeup_get_gpio_state); -STATIC MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_reset_gpio_state_obj, Wakeup_reset_gpio_state); +static MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_get_gpio_state_obj, Wakeup_get_gpio_state); +static MP_DEFINE_CONST_FUN_OBJ_0(Wakeup_reset_gpio_state_obj, Wakeup_reset_gpio_state); -STATIC const mp_map_elem_t wakeup_globals_table[] = { +static const mp_map_elem_t wakeup_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_wakeup) }, { MP_ROM_QSTR(MP_QSTR_get_gpio_state), MP_ROM_PTR(&Wakeup_get_gpio_state_obj) }, { MP_ROM_QSTR(MP_QSTR_reset_gpio_state), MP_ROM_PTR(&Wakeup_reset_gpio_state_obj) } }; -STATIC MP_DEFINE_CONST_DICT(mp_module_wakeup_globals, wakeup_globals_table); +static MP_DEFINE_CONST_DICT(mp_module_wakeup_globals, wakeup_globals_table); const mp_obj_module_t wakeup_user_cmodule = { .base = { &mp_type_module }, From d93155f51c67bc9a9e17fe8864f055d43b81c1e8 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Wed, 19 Jun 2024 23:19:33 +0100 Subject: [PATCH 13/15] CI: Add py_decl firmware/filesystem overlap check. --- .github/workflows/micropython.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/micropython.yml b/.github/workflows/micropython.yml index cf4a42c..ae62437 100644 --- a/.github/workflows/micropython.yml +++ b/.github/workflows/micropython.yml @@ -112,6 +112,13 @@ jobs: submodules: true path: pimoroni-pico + - name: "Py_Decl: Checkout py_decl" + uses: actions/checkout@v4 + with: + repository: gadgetoid/py_decl + ref: v0.0.1 + path: py_decl + # Check out dir2u2f - uses: actions/checkout@v4 with: @@ -160,6 +167,11 @@ jobs: run: | cp firmware.uf2 ${{env.RELEASE_FILE}} + - name: "Py_Decl: Verify UF2" + shell: bash + run: | + python3 py_decl/py_decl.py --to-json --verify micropython/ports/rp2/build/${{ env.RELEASE_FILE }} + - name: Append Filesystem shell: bash run: | From a021d3ba22d3588b5bdfcd8c83ea895ec5f6fbaa Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Thu, 20 Jun 2024 00:00:51 +0100 Subject: [PATCH 14/15] CI: Switch to dir2uf2 0.0.4 for fs autodetect. --- .github/workflows/micropython.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/micropython.yml b/.github/workflows/micropython.yml index ae62437..8deac6b 100644 --- a/.github/workflows/micropython.yml +++ b/.github/workflows/micropython.yml @@ -64,15 +64,9 @@ jobs: - name: Badger 2040 shortname: badger2040 board: PIMORONI_BADGER2040 - # 0x10000000 + (2*1024*1024) - (1408*1024) - dir2uf2_fs_start: 269090816 - dir2uf2_fs_size: 1441792 - name: Badger 2040 W shortname: badger2040w board: PIMORONI_BADGER2040W - # 0x10000000 + (2*1024*1024) - (848*1024) - dir2uf2_fs_start: 269664256 - dir2uf2_fs_size: 868352 env: RELEASE_FILE: pimoroni-${{matrix.shortname}}-${{github.event.release.tag_name || github.sha}}-micropython.uf2 @@ -123,7 +117,7 @@ jobs: - uses: actions/checkout@v4 with: repository: gadgetoid/dir2uf2 - ref: v0.0.1 + ref: v0.0.4 path: dir2uf2 # HACK: Patch startup overclock into Pico SDK @@ -176,7 +170,7 @@ jobs: shell: bash run: | python3 -m pip install littlefs-python==0.4.0 - ./dir2uf2/dir2uf2 --fs-start ${{matrix.dir2uf2_fs_start}} --fs-size ${{matrix.dir2uf2_fs_size}} --append-to micropython/ports/rp2/build/${{env.RELEASE_FILE}} --manifest ${{env.BOARD_DIR}}/uf2-manifest.txt --filename with-badger-os.uf2 ${{env.BADGER_OS_DIR}}/ + ./dir2uf2/dir2uf2 --append-to micropython/ports/rp2/build/${{env.RELEASE_FILE}} --manifest ${{env.BOARD_DIR}}/uf2-manifest.txt --filename with-badger-os.uf2 ${{env.BADGER_OS_DIR}}/ - name: Store .uf2 as artifact uses: actions/upload-artifact@v4 From 037b1999fc07c63ca7eb88dc36595d52ea0e2917 Mon Sep 17 00:00:00 2001 From: Phil Howard Date: Thu, 20 Jun 2024 00:36:20 +0100 Subject: [PATCH 15/15] Both: Add/update pins.csv. --- firmware/PIMORONI_BADGER2040/pins.csv | 35 ++++++++++++++++++++++++++ firmware/PIMORONI_BADGER2040W/pins.csv | 11 +++++++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 firmware/PIMORONI_BADGER2040/pins.csv diff --git a/firmware/PIMORONI_BADGER2040/pins.csv b/firmware/PIMORONI_BADGER2040/pins.csv new file mode 100644 index 0000000..75f0d4f --- /dev/null +++ b/firmware/PIMORONI_BADGER2040/pins.csv @@ -0,0 +1,35 @@ +GP0,GPIO0 +GP1,GPIO1 +GP2,GPIO2 +GP3,GPIO3 +GP4,GPIO4 +GP5,GPIO5 +GP6,GPIO6 +GP7,GPIO7 +GP8,GPIO8 +GP9,GPIO9 +GP10,GPIO10 +GP11,GPIO11 +GP12,GPIO12 +GP13,GPIO13 +GP14,GPIO14 +GP15,GPIO15 +GP16,GPIO16 +GP17,GPIO17 +GP18,GPIO18 +GP19,GPIO19 +GP20,GPIO20 +GP21,GPIO21 +GP22,GPIO22 +GP25,GPIO25 +GP26,GPIO26 +GP27,GPIO27 +GP28,GPIO28 +DOWN,GPIO11 +A,GPIO12 +B,GPIO13 +C,GPIO14 +UP,GPIO15 +EN_3V3,GPIO10 +LED,GPIO25 +BUSY,GPIO26 \ No newline at end of file diff --git a/firmware/PIMORONI_BADGER2040W/pins.csv b/firmware/PIMORONI_BADGER2040W/pins.csv index 012bc7c..9d564be 100644 --- a/firmware/PIMORONI_BADGER2040W/pins.csv +++ b/firmware/PIMORONI_BADGER2040W/pins.csv @@ -24,7 +24,16 @@ GP22,GPIO22 GP26,GPIO26 GP27,GPIO27 GP28,GPIO28 +DOWN,GPIO11 +ALARM,GPIO8 +EN_3V3,GPIO10 +A,GPIO12 +B,GPIO13 +C,GPIO14 +UP,GPIO15 +LED,GPIO22 +BUSY,GPIO26 WL_GPIO0,EXT_GPIO0 WL_GPIO1,EXT_GPIO1 WL_GPIO2,EXT_GPIO2 -LED,EXT_GPIO0 \ No newline at end of file +WL_LED,EXT_GPIO0 \ No newline at end of file