From 44182aa685a5e287a304221c62810822051359d9 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 5 Sep 2022 16:33:35 +0100 Subject: [PATCH] docs: Add data logging API (#720) Includes microbit.run_every function/decorator. --- docs/index.rst | 1 + docs/log-html-view.jpeg | Bin 0 -> 26878 bytes docs/log-my_data.png | Bin 0 -> 41180 bytes docs/log.rst | 122 +++++++++++++++++++++++++++++++++++++++ docs/microbit.rst | 32 ++++++++++ examples/data-logging.py | 42 ++++++++++++++ 6 files changed, 197 insertions(+) create mode 100644 docs/log-html-view.jpeg create mode 100644 docs/log-my_data.png create mode 100644 docs/log.rst create mode 100644 examples/data-logging.py diff --git a/docs/index.rst b/docs/index.rst index 1ae7da41c..1d8a85153 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -79,6 +79,7 @@ Projects related to MicroPython on the BBC micro:bit include: ble.rst button.rst compass.rst + log.rst display.rst filesystem.rst i2c.rst diff --git a/docs/log-html-view.jpeg b/docs/log-html-view.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f9b736c360506309a259919e83d58e17c7ee35da GIT binary patch literal 26878 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�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

e0Aj{2IE1 z0VUuL7WM+UthES`pDhYB2R}550gR9jB*h-Za0+0Dfi84e3Pph`LSaTnM*)%0E`S=Y zf~xfQ_XF2(3J?im3nXv~_bT=P1q6_Hr1wbwKz}+jhsvR-cs9T&9!YEM@E7-mDF8@C z<+uedK^a^%F)=Yu_i&vB`i2tg|O6|%E96TAi9$4)~!Qa4d5EI2rGYK6$0;!G01^O zMmvJJbabFEg3Ccj3&aGrA_ohEp`2LR0?QHOaD26fsH8*^Z<;LhK1NhuxGMoagp_dJP zKyA1j8 zPDC-Rt9$FMw}6<=XvNdwjt)BUhtP*5@=C@;4dFcJWUUs(Y2V`FI8KZcDS2TX=Q$iN zSZepqd?;DYu;-=x$`$ezqm5VEU|x&bjFx=DP9S0MuP9EH(R91L)drc2$Z(crI<4{x z{fK8sOAiVPT}M3_1H!aB6bsif#!vytLb{OYpP23PV=bQ4sdWFz{%|y&%cn-i&IpN0 z5fI4~^0cI9*&~mHfU58=fAGNvVQ8QdhmTa1Yfz&AdBzwFAfk(kVQ9`doM@p)J>5Mx z3y1{p0fqoxKr{dlPPti4qyb^D+R)+x5OL@jSdar0Lsif**oiLiv}?H?M7mZMX@pXM z1&aPSI>ieXv>3wzWt={9E>H}f8q1fh#PgstjtJKX;NjS_@D%_tfvu<(kB6J$sc?5F z;k>mO4Kd?Za%+yg13r#=G$VbXk@$i4k*ody9OsQ?#?3ENfmwk#9T-JQB>PXE!iWqo z(HMh1(a-(d&!IOBt`*O$DXVH9R;$>=s( zqmQ#~+ctDS0E=6P(|yn%fU?64&bVdPVI^Y>Gd4)$zJNkh>t+tIE&@7nG+VGX!?EZM z>(pjv6#WFxT8$l<5fXG2TZt@3aDdu)in_ED3 z4aW|=)bw8rBS?0wQ=h&4(aaE-%SB{t;ab&#chr!8I8Zwm}S&TEQZ6#K^LtCoM?U|yF zw3LPvj4_gP#w=pPYVwH-U9|LqoRUHqjVQrcX@%e(<7MxbU3M(OyoRt@4EZVe^myTPE*}aYb=tH%dw?2_QnC_eEWW7`7NFIVh{vK zUlbfIqv=%Iknkf3%c3bOCZ=W$$@=@`xy~$G&{UV@EKr;{E@ba>!pias3`WB(H%J@yK2?z8 zq6@m!RjJAcAlJ?e3@kDsgy(sj^U6*!ax^iSNag{E);~2m@yzqv$ENd|g=%YS)^F&# zWkq{ONU}njC~SxqjX^_34-b$0;PD?}T zePnWG+sVlZ#d9Vt!m>ERkZRU;tpa$)_kpV@nTv0KsRpOc+s^fWTkt>#IUJr zD4dHaS!6i$!c&&*AIrRQ{Opw96hxz*tWjL0xh7Af^~mJO!_A9wenVS=Cqjx#LDn)$ z(h_HM2{X|03pA3MD}PE}x}I6}PP}w$uAiv?)%oiWvRccXrDd-bn~`&lweLa*M|@pr zGfvDE4y3c+e`VL`$e8dVD%xbob78271+N`F+twJ{*ij!d0p&6vpl+(I1E&>cRJVTe z6Ny;-t~>5LcBpq`cqEu#)#BL0ocWpZeTRxV$~8O!E!@I{S={egjg1ewTYvg_8Yfm_Ru zpL=#_a7g&_)?02}wPrPA3?5@x)+&U+GGK(q!AR~?Pd$Z2zsN!PRjXDVIeMH4sdDN5 z-u;0#lLaZf&_f@;vn~;d#%m05c8!elR{0rm2-g%W0z(>KkdzW%6Q~?u4>|X0*hW~k zjn)3R3YvgOoX&l4t|%pbMwGuOKO;`TsDdKl5|}vfNktzN6@s79XbLn)`_;)4XP{KR z&-+2pc&Z=u;}drL5fJd0p??X#>=HjCs>QvqH2tcvkYTMn78v7Eu&Di_3av>#{qmlH zF_RB9XGKy+>uoe)qcIbU(ZWS%^ZEzd_ddI;cP3jPGJ;vF6}VpTY9jF{$fyh1TvL60 zCYuGB;4{xW4N{}QbLV!vzI}XX`zM7-L!ci+_HEO-WohlZt;jO%MBN-8hek2yvCXD0g3 z&826Jo-0tnh}q2S*>fhH5)^QjvtD7sPLHc8#g*hFjoP(+8-jGFvw7me@uU3NpZ(d< z-rmW{sRR4>W3mgrR=`Rq*5buoXz+k{d-v>tcR_7!9rE!$0gK=G#y9Yhz}o?|C>XDR zX2U@c1G{ht0}n1fs-dAld?)pFjqR!Tn52uJ9ek}5wVeoY+076BSM zmt^E%7|j?1UQT$w;1CIGEz(+RklH#feZW(RpAp(}DSk!}=KwlUE%vwt@D7DhxmFr= zPEA5B4-E7Vz%3P(qYS_o4}()~1P?j*%u!)EKO=IS?;sTT>L8=Fwy~iRiA$42%Ji%v z6=p1^1L-Ad1;|}$<188FwFw=L9iQXR?e80(OOaMSBc=nGfq=r9xmn9u*biB4&_sZh z8r;+fpTFg{%~RtOCyyT==<6FA9Z^P?7{amn($hf!bVTu3V#9{@a7$v00TAKu30EgH zR>aK48`n=v;?o_0k;s?;O9JPF4X5U(g^29}O1I)>xY3+K;rQfuYGyD`X^$`mRhVgx zi498^2{o39NM+4*n$j#Ht)zgk_%T`=OPoG6AQ@DAa%6Z6WI1TPwN`+wq2b}3 zJ9mOw0#1YvJn$fb@Wf(qy#KpDcK4?~b-%GpO8NHNZ=*aM1Rs9*;Z2)19X)nrdU_H} z6I-@y{`6-awpLF~O@OsRTefo5%7-7gfBo7u%U7hMt>1H1}{Ku zwDdT*^3Xy9E^$Y#HM*66X&j<9)IT{f312Umla6n^lAjUPUL9n_y@yAJ@yFm5RCoos zz40O*`4mY;o4VUXO!By7*y4VXRZPlwZNS2*w6fYt&Pf}Pd`wPEobDR{+djI?=Y|GR zxm(6eoaNEbSi?hJT|>h|4?gtEzx1oO-*KlkOmG_xiG2t5508xEcP#`3V~nFqvev=^ z!khipx4xB#C*z5v(FUX-U;WxwzV@}poZovS5}T(ZyOpdNhJ-C<66ai!79NFs8KZnb zW-`lK7kv4?dscTe$Y5OOMkLF|gf9w|OQj0|US5F3;XR%0{l|MVsWi;EYT`|G3z-F8dSq-vQ`5a$x4!=T zOJDzw|9Shao$EK>x~Q`Qcm~oT#06wwk45}tYi{USwfrCd`JcZ2_21k6=5Fw_?R@=( zKlpF|e&>Nb_dIYPa8PpQq7NEl@IvwSo!Qvky(Hu(?!Nn8bohSv_x|&DzyA%;U&dm| zT*fda*m=3y{bg(y7*-fqFs#_5Ya_Ik$l?rJZZ2I&XG|dwL6Bsg8XRJoIhLA;rG`60 z+E=r|>`bTMyd>7yo=BpMQC1hs!i9D5h~2gGjbpvXI@>#=p(q&(Iwx5)x~(Bbl8A%8 z8!y~)W{i#}YlcRLmn~afA4}*oz7(d7M}~QZYC;iKP*E-yEokXk*b$_%*{RtO7oL!D zKWwu32=}921lOPoV0_e!Xi7*)5Tmmo)wwRO> zLxhe}8$T#82+&qSPls_RfEoY`CLP44phD8o_k;k z0r-rIJQ^5$#VAQ+a7k-xJJy-N(uCcLPB*9}P`@WVJO&Kd5({NgVU>)8?tkdPEqC3So}G&)66kDW9suv9y}cFY zcP=Pwx^+_|6mq-5ar?l*R{Cu@5aEk1X$-@obBs2_QA_kN~mVRIYTZ0p_kpmY82{{6o{(R;$+ z88w43E17QsmYSO5mWO2olRT!NB`3o;D_dY`2|3ldm-)rd2q@HAqtC09Do%-nP{t9{ zI(|lcp5^?EzyWk}F;49`867_(tUt%kh@onH$c_NK#LtKv^nwAMs0x`Sen!su`A6bK zenzE&K!|9GlG#N_MgsS0Yj48_J~Y>n$KKKH;Cpw$HLn6PqDgTi4}6Y^1i~o3G!I0tv`^}mHD~7lVGhr>aniS)SME#aktB#Il$FsA!bT%1Ej-4F) z&L4g6_S@GtH8jRVbZT;FEIhh#Q+LSvCa-}_5lRMgY~9M$yZwF54GZcp*TuZ%SW;yQ zJQK9UYd5dG5tCQr{b!-;3z{1{J30!Jvk_z0uHCTz^&M~R+<(h0w?Fs2?>+Ok|A^mU zVrF{lUH8_+lG$|bC(k^4=)hs0d&`$B?>{?~8=V&9aTc}OYpQLG5_)2qvv52rwJ}+% z3S@;L%SdyAFk6Mi`N+=*^9^Zy9l#*;4ll~ji2M>iBQD7m1--O#eny-H2;y2)4zzXr zj41Cy96OdXFdvumGnU8gu%z9*Hf&6M*Fb8_V&l_ZwQ?1%LOr-6z!%k`44&DIMY;er zR{GI%b&feVc`Ie^-hfnMzh0{t&xNoogMzh^Wlgz z!sJz|ZsQ6O8Oh~MtslvzC+_LkKq)CtOn-XmCM?jQ!)LcNbVbwB_oL16R&(ggmiomD zR;gphj$#c(1B*9C^7k)Z+cv4QlgGcfddr!~nZ^nA~L- zqBVVer$XmaYZkBU4x)ug>Z$8A2Ttd6sZ9+%EFboJhlBidJmRHNb0QfQEw!O!G^c~I zz!t2EiSxv4#3(%H-0?G_>k2T!H(26l#Po>cXGA~DMK6Gq_!(h;psVW`zsva<-C2xu zIok!$<_f^FLm6C-nvq%JXLJLRC4NR{{h^2IDuKm=TWGB@H;X15C6VL!8S&Wo($O(@ z4~hMJiZ@;6;mgnGGcslVwm9;cafhy?;TDA)!Gx}yf4I~dIAiVm2|ZZu-g~8SsIQh6 zU}^b3V=NTdW)Njq^e9kPE7V~G(;myS zytURdBrWrZ1%W}es9Z3J706KqV#brwy-XIIie~~~b zUA+9lw<>WB%5#)4nDlx=aKVvEF z7R^+Yykb_m%K9toEWZ~rE6bFwy(YMJcuCRA<{vpD=GemwS?tHQ zX~V5z{KA)P6|P~H3(ir3Fc=#3JudCcY%LG56a_vo6_*;ztVZQUl@N@sKdJIFUV$lt z#5K)Ac7bo1bv%m9@h28j$TDP@R-$0J#y_&$FjPyPIS--C)o@*luw>p@*UgBuFq~QP zJUJa?vJ2}9H6f)e`C*}$rXb6c0a@jTlvYd`ZVls%bFPF5sEBTyK~&)QD~+2A7K{Z! z0XIOkP924iLU3cOg^;qwYQhDa8;*?P#avlj$22Eq11`!bmy{bdC(XF!kOH^phy{jY z3OlUoCi>3RWvno`zh$@%b-T8+WI28mr7D$lb`a~*_PXO|EK#aKcm+|TCT1*|G6R#B z-d9z)gGE-6UkuI*G+OoX+uHB@7>+3vrl838AV~`np@`MmYQ?P~U2KJzDZXtYCa_VU z$O$W&k=UHWyBnz1h6G3E1#xlRoh>$8qKo}}Nf1GGuR9+FVkaqqw*fUZAL8M0zQ-n5TmZZFGvqdz7m?ESK zBotXg?{uf_g$-d5WRYhqDMrVK@*YlE%Xxr$xgeu)g;!J$9M4y#sVYC?2f()oG3@-n zjwu^)W9(n{Y?Wo^0YBrF2(zaA@kH5a$ z=DH)1+>b{NzA<@dkj5=>Z3;vRo8_c0VW2r=)Yum{{KGLeW-ijmy9!)bK}H6fxs<8T z7)oQ$8JiD3VpXoz0F-b`Qy8`qL&}x+_peiAWCq(MPdYy8(&ios8>E!}h>F7|_lKJz zG6qC@$LYIo9y~rH#>Oc%oX?+4^T`6slU63BQe$H3g@Lz@(V!yjF-Ae*+3$bn@gF~* z!qt*U(8SpAU;O1?zP9bv7oY#h$rHyoX9dzPy!_(H{ywLOB>CvTng8-{|K0!lfB)bA z>R{d@OH&dC_;4;?u0&42o4pbeJ${^8gE>;L_K{O|ws|MtKCkN?~M`NkWspYA{P z-EVyxTqs&=rS-c%Ez7NC#-Tg5dDh}q1&m(Xw{Hh!A689cX#sfrUVZgd#~X&TzVCy? z0Ztb1rvRZJieXj|^bKIN1J@ri-C9392RTqAM;`IgOD};@0-262&5@zuD!A6*!Q9h=FA6Ru_2nuQl1#{f*<|h`+xAK ze>yZa6BvR(v;W<{`PZih2B6kYKKVo@pFMi~_|Cn%!_f#sd1J}a*}ne0J9mNW32p}e z>R1He1yE{z1-2jOf3J>f+GlLaaSjU#Xtx4X7eoE>IOV zF1WxBM}i^G&9=|CDe3C;G~fxI%RobTC|{bNaW0chEnU{LZ21xpIC#FeapU?$i`tzJ zE;Ix^h7vy`YN)TRLv0gtGYh-BHmqI~6+TSG#Xa4iu0U-{DQFb13~2x{5Dn@lgn-{6 zcmlC^!T5?4J_1ps>gtn|ljFm~gNTKvzCATPT%L7TX5+B!l4@kL^A3;7;VX@JLV%$V7FRsza zq%vU0dr9}t-MDbelD0aX3Z-V^1tVrOPoq3%B>b9WI2!9-v~c*`Kq{R> zYj0HU)?05q*?*>M$B0L11%=k4iH653 z$ZJsv6q-1PW4jG>kTJ)4j|RE?qhI(Um>Ey>of1S$a1un4Ga&-46*dLYMDuYSLUjNU zAPB1vU1{LUrTH1PqhE|gV~$W}*W0`L`ui&R8KE%XQp^{F+yz>r!jM@Hf3P&sn?85;?9lKKdh6((pB^}k?hDuwa66QNV&U$% z3p(;wZEo6ij_}--=Anyaijb=LP)(MsCM&qG!V+VK5i?AxFcCMLMQpw{$R&Mlj1EOY znbfScRz|}JrrMZDf+y7qiOao^&v1KBzKa43khg;dMGh>PUbUFWj|KG z<>ttSCW_la!KQg;HrTLb`D8l1ecS7^lf&y)txTsfCX_&b8+O6p{o~)=@yH`9I+x~D z5chnLtH%`6q~q~OEEaK{Xmn@rC4j#VHbr_iH8nBz(n~LV`HT1GRUoyt>CEZ=ejR9* zSF;mSFKv5u@#5|f5kJokU`Qirt;Xik#X=?w*}urV_iMa%Htv* z6o@mh1iwTIU=OAtyr-PBZ-59L*V)b10hft zcgKz9=4R0Ex1?cI0&P(t6cu;B3dqPg#}iy85(k0914Ef5Y6sXR9vPOh?LFek47vypokSBxk5^eP} z&pZRllUHBehCUJ4)W7`b7eJOCmV9P%;)x$Uo|>H=85rDs@X)E5iAO&FxwZ)4+7crT z#ieUTs{D+`7{H>|`p!G=WQ>_2omE|3Qb>WAKIsa6#=6=%Ou_&qEBP6hboU^QlGp=t z4WoEX0wuv_1{?&6m1rYM{EQ_r+NeOugw%PUF_Hl?Bax`!0>_ub(1tDhwR!~~y=Mr-?Y)qpkjMh4v z-*xcNK>ukHUTS8xyR8K%*|lm#Q)` znL<7wW=sf1dng{^6c77KX-=FNXP!NJ;_(0XfBzqTv<7{aPkiDNPe1)M;(-6=Z~V5k z_So@b|M+)*d*<{2FgF&D?%w@&&yr=o`YXTG+T1p9=JbF6tG_ted$euCO=SyP^*bvN zEcPYOSw{0us{D*-`S1m4tsNgL5{|&XzM*d5bpJd2jQuCi^E1}viUPF4DP%f+M)b!4 zwJuZ^GGVeHI4Bu|PPa1*aTambFl~)PjB=Jg6~NBfUj2RjlT+gv@H4Jh(R=i;qo&@s ze-F;)vW1rB7F3HK{m|eDpcWOv9s)Xl*vQBj!(WIG49x|eLn(F9^>JGI(L`M+7Ke8R z;T3SMI1jj=30M}!pw`6wxxfaTGs5{CY-3~Xt1rL0q_ZpD)BW;mF9n`xUev{jJn85T z#JhU*2{cV(nU`L8p?lTZiK)q-JoDp6AN^u#CW~0rT5HU*xzz(M3Vr)g+OQ z2)en8wys_H&(G~j+XQK*{Y2ln=|BIye@fQK!thWnrT*7n{ah`D3o09=;Tx0u%ojeN zXlg(s@jJiu+YL1_;^EJJ?z2G%wCYsw{4YQHrH0PMsCr^*Zfh>>N?jUbKw7QS~_f<wRPyMw6(V*pqsS@ zmAH}0w$_C$tu02I;z}chp&^`dm0SgWMhrILZw50ZzO>45Mm*WTY~i2YI_$T0DemWq z<(QZY^h_?7DzMoA@6MzAbaU;o@^ z9y!^2Vs3ioOJDjDem1~jrT67Eu`Y*^aWpyMj9wf>_x#f{-l6HV&zJqrpI-abPf^iy zJd&q>c>eg)d&dtQKS!BqnjP_LtjJEUXion6V~>3L?zKKCzv!aJ87FHk_U;W>Lsk)l z`vk!uQ#sPvLhgJ2@U2%~e$D!!SghuM|IPoYt8?K6Bg_}+q&VBpyz}^O-C}Y4gmdD` z(5bN}|JCnCcb&}(N`CDgzG3m4$tg|}x3%O-&IjJTDg_x56@Jhz;fj@cMsw?a=yw%6 zUln)h_vzPMS;n!1a$ZSFc6s4f**g%!2Qa)5Vb+C7q)K51Q5j5-)0}c#%xaa^EMs|& zaUu)Bju|T~kulgK7f@>z%c1X$pmb9cq!s3>_8jh2`NA*$+|M6Aau_Wb;*EUgJKu?f zBe!n4wWY1i7aaerrnyWimrh9`fVl(x{aZHQE`&f2`kL3;cT!w2u9?)OAHq;ah`xI7 z(xoew?mhPZvv*Z(j_gMCoRV7Y_AGiP%*@Qp%*;>wcS7%>UvTprP9DR|%(&nM+ubdx zDq8n99uHmS>tkvV7>^587v|F`)4ax_YOlQiO|N*;L#qH(LqmcvP?Qi`4Jx3(u!gu5 z!n@x7w)egF1Ibk}xyh)300t1pU^l6d3Mec9G!Wd48IWNjC}BdtaQDWB9Pd5}HY5Qf zc~8olE<$hYV_~a;;#4|1S<;D$&y`Q++n76+?S_G<`bt#DdPG4AW};FWwK3)_F{(yw zLe;hNVhn!Ihd%b{Pky3E>6*3c`a*VP-Vc57Ll1iJgHnoqyj8o9`}o-}e7>i>^o1|j znM`h`Tz0!ddCTTi-jZRd-ujB!Az=xh`yl?&wLIuCc*A41D{MQ!17kp!8wAV*YwMcO zRvFU*uB~um0(zPc4CC<$GrDFpaozyf0XE}d(uM)l)n*ciLGnR=J1~f?Tu%<$;9ipm zNb(M_e%d{3MTzSU{@JynN)N>q2dFB5q429Ez4-5cRPgHS*8G*L^XNv=R}dmyGjFz- z$MgRP`Y>7+15N4>VnSVs3stA)N6jOa!Bg93C$sr%S-?ym`G`k;@IxQ`>es%yJ=uQa zo8IW0z`JDn%%?r$u}^(ciPx(fAN7bw7QQaR?4V8G6H{Dh5I_MXjFKq;h!oVedPNK5 zjIGcB=+c(=aKH>8Fb67teL0I>0Rh(t&DObW*cA+*)Epz_CN*dR0GsyW0~82YVT~xc zJ{0Hyg^@rQM$Ui%y1XV-3X-};lV&I|LWvDFxR*_*hsGfR0d#Ec~( zv^eaG8z{zj@GUlh!71MM%9kZvH}(~WRFN<**F&gHQ*G6gok#ARJX4$GS+8cKDB;9~ z5Z?B-w>0BM#XbK;FPq%&{v==al9!Z#03%8y!KLZ+!uj*Xne~zvzqqdJuIo-eVCOY& ze7zVJSFV|=7b!VvANufzzx>s&l(2wDKKv1-SIVhh#KDVy_lFS*IDocxgb_HB(wqR%tJ@^eaS2LM&&DzCr_T7FJ?)tpgfbdXUaK@YUkYa>XpTOF{BCppS|%@V7xq zwCvmdlD=B%d^3woAUzXGPh4a@i3dAgm&+6_pM+6f)eFDdYzu%Y_XTj;uwK3IdoF}9 zBSq}Ow^!^xG%h4pyZs?rWCxZ}0<>$gAYri=`;NZHI;})xMuKF5(^KQA#9NG1;`lju zoGRn$W^=pUwyWmv`Ov&w|55zkiW^}&gMnmW;ZhmrGgg?+V6r`C98YuTQvqZlOW`BE z`#ut7IDw!1;D=#kP6%mwWu{L1AYld+jtq#wykJQlyzJ3sN*H~1eMXCcwCD70zRxHV zqzq7kqOg6AS4-O0oJP~OZG0qDyy#R`b=s>UEpdRqRES&uYAMx zIJPTuNF!FO_RzK4P3*$isKkLASs-r zfo>J0WbXtH`+eW7dKYTQ)YVN+oGP+6<2^OXi=uhC^RqfjD)G*C>5A`3t&<9{zn zpQU61htfxBN@l%}H-??-9;7O%u}n2!y?<{b1~iG5Q%7;REG+03zxrLZkd#y%zEoEF zO<_p$Ou=KcbCL9!jYjUSuC`WOpr%8Q~j#2$IrTa%mgh@ZKlzx z$kdVM=Z4y!qCcp!rlKZ}f90JoULvLPMOm7{I@-m{!+BFFX|R`xsdQ9j#G$#F=kq69 z&iO7ZEVM0sJxP*YUq1q4Kqw4Mlo3zNrtSKfd2=TSc}~m%Q)T|bCOA(%1INGbU`h}k z6ULaG(LZgZB8}#s+1db`voL3&n7U3ol{v|*8;;~f9?-V1jKBmW2+V&ku3yS?2#BK5 zF>tjb8FNubHMwwfCBh4#;P zyU$P=BLozGIm$@HWX(n$=ef$5oR3VHw>NJl4?9^{Shx_{+dcJ+BkD7O$q7r}x^)%^BY}Y2?)L9CS1c?nTpIf6&wgDUDy;ic@XHfaL zeO%vc?i^~!?d_ZORp0CC>N?2X!?x?X%p6?&MCm`gd-JEi{JFh(`y?yt_1dNHlwI3w zA9u~F^SX&_c-)8daCp3a|JJ1d#d2Scs}+l-HY7+O*>~OQkcZ8B6MfVB@Rv{i-d$an z(*EDu_xFGKV>D8%Q!zVKo1)fPI68_1!nw-)pRReg>12Xb7)a$=dykJf`^Az=KXKs_ zY0U|Nk}3{E65*p9n1M_Y4#*RiZnf^NZtiybXq)SIZ?*5QH#hrzPnN6Arav4aVsm|c z*zfzkZ`x+Jy?<)YH8<~?)gdBw5BJK_tyZntT`8aR#SnJW=xIO4T{(o}?*1-f^>pOf z-QAs}C)wR>-aOoI`@XkJ+s4D=u5H`$$zk0#(kf{F|IO<5@u8)8cz6Uh>u%Qz$4N3c zGvm*JPLjtT)PH&oqfgTbIOam{8j%Dp?2 z$(R&3)K+Iw$${Iw0^x8tTpkH4ZB2}gPo&*MCWQ!A3K*ZIu1Tu~z8mk40 z(St(bDaC?-G#bql0-o{mG!Vsc@figMP#Y>@sDI!e{`zlD9qS+h0prQ5- z{Dm7n^5JV;=QeGAyP>gmBAbfW*8Soazdn58$i991KKtR1C&v@B<26fGF1vK%{Qmt1 zzxwTOM#{@rHtRS}Z|?w>Xz?=(4jnx5<*$8p;o?R6wr+ZV)An!txISD~VMn9SEL?Q@ z?Ad1{<;w6{eXC%|LVp+_|L_V$F~cW@kM$Eq{ojK|D`NqWf)wfki(I|Akdh0aIPbGv z1PHOPtxZYZKyQCTRkZWm`NsMNBVamC#xPCK^RDFVt(ET;AtV-!MosJ7sWX|0iNXGX zNGKe#?Y>)g+^n}^`5J=;=C(G^ZJU!wC8r`(?K%LkY~kYGTRq*k?{r?-v2OJWWipdWcPNJ$rHlrp=;=nI(NF}U zbS=k}z6nSe0!Z#i2q6_helRgDk-&ljU?~9?I+8KYE0x^EqPK2b3y~(}F+FeYoSV11 zxez30u8>G1lq?1U0X2UTq}1goot(IGsk7_a)irC^wy#}tzT=p(U^NYEVj^t^5SAj9 zN`xb`1_y?>Z{L9|x#-iM5R5As6;Mdoaqu(EmM)MTrj5!1+IpM$X~uPmo1v+gB9Iu# zoNQ-Z7a5co)TD-#a$t1W=e(t*WzDng>BKl8G#m~~DbzP9Sw$l;dK%Gav@(LY-*Y0t zx!XT7FrG;GoKZ?S=N@BB`q)4dnN&r2)tr_#ghTlWYKgEJj!4t2tgfo6uH3(C*M{G2 zOeRtsNyfOcX0>d4+0v!&@7|>*Oq9v>$lyR(Bs9(((+I9>UpqKFu;;+OkALDL?0Cni zv&UAiSb6^3souWPl^Tu&rkzZul+|j-$&TL9p^ts~ zV+ZygeC3T-2!c<2=JR#&rje1vmGhTge)WafHSv#s@{?8|P!Wrk5mD zM}R1X%BooZ&|qz2yn1%+@uM9#u3oRNuU*&P&Ly}`#vs^dE@N)Aq5=S1-zCIAPca&e zhR(2Go**ER;GUCpG8x7{`0)hyDB|u6z(c;$DRxX5Tni!*%D_3G5)Fh29jq&C>&vPux{@T~S#(buJ zBEhhF*RsV+=e5rDeI^j7kvL=QbD#ShA%t_@*xc06)QAvb%tJZ<)%gqN?|gq}ysqw> z-}>fQA|Zr`#>!pS#Xvsy>CYe#ufP6!V?$F-?Q9`@0GM$PLC`%1HJYb7XT$;<^)0O= z5KO1jlv2sL?=xR=t0FRy%0^?A1RJObAw(*b3Wh?QF`u~v6Wg}4*{ne+##m{bVHlJU zHQ-I9)9R&kI*Aa%mStgpg=O^x5a04Tr*cV^RPh7*j$W#|6NtbaKUt6}2^Wkw{n#@NGNj`y4&R zXfzu5%U3qvH{U5Pn*+qAX(u%M^#KBEg#K1A~z$mc^;=NF^%j@Pl&ApQ?7j#Yf$D>WL8=J6O!ON=xcjpj*r$SMHh0SRJ07L#HD#eHjv z!IR=?t|-m{rF_KQ5;Yo)&KU(vUa!M(ZUZV1Exw@uwc)!lE_w;;86k~E^Eg8VOkOZ3 zuqebJiUmsmlDYlew%!~W)Ro>u+BHZdXxXuFBso4zF~|=ph%uKEW2}r%qvhpD$V@t8 zm;@*(+0RB6#W20Uia>}^nn|ZA#)Qz~yA)@pMSJoX3$Z{N&6A1F8ATxgAwh7gHiRr| zAeA2H=yLz?(aYB^clQn?Cwz${Adm=hd8J9QU@RC2XEMIzA{?}&1PT;OjO7fzA`~t2 z1`N#gLbg3c7Bw1;<^e!uaeD|TrG^N}dodHB4k<@;EaMC@3D`;mBIi0g2U00w;n_ip zViEwL3?U>e+p?*Zae;H+gsc!OWR-ay1Gs+@kEu({o@92&fsU@8Q?~~O ze12ne{N~WunB)0eB8egAzjfu@g}?l>KfiVJjvWYwDBZJt`=!oK=5vH_(S`~^NeWjR zm=XYGORW$>plK--DVDxKqtR%lgMus^T)uoM7ORZKa%NQ|KX;6aN3ue)PjjE@OvZlEd0~cg(N9W;7xA&asI(qT;(JS2- z`;&tX$(j)dTWNtiuU@}$^VabA7^Y@09LAIiAr?F{FEKjQdH$T|F-pylZ5al+aN+#F z|NDO)J9hls`3rmZ?%(v@rlUuX-oD)}ggBQ&1$_epqoZRzJ-x5L{>JmqKY#M%NdV~T z>e{hwyE2VYa!D{&Hm$pM?NZjPmTf)w2@O4z)@XDMjB*)Gr&HbC-Hfw_crBWOhs~X5 zyXdTXOx=WwvUb!rLXKrHYG(S!Z2?_3?o4!FU(s6c6OkK;OIJ$eUA1&U>**6mTB@VM z3TLyKlgEy}ziX%R$vSfENL^jr3fdAwGM%_`?MkE~avOJmdJ%a`-E ztJ`*Li&e!A9Ne$O@vC3?3P(JVO6=LchjX5BGf^BBAf|1&4N&4aBZ$XJ8L`Ajqj}uW z%19|`YnylG?5WX_k*UfE01RVhmzCAGU=pOr81v+~Cp_j;AhsF86C++?Y{BX!RTbr& zvrNVf+3IxAVa_x2+XjdFPn|#S3MnyMyWZ8;-xrL8R7$vh{d0YN{p;7SZ)|K-!|F?y zFXb{;p#lIXt0*5B9{9;memuLX`sJ5i?(V*A1nA0@%m3fAAG&tyn#vqM`jL-*@k?I< zLdKF~lT%$ldGNg^X&^+gZfYgcXf)G7i}NOo;LfcZh>QAo9RMlRt4M({7J!ro775rH zCNTzALdp|k6Hbbua!O1Oxg+E4ZLObJwY*#+aJdn%d?|dv7?LDnEm*Z|$2*%ZUFuxj zz8c0yo8~lq>s#Mcrc{pOWHKos{Ic@!tg6_V(0!Uwjvh$y`?ySP%f5glaJLy3@njG^H`&EMm26#LetjP zrfm62^<^*(ll#J#Zk91G%P>MgLIc8M6XRdp@Z85&&aJT#_A&yHf=e(00ZeHklWJ^k zT(EdiM@L7-b=J18?Rw$bE3dq)#>nf|t*fe<_14>OS5!pfwY6u@oQdbs)q@8QD67?I zEVgLTqJRG9e~OlsS69z&ZfWi~-VupJ3`5;Guwml{^;KVe<<-x8{PX4!U5a*!4H0LvSnC?gEkHTaZr6_b1X=u z?}mdxBz%DoNP#c}L&3U09dmswaWEJP)CVx7>LY4Z0@%=q5KmSn7 z5C8}QhKN~SIXF7e+dnumGA1PWAggEBw$5o5*$G2>Y9o^69T6B{q(A~ol#e732?&so zLgunJdB4vU1veOpOZXh{yMY8Cr~sb!o>EF(v#il*9+=-WM-mY86GK7f)&Iuap^o!JnGhESm&@$EE=thC6HX;$x|Fp zka4R(8ja?Gqm^++U|D!x336(^u=pb>Y3V!^X*3$mBX{D*xlN`_. + +Functions +========= + +.. py:function:: set_labels(*labels, timestamp=log.SECONDS) + + Set up the log file header. + + This function accepts any number of positional arguments, each creates + a column header, e.g. ``log.set_labels("X", "Y", "Z")``. + + Ideally this function should be called a single time, before any data is + logged, to configure the data table header once. + + If a log file already exists when the programme starts, or if this function + is called multiple times, it will check the labels already defined in the + log file. + If this function call contains any new labels not already present, it will + generate a new header row with the additional columns. + + By default the first column contains a time stamp for each row. The time + unit can be selected via the ``timestamp`` argument, e.g. + ``log.set_labels("temp", timestamp=log.MINUTES)`` + + :param \*labels: Any number of positional arguments, each corresponding to + an entry in the log header. + :param timestamp: Select the timestamp unit that will be automatically + added as the first column in every row. Timestamp values can be one of + ``log.MILLISECONDS``, ``log.SECONDS``, ``log.MINUTES``, ``log.HOURS``, + ``log.DAYS`` or ``None`` to disable the timestamp. The default value + is ``log.SECONDS``. + +.. py:function:: set_mirroring(serial) + + Configure mirroring of the data logging activity to the serial output. + + Serial mirroring is disabled by default. When enabled, it will print to + serial each row logged into the log file. + + :param serial: ``True`` enables mirroring data to the serial output. + +.. py:function:: delete(full=False) + + Delete the contents of the log, including headers. + + To add the log headers again the ``set_labels`` function should to be + called after this function. + + There are two erase modes; "full" completely removes the data from the + physical storage, and "fast" invalidates the data without removing it. + + :param full: ``True`` selects a "full" erase and ``False`` selects the + "fast" erase method. + +.. py:function:: add( data_dictionary, /, *, **kwargs) + + Add a data row to the log. + + There are two ways to log data with this function: + + #. Via keyword arguments, each argument name representing a label. + + * e.g. ``log.add(X=compass.get_x(), Y=compass.get_y())`` + + #. Via a dictionary, each dictionary key representing a label. + + * e.g. ``log.add({ "X": compass.get_x(), "Y": compass.get_y() })`` + + The keyword argument option can be easier to use, and the dictionary option + allows the use of spaces (and other special characters), that could not be + used with the keyword arguments. + + New labels not previously specified via the ``set_labels`` function, or by + a previous call to this function, will trigger a new header entry to be + added to the log with the extra labels. + + Labels previously specified and not present in a call to this function will + be skipped with an empty value in the log row. + + :raise OSError: When the log is full this function raises an ``OSError`` + exception with error code 28 ``ENOSPC``, which indicates there is no + space left in the device. + +Examples +======== + +A minimal example:: + + from microbit import * + import log + + # Set the timer to log data every 5 seconds + @run_every(s=5) + def log_temp(): + log.add(temp=temperature()) + + while True: + # Needed so that the programme doesn't end + sleep(100) + +An example that runs through all of the functions of the log module API: + +.. include:: ../examples/data-logging.py + :code: python diff --git a/docs/microbit.rst b/docs/microbit.rst index 9c13a85c1..b3ee95969 100644 --- a/docs/microbit.rst +++ b/docs/microbit.rst @@ -76,6 +76,38 @@ Functions :param n: An integer or floating point number indicating the number of milliseconds to wait. +.. py:function:: run_every(callback, h=None, min=None, s=None, ms=None) + + Schedule to run a function at the interval specified by the time arguments. + + ``run_every`` can be used in two ways: + + * As a **Decorator** - placed on top of the function to schedule. + For example:: + + @run_every(h=1, min=20, s=30, ms=50) + def my_function(): + # Do something here + + * As a **Function** - passing the callback as a positional argument. + For example:: + + def my_function(): + # Do something here + run_every(my_function, s=30) + + Each arguments corresponds to a different time unit and they are additive. + So ``run_every(min=1, s=30)`` schedules the callback every minute and + a half. + + When an exception is thrown inside the callback function it deschedules + the function. To avoid this you can catch exceptions with ``try/except``. + + :param callback: Function to call at the provided interval. + :param h: Sets the hour mark for the scheduling. + :param min: Sets the minute mark for the scheduling. + :param s: Sets the second mark for the scheduling. + :param ms: Sets the millisecond mark for the scheduling. .. py:function:: temperature() diff --git a/examples/data-logging.py b/examples/data-logging.py new file mode 100644 index 000000000..c3decb641 --- /dev/null +++ b/examples/data-logging.py @@ -0,0 +1,42 @@ +from microbit import * +import log + +# Configure the labels and select a time unit for the timestamp +log.set_labels('temp', 'brightness', timestamp=log.SECONDS) + +# Send each data row to the serial output +log.set_mirroring(True) + +continue_logging = True + +# This decorator schedules this function to run every 10s 50ms +@run_every(s=10, ms=50) +def log_data(): + """Log the temperature and light level, and display an icon.""" + global continue_logging + if continue_logging: + display.show(Image.SURPRISED) + try: + log.add(temp=temperature(), brightness=display.read_light_level()) + except OSError: + continue_logging = False + display.scroll("Log full") + sleep(500) + +while True: + if button_a.is_pressed() and button_b.is_pressed(): + display.show(Image.CONFUSED) + # Delete the log file using the "full" options, which takes + # longer but ensures the data is wiped from the device + log.delete(full=True) + continue_logging = True + elif button_a.is_pressed(): + display.show(Image.HAPPY) + # Log only the light level, the temp entry will be empty. If the log + # is full this will throw an exception and the programme will stop + log.add({ + "brightness": display.read_light_level() + }) + else: + display.show(Image.ASLEEP) + sleep(500)