From a25ea1aa35770a50b2a5cc465bedb80f303937bb Mon Sep 17 00:00:00 2001 From: 0x1abin <270995079@qq.com> Date: Thu, 22 Mar 2018 14:50:51 +0800 Subject: [PATCH] updated the I2S module --- .../internalfs_image/image/SFArch_48.fon | Bin 9286 -> 0 bytes .../components/internalfs_image/image/boot.py | 15 +- .../internalfs_image/image/config.json | 1 - .../internalfs_image/image/examples/main.py | 34 ++ .../image/examples/mqtt_example.py | 22 + .../image/examples/ssd1306_spi_example.py | 27 ++ .../image/examples/tftdemo.py | 283 +++++++++++++ .../image/examples/thread_example.py | 145 +++++++ .../image/examples/webserver_example.py | 61 +++ .../internalfs_image/image/flash.sh | 2 - .../internalfs_image/image/fonts/BigFont.fon | Bin 0 -> 3052 bytes .../image/fonts/DejaVuSans12.fon | Bin 0 -> 1166 bytes .../image/fonts/DejaVuSans18.fon | Bin 0 -> 1836 bytes .../image/fonts/DejaVuSans24.fon | Bin 0 -> 2732 bytes .../image/fonts/DotMatrix_M.fon | Bin 0 -> 4192 bytes .../image/fonts/Grotesk24x48.fon | Bin 0 -> 13692 bytes .../image/fonts/OCR_A_Extended_M.c | 119 ++++++ .../image/fonts/arial_bold.fon | Bin 0 -> 3052 bytes .../image/fonts/swiss721_outline.fon | Bin 0 -> 3052 bytes .../internalfs_image/image/func_point | 0 .../image/lib/LoRaReceiver.py | 13 + .../internalfs_image/image/lib/LoRaSender.py | 14 + .../internalfs_image/image/lib/bme280.py | 206 ++++++++++ .../internalfs_image/image/lib/config_lora.py | 30 ++ .../internalfs_image/image/lib/controller.py | 122 ++++++ .../image/lib/controller_esp.py | 163 ++++++++ .../internalfs_image/image/lib/led.py | 11 + .../internalfs_image/image/lib/sx127x.py | 389 ++++++++++++++++++ .../components/internalfs_image/image/main.py | 127 ++---- .../internalfs_image/image/spiffs.info | 11 + .../internalfs_image/image/www/favicon.ico | Bin 0 -> 7902 bytes .../internalfs_image/image/www/index.html | 28 ++ .../internalfs_image/image/www/pdf-sample.pdf | Bin 0 -> 7945 bytes .../internalfs_image/image/www/pdf.png | Bin 0 -> 4551 bytes .../internalfs_image/image/www/style.css | 36 ++ .../internalfs_image/image/www/test.pyhtml | 34 ++ .../micropython/esp32/machine_i2s.c | 138 +++---- .../micropython/esp32/modules/m5stack.py | 2 +- 38 files changed, 1833 insertions(+), 200 deletions(-) delete mode 100755 MicroPython_BUILD/components/internalfs_image/image/SFArch_48.fon delete mode 100644 MicroPython_BUILD/components/internalfs_image/image/config.json create mode 100644 MicroPython_BUILD/components/internalfs_image/image/examples/main.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/examples/mqtt_example.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/examples/ssd1306_spi_example.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/examples/tftdemo.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/examples/thread_example.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/examples/webserver_example.py delete mode 100755 MicroPython_BUILD/components/internalfs_image/image/flash.sh create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/BigFont.fon create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans12.fon create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans18.fon create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans24.fon create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/DotMatrix_M.fon create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/Grotesk24x48.fon create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/OCR_A_Extended_M.c create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/arial_bold.fon create mode 100644 MicroPython_BUILD/components/internalfs_image/image/fonts/swiss721_outline.fon delete mode 100644 MicroPython_BUILD/components/internalfs_image/image/func_point create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/LoRaReceiver.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/LoRaSender.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/bme280.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/config_lora.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/controller.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/controller_esp.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/led.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/lib/sx127x.py create mode 100644 MicroPython_BUILD/components/internalfs_image/image/spiffs.info create mode 100644 MicroPython_BUILD/components/internalfs_image/image/www/favicon.ico create mode 100644 MicroPython_BUILD/components/internalfs_image/image/www/index.html create mode 100644 MicroPython_BUILD/components/internalfs_image/image/www/pdf-sample.pdf create mode 100644 MicroPython_BUILD/components/internalfs_image/image/www/pdf.png create mode 100644 MicroPython_BUILD/components/internalfs_image/image/www/style.css create mode 100644 MicroPython_BUILD/components/internalfs_image/image/www/test.pyhtml diff --git a/MicroPython_BUILD/components/internalfs_image/image/SFArch_48.fon b/MicroPython_BUILD/components/internalfs_image/image/SFArch_48.fon deleted file mode 100755 index a7d128eb474ad72fed29783fbbe9aa6af3eca027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9286 zcmZQjV_;CwW?*0tQsm}UU=m<>z~AtP{XsqR5BY2et!G&$3K7ktF!0tKX~wgGPk-6vn~T4!v_Wi zJLU%r3^nWz7#RNWA7EhoA>Y8j{K1}qf&D=pgZ%&h|Nqqg|NsB*e;D`-VjMtK#=w8z z4+BW?2mAm3|9=3fcnBg6g9zr&4?w0JsAFJ|Z}`K&V9)r2fuWB10|P?^$kGD#1_l*w zc?Cu#29Rq&;vixE2Mmn=|1ik^|HttE|9|HH|Nrs-|M|!M@rMuf{0|uZ-#@_c|33r6 z|NjjP_5Tkr*#CdP!2bUO81vtMz+m71fT526_<=w6^Z)<$p1gU!2AQ`2mXiu{x>k#H-E5iV5sLmP!E!9sAFLM zVbA!70Tk^Y7~~u3h!QItGS+VD!I%;s5^! z_5VNE|Np@M{{zGS2cV$(0}ikX26b+BZWckCzrVk~zrVk(ra*(6M}b9%@qs=2hkyJJ z|HwE0uxI~J$Nr#>|G^*r14!rrNRa)5J@W^7h6kG5JPOQ0?4Shqj~^sc50H0_A59WfRhUU|A+to|EvH1|NQ^|KmY&#C;uOmLm*NIK#5jI zjgyO+pO3%)`Qy*OfByMn!=NiI%El_s!2j_7|M~y_{r~^`|3CR340@`ZY|H|3^7GF> z|L{SdTTp>fn1PRhzk&Y%`vc|=%s&`^F#ciq$56*m&tT7B-yna0{{a63_77mGKM1J? zd9W1w1NIM$9~cT447g<#Sk)Np4=}L*KfqA`zk&V#KZg4MKiGfNKd5i0Z~npf&%S~E z;|~V;`3D&O{b6AK{(wP#KLaS`fYPA-9|p$%;Pk-o_Xh*}`vVO1bqpZo_WcK#f7CPB zAN<4ohyO$U0sH@d82~z|Nj`larB4(k9^|~<_~rZ z{}>zO8yMI>FfjjNVEE4f@*w{Q2KFBejQKmYZkmNrG279oBKsmaO0hIh1e=z^I z2L=59KmY긝!Ttw>F}IWgixLCK4`AE=gHufV1N#RIjG&SUtdso%s9<0OB^?H4 zP+%Tl{(k@zSoZ(H0mc6V>>5x31uDoG806nj|6wrUmQ-L; zl3?JMXW+lz!2bRK^Y;ggzdtbk{Q-)F`WgoNe~?_*!2bULI0!y4{{O-FAC!C<|KC6O z|NZ~}pFv6P?;ra=|JXm&gMBG~02K0|Q27CNbR7eOoGHj($_)GZ z2bEx8SFwL!V5nyRxeQc{$b;$;usHMoAK;`2j#^MO{P@rC|NH^Qe}5SG-ydM8|HA+Z zTze4p0F>_dpMPNdXMf=T;s5`C$p8NjNpC+uk!}u3EeiGjAISd)$$|>?2cWdWfXJxw z2SBL>OKuBj5h` z$G>{{^AA5*FxUtQi!w?wFgGy%02NRVNts|A1<(e+>K&82>TUACUjS{GZ|f1Nk3}|3E3=1A{%cv;wOl zJ1B4eZ-iv*{9xe!0WM=8X$6#L>LAsC z0?2(}TmY(UV5v*Kfr0S>1A_y%x&n(n14I1*1_u8BKNuM5|AW#oxYYtGfq$_7WBlL1 z_>cV$KjRaru{lPzZ_V$n*ba|4=9YkN?0Qdr%Ep z|HFR%gWn(O{~!GRp#FdR`v>*^`}+^n@Bc3k$}si~4E7H|1gQLDV6gwdz`$S+vK>l% z05!x8fLb05436B=3XJlg;tUiD_CG-7HmF{#vuBWRf586X55ph%1NNX&8BExLDr9is zTgOnxe}Mn+AI2Z`KkWJcAAkJ+AE+7FfBgT)AM*d|8UCMt!2a_GL;ZdR_U{isr5XSI z2F9Nc7-XEdB^8+Eam_6+s%4f6d5_>VtefBb>{;}8B1 zKkPsJ|NjBp*mwZe@q_>WfA)v}n?J}u{J{R<2jibV4FBpF{@XMDm;e92{r~@FP?_+L zf&T-8Gq;2SlME=K+karF|G@w%$o??@sAK<7#}8_L)X5*HlW(ZAZ>Y0pu(1c1PIcfc z@(*0SLmD(NlH(79T^+-}diHwhrFgA(EYhWh`1Kuw7{ z{(t-j>>vJM{A0%;fBXRBj~@*7^BI^wKVYc)11jtpe}7=GuLD)4j6Xjx*xNDiA3wnS z^9RE}dj|XV2mBBIu>X*6{KxzeWZ(gCE9(b?Jj5}s+)@h63ZROi9#j(ifrKKW?B<6S z(R>Vb_MoDM{r^8^P$T&dC@IK40OcE~Vta6P#{7Yy;19^+|NRI5KZb-h*fS46b*3A) zxB{~jgZ&R?P@(mq9#k$hgEAQ?Q`s{x)PRZ)#t#h45BS&*{*#~o&;I|9dQb}=R2+fZ z$@~YPO8e&DH z{|6O6@Ydardiw@`XoSkcl-tj5VE_C9ln~|n4={iH!BA(%z<;=b;e#i)kRr2~{D1lX z&p|z;`u`1o7(k6m<_`>i80r}08`vK(f*P1u7ze;=>>2n!$p7R2fBgT0|DZmX7q^50 zgAAxyFaHBv?1NkRb&!M$3J!2FWRIJyhbQzJkk9|sH~gu8_{aYLAO8P8*g-`eDAv6} znN*&SfsemIzWspw;Ro`EKgd7)A^+fy{DV6A2lnz0!GXYuf*Tv&A1!>%JbG z*nGLw6qvLbEFhuxgMt46^9OJnn&BTqJp=m>P}l7P{|AQp1NH|%wN?ZFANGF?_CMr* zF#dl4s&$+HACTY2|DWOCpSnNHpFjToz<>Vu^9T0w`{f&d)cvVrfB5^uANl70hd+Sw z{^1YyKkWMt{C`kq&-kD5#~=1T?9U(Ye~`c5U=OOW|1tdi!T5vu`vLX?{O1_>8RY!9 zs0Z~Q8UFBpVE$l#fdAls2K)9u4FBXmF#f1N!2b9@gM9xVhC2HX zj6eP#VE+8Sf&czL2K)LS41fPWVEzu`{%5eS|HJV2^9T0-=O4)Lw{Q6Or;hpe$3ODt z5C8aY&;S3&ANl`>KiL1{Z>awu!(h+g54IgteS*RZ)YkhC=@Ho<_V$sO$oD2AKapVBiO}yg^-r51`@<+;IT)AwGX#kU#!_p-#R5)JKp% z@Q>ji^FRI{?EgV+8c@3y(xZ@nzz_gxoXX4pXOIV_LQvZcT$MD`KYqac=LfiOJm0|l z`2o0HT*pv9zoGv4gZhU*>Ou8_JjkIR82^6&B|dp@-xgFq!`rk-97v@c$StqNqzv*a zsBUKmSH^!pH8bOX_CKIx!2f{xk3HDY%s>Ayuz&sm&gK074}g6t4{8MeVE|Pqpr$UU zW5f=UI)C7S{QTwz_4fS-|Jd^%|4=VK|3UqJP*Dc%YJmqK>i;u<3vp2U5|ordZUeQ8 zK^;nV28JMR83krVc2IK?tcM@cCT9Lq|AYVF{{w&6|L`A>fAELlAO8VR&1}zqfce7@ z27CSn5LM6L!2j?E<3IU^`h!2@f5^`VHT56J|Np`G9~9UP5b6Wt&;Jeb?SB}5$Ul&0 z_`~plxgnTaT7gM{LH+}%w-0IUAE^KTNB%+m;SbC|>KNqsq21jBpyC@8ZlKiJ{158eK@Aj8uLM+S*MpmlVcfC`O!5^BjL#w6>c4*&_@6&u zsIzBa|M-W&9@MqBXOM6F0cvJ}`n`V`f3P0_4X)WUKLCwEus{63U@zYQYD2J}KfqvL z1Lo^)U-SR?)8EOkm@0!#LmDF&aI)qq+`Lrz#vn@AOLE?)PVX>kdhx% zUHt>q`~MjJ*facN{A17fkMR$v)d6mLfQb+M&Hvdy@E`uq{(%4RfBpyj$N%#mV1NE! z9z@J{BKSeY0z0U44(?we2vEwe0TC9A4;Ui2 zr4*Rt_`xGKj6WDY)PvfV_RT-!57hC0kU#!|`Qsmkf1pGRs#8G2P44Z4fg#HzyqQ7%|G}b{$c!62MRv^=LbM}P9~CDR)JB;f`Nhg0jT56Q1b^I zmG=7?K;?`4`vVOB>loO7e_*J;-@yE@j=}!(2j>6t57_^yX9l&7_VfS$`NRHyf5ZPD ze;EEFr7}>P{|~r91?peQKLFK%Ajk6m19t!ze=tOG%PBA^*@G%sa3k@L{Qv(y?EiyP z{Q+>b400ee20>j@P$v7&0P2!}n)0Ah11bp$NPB36e*kx*VUqTsflEeED;PA+05Tms zDkJ}oA)1?4fkl-4!TaPspM3L=dieu?>X|?P;D7(Xem_H91>+9}<^%B>!pv;) z|Nr0r|NH-ch6Dy4P9^~x_6POsKkN_w<9|@cd?1mmUeO0or=N^o(Z>f2GD)Cj5N5AP zo`hb}KWMM$2lGd8uc)q$0o3+D=@rR;U`R&viXJe4k|L;K&;H{N`-eY}5n1^Ipu}O{ z@W-B^0y1O(XD4PrL+=$m`2QbwuZVyCKY38E z@dIe&?*TJWy`pqbijW1>X7=RvivAPVE6M;hzm(({*!vHFx!vhQjncSQTOuYR3#~*+G`R8A~ z{rvvpk3atSQ&(p%4`%)N17SV*kVTiSPBti6eG;&wxH>d>;>U7uh|FCcVFW*oP@9O;fz#x|cvWYHTom_5pSXYPP2SW`5^ACnU z4D276L7g7Z+|&d92jFfF!~cf*25?`8{U4|t{Riss{E-J0r}lps{(h+c!T9^*?+@(H zAAg5*cI5l-_aCT}-!I?r$G%R!@rV5%d*%=IAL{rI{D1IIzTy9YKj7X@9rHitk3X3I zuz&u*{sYwSdBA`E0RI8``3&+6_A(4|3^sY(vI;D!%m>2DBe=z<4O=bLJr~^5& zzCr#lsJHWg`6HyK^QZm+sMBLF|AXPr{{!sr!JQq(-=Klce++g1KY;o?^84x-|9}3# ze}8@hs4w>Y@rQbQ`Qtx-)Pn{!e$=u5Z+;;EgO9&=}S~&>#srq&No6 zn}X(L!ChfcdkQwU0d6ZZA7Ef8hCcAv2S4bSI+>(pz(xyXh+8$)RjWR^`K689Xmr^9e=~0dVWxk=kX8w{^vjBpM&NE zLA_=0Fe?M7UCjV80n{W1wTr+QG`ngCYLqe*fttpkE)Qr%L>^Q;f?GyEEZfQb~q^@$dssKL9k& z1)9bC{{WPlKr;m3DV77E$im8F|9=29bjkky0ch9=)PMO`&%l5D11R0tH~(S&A^!k0 z8S{bvKdA3|0MsF8{=rZNieD1DJ`Zqoecppd9Y9?)@Q4G}t`Dd?_<@0eoq?fzNOXNF z=-TzE9I&oW713QEPz-{WiaY=hEWkQCppMl8a2E+C@{a*rrrAR#7(x9a++Ck)ZZQQ$ zX;8NWH0RJz|Bw0q1O5jLb)b0<$W)kp1BeHn8VGi*KVT2Cm;VFEF`&vCG-vk*H0o^+a;p7-`ak^t z57hqwO?EwCsFRT6Wl?7kV5ngK!Tg~f)JuP0FApjN?U+CRsNlbU@Izf4^WmRA`2Qb& XVE<2^q5cDC%;tYkfJb~ 0: + print("WiFi started") + utime.sleep_ms(500) + + rtc = machine.RTC() + print("Synchronize time from NTP server ...") + rtc.ntp_sync(server="hr.pool.ntp.org") + tmo = 100 + while not rtc.synced(): + utime.sleep_ms(100) + tmo -= 1 + if tmo == 0: + break + + if tmo > 0: + print("Time set") + utime.sleep_ms(500) + t = rtc.now() + utime.strftime("%c") + print("") diff --git a/MicroPython_BUILD/components/internalfs_image/image/examples/mqtt_example.py b/MicroPython_BUILD/components/internalfs_image/image/examples/mqtt_example.py new file mode 100644 index 0000000..cbd7a86 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/examples/mqtt_example.py @@ -0,0 +1,22 @@ + +def conncb(task): + print("[{}] Connected".format(task)) + +def disconncb(task): + print("[{}] Disconnected".format(task)) + +def subscb(task): + print("[{}] Subscribed".format(task)) + +def pubcb(pub): + print("[{}] Published: {}".format(pub[0], pub[1])) + +def datacb(msg): + print("[{}] Data arrived from topic: {}, Message:\n".format(msg[0], msg[1]), msg[2]) + +mqtt = network.mqtt("loboris", "loboris.eu", user="wifimcu", password="wifimculobo", cleansession=True, connected_cb=conncb, disconnected_cb=disconncb, subscribed_cb=subscb, published_cb=pubcb, data_cb=datacb) + +mqtts = network.mqtt("eclipse", "iot.eclipse.org", secure=True, cleansession=True, connected_cb=conncb, disconnected_cb=disconncb, subscribed_cb=subscb, published_cb=pubcb, data_cb=datacb) + + + diff --git a/MicroPython_BUILD/components/internalfs_image/image/examples/ssd1306_spi_example.py b/MicroPython_BUILD/components/internalfs_image/image/examples/ssd1306_spi_example.py new file mode 100644 index 0000000..6dec2ef --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/examples/ssd1306_spi_example.py @@ -0,0 +1,27 @@ +import machine +from ssd1306 import SSD1306_SPI + +WIDTH = const(128) +HEIGHT = const (64) +pdc = machine.Pin(27, machine.Pin.OUT) +pcs = machine.Pin(26, machine.Pin.OUT) +sck_pin = machine.Pin(19, machine.Pin.OUT) +mosi_pin = machine.Pin(23, machine.Pin.IN) +miso_pin = machine.Pin(25, machine.Pin.OUT) + +prst = machine.Pin(18, machine.Pin.OUT) + +spi = machine.SPI(1,baudrate=1000000, sck=sck_pin, mosi=mosi_pin, miso=miso_pin) + +ssd = SSD1306_SPI(WIDTH, HEIGHT, spi, pdc, prst, pcs) + +import freesans20 + +from writer import Writer +wri2 = Writer(ssd, freesans20, verbose=True) + +Writer.set_clip(True, True) +Writer.set_textpos(0, 0) +wri2.printstring('MicroPython\n') + +ssd.show() diff --git a/MicroPython_BUILD/components/internalfs_image/image/examples/tftdemo.py b/MicroPython_BUILD/components/internalfs_image/image/examples/tftdemo.py new file mode 100644 index 0000000..ddf72ea --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/examples/tftdemo.py @@ -0,0 +1,283 @@ +""" +Demo program demonstrating the capabities of the MicroPython display module +Author: LoBo (https://github/loboris) +Date: 08/10/2017 + +""" + +import machine, display, time, math + +tft = display.TFT() + +#ESP32-WROVER-KIT v3: +#tft.init(tft.ST7789, rst_pin=18, backl_pin=5, miso=25,mosi=23,clk=19,cs=22,dc=21) + +#Adafruit: +#tft.init(tft.ILI9341, width=240, height=320, miso=19,mosi=18,clk=5,cs=15,dc=33, bgr=True) + +#Set correct configuration +tft.init(tft.ILI9341, width=240, height=320, miso=19,mosi=23,clk=18,cs=5,dc=26,tcs=27,hastouch=True, bgr=True) + +maxx = 240 +maxy = 320 +miny = 12 +touch = False + +# fonts used in this demo +fontnames = ( + tft.FONT_Default, + tft.FONT_7seg, + tft.FONT_Ubuntu, + tft.FONT_Comic, + tft.FONT_Tooney, + tft.FONT_Minya +) + + +# Check if the display is touched +#------------- +def touched(): + if not touch: + return False + else: + tch,_,_ = tft.gettouch() + if tch <= 0: + return False + else: + return True + +# print display header +#---------------------- +def header(tx, setclip): + # adjust screen dimensions (depends on used display and orientation) + global maxx, maxy, miny + + maxx, maxy = tft.screensize() + tft.clear() + if maxx < 240: + tft.font(tft.FONT_Small, rotate=0) + else: + tft.font(tft.FONT_Default, rotate=0) + _,miny = tft.fontSize() + miny += 5 + tft.rect(0, 0, maxx-1, miny-1, tft.OLIVE, tft.DARKGREY) + tft.text(tft.CENTER, 2, tx, tft.CYAN, transparent=True) + + if setclip: + tft.setwin(0, miny, maxx, maxy) + +# Display some fonts +#------------------- +def dispFont(sec=5): + header("DISPLAY FONTS", False) + + if maxx < 240: + tx = "MicroPython" + else: + tx = "Hi from MicroPython" + starty = miny + 4 + + n = time.time() + sec + while time.time() < n: + y = starty + x = 0 + i = 0 + while y < maxy: + if i == 0: + x = 0 + elif i == 1: + x = tft.CENTER + elif i == 2: + x = tft.RIGHT + i = i + 1 + if i > 2: + i = 0 + + for font in fontnames: + if font == tft.FONT_7seg: + tft.font(font) + tft.text(x,y,"-12.45/",machine.random(0xFFFFFF)) + else: + tft.font(font) + tft.text(x,y,tx, machine.random(0xFFFFFF)) + _,fsz = tft.fontSize() + y = y + 2 + fsz + if y > (maxy-fsz): + y = maxy + if touched(): + break + +# Display random fonts +#------------------------------ +def fontDemo(sec=5, rot=False): + tx = "FONTS" + if rot: + tx = "ROTATED " + tx + header(tx, True) + + tx = "ESP32-MicrpPython" + n = time.time() + sec + while time.time() < n: + frot = 0 + if rot: + frot = math.floor(machine.random(359)/5)*5 + for font in fontnames: + if (not rot) or (font != tft.FONT_7seg): + x = machine.random(maxx-8) + if font != tft.FONT_7seg: + tft.font(font, rotate=frot) + _,fsz = tft.fontSize() + y = machine.random(miny, maxy-fsz) + tft.text(x,y,tx, machine.random(0xFFFFFF)) + else: + l = machine.random(6,12) + w = machine.random(1,l // 3) + tft.font(font, rotate=frot, dist=l, width=w) + _,fsz = tft.fontSize() + y = machine.random(miny, maxy-fsz) + tft.text(x,y,"-12.45/", machine.random(0xFFFFFF)) + if touched(): + break + tft.resetwin() + +# Display random lines +#------------------- +def lineDemo(sec=5): + header("LINE DEMO", True) + + n = time.time() + sec + while time.time() < n: + x1 = machine.random(maxx-4) + y1 = machine.random(miny, maxy-4) + x2 = machine.random(maxx-1) + y2 = machine.random(miny, maxy-1) + color = machine.random(0xFFFFFF) + tft.line(x1,y1,x2,y2,color) + if touched(): + break + tft.resetwin() + +# Display random circles +#---------------------------------- +def circleDemo(sec=5,dofill=False): + tx = "CIRCLE" + if dofill: + tx = "FILLED " + tx + header(tx, True) + + n = time.time() + sec + while time.time() < n: + color = machine.random(0xFFFFFF) + fill = machine.random(0xFFFFFF) + x = machine.random(4, maxx-2) + y = machine.random(miny+2, maxy-2) + if x < y: + r = machine.random(2, x) + else: + r = machine.random(2, y) + if dofill: + tft.circle(x,y,r,color,fill) + else: + tft.circle(x,y,r,color) + if touched(): + break + tft.resetwin() + +#------------------ +def circleSimple(): + tx = "CIRCLE" + header(tx, True) + + x = 110 + y = 160 + r = 110 + z = 0 + while z < 12: + color = machine.random(0xFFFFFF) + fill = machine.random(0xFFFFFF) + tft.circle(x,y,r,color,fill) + r -= 10 + x += 10 + z += 1 + +# Display random ellipses +#----------------------------------- +def ellipseDemo(sec=5,dofill=False): + tx = "ELLIPSE" + if dofill: + tx = "FILLED " + tx + header(tx, True) + + n = time.time() + sec + while time.time() < n: + x = machine.random(4, maxx-2) + y = machine.random(miny+2, maxy-2) + if x < y: + rx = machine.random(2, x) + else: + rx = machine.random(2, y) + if x < y: + ry = machine.random(2, x) + else: + ry = machine.random(2, y) + color = machine.random(0xFFFFFF) + if dofill: + fill = machine.random(0xFFFFFF) + tft.ellipse(x,y,rx,ry,15, color,fill) + else: + tft.ellipse(x,y,rx,ry,15,color) + if touched(): + break + tft.resetwin() + +# Display random rectangles +#--------------------------------- +def rectDemo(sec=5, dofill=False): + tx = "RECTANGLE" + if dofill: + tx = "FILLED " + tx + header(tx, True) + + n = time.time() + sec + while time.time() < n: + x = machine.random(4, maxx-2) + y = machine.random(miny, maxy-2) + w = machine.random(2, maxx-x) + h = machine.random(2, maxy-y) + color = machine.random(0xFFFFFF) + if dofill: + fill = machine.random(0xFFFFFF) + tft.rect(x,y,w,h,color,fill) + else: + tft.rect(x,y,w,h,color) + if touched(): + break + tft.resetwin() + +# Display random rounded rectangles +#-------------------------------------- +def roundrectDemo(sec=5, dofill=False): + tx = "ROUND RECT" + if dofill: + tx = "FILLED " + tx + header(tx, True) + + n = time.time() + sec + while time.time() < n: + x = machine.random(2, maxx-18) + y = machine.random(miny, maxy-18) + w = machine.random(12, maxx-x) + h = machine.random(12, maxy-y) + if w > h: + r = machine.random(2, h // 2) + else: + r = machine.random(2, w // 2) + color = machine.random(0xFFFFFF) + if dofill: + fill = machine.random(0xFFFFFF) + tft.roundrect(x,y,w,h,r,color,fill) + else: + tft.roundrect(x,y,w,h,r,color) + if touched(): + break + tft.resetwin() diff --git a/MicroPython_BUILD/components/internalfs_image/image/examples/thread_example.py b/MicroPython_BUILD/components/internalfs_image/image/examples/thread_example.py new file mode 100644 index 0000000..828d3f5 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/examples/thread_example.py @@ -0,0 +1,145 @@ +import machine, _thread, time +import micropython, gc +import bme280 + +# Setup the LED pins +bled = machine.Pin(4, mode=machine.Pin.OUT) +#rled = machine.Pin(0, mode=machine.Pin.OUT) +#gled = machine.Pin(2, mode=machine.Pin.OUT) + +bled.value(0) +#gled.value(0) +#rled.value(0) + +# Setup I2C to be used with BME280 sensor +i2c=machine.I2C(scl=machine.Pin(26),sda=machine.Pin(25),speed=400000) +# Initialize BME280 +bme=bme280.BME280(i2c=i2c) + +# Define LED thread function +#--------------------------- +def rgbled(n=200, led=bled): + notif_exit = 4718 + notif_replay = 2 + notif_count = 3 + x = 0 + _thread.allowsuspend(True) + while True: + led.value(1) + time.sleep_ms(n) + led.value(0) + x = x + 1 + + t = 10 + while t > 0: + notif = _thread.getnotification() + if notif == notif_exit: + _thread.sendmsg(_thread.getReplID(), "[%s] Exiting" % (_thread.getSelfName())) + return + elif notif == notif_replay: + _thread.sendmsg(_thread.getReplID(), "[%s] I've been notified" % (_thread.getSelfName())) + elif notif == notif_count: + _thread.sendmsg(_thread.getReplID(), "[%s] Run counter = %u" % (_thread.getSelfName(), x)) + elif notif == 777: + _thread.sendmsg(_thread.getReplID(), "[%s] Forced EXCEPTION" % (_thread.getSelfName())) + time.sleep_ms(1000) + zz = 234 / 0 + elif notif != 0: + _thread.sendmsg(_thread.getReplID(), "[%s] Got unknown notification: %u" % (_thread.getSelfName(), notif)) + + typ, sender, msg = _thread.getmsg() + if msg: + _thread.sendmsg(_thread.getReplID(), "[%s] Message from '%s'\n'%s'" % (_thread.getSelfName(), _thread.getThreadName(sender), msg)) + time.sleep_ms(100) + t = t - 1 + gc.collect() + +# For LED thread we don't need more than 3K stack +_ = _thread.stack_size(3*1024) +# Start LED thread +#rth=_thread.start_new_thread("R_Led", rgbled, (100, rled)) + +time.sleep_ms(500) +#gth=_thread.start_new_thread("G_Led", rgbled, (250, gled)) +bth=_thread.start_new_thread("B_Led", rgbled, (100, bled)) + +# Function to generate BME280 values string +#--------------- +def bmevalues(): + t, p, h = bme.read_compensated_data() + + p = p // 256 + pi = p // 100 + pd = p - pi * 100 + + hi = h // 1024 + hd = h * 100 // 1024 - hi * 100 + #return "[{}] T={0:1g}C ".format(time.strftime("%H:%M:%S",time.localtime()), round(t / 100,1)) + "P={}.{:02d}hPa ".format(pi, pd) + "H={}.{:01d}%".format(hi, hd) + return "[{}] T={}C ".format(time.strftime("%H:%M:%S",time.localtime()), t / 100) + "P={}.{:02d}hPa ".format(pi, pd) + "H={}.{:02d}%".format(hi, hd) + +# Define BME280 thread function +#----------------------- +def bmerun(interval=60): + _thread.allowsuspend(True) + sendmsg = True + send_time = time.time() + interval + while True: + while time.time() < send_time: + notif = _thread.getnotification() + if notif == 10002: + _thread.sendmsg(_thread.getReplID(), bmevalues()) + elif notif == 10004: + sendmsg = False + elif notif == 10006: + sendmsg = True + elif (notif <= 3600) and (notif >= 10): + interval = notif + send_time = time.time() + interval + _thread.sendmsg(_thread.getReplID(), "Interval set to {} seconds".format(interval)) + + time.sleep_ms(100) + send_time = send_time + interval + if sendmsg: + _thread.sendmsg(_thread.getReplID(), bmevalues()) + +# 3K is enough for BME280 thread +_ = _thread.stack_size(3*1024) +# start the BME280 thread +bmeth=_thread.start_new_thread("BME280", bmerun, (60,)) + +# === In the 3rd thread we will run Neopixels rainbow demo === + +np=machine.Neopixel(machine.Pin(22), 24) + +# DEfine Neopixels thread function +#--------------- +def thrainbow(): + pos = 0 + bri = 0.02 + while True: + for i in range(0, 24): + dHue = 360.0/24*(pos+i); + hue = dHue % 360; + np.setHSB(i, hue, 1.0, bri, 1, False) + np.show() + notif = _thread.getnotification() + if (notif > 0) and (notif <= 100): + bri = notif / 100.0 + elif notif == 1000: + _thread.sendmsg(_thread.getReplID(), "[%s] Run counter = %u" % (_thread.getSelfName(), pos)) + pos = pos + 1 + +# Start the Neopixels thread +npth=_thread.start_new_thread("Neopixel", thrainbow, ()) + + +utime.sleep(1) + +machine.heap_info() +_thread.list() + +# Set neopixel brightnes (%) +#_thread.notify(npth, 20) +# Get counter value from Neopixel thread +#_thread.notify(npth, 1000) + diff --git a/MicroPython_BUILD/components/internalfs_image/image/examples/webserver_example.py b/MicroPython_BUILD/components/internalfs_image/image/examples/webserver_example.py new file mode 100644 index 0000000..449290e --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/examples/webserver_example.py @@ -0,0 +1,61 @@ + +from microWebSrv import MicroWebSrv +import _thread + +def _httpHandlerTestGet(httpClient, httpResponse) : + content = """\ + + + + + TEST GET + + +

TEST GET

+ Client IP address = %s +
+
+ First name:
+ Last name:
+ +
+ + + """ % httpClient.GetIPAddr() + httpResponse.WriteResponseOk( headers = None, + contentType = "text/html", + contentCharset = "UTF-8", + content = content ) + +def _httpHandlerTestPost(httpClient, httpResponse) : + formData = httpClient.ReadRequestPostedFormData() + firstname = formData["firstname"] + lastname = formData["lastname"] + escape = httpClient.GetServer().HTMLEscape + content = """\ + + + + + TEST POST + + +

TEST POST

+ Firstname = %s
+ Lastname = %s
+ + + """ % (escape(firstname), escape(lastname)) + httpResponse.WriteResponseOk( headers = None, + contentType = "text/html", + contentCharset = "UTF-8", + content = content ) + +routeHandlers = [ + ( "/test", "GET", _httpHandlerTestGet ), + ( "/test", "POST", _httpHandlerTestPost ) +] + +srv = MicroWebSrv(routeHandlers=routeHandlers) + +srv.Start(threaded=True) diff --git a/MicroPython_BUILD/components/internalfs_image/image/flash.sh b/MicroPython_BUILD/components/internalfs_image/image/flash.sh deleted file mode 100755 index bf722b7..0000000 --- a/MicroPython_BUILD/components/internalfs_image/image/flash.sh +++ /dev/null @@ -1,2 +0,0 @@ -esptool.py --chip esp32 --port /dev/tty.SLAB_USBtoUART --baud 961200 write_flash -z 0x1000 ~/workspace/M5Stack/M5Cloud/firmwares/m5cloud-20180309-v0.3.6.bin -ampy put SFArch_48.fon && ampy put main.py \ No newline at end of file diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/BigFont.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/BigFont.fon new file mode 100644 index 0000000000000000000000000000000000000000..c7b3c4811036ff0e7db0b21c987fab21a5904a92 GIT binary patch literal 3052 zcmWd-P>5$B0;9m2POyp zAM!t>9HboNKk)xxieQS6{~`YYBo2}XVLkyq1HJ-=2aE@p8`v563U~@Q3P9oz%+Da% z0D}As{2crmVp7{Rz4UPll}lTmw^uq*%_D{7!NRffGOmM@E`i2mTKr8dVNi9fXa` z#qvMoe?U~=Cn5UbYM2<<82A`u7%UhNVaOl@m*)Q<-x-@)q(IauzZc z{BZw+T+G}c-yq+>j0EN3^862E3S=x$Ot+A+K)4hk&wPOS07C(Tg^Yzv0sjNI10FCw zV1B^%faih41F#PtFg##*zzp}P{0|uh2$X*y|ACSP~6EtO+fe`CJ*ux{|^SJPuUN^^n+-SdCcG#N3cNRFpLm| zupoH{EQ=B+G7NkS(DVmNZ(s!w0+hBuEEo-9gD{#76w^TR%m?^C$W=%{UCnra5$tXd z4Po*B00$0;_#*>>;Lw);zz&T8<^${x_zGa*iU?tl=^!ls0a60+S%A_vjEzVi>>v0* zaRN3K5|1(#d=~8R^dtX(uK=bCP8Z0-(}(;IJ_$Y!J_bGmu=xgj4164X5{UGLMV^6= zK_28ZFoxQ10ks<(zkC)j-!U-A6u_YT2l)>$whX+4;eP;$GgK0hei{Ej%LQ=xU{L^p z2zfbB30c7Rfd2rv6g|KP_OF};*l`RD4D#So2U7NcNe(^>ZguGBq+bAQ2gO24{W%4grWDm;{ABGa`IZ;}7Z@MEEg3 z;IH7b0BZyhH8Owre}MDBABYRk;vX892>-$J4+H-L_7C9PiJ$nH=Jbsb&FgLIt-~*Ls1&H{E$b(3T zxsY^#upg8oBrF6FIgdj|0#sIj>;_@>50LU0jfAIv0R{;Mv|Mb#AOo#v85kJYKOmroRKS(_&Ux3^OV&lX7pc1KoADTn>Z@|>bK~oGrJRN~@u{7L& zFm>R1pa5hWC@c}-$M6H*l z2h$6p`ENi>mMP%>018uB9Rzbf-v@pReo$ToV?_Feq)7$_{sRyegye^ojtmSC*E29M zqr{U;0nZ0^a2|u3Z@~vH1<><9s<{x;84n~`@sK$-vXo$gi-Z^^z%QE zF_1CfZ(x2PQ6Pa_|1&T$Ff*_-$RqMe0eb4rU~k|*0Ahp0kTED#LooXX<_DnGs64pFhpCZ&An`yD(n3{` zNkG(Jj6WbH20OS01l8^!J|i^!z~UPl4KZ210V2on0NnO?0O29*mY1=fV|m8{Y92%n Oj0_6!h)>JUD**s)8VlM0 literal 0 HcmV?d00001 diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans12.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans12.fon new file mode 100644 index 0000000000000000000000000000000000000000..36e76bfcb5c404895f976eba326fa4b26adf7b65 GIT binary patch literal 1166 zcmZSJW?)d@VqjokQDkJ~WMci>pv1_`%*eW}L79nzgON)}q+UhkpN5ADBO5mphvKOf z4<4;5Xkt)hjHD895$uI0>};Fk)l}Nk|AN zG;t{WF$OEE5^%IINUkseb0m@`dFdbGFa>jdaoF$(Bv+V$IhGQ3=OltF%)y*L0!;!= z91a#>PPIjGwMB7-C4{4qc=ke4ffWlQ8zajZYZgX!MwW9n%p7ctT+DJ09>_7j6VmJ$k09D)`uATM(MPqNI3Mv6)g3SL*XBX z!XGzKNU;A=)otlEdN~ebXJju*G9NXsAT5gf+!P_;NTEQsA6ViXJGx| z;^O?Envs>8i9?dZDWOG?t%i}2hl%C?hgwEfZbpuS98NqfiUxHopkQYx?E4=S;1Qpe HpH~6^ROtF6 literal 0 HcmV?d00001 diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans18.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans18.fon new file mode 100644 index 0000000000000000000000000000000000000000..0d609fb733721b76367eefd1052953c618ee8372 GIT binary patch literal 1836 zcmZP&Vqj35fx4Ws!)GKO9{*=opw7s|%E#e*iNW5_EW&Ss2-J9dtQZnHbssAJF4rVq#+ZpwGz0&%nlG*e3Cq$MBd$G7p0R zBPTB-x1Ifr8#Z$M?9B%s+&KUEfgvLYFB7-Lj~fzD@c+LNSY1uM;(-JM1F)$4`wzxo z!Mged4-70n{9$Koc<}%E0~1CrUPf+q#seF2ggK5G^8Ek*!GMRE!IY7Mmyx@!E+L_& z&YhW=x&2>_8CbiV{G1pbw$Fc$AAE4*{lf?5V0Hihv$3)9@$kq3grZ}=d`e4s*_z5e_IS8&w) z|9{}X0Wfjk|9>}-5Eq#D@81D1a0i*n#}6^J{lh=z13A10=Rf%2!N|qS#CPC>4L|dN z|Ns9pLs$nq8JT#Q*#7_jf53~8Rq#KX#4*F3WDxQ1fj7tiIwX?Y_Bp_IaDn$83@h*f1Y3@B>@>;Di4v#+dEkfnab_w39z4%y2-S`2!zgLx%OAI))H% z6#f7IACzezSqDmng3N)24>*uMm`VPVV+aFlIAF$>kj7?kmssHvN8KjC+u09bI1Bvx=DGZ!^ zjNFV32NH~L|A(k5|M@1Bg^P=kTVDQ|JoEqme;6C|iM|A{E(UJ2gjCML&&4Q^+;d#A&v4t}+_u~Na(ost1r`q~z)pR5BiZ1L9DB3DnZz9h zl`K4bNCxmTK+?_u8|H>8kXtza|7YWou`nq3|G%1nLy(D^UmjFmTYUIn0iq@3`D+-M vguvPT|A$(ziVr_PGBW)9G9X&w$A>yrP~u_WZ~uSz0mJ{G0FU^z{JatX&-s3b literal 0 HcmV?d00001 diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans24.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/DejaVuSans24.fon new file mode 100644 index 0000000000000000000000000000000000000000..5220bfc535e344df8616b83a8bf49af122a2e900 GIT binary patch literal 2732 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 literal 0 HcmV?d00001 diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/OCR_A_Extended_M.c b/MicroPython_BUILD/components/internalfs_image/image/fonts/OCR_A_Extended_M.c new file mode 100644 index 0000000..1104238 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/fonts/OCR_A_Extended_M.c @@ -0,0 +1,119 @@ +// OCR_A_Extended_M.c +// Font type : Full (95 characters) +// Font size : 16x24 pixels +// Memory usage : 4564 bytes + +#if defined(__AVR__) + #include + #define fontdatatype const uint8_t +#elif defined(__PIC32MX__) + #define PROGMEM + #define fontdatatype const unsigned char +#elif defined(__arm__) + #define PROGMEM + #define fontdatatype const unsigned char +#endif + +fontdatatype OCR_A_Extended_M[4564] PROGMEM={ +0x10,0x18,0x20,0x5F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // +0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ! +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x1E,0x78,0x1E,0x78,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // " +0x00,0x00,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x1F,0xF8,0x1F,0xF8,0x06,0x60,0x06,0x60,0x06,0x60,0x1F,0xF8,0x1F,0xF8,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // # +0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x1F,0xF8,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x18,0x00,0x18,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // $ +0x00,0x00,0x1C,0x00,0x1C,0x18,0x1C,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0xE0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x07,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x38,0x18,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // % +0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x0F,0xC0,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x0C,0xC0,0x07,0x80,0x07,0x00,0x0F,0x80,0x1D,0xC8,0x18,0xF8,0x18,0x70,0x18,0xF0,0x0F,0xD8,0x0F,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // & +0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ' +0x00,0x00,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x80,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ( +0x00,0x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x01,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x01,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ) +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x19,0x88,0x19,0x98,0x0F,0xF0,0x07,0xE0,0x03,0xC0,0x03,0xC0,0x07,0xE0,0x0F,0xF0,0x1D,0xB8,0x11,0x98,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // * +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x07,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // , +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // . +0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // / + +0x00,0x00,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 0 +0x00,0x00,0x1F,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x01,0x98,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 1 +0x00,0x00,0x1F,0xF0,0x1F,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0xF8,0x1F,0xF0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 2 +0x00,0x00,0x1F,0xF8,0x1F,0xFC,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x07,0xF8,0x07,0xF8,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x1F,0xFC,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 3 +0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x1F,0xF8,0x1F,0xF8,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 4 +0x00,0x00,0x07,0xF8,0x07,0xF8,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0xF0,0x07,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x18,0x18,0x1F,0xF8,0x07,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 5 +0x00,0x00,0x1C,0x00,0x1C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 6 +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 7 +0x00,0x00,0x07,0xE0,0x07,0xE0,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 8 +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 9 +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // : +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x07,0xE0,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ; +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x78,0x00,0xE0,0x01,0xC0,0x07,0x00,0x0E,0x00,0x1C,0x00,0x0E,0x00,0x07,0x00,0x01,0xC0,0x00,0xE0,0x00,0x78,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // < +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // = +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x1E,0x00,0x07,0x00,0x03,0x80,0x00,0xE0,0x00,0x70,0x00,0x38,0x00,0x70,0x00,0xE0,0x03,0x80,0x07,0x00,0x1E,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // > +0x00,0x00,0x00,0x20,0x00,0x60,0x01,0xF0,0x03,0x98,0x07,0x18,0x0E,0x18,0x18,0x70,0x10,0xE0,0x01,0xC0,0x03,0x80,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ? + +0x00,0x00,0x07,0xE0,0x0F,0xF0,0x18,0x18,0x18,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0x98,0x0F,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // @ +0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x0C,0x30,0x0F,0xF0,0x0F,0xF0,0x0C,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // A +0x00,0x00,0x1F,0xF0,0x1F,0xF8,0x18,0x1C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x1F,0xF8,0x1F,0xF8,0x18,0x1C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x1C,0x1F,0xF8,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // B +0x00,0x00,0x01,0xFC,0x03,0xFC,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1C,0x00,0x0C,0x00,0x0E,0x00,0x06,0x00,0x07,0x00,0x03,0xFC,0x01,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // C +0x00,0x00,0x1F,0xC0,0x1F,0xE0,0x06,0x70,0x06,0x30,0x06,0x30,0x06,0x18,0x06,0x18,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x0C,0x06,0x1C,0x06,0x18,0x06,0x38,0x06,0x30,0x06,0x70,0x1F,0xE0,0x1F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // D +0x00,0x00,0x1F,0xFC,0x1F,0xFC,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xC0,0x1F,0xC0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xFC,0x1F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // E +0x00,0x00,0x1F,0xFC,0x1F,0xFC,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF0,0x1F,0xF0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // F +0x00,0x00,0x01,0xF8,0x03,0xF8,0x03,0x00,0x06,0x00,0x0E,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0xF8,0x18,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // G +0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // H +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // I +0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x07,0xF0,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // J +0x00,0x00,0x18,0x0C,0x18,0x18,0x18,0x30,0x18,0x60,0x18,0xC0,0x19,0x80,0x1B,0x00,0x1E,0x00,0x1C,0x00,0x1E,0x00,0x1F,0x00,0x1B,0x80,0x19,0xC0,0x18,0xE0,0x18,0x70,0x18,0x30,0x18,0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // K +0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // L +0x00,0x00,0x1C,0x38,0x1C,0x38,0x1E,0x78,0x1E,0xF8,0x1B,0xD8,0x19,0x98,0x19,0x98,0x19,0x98,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // M +0x00,0x00,0x1C,0x18,0x1C,0x18,0x1E,0x18,0x1E,0x18,0x1E,0x18,0x1B,0x18,0x1B,0x18,0x1B,0x18,0x19,0x98,0x19,0x98,0x18,0xD8,0x18,0xD8,0x18,0xD8,0x18,0x78,0x18,0x78,0x18,0x78,0x18,0x38,0x18,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // N +0x00,0x00,0x03,0xC0,0x03,0xC0,0x06,0x60,0x06,0x60,0x0E,0x70,0x0C,0x30,0x0C,0x30,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x06,0x60,0x06,0x60,0x03,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // O + +0x00,0x00,0x1F,0xF0,0x1F,0xF0,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF0,0x1F,0xF0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // P +0x00,0x00,0x00,0x70,0x00,0xF8,0x01,0xD8,0x03,0x98,0x07,0x18,0x0C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x98,0x19,0x98,0x19,0xF0,0x18,0xE0,0x19,0xC0,0x1B,0xE0,0x1F,0x78,0x0E,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Q +0x00,0x00,0x1F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF0,0x19,0x80,0x19,0x80,0x18,0xC0,0x18,0xC0,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // R +0x00,0x00,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x18,0x0C,0x00,0x06,0x00,0x06,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0x60,0x00,0x60,0x00,0x30,0x18,0x18,0x18,0x18,0x1F,0xF8,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // S +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x19,0x98,0x19,0x98,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // T +0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // U +0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x0E,0x70,0x06,0x60,0x06,0x60,0x07,0xE0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // V +0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x19,0x98,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // W +0x00,0x00,0x18,0x18,0x18,0x18,0x0C,0x30,0x0C,0x30,0x06,0x60,0x06,0x60,0x03,0xC0,0x03,0xC0,0x01,0x80,0x01,0x80,0x03,0xC0,0x03,0xC0,0x06,0x60,0x06,0x60,0x0C,0x30,0x0C,0x30,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // X +0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0C,0x30,0x0E,0x60,0x07,0xE0,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Y +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x30,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x0C,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // Z +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1B,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // [ +0x00,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x07,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0xC0,0x00,0x60,0x00,0x70,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // +0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x00,0xD8,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ] +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0xC0,0x03,0xC0,0x07,0xE0,0x07,0xE0,0x0E,0x70,0x0E,0x70,0x1C,0x30,0x1C,0x38,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ^ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00, // _ + +0x00,0x00,0x06,0x00,0x07,0xC0,0x03,0xE0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ` +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xF0,0x07,0xF0,0x00,0x18,0x00,0x18,0x00,0x18,0x0F,0xF8,0x0F,0xF8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1F,0xF8,0x0F,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // a +0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1B,0xE0,0x1F,0xF0,0x1E,0x38,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1C,0x18,0x1E,0x38,0x1F,0xF0,0x1B,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // b +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFC,0x07,0xFC,0x0E,0x00,0x1C,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x1C,0x00,0x0E,0x00,0x07,0xFC,0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // c +0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x07,0xD8,0x0F,0xF8,0x1C,0x78,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1C,0x78,0x0F,0xF8,0x07,0xD8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // d +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0F,0xF0,0x1C,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x1F,0xF8,0x1F,0xF8,0x18,0x00,0x18,0x00,0x1C,0x00,0x0F,0xF8,0x07,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // e +0x00,0x00,0x00,0xFC,0x01,0xFC,0x03,0x80,0x03,0x00,0x03,0x00,0x0F,0xF0,0x0F,0xF0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // f +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xD8,0x0F,0xF8,0x1C,0x78,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1C,0x78,0x0F,0xF8,0x07,0xD8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x38,0x0F,0xF0,0x0F,0xE0, // g +0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x19,0xF0,0x1B,0xF0,0x1F,0x18,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // h +0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // i +0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF8,0x03,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x0C,0x18,0x0C,0x18,0x07,0xF0,0x03,0xE0, // j +0x00,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x30,0x18,0x60,0x18,0xC0,0x19,0x80,0x1B,0x80,0x1F,0x00,0x1E,0x00,0x1F,0x00,0x19,0x80,0x18,0xC0,0x18,0x60,0x18,0x30,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // k +0x00,0x00,0x0F,0x80,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // l +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x78,0x3F,0xFC,0x39,0xCC,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // m +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xF0,0x1B,0xF0,0x1F,0x18,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // n +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0F,0xF0,0x1C,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1C,0x38,0x0F,0xF0,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // o + +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0xC0,0x1F,0xE0,0x1E,0x70,0x1C,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1C,0x38,0x1E,0x70,0x1F,0xE0,0x1B,0xC0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00, // p +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xD8,0x0F,0xF8,0x1C,0x78,0x18,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x1C,0x78,0x0F,0xF8,0x07,0xD8,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18, // q +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xF0,0x1B,0xF8,0x1F,0x0C,0x1C,0x0C,0x18,0x0C,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // r +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x1F,0xF8,0x18,0x18,0x18,0x00,0x1E,0x00,0x07,0x80,0x01,0xF0,0x00,0x70,0x00,0x18,0x00,0x18,0x18,0x18,0x1F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // s +0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0xF8,0x1F,0xF8,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x0C,0x06,0x1C,0x03,0xF8,0x01,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // t +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x18,0xF8,0x0F,0xD8,0x07,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // u +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x38,0x38,0x18,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x06,0xC0,0x06,0xC0,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // v +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x31,0x8C,0x33,0xCC,0x1F,0xF8,0x1E,0x78,0x1C,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // w +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x1C,0x38,0x0C,0x30,0x06,0x60,0x03,0xC0,0x03,0xC0,0x01,0x80,0x03,0xC0,0x06,0xE0,0x0E,0x70,0x0C,0x30,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // x +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x38,0x38,0x18,0x30,0x18,0x30,0x0C,0x60,0x0C,0x60,0x06,0xC0,0x07,0xC0,0x07,0x80,0x01,0x80,0x03,0x80,0x03,0x00,0x03,0x00,0x3E,0x00,0x3E,0x00, // y +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x38,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x06,0x00,0x0C,0x00,0x1C,0x00,0x1F,0xF8,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // z +0x00,0x00,0x00,0xF8,0x01,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x00,0x1F,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xF8,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // { +0x00,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // | +0x00,0x00,0x1F,0x00,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0xF8,0x00,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // } +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x8C,0x1F,0xFC,0x18,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ~ +}; diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/arial_bold.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/arial_bold.fon new file mode 100644 index 0000000000000000000000000000000000000000..9cf4ee62d4586b0ef8983799306f88f400e740e0 GIT binary patch literal 3052 zcmWd-P>5$B0x&b6Lk6%2Oe<9QB$P}bv__&@M}fXhE%|G;O!V8Hl*@c}~tg8`2L zs`(&Y3=bF|fYV6=PXbsk$jwj#*dMSzU}NB6;0MJs7X8c**gvot@G$Tm;D`Ey%>dc` zQ1cEjKz+{)j&WwF=?n}Y|3mx^vI)jQ_#Z5v021dbVE@3pfx&<$f&T$JJbV}!Kp_G* z4vhyA$0Far08if_6$}at510?|GsrOTGcX@uc)*|l7KIb?ALPN|38Uc>PzDDB9|L;> zD0~?ous85Aa6rXD6v+L2p!g{O#SX+R5E3NIet^e7xI+Ae&Iu6Izo7O&fP+JT9VwN8 z(l*-x5Cr8i{s;0OBn%`B3?x9hL0BFtB4Ge#Nq~U-2YI*&%n$fK@L0$QNH9R4i~x@X z{|7`mmOlVC5u^=<4dg$_!^4;V2mcQq1`tGLf$RohQ2c^qc^LQ~@IQdCKqN>GgxNvv zv#<~VB~XJO20tt$BrN2AAbbe3R6;`jhx`u&52P1_L1BdrgXF*%Y%l|yL{Hxm5)uXy z2@(e+8>A1&9gsQ5;8FNgYqYz1&;(j1N#HU4-6JO5_}fy z$npO}{s+GB1%(wVma*XffQUZ>Q1}{17=ThI-vdxO1*KSKX!*^+V0a7!rE_4A&jJEr z?vpT(Dd0(9I{>P4Ky?w@0iFbz0to}Syo8Jej{&HTV}_O>5ZA)w!DTwQ>;siBpwfkn z0hCf9^2`UA4}i*J4154q!hmETCNeg_%4r68`3KSu7X{ZL5FS{Z0aW&YSRmK2CGf!A z46z#@`Tzg_{}6ewtq>+o5>m%9K45>q2P&Z-uy24Vg``?U*$Ybj{115Hxfh}iTm~gT z)bb@Dm(GxU!@Pn01FQ~$ma-6yP!bd`pi&olzG7afIUGXLH+?h*o_c3@jl@H04gIvr91?~%m;-qs4W1CAs9_ap0R%6L=2rHt;v_AK*K{a{!c5Vfta_q0=yV2yJd*|Htx-VGjaA#9<^p_k+}c!yj75 zqt(73X{5Rn7Jra%0ZW3~9hmV0Des^Pm`CtgZ+pe>*##u24+N_FJLHu;4|Y5932 E0Kq-+S^xk5 literal 0 HcmV?d00001 diff --git a/MicroPython_BUILD/components/internalfs_image/image/fonts/swiss721_outline.fon b/MicroPython_BUILD/components/internalfs_image/image/fonts/swiss721_outline.fon new file mode 100644 index 0000000000000000000000000000000000000000..2ece05ef63436c997aee354d7abc0ae837e566ea GIT binary patch literal 3052 zcmWd-P>5$B0x&l)K_N2(GXo<70|Q8exdEn?$pHpoBB(Uu1V#l$1ttgiA50D`4fY>c z8aNp^83YlE9xyN9QQ-c-wSZNDc>==*whx>aSOl0iFf3qr08(UOa4cb0!mb0y8>||b zE!d86?c&)ba!kSkBnQIm4Lk?99k?Ah8(0}QEyON}Du@S2oZzXv6`= z2BrpP239y^W?*VyY+yJ5QOCo;1(tz@0aF7=B^Lt^M4Ewtf$;#N1E+_036BJm0_y}W z4>kk16oTQv0EPVjU@Qg)gfxuBd;k=d%npdqg~@s^?kdK+6+L;fqDDZCJ3P3>K4J-=G2opfM9QYhK9QYj= z5fCm9($77CFMuI{VF9B9D110Sa0u{!fEv%he1OG(`vOk@;{!$o#tRGqd;#1OP|UYs zP+**?a}o z2V4x?54aRKFMxc(ief%L$Tb%j7Jys_az7*{kwW+bGY``jrYTHc7$ulen5HmIVM;+a zpA#HDoD*0Am@hB{urGkQAM7UuMtF=6$zQ+-4?UPK88{dUm>YN)BpBEk7!EMNQ#V|m zLH-Ab4Ix1+RLlX=_kclyfrp`hv4Ias5*$Al_yQOvFeWfHfc%Y`e;F80^Bb|G(;q1;PE5>KtMqJgouWShWG^m z1MwFk8saYmB;?^?!u)_mg7b-x3@B1X7(`@*OgLY#NFdCYKOkTrenG?oWC9pxfXtDH zhY3 zMVu(XLu7)ef|!FugP?=Bg2)7s01*vD`0+7-+>4As{zT*-8ygiDqY$kSttnbl zbie3^=z`gnbD*{}$XEzz2x&-ah-!$f5L+RdA+kcGL&O8&e)b0(0>UR$R5U=|644M* zQ4v1DA;1ogAN~g%0^BFKG`KXlPjCouKY+LdDg03NKT+urKEa{FeuIGn;sTWTR}jAe zu?As3^8*$E?iXAZTnwxam?apV@QH9gVUb{l=U-6#@mGLyCJKhfKO%l0CW~cA-{3Jo zxZlD;BS0lUBtT?=&;o7+ZUO6> zwa^bPc=`mF*$-g4;PeAnInKlYs#PI%4r2qO1E`b+m)8jl;Ch7p0E+`VqSS@5*d16L z*dZZwfKh=-fQ5sD1>##$$p8Nt7#Ke=OEA4)TEX;!S%MKBC+McIKVTDJyuf~eCxH6` z_XM5*c6jcCrrrnK0-WG9#HGP|f=hrOp1L3=fyyAx3tRc8E48 z$^L;OKp2$k0z?9YCvXI?UtkE}pTMC23PGs*KX6O%LfsF_35e7I%Kf0Y2GQ`?LrPts z+83uGfq1&Fq{ z(Ku#qrRfEOmghjC2+W7m{SY;vJO~fp6Ue1IM4tZvmjKNFoF};8r2s^hfr0r4iw5Tl zP{?p;aGqe%V15CLH3kj1`~#*1%nHm2xZKZvfJXsTvamj2n!ta711a}H+E2_0ObW~i zpm1Y!U`$|CfVBKzrZX_`SwQRtk(@7hG!W?zqK40c%YZY0HGp*i%K|0^CI?WAKx81K z<;#)*l2zqdNAmSGy&u76Iz`B4*fzg3Ufpr0A0H!?D`~;Q-ObeL6@yy=9 z(g4xTz`*{4g@gSAv;_FU$^m!Z0Y(NGWM<$2x1V8ra0?UGGQ~kNGr-%fpcbhC!vO>z b)_!AP;Ny^-A&>xb3o;!P;1QpepH~6^qXNd2 literal 0 HcmV?d00001 diff --git a/MicroPython_BUILD/components/internalfs_image/image/func_point b/MicroPython_BUILD/components/internalfs_image/image/func_point deleted file mode 100644 index e69de29..0000000 diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaReceiver.py b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaReceiver.py new file mode 100644 index 0000000..981e7fa --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaReceiver.py @@ -0,0 +1,13 @@ +def receive(lora): + print("LoRa Receiver") + + while True: + if lora.receivedPacket(): + lora.blink_led() + payload = lora.read_payload() + + try: + print("*** Received message ***\n{}".format(payload.decode())) + except Exception as e: + print(e) + print("with RSSI: {}\n".format(lora.packetRssi())) \ No newline at end of file diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaSender.py b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaSender.py new file mode 100644 index 0000000..028ec76 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/LoRaSender.py @@ -0,0 +1,14 @@ +from time import sleep + + +def send(lora): + counter = 0 + print("LoRa Sender") + + while True: + payload = 'Hello ({0})'.format(counter) + print("Sending packet: \n{}\n".format(payload)) + lora.println(payload) + + counter += 1 + sleep(5) \ No newline at end of file diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/bme280.py b/MicroPython_BUILD/components/internalfs_image/image/lib/bme280.py new file mode 100644 index 0000000..c8d67ba --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/bme280.py @@ -0,0 +1,206 @@ +# Authors: Paul Cunnane 2016, Peter Dahlebrg 2016 +# +# This module borrows from the Adafruit BME280 Python library. Original +# Copyright notices are reproduced below. +# +# Those libraries were written for the Raspberry Pi. This modification is +# intended for the MicroPython and esp8266 boards. +# +# Copyright (c) 2014 Adafruit Industries +# Author: Tony DiCola +# +# Based on the BMP280 driver with BME280 changes provided by +# David J Taylor, Edinburgh (www.satsignal.eu) +# +# Based on Adafruit_I2C.py created by Kevin Townsend. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import time +from ustruct import unpack, unpack_from +from array import array + +# BME280 default address. +BME280_I2CADDR = 0x76 + +# Operating Modes +BME280_OSAMPLE_1 = 1 +BME280_OSAMPLE_2 = 2 +BME280_OSAMPLE_4 = 3 +BME280_OSAMPLE_8 = 4 +BME280_OSAMPLE_16 = 5 + +BME280_REGISTER_CONTROL_HUM = 0xF2 +BME280_REGISTER_CONTROL = 0xF4 + + +class BME280: + + def __init__(self, + mode=BME280_OSAMPLE_1, + address=BME280_I2CADDR, + i2c=None, + **kwargs): + # Check that mode is valid. + if mode not in [BME280_OSAMPLE_1, BME280_OSAMPLE_2, BME280_OSAMPLE_4, + BME280_OSAMPLE_8, BME280_OSAMPLE_16]: + raise ValueError( + 'Unexpected mode value {0}. Set mode to one of ' + 'BME280_ULTRALOWPOWER, BME280_STANDARD, BME280_HIGHRES, or ' + 'BME280_ULTRAHIGHRES'.format(mode)) + self._mode = mode + self.address = address + if i2c is None: + raise ValueError('An I2C object is required.') + self.i2c = i2c + + # load calibration data + dig_88_a1 = self.i2c.readfrom_mem(self.address, 0x88, 26) + dig_e1_e7 = self.i2c.readfrom_mem(self.address, 0xE1, 7) + self.dig_T1, self.dig_T2, self.dig_T3, self.dig_P1, \ + self.dig_P2, self.dig_P3, self.dig_P4, self.dig_P5, \ + self.dig_P6, self.dig_P7, self.dig_P8, self.dig_P9, \ + _, self.dig_H1 = unpack("> 4) + + self.dig_H6 = unpack_from("> 4 + raw_press = ((readout[0] << 16) | (readout[1] << 8) | readout[2]) >> 4 + # temperature(0xFA): ((msb << 16) | (lsb << 8) | xlsb) >> 4 + raw_temp = ((readout[3] << 16) | (readout[4] << 8) | readout[5]) >> 4 + # humidity(0xFD): (msb << 8) | lsb + raw_hum = (readout[6] << 8) | readout[7] + + result[0] = raw_temp + result[1] = raw_press + result[2] = raw_hum + + def read_compensated_data(self, result=None): + """ Reads the data from the sensor and returns the compensated data. + + Args: + result: array of length 3 or alike where the result will be + stored, in temperature, pressure, humidity order. You may use + this to read out the sensor without allocating heap memory + + Returns: + array with temperature, pressure, humidity. Will be the one from + the result parameter if not None + """ + self.read_raw_data(self._l3_resultarray) + raw_temp, raw_press, raw_hum = self._l3_resultarray + # temperature + var1 = ((raw_temp >> 3) - (self.dig_T1 << 1)) * (self.dig_T2 >> 11) + var2 = (((((raw_temp >> 4) - self.dig_T1) * + ((raw_temp >> 4) - self.dig_T1)) >> 12) * self.dig_T3) >> 14 + self.t_fine = var1 + var2 + temp = (self.t_fine * 5 + 128) >> 8 + + # pressure + var1 = self.t_fine - 128000 + var2 = var1 * var1 * self.dig_P6 + var2 = var2 + ((var1 * self.dig_P5) << 17) + var2 = var2 + (self.dig_P4 << 35) + var1 = (((var1 * var1 * self.dig_P3) >> 8) + + ((var1 * self.dig_P2) << 12)) + var1 = (((1 << 47) + var1) * self.dig_P1) >> 33 + if var1 == 0: + pressure = 0 + else: + p = 1048576 - raw_press + p = (((p << 31) - var2) * 3125) // var1 + var1 = (self.dig_P9 * (p >> 13) * (p >> 13)) >> 25 + var2 = (self.dig_P8 * p) >> 19 + pressure = ((p + var1 + var2) >> 8) + (self.dig_P7 << 4) + + # humidity + h = self.t_fine - 76800 + h = (((((raw_hum << 14) - (self.dig_H4 << 20) - + (self.dig_H5 * h)) + 16384) + >> 15) * (((((((h * self.dig_H6) >> 10) * + (((h * self.dig_H3) >> 11) + 32768)) >> 10) + + 2097152) * self.dig_H2 + 8192) >> 14)) + h = h - (((((h >> 15) * (h >> 15)) >> 7) * self.dig_H1) >> 4) + h = 0 if h < 0 else h + h = 419430400 if h > 419430400 else h + humidity = h >> 12 + + if result: + result[0] = temp + result[1] = pressure + result[2] = humidity + return result + + return array("i", (temp, pressure, humidity)) + + @property + def values(self): + """ human readable values """ + + t, p, h = self.read_compensated_data() + + p = p // 256 + pi = p // 100 + pd = p - pi * 100 + + hi = h // 1024 + hd = h * 100 // 1024 - hi * 100 + return ("{}C".format(t / 100), "{}.{:02d}hPa".format(pi, pd), + "{}.{:02d}%".format(hi, hd)) diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/config_lora.py b/MicroPython_BUILD/components/internalfs_image/image/lib/config_lora.py new file mode 100644 index 0000000..6102814 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/config_lora.py @@ -0,0 +1,30 @@ +import sys +import os +import time + + +def mac2eui(mac): + mac = mac[0:6] + 'fffe' + mac[6:] + return hex(int(mac[0:2], 16) ^ 2)[2:] + mac[2:] + + +# Node Name +from machine import unique_id +import ubinascii +unique_id = ubinascii.hexlify(unique_id()).decode() + +NODE_NAME = 'ESP32_' + +NODE_EUI = mac2eui(unique_id) +NODE_NAME = NODE_NAME + unique_id +# NODE_NAME = NODE_NAME + NODE_EUI + +# millisecond +millisecond = time.ticks_ms +# microsecond = time.ticks_us + + +# Controller +from controller_esp import Controller + + diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/controller.py b/MicroPython_BUILD/components/internalfs_image/image/lib/controller.py new file mode 100644 index 0000000..27537d9 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/controller.py @@ -0,0 +1,122 @@ +from time import sleep + + +class Controller: + + class Mock: + pass + + + ON_BOARD_LED_PIN_NO = None + ON_BOARD_LED_HIGH_IS_ON = True + GPIO_PINS = [] + + PIN_ID_FOR_LORA_RESET = None + + PIN_ID_SCK = None + PIN_ID_MOSI = None + PIN_ID_MISO = None + + PIN_ID_FOR_LORA_SS = None + PIN_ID_FOR_LORA_DIO0 = None + PIN_ID_FOR_LORA_DIO1 = None + PIN_ID_FOR_LORA_DIO2 = None + PIN_ID_FOR_LORA_DIO3 = None + PIN_ID_FOR_LORA_DIO4 = None + PIN_ID_FOR_LORA_DIO5 = None + + spi = None + + def __init__(self, + spi = spi, + pin_id_led = ON_BOARD_LED_PIN_NO, + on_board_led_high_is_on = ON_BOARD_LED_HIGH_IS_ON, + pin_id_reset = PIN_ID_FOR_LORA_RESET, + blink_on_start = (2, 0.5, 0.5)): + + self.pin_led = self.prepare_pin(pin_id_led) + self.on_board_led_high_is_on = on_board_led_high_is_on + self.pin_reset = self.prepare_pin(pin_id_reset) + self.spi = self.prepare_spi(spi) + self.reset_transceivers() + self.transceivers = {} + self.blink_led(*blink_on_start) + + + def add_transceiver(self, + transceiver, + pin_id_ss = PIN_ID_FOR_LORA_SS, + pin_id_RxDone = PIN_ID_FOR_LORA_DIO0, + pin_id_RxTimeout = PIN_ID_FOR_LORA_DIO1, + pin_id_ValidHeader = PIN_ID_FOR_LORA_DIO2, + pin_id_CadDone = PIN_ID_FOR_LORA_DIO3, + pin_id_CadDetected = PIN_ID_FOR_LORA_DIO4, + pin_id_PayloadCrcError = PIN_ID_FOR_LORA_DIO5): + + transceiver.transfer = self.spi.transfer + transceiver.blink_led = self.blink_led + + transceiver.pin_ss = self.prepare_pin(pin_id_ss) + transceiver.pin_RxDone = self.prepare_irq_pin(pin_id_RxDone) + transceiver.pin_RxTimeout = self.prepare_irq_pin(pin_id_RxTimeout) + transceiver.pin_ValidHeader = self.prepare_irq_pin(pin_id_ValidHeader) + transceiver.pin_CadDone = self.prepare_irq_pin(pin_id_CadDone) + transceiver.pin_CadDetected = self.prepare_irq_pin(pin_id_CadDetected) + transceiver.pin_PayloadCrcError = self.prepare_irq_pin(pin_id_PayloadCrcError) + + transceiver.init() + + self.transceivers[transceiver.name] = transceiver + return transceiver + + + def prepare_pin(self, pin_id, in_out = None): + reason = ''' + # a pin should provide: + # .low() + # .high() + # .value() # read input. + # .irq() # ref to the irq function of real pin object. + ''' + raise NotImplementedError('reason') + + + def prepare_irq_pin(self, pin_id): + reason = ''' + # a irq_pin should provide: + # .set_handler_for_irq_on_rising_edge() # to set trigger and handler. + # .detach_irq() + ''' + raise NotImplementedError('reason') + + + def prepare_spi(self, spi): + reason = ''' + # a spi should provide: + # .close() + # .transfer(address, value = 0x00) + ''' + raise NotImplementedError('reason') + + + def led_on(self, on = True): + self.pin_led.high() if self.on_board_led_high_is_on == on else self.pin_led.low() + + + def blink_led(self, times = 1, on_seconds = 0.1, off_seconds = 0.1): + for i in range(times): + self.led_on(True) + sleep(on_seconds) + self.led_on(False) + sleep(off_seconds) + + + def reset_transceivers(self, duration_low = 0.01, duration_high = 0.01): + self.pin_reset.low() + sleep(duration_low) + self.pin_reset.high() + sleep(duration_high) + + + def __exit__(self): + self.spi.close() diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/controller_esp.py b/MicroPython_BUILD/components/internalfs_image/image/lib/controller_esp.py new file mode 100644 index 0000000..cd868c6 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/controller_esp.py @@ -0,0 +1,163 @@ +from machine import Pin, SPI, reset +import config_lora +import controller + + +''' +import time +PIN_ID_FOR_LORA_RESET = 18 +PIN_ID_FOR_LORA_SS = 26 +PIN_ID_SCK = 19 +PIN_ID_MOSI = 23 +PIN_ID_MISO = 25 +PIN_ID_FOR_LORA_DIO0 = 5 +ON_BOARD_LED_PIN_NO = 2 + +#spi = machine.SPI(1, baudrate = 8000000, sck = machine.Pin(PIN_ID_SCK, machine.Pin.OUT), mosi = machine.Pin(PIN_ID_MOSI, machine.Pin.OUT), miso = machine.Pin(PIN_ID_MISO, machine.Pin.IN), cs = machine.Pin(PIN_ID_FOR_LORA_SS, machine.Pin.OUT), duplex=False) +#spi = machine.SPI(1, baudrate = 8000000, sck = machine.Pin(PIN_ID_SCK, machine.Pin.OUT), mosi = machine.Pin(PIN_ID_MOSI, machine.Pin.OUT), miso = machine.Pin(PIN_ID_MISO, machine.Pin.IN), duplex=False) +spi = machine.SPI(1, baudrate = 8000000, sck = machine.Pin(PIN_ID_SCK, machine.Pin.OUT), mosi = machine.Pin(PIN_ID_MOSI, machine.Pin.OUT), miso = machine.Pin(PIN_ID_MISO, machine.Pin.IN)) + +dio=machine.Pin(PIN_ID_FOR_LORA_DIO0, machine.Pin.IN) +cs=machine.Pin(PIN_ID_FOR_LORA_SS, machine.Pin.OUT) +rst=machine.Pin(PIN_ID_FOR_LORA_RESET, machine.Pin.OUT) +rst.value(0) +response = bytearray(4) + +def xrst(): + rst.value(0) + time.sleep_ms(100) + rst.value(1) + +xrst() + +def xrd(reg): + cs.value(0) + spi.write_readinto(bytes([reg]), response); + cs.value(1) + print(response) + +def yrd(reg): + cs.value(0) + spi.write(bytes([reg])); + spi.readinto(response) + cs.value(1) + print(response) + +def zrd(reg): + cs.value(0) + spi.write(bytes([reg])); + spi.write_readinto(bytes([0]),response) + cs.value(1) + print(response) + +def wrd(reg): + cs.value(0) + res = spi.readfrom_mem(reg,4) + cs.value(1) + print(res) + +''' + +class Controller(controller.Controller): + + PIN_ID_FOR_LORA_RESET = 18 + + PIN_ID_FOR_LORA_SS = 26 + PIN_ID_SCK = 19 + PIN_ID_MOSI = 23 + PIN_ID_MISO = 25 + + PIN_ID_FOR_LORA_DIO0 = 5 + PIN_ID_FOR_LORA_DIO1 = None + PIN_ID_FOR_LORA_DIO2 = None + PIN_ID_FOR_LORA_DIO3 = None + PIN_ID_FOR_LORA_DIO4 = None + PIN_ID_FOR_LORA_DIO5 = None + + spi = None + + ON_BOARD_LED_PIN_NO = 2 + ON_BOARD_LED_HIGH_IS_ON = True + GPIO_PINS = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, + 23, 25, 26, 27, 32, 34, 35, 36, 37, 38, 39) + try: + if not spi: + spi = SPI(1, baudrate = 5000000, polarity = 0, phase = 0, bits = 8, firstbit = SPI.MSB, + sck = Pin(PIN_ID_SCK, Pin.OUT), + mosi = Pin(PIN_ID_MOSI, Pin.OUT), + miso = Pin(PIN_ID_MISO, Pin.IN)) + #spi.init() + print(spi) + + except Exception as e: + print(e) + if spi: + spi.deinit() + spi = None + reset() # in case SPI is already in use, need to reset. + + + def __init__(self, + spi = spi, + pin_id_led = ON_BOARD_LED_PIN_NO, + on_board_led_high_is_on = ON_BOARD_LED_HIGH_IS_ON, + pin_id_reset = PIN_ID_FOR_LORA_RESET, + blink_on_start = (2, 0.5, 0.5)): + + super().__init__(spi, + pin_id_led, + on_board_led_high_is_on, + pin_id_reset, + blink_on_start) + + + def prepare_pin(self, pin_id, in_out = Pin.OUT): + if pin_id is not None: + pin = Pin(pin_id, in_out) + new_pin = Controller.Mock() + new_pin.pin_id = pin_id + new_pin.value = pin.value + + if in_out == Pin.OUT: + new_pin.low = lambda : pin.value(0) + new_pin.high = lambda : pin.value(1) + else: + new_pin.irq = pin.irq + + return new_pin + + + def prepare_irq_pin(self, pin_id): + pin = self.prepare_pin(pin_id, Pin.IN) + if pin: + pin.set_handler_for_irq_on_rising_edge = lambda handler: pin.irq(handler = handler, trigger = Pin.IRQ_RISING) + pin.detach_irq = lambda : pin.irq(handler = None, trigger = 0) + return pin + + + def prepare_spi(self, spi): + if spi: + new_spi = Controller.Mock() + + def transfer(pin_ss, address, value = 0x00): + response = bytearray(1) + + pin_ss.low() + + spi.write(bytes([address])) # write register address + spi.write_readinto(bytes([value]), response) # write or read register walue + #spi.write_readinto(bytes([address]), response) + + pin_ss.high() + + return response + + new_spi.transfer = transfer + new_spi.close = spi.deinit + return new_spi + + + def __exit__(self): + self.spi.close() + diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/led.py b/MicroPython_BUILD/components/internalfs_image/image/lib/led.py new file mode 100644 index 0000000..17e7b61 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/led.py @@ -0,0 +1,11 @@ +# coding: utf-8 + +import time + + +def blink(pin, times = 1, on_seconds = 0.1, off_seconds = 0.1, high_is_on = True): + for i in range(times): + pin.high() if high_is_on else pin.low() + time.sleep(on_seconds) + pin.low() if high_is_on else pin.high() + time.sleep(off_seconds) \ No newline at end of file diff --git a/MicroPython_BUILD/components/internalfs_image/image/lib/sx127x.py b/MicroPython_BUILD/components/internalfs_image/image/lib/sx127x.py new file mode 100644 index 0000000..4b4aa22 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/lib/sx127x.py @@ -0,0 +1,389 @@ +from time import sleep +import time +import gc +import config_lora + + +PA_OUTPUT_RFO_PIN = 0 +PA_OUTPUT_PA_BOOST_PIN = 1 + + +# registers +REG_FIFO = 0x00 +REG_OP_MODE = 0x01 +REG_FRF_MSB = 0x06 +REG_FRF_MID = 0x07 +REG_FRF_LSB = 0x08 +REG_PA_CONFIG = 0x09 +REG_LNA = 0x0c +REG_FIFO_ADDR_PTR = 0x0d + +REG_FIFO_TX_BASE_ADDR = 0x0e +FifoTxBaseAddr = 0x00 +# FifoTxBaseAddr = 0x80 + +REG_FIFO_RX_BASE_ADDR = 0x0f +FifoRxBaseAddr = 0x00 +REG_FIFO_RX_CURRENT_ADDR = 0x10 +REG_IRQ_FLAGS_MASK = 0x11 +REG_IRQ_FLAGS = 0x12 +REG_RX_NB_BYTES = 0x13 +REG_PKT_RSSI_VALUE = 0x1a +REG_PKT_SNR_VALUE = 0x1b +REG_MODEM_CONFIG_1 = 0x1d +REG_MODEM_CONFIG_2 = 0x1e +REG_PREAMBLE_MSB = 0x20 +REG_PREAMBLE_LSB = 0x21 +REG_PAYLOAD_LENGTH = 0x22 +REG_FIFO_RX_BYTE_ADDR = 0x25 +REG_MODEM_CONFIG_3 = 0x26 +REG_RSSI_WIDEBAND = 0x2c +REG_DETECTION_OPTIMIZE = 0x31 +REG_DETECTION_THRESHOLD = 0x37 +REG_SYNC_WORD = 0x39 +REG_DIO_MAPPING_1 = 0x40 +REG_VERSION = 0x42 + +# modes +MODE_LONG_RANGE_MODE = 0x80 # bit 7: 1 => LoRa mode +MODE_SLEEP = 0x00 +MODE_STDBY = 0x01 +MODE_TX = 0x03 +MODE_RX_CONTINUOUS = 0x05 +MODE_RX_SINGLE = 0x06 + +# PA config +PA_BOOST = 0x80 + +# IRQ masks +IRQ_TX_DONE_MASK = 0x08 +IRQ_PAYLOAD_CRC_ERROR_MASK = 0x20 +IRQ_RX_DONE_MASK = 0x40 +IRQ_RX_TIME_OUT_MASK = 0x80 + +# Buffer size +MAX_PKT_LENGTH = 255 + + +class SX127x: + + # The controller needs to provide an interface consisted of: + # 1. a SPI, with transfer function. + # 2. a reset pin, with low(), high() functions. + # 3. IRQ pinS , to be triggered by RFM96W's DIO0~5 pins. These pins each has two functions: + # 3.1 set_handler_for_irq_on_rising_edge() + # 3.2 detach_irq() + # 4. a function to blink on-board LED. + + def __init__(self, + name = 'SX127x', + parameters = {'frequency': 868E6, 'tx_power_level': 2, 'signal_bandwidth': 125E3, + 'spreading_factor': 8, 'coding_rate': 5, 'preamble_length': 8, + 'implicitHeader': False, 'sync_word': 0x12, 'enable_CRC': False}, + onReceive = None): + + self.name = name + self.parameters = parameters + self._onReceive = onReceive + self._lock = False + + + def init(self): + # check version + version = self.readRegister(REG_VERSION) + if version != 0x12: + print("Detected version:", version) + raise Exception('Invalid version.') + + + # put in LoRa and sleep mode + self.sleep() + + + # config + self.setFrequency(self.parameters['frequency']) + self.setSignalBandwidth(self.parameters['signal_bandwidth']) + + # set LNA boost + self.writeRegister(REG_LNA, self.readRegister(REG_LNA) | 0x03) + + # set auto AGC + self.writeRegister(REG_MODEM_CONFIG_3, 0x04) + + self.setTxPower(self.parameters['tx_power_level']) + self._implicitHeaderMode = None + self.implicitHeaderMode(self.parameters['implicitHeader']) + self.setSpreadingFactor(self.parameters['spreading_factor']) + self.setCodingRate(self.parameters['coding_rate']) + self.setPreambleLength(self.parameters['preamble_length']) + self.setSyncWord(self.parameters['sync_word']) + self.enableCRC(self.parameters['enable_CRC']) + + # set base addresses + self.writeRegister(REG_FIFO_TX_BASE_ADDR, FifoTxBaseAddr) + self.writeRegister(REG_FIFO_RX_BASE_ADDR, FifoRxBaseAddr) + + self.standby() + + + def beginPacket(self, implicitHeaderMode = False): + self.standby() + self.implicitHeaderMode(implicitHeaderMode) + + # reset FIFO address and paload length + self.writeRegister(REG_FIFO_ADDR_PTR, FifoTxBaseAddr) + self.writeRegister(REG_PAYLOAD_LENGTH, 0) + + + def endPacket(self): + # put in TX mode + self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_TX) + + # wait for TX done, standby automatically on TX_DONE + tmo = 0 + freg = self.readRegister(REG_IRQ_FLAGS) + while (freg & IRQ_TX_DONE_MASK) == 0: + time.sleep_ms(10) + tmo += 1 + if tmo > 20: + break + freg = self.readRegister(REG_IRQ_FLAGS) + pass + + # clear IRQ's + self.writeRegister(REG_IRQ_FLAGS, IRQ_TX_DONE_MASK) + + if tmo >= 20: + print("Send timeout.") + + self.collect_garbage() + + + def write(self, buffer): + currentLength = self.readRegister(REG_PAYLOAD_LENGTH) + size = len(buffer) + + # check size + size = min(size, (MAX_PKT_LENGTH - FifoTxBaseAddr - currentLength)) + + # write data + for i in range(size): + self.writeRegister(REG_FIFO, buffer[i]) + + # update length + self.writeRegister(REG_PAYLOAD_LENGTH, currentLength + size) + return size + + + def aquire_lock(self, lock = False): + pass + + + def println(self, string, implicitHeader = False): + self.aquire_lock(True) # wait until RX_Done, lock and begin writing. + + self.beginPacket(implicitHeader) + self.write(string.encode()) + self.endPacket() + + self.aquire_lock(False) # unlock when done writing + + + def getIrqFlags(self): + irqFlags = self.readRegister(REG_IRQ_FLAGS) + self.writeRegister(REG_IRQ_FLAGS, irqFlags) + return irqFlags + + + def packetRssi(self): + return (self.readRegister(REG_PKT_RSSI_VALUE) - (164 if self._frequency < 868E6 else 157)) + + + def packetSnr(self): + return (self.readRegister(REG_PKT_SNR_VALUE)) * 0.25 + + + def standby(self): + self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_STDBY) + + + def sleep(self): + self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP) + + + def setTxPower(self, level, outputPin = PA_OUTPUT_PA_BOOST_PIN): + if (outputPin == PA_OUTPUT_RFO_PIN): + # RFO + level = min(max(level, 0), 14) + self.writeRegister(REG_PA_CONFIG, 0x70 | level) + + else: + # PA BOOST + level = min(max(level, 2), 17) + self.writeRegister(REG_PA_CONFIG, PA_BOOST | (level - 2)) + + + def setFrequency(self, frequency): + self._frequency = frequency + + frfs = {169E6: (42, 64, 0), + 433E6: (108, 64, 0), + 434E6: (108, 128, 0), + 866E6: (216, 128, 0), + 868E6: (217, 0, 0), + 915E6: (228, 192, 0)} + + self.writeRegister(REG_FRF_MSB, frfs[frequency][0]) + self.writeRegister(REG_FRF_MID, frfs[frequency][1]) + self.writeRegister(REG_FRF_LSB, frfs[frequency][2]) + + + def setSpreadingFactor(self, sf): + sf = min(max(sf, 6), 12) + self.writeRegister(REG_DETECTION_OPTIMIZE, 0xc5 if sf == 6 else 0xc3) + self.writeRegister(REG_DETECTION_THRESHOLD, 0x0c if sf == 6 else 0x0a) + self.writeRegister(REG_MODEM_CONFIG_2, (self.readRegister(REG_MODEM_CONFIG_2) & 0x0f) | ((sf << 4) & 0xf0)) + + + def setSignalBandwidth(self, sbw): + bins = (7.8E3, 10.4E3, 15.6E3, 20.8E3, 31.25E3, 41.7E3, 62.5E3, 125E3, 250E3) + + bw = 9 + for i in range(len(bins)): + if sbw <= bins[i]: + bw = i + break + + self.writeRegister(REG_MODEM_CONFIG_1, (self.readRegister(REG_MODEM_CONFIG_1) & 0x0f) | (bw << 4)) + + + def setCodingRate(self, denominator): + denominator = min(max(denominator, 5), 8) + cr = denominator - 4 + self.writeRegister(REG_MODEM_CONFIG_1, (self.readRegister(REG_MODEM_CONFIG_1) & 0xf1) | (cr << 1)) + + + def setPreambleLength(self, length): + self.writeRegister(REG_PREAMBLE_MSB, (length >> 8) & 0xff) + self.writeRegister(REG_PREAMBLE_LSB, (length >> 0) & 0xff) + + + def enableCRC(self, enable_CRC = False): + modem_config_2 = self.readRegister(REG_MODEM_CONFIG_2) + config = modem_config_2 | 0x04 if enable_CRC else modem_config_2 & 0xfb + self.writeRegister(REG_MODEM_CONFIG_2, config) + + + def setSyncWord(self, sw): + self.writeRegister(REG_SYNC_WORD, sw) + + + # def enable_Rx_Done_IRQ(self, enable = True): + # if enable: + # self.writeRegister(REG_IRQ_FLAGS_MASK, self.readRegister(REG_IRQ_FLAGS_MASK) & ~IRQ_RX_DONE_MASK) + # else: + # self.writeRegister(REG_IRQ_FLAGS_MASK, self.readRegister(REG_IRQ_FLAGS_MASK) | IRQ_RX_DONE_MASK) + + + def dumpRegisters(self): + for i in range(128): + print("0x{0:02x}: {1:02x}".format(i, self.readRegister(i))) + + + def implicitHeaderMode(self, implicitHeaderMode = False): + if self._implicitHeaderMode != implicitHeaderMode: # set value only if different. + self._implicitHeaderMode = implicitHeaderMode + modem_config_1 = self.readRegister(REG_MODEM_CONFIG_1) + config = modem_config_1 | 0x01 if implicitHeaderMode else modem_config_1 & 0xfe + self.writeRegister(REG_MODEM_CONFIG_1, config) + + + def onReceive(self, callback): + self._onReceive = callback + + if self.pin_RxDone: + if callback: + self.writeRegister(REG_DIO_MAPPING_1, 0x00) + self.pin_RxDone.set_handler_for_irq_on_rising_edge(handler = self.handleOnReceive) + else: + self.pin_RxDone.detach_irq() + + + def receive(self, size = 0): + self.implicitHeaderMode(size > 0) + if size > 0: self.writeRegister(REG_PAYLOAD_LENGTH, size & 0xff) + + # The last packet always starts at FIFO_RX_CURRENT_ADDR + # no need to reset FIFO_ADDR_PTR + self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_CONTINUOUS) + + + # on RPi, interrupt callback is threaded and racing with main thread, + # Needs a lock for accessing FIFO. + # https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/ + # http://raspi.tv/2013/how-to-use-interrupts-with-python-on-the-raspberry-pi-and-rpi-gpio-part-2 + def handleOnReceive(self, event_source): + self.aquire_lock(True) # lock until TX_Done + + # irqFlags = self.getIrqFlags() should be 0x50 + if (self.getIrqFlags() & IRQ_PAYLOAD_CRC_ERROR_MASK) == 0: + if self._onReceive: + payload = self.read_payload() + self.aquire_lock(False) # unlock when done reading + + self._onReceive(self, payload) + + self.aquire_lock(False) # unlock in any case. + + + def receivedPacket(self, size = 0): + irqFlags = self.getIrqFlags() + + self.implicitHeaderMode(size > 0) + if size > 0: self.writeRegister(REG_PAYLOAD_LENGTH, size & 0xff) + + # if (irqFlags & IRQ_RX_DONE_MASK) and \ + # (irqFlags & IRQ_RX_TIME_OUT_MASK == 0) and \ + # (irqFlags & IRQ_PAYLOAD_CRC_ERROR_MASK == 0): + + if (irqFlags == IRQ_RX_DONE_MASK): # RX_DONE only, irqFlags should be 0x40 + # automatically standby when RX_DONE + return True + + elif self.readRegister(REG_OP_MODE) != (MODE_LONG_RANGE_MODE | MODE_RX_SINGLE): + # no packet received. + # reset FIFO address / # enter single RX mode + self.writeRegister(REG_FIFO_ADDR_PTR, FifoRxBaseAddr) + self.writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_RX_SINGLE) + + + def read_payload(self): + # set FIFO address to current RX address + # fifo_rx_current_addr = self.readRegister(REG_FIFO_RX_CURRENT_ADDR) + self.writeRegister(REG_FIFO_ADDR_PTR, self.readRegister(REG_FIFO_RX_CURRENT_ADDR)) + + # read packet length + packetLength = self.readRegister(REG_PAYLOAD_LENGTH) if self._implicitHeaderMode else \ + self.readRegister(REG_RX_NB_BYTES) + + payload = bytearray() + for i in range(packetLength): + payload.append(self.readRegister(REG_FIFO)) + + self.collect_garbage() + return bytes(payload) + + + def readRegister(self, address, byteorder = 'big', signed = False): + response = self.transfer(self.pin_ss, address & 0x7f) + return int.from_bytes(response, byteorder) + + + def writeRegister(self, address, value): + self.transfer(self.pin_ss, address | 0x80, value) + + + def collect_garbage(self): + gc.collect() + print('[Memory - free: {} allocated: {}]'.format(gc.mem_free(), gc.mem_alloc())) + diff --git a/MicroPython_BUILD/components/internalfs_image/image/main.py b/MicroPython_BUILD/components/internalfs_image/image/main.py index b3bf1d1..bdd7fd5 100644 --- a/MicroPython_BUILD/components/internalfs_image/image/main.py +++ b/MicroPython_BUILD/components/internalfs_image/image/main.py @@ -1,103 +1,34 @@ -''' -Arduino version: -https://github.com/dankelley2/M5Stack_BTCTicker +import machine, network, utime -Response (JSON) - last Last BTC price. - high Last 24 hours price high. - low Last 24 hours price low. - vwap Last 24 hours volume weighted average price. - volume Last 24 hours volume. - bid Highest buy order. - ask Lowest sell order. - timestamp Unix timestamp date and time. - open First price of the day. - - m5stack.com/api/btc/ticker/btcusd.json -''' +print("") +print("Starting WiFi ...") +sta_if = network.WLAN(network.STA_IF); sta_if.active(True) +sta_if.connect("mySSID", "wifi_password") +tmo = 50 +while not sta_if.isconnected(): + utime.sleep_ms(100) + tmo -= 1 + if tmo == 0: + sta_if.disconnect() + break -from m5stack import * -from utils import * -import utime as time -import machine -import urequests -import ujson -import curl -import utils -import m5cloud -import gc +if tmo > 0: + print("WiFi started") + utime.sleep_ms(500) - -def timeout_reset(timer): - import machine - machine.reset() - -t1 = machine.Timer(2) -t1.init(period=60*1000*60*6, mode=t1.PERIODIC, callback=timeout_reset) - - -def main(): - lcd.clear() - lcd.setBrightness(500) - lcd.setTextColor(lcd.WHITE, lcd.BLACK) - lcd.font('SFArch_48.fon') - lcd.print('BTC Price', lcd.CENTER, 30, lcd.ORANGE) - prev_price = '' - timereset = time.ticks_ms() + (60*1000) - while True: - if not m5cloud.idle(): + rtc = machine.RTC() + print("Synchronize time from NTP server ...") + rtc.ntp_sync(server="hr.pool.ntp.org") + tmo = 100 + while not rtc.synced(): + utime.sleep_ms(100) + tmo -= 1 + if tmo == 0: break - try: - # btc_data = get_btc_price() - gc.collect() - lcd.triangle(300,0, 319,0, 319,19, lcd.YELLOW, lcd.YELLOW) - r = curl.get('http://api.m5stack.com/btc') - lcd.triangle(300,0, 319,0, 319,19, lcd.BLUE, lcd.BLUE) - btc_data = ujson.loads(r[2]) - print(btc_data) - print('') - if btc_data: - # update time - t = int(btc_data['timestamp']) - t = time.gmtime(t) - tstr = 'Update: %4d-%02d-%02d %02d:%02d:%02d' % (t[0], t[1], t[2], t[3], t[4], t[5]) - lcd.font(lcd.FONT_Default) - lcd.print(tstr, 3, 3, 0x666666) - - # Max price - high = btc_data['high'] - high = high[:(high.find('.')+3)] - lcd.font(lcd.FONT_DejaVu18) - lcd.print('Max:', 20, 192, lcd.GREEN) - lcd.print(high, 5, 215, lcd.GREEN) - - # Min price - low = btc_data['low'] - low = low[:(low.find('.')+3)] - lcd.font(lcd.FONT_DejaVu18) - lcd.print('Min:', 255, 192, lcd.RED) - lcd.print(low, lcd.RIGHT, 215, lcd.RED) - - # Last Price - price = btc_data['last'] - if not price == prev_price: - lcd.rect(0, 105, 320, 48, lcd.BLACK, lcd.BLACK) - lcd.font('SFArch_48.fon') - lcd.print('$ '+price, lcd.CENTER, 105, color=lcd.WHITE) - - # Symbol - _offset = 185 - if price > prev_price: - lcd.rect(140, _offset, 41, 26, lcd.BLACK, lcd.BLACK) - lcd.triangle(160,_offset, 140,_offset+25, 180,_offset+25, lcd.GREEN, lcd.GREEN) - elif price < prev_price: - lcd.rect(140, _offset, 41, 26, lcd.BLACK, lcd.BLACK) - lcd.triangle(160,_offset+25, 140,_offset, 180,_offset, lcd.RED, lcd.RED) - prev_price = price - - except: - pass - time.sleep(5) - -main() + if tmo > 0: + print("Time set") + utime.sleep_ms(500) + t = rtc.now() + utime.strftime("%c") + print("") diff --git a/MicroPython_BUILD/components/internalfs_image/image/spiffs.info b/MicroPython_BUILD/components/internalfs_image/image/spiffs.info new file mode 100644 index 0000000..68946a2 --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/spiffs.info @@ -0,0 +1,11 @@ +INTRODUCTION + +Spiffs is a file system intended for SPI NOR flash devices on embedded targets. +Spiffs is designed with following characteristics in mind: + + * Small (embedded) targets, sparse RAM without heap + * Only big areas of data (blocks) can be erased + * An erase will reset all bits in block to ones + * Writing pulls one to zeroes + * Zeroes can only be pulled to ones by erase + * Wear leveling diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/favicon.ico b/MicroPython_BUILD/components/internalfs_image/image/www/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..169f21ce9ce4c9d252e175d16f68368cfa7f6c4f GIT binary patch literal 7902 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 + + + + + + MicroWebSrv test page + + + + +

MicroWebSrv test page

+

Hello from MicroPython !

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis eget ligula quis libero mollis dapibus. Suspendisse potenti. Nullam facilisis neque et sem. Proin placerat adipiscing urna. Aenean sollicitudin. Mauris lorem erat, fringilla quis, sagittis a, varius sed, nunc. Pellentesque ligula. Nullam egestas eleifend turpis. Vivamus ac sapien. Sed venenatis, ligula ut scelerisque vehicula, erat tellus euismod ipsum, eget faucibus tortor arcu et lectus. Vivamus vel purus. Fusce dignissim tortor quis diam elementum fermentum. Mauris eleifend lorem vel arcu. Vivamus tempus faucibus lectus. Curabitur volutpat ornare mi. Curabitur ac libero. Sed eu elit ac metus egestas iaculis. +

+
+
+
+
+ +

+ Download « PDF file » +

+
+ + + \ No newline at end of file diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/pdf-sample.pdf b/MicroPython_BUILD/components/internalfs_image/image/www/pdf-sample.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f698ff53d41575b222e6778f87f9e9fd8da4f2b1 GIT binary patch literal 7945 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 Z0S3#ENH3PVYs5iAE1s@?F6*2Ung9(Q3(x=n literal 0 HcmV?d00001 diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/style.css b/MicroPython_BUILD/components/internalfs_image/image/www/style.css new file mode 100644 index 0000000..9a7852e --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/www/style.css @@ -0,0 +1,36 @@ +html, body { + margin: 0; + padding: 0; + } +body { + background-color: white; + font-family: Verdana, sans-serif; + font-size: 100%; + } +h1 { + font-size: 200%; + color: navy; + text-align: center; + } +h2 { + font-size: 150%; + color: red; + padding-left: 15px; + } +p,ul,li,td { + color: black; + } +a:link { + color: green; + text-decoration: underline; + } +a:visited { + color: gray; + } +a:hover { + color: red; + text-decoration: none; +} +a:active, a:focus { + color: red; +} \ No newline at end of file diff --git a/MicroPython_BUILD/components/internalfs_image/image/www/test.pyhtml b/MicroPython_BUILD/components/internalfs_image/image/www/test.pyhtml new file mode 100644 index 0000000..bb98d2c --- /dev/null +++ b/MicroPython_BUILD/components/internalfs_image/image/www/test.pyhtml @@ -0,0 +1,34 @@ + + + TEST + + +

BEGIN

+ {{ py }} + def _testFunction(x) : + return "IN TEST FUNCTION %s" % x + {{ end }} +
+ {{ for toto in range(3) }} + This is an HTML test...
+ TOTO = {{ toto + 1 }} !
+ {{ for toto2 in range(3) }} + TOTO2 = {{ _testFunction(toto2) }} + {{ end }} + Ok good.
+ {{ end }} +
+ {{ _testFunction(100) }}
+
+ {{ if 2+5 < 3 }} + IN IF (1) + {{ elif 10+15 != 25 }} + IN ELIF (2) + {{ elif 10+15 == 25 }} + IN ELIF (3) + {{ else }} + IN ELSE (4) + {{ end }} +

JC :')

+ + diff --git a/MicroPython_BUILD/components/micropython/esp32/machine_i2s.c b/MicroPython_BUILD/components/micropython/esp32/machine_i2s.c index 6f3284e..d8c7ced 100644 --- a/MicroPython_BUILD/components/micropython/esp32/machine_i2s.c +++ b/MicroPython_BUILD/components/micropython/esp32/machine_i2s.c @@ -36,7 +36,7 @@ typedef struct { i2s_port_t port; i2s_config_t config; i2s_channel_t num_channels; - uint8_t volume; + uint16_t volume; } machine_i2s_obj_t; extern const mp_obj_type_t machine_i2s_type; @@ -62,7 +62,8 @@ STATIC void machine_i2s_obj_init_helper(machine_i2s_obj_t *self, size_t n_args, self->config.bits_per_sample = (i2s_bits_per_sample_t)args[ARG_bits].u_int; self->config.channel_format = (i2s_channel_fmt_t)args[ARG_channel_format].u_int; self->config.communication_format = (i2s_comm_format_t)args[ARG_data_format].u_int; - self->config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1, //Interrupt level 1 + // self->config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL3, + self->config.intr_alloc_flags = 0, self->config.dma_buf_count = (int)args[ARG_dma_count].u_int; self->config.dma_buf_len = (int)args[ARG_dma_len].u_int; self->config.use_apll = 0; @@ -252,7 +253,7 @@ STATIC mp_obj_t machine_i2s_set_pin(size_t n_args, const mp_obj_t *pos_args, mp_ mp_int_t data_in_num = -1; if (args[3].u_int >= 0) { - mp_int_t data_in_num = args[3].u_int; + data_in_num = args[3].u_int; } i2s_pin_config_t pin_config = { @@ -281,6 +282,24 @@ STATIC mp_obj_t machine_i2s_set_volume(mp_obj_t self_in, mp_obj_t volume) { } MP_DEFINE_CONST_FUN_OBJ_2(machine_i2s_set_volume_obj, machine_i2s_set_volume); +//---------------------------------------------------------------------- +STATIC mp_obj_t machine_i2s_read(const mp_obj_t self_in, mp_obj_t buf_len) { + const machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); + + size_t _buf_len = mp_obj_get_int(buf_len); + vstr_t vstr; + vstr_init_len(&vstr, _buf_len); + + if (i2s_read_bytes(self->port, (char*)vstr.buf, vstr.len, portMAX_DELAY) == ESP_FAIL) { + mp_raise_OSError(MP_EIO); + return mp_const_none; + } + + // Return read data as string + return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); +} +MP_DEFINE_CONST_FUN_OBJ_2(machine_i2s_read_obj, machine_i2s_read); + //---------------------------------------------------------------------- STATIC mp_obj_t machine_i2s_write(const mp_obj_t self_in, mp_obj_t buf_in) { const machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -288,65 +307,30 @@ STATIC mp_obj_t machine_i2s_write(const mp_obj_t self_in, mp_obj_t buf_in) { mp_buffer_info_t bufinfo; mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ); - if (i2s_write_bytes(self->port, bufinfo.buf, bufinfo.len, portMAX_DELAY) == ESP_FAIL) { - mp_raise_OSError(MP_EIO); - } - - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_2(machine_i2s_write_obj, machine_i2s_write); - -//---------------------------------------------------------------------- -STATIC mp_obj_t machine_i2s_read(const mp_obj_t self_in, mp_obj_t buf_len) { - const machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); - - uint8_t *rdbuf = malloc(buf_len); - - if (i2s_read_bytes(self->port, (char*)rdbuf, buf_len, portMAX_DELAY) == ESP_FAIL) { - mp_raise_OSError(MP_EIO); - return mp_const_none; - } - - mp_obj_t res = mp_const_none; - if (rdbuf) res = mp_obj_new_str_of_type(&mp_type_bytes, (byte*)rdbuf, buf_len); - else res = mp_obj_new_str_of_type(&mp_type_bytes, (byte*)"", 0); - - if (rdbuf) free(rdbuf); - - return res; -} -MP_DEFINE_CONST_FUN_OBJ_2(machine_i2s_read_obj, machine_i2s_read); - -//---------------------------------------------------------------------- -STATIC mp_obj_t machine_i2s_stream_out(const mp_obj_t self_in, mp_obj_t buf_in) { - const machine_i2s_obj_t *self = MP_OBJ_TO_PTR(self_in); - - mp_buffer_info_t bufinfo; - mp_get_buffer_raise(buf_in, &bufinfo, MP_BUFFER_READ); - - uint8_t buf_bytes_per_sample = (self->config.bits_per_sample / 8); - uint32_t num_samples = bufinfo.len / buf_bytes_per_sample / self->num_channels; - // support only 16 bit buffers for now if(self->config.bits_per_sample != I2S_BITS_PER_SAMPLE_16BIT) { mp_raise_ValueError("support only 16 bit buffers for now"); return mp_const_none; } - // pointer to left / right sample position - char *ptr_l = bufinfo.buf; - char *ptr_r = bufinfo.buf + buf_bytes_per_sample; - uint8_t stride = buf_bytes_per_sample * 2; + if (self->config.mode & I2S_MODE_DAC_BUILT_IN) { - if (self->num_channels == (i2s_channel_t)1) { - ptr_r = ptr_l; - } + uint8_t buf_bytes_per_sample = (self->config.bits_per_sample / 8); + uint32_t num_samples = bufinfo.len / buf_bytes_per_sample / self->num_channels; - int bytes_pushed = 0; - TickType_t max_wait = 20 / portTICK_PERIOD_MS; // portMAX_DELAY = bad idea - for (int i = 0; i < num_samples; i++) { + // pointer to left / right sample position + char *ptr_l = bufinfo.buf; + char *ptr_r = bufinfo.buf + buf_bytes_per_sample; + uint8_t stride = buf_bytes_per_sample * self->num_channels;; + + if (self->num_channels == (i2s_channel_t)1) { + ptr_r = ptr_l; + } + + int bytes_pushed = 0; + TickType_t max_wait = 20 / portTICK_PERIOD_MS; // portMAX_DELAY = bad idea + for (int i = 0; i < num_samples; i++) { - if (self->config.mode & I2S_MODE_DAC_BUILT_IN) { // assume 16 bit src bit_depth short left = *(short *) ptr_l; short right = *(short *) ptr_r; @@ -360,46 +344,25 @@ STATIC mp_obj_t machine_i2s_stream_out(const mp_obj_t self_in, mp_obj_t buf_in) uint32_t sample = (uint16_t) left; sample = (sample << 16 & 0xffff0000) | ((uint16_t) right); + bytes_pushed = i2s_push_sample(self->port, (const char*) &sample, max_wait); - bytes_pushed = i2s_push_sample(self->port, (const char*) &sample, 0); - } else { - - switch (self->config.bits_per_sample) - { - case I2S_BITS_PER_SAMPLE_16BIT: - ; // workaround - - /* low - high / low - high */ - const char samp32[4] = {ptr_l[0], ptr_l[1], ptr_r[0], ptr_r[1]}; - - bytes_pushed = i2s_push_sample(self->port, (const char*) &samp32, max_wait); - break; - - case I2S_BITS_PER_SAMPLE_32BIT: - ; // workaround - - const char samp64[8] = {0, 0, ptr_l[0], ptr_l[1], 0, 0, ptr_r[0], ptr_r[1]}; - bytes_pushed = i2s_push_sample(self->port, (const char*) &samp64, max_wait); - break; - - default: - // ESP_LOGE(TAG, "bit depth unsupported: %d", self->config.bits_per_sample); - mp_raise_ValueError("8 bit depth unsupported"); + // DMA buffer full - retry + if (bytes_pushed == 0) { + i--; + } else { + ptr_l += stride; + ptr_r += stride; } } + } else { - // DMA buffer full - retry - if (bytes_pushed == 0) { - i--; - } else { - ptr_r += stride; - ptr_l += stride; - } + if (i2s_write_bytes(self->port, bufinfo.buf, bufinfo.len, 0) == ESP_FAIL) + mp_raise_OSError(MP_EIO); } return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_2(machine_i2s_stream_out_obj, machine_i2s_stream_out); +MP_DEFINE_CONST_FUN_OBJ_2(machine_i2s_write_obj, machine_i2s_write); //---------------------------------------------------------------------- STATIC const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { @@ -414,12 +377,11 @@ STATIC const mp_rom_map_elem_t machine_i2s_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_nchannels), MP_ROM_PTR(&machine_i2s_set_channel_obj) }, { MP_ROM_QSTR(MP_QSTR_set_pin), MP_ROM_PTR(&machine_i2s_set_pin_obj) }, { MP_ROM_QSTR(MP_QSTR_set_dac_mode), MP_ROM_PTR(&machine_i2s_set_dac_mode_obj) }, - { MP_ROM_QSTR(MP_QSTR_set_adc_mode), MP_ROM_PTR(&machine_i2s_set_adc_mode_obj) }, + { MP_ROM_QSTR(MP_QSTR_set_adc_pin), MP_ROM_PTR(&machine_i2s_set_adc_mode_obj) }, { MP_ROM_QSTR(MP_QSTR_adc_enable), MP_ROM_PTR(&machine_i2s_adc_enable_obj) }, - { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&machine_i2s_write_obj) }, { MP_ROM_QSTR(MP_QSTR_read), MP_ROM_PTR(&machine_i2s_read_obj) }, + { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&machine_i2s_write_obj) }, { MP_ROM_QSTR(MP_QSTR_volume), MP_ROM_PTR(&machine_i2s_set_volume_obj) }, - { MP_ROM_QSTR(MP_QSTR_stream_out), MP_ROM_PTR(&machine_i2s_stream_out_obj) }, // Constants { MP_ROM_QSTR(MP_QSTR_I2S_NUM_0), MP_ROM_INT(I2S_NUM_0) }, diff --git a/MicroPython_BUILD/components/micropython/esp32/modules/m5stack.py b/MicroPython_BUILD/components/micropython/esp32/modules/m5stack.py index e9530fd..bfccc18 100644 --- a/MicroPython_BUILD/components/micropython/esp32/modules/m5stack.py +++ b/MicroPython_BUILD/components/micropython/esp32/modules/m5stack.py @@ -6,7 +6,7 @@ from utime import ticks_ms import display as lcd import utils -VERSION = "v0.3.7" +VERSION = "v0.3.8" _BUTTON_A_PIN = const(39) _BUTTON_B_PIN = const(38)