From 42ec475bb483c84af694aad52807b544254c2bae Mon Sep 17 00:00:00 2001 From: tobozo Date: Tue, 10 Oct 2023 18:48:25 +0200 Subject: [PATCH 1/7] Keyboard and trackball drivers for T-Deck --- assets/jackalope.jpeg | Bin 0 -> 156064 bytes library.json | 2 +- library.properties | 2 +- src/Config.h | 60 +- src/ESP32-Chimera-Core.cpp | 29 +- src/ESP32-Chimera-Core.hpp | 22 +- .../ESP32-S3-Box/Audio/src/bsp_board.h | 2 +- src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.c | 5 +- src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h | 11 +- src/drivers/ESP32-S3-Box/Audio/src/es8311.h | 1 + .../ESP32-S3-Box/Audio/src/esp32_s3_box.h | 1 + src/drivers/Odroid-Go/Battery/battery.cpp | 1 + src/drivers/Odroid-Go/Battery/battery.h | 27 +- src/drivers/T-Deck/keyboard.h | 140 +++ src/drivers/T-Deck/trackball.h | 190 ++++ src/drivers/common/Audio/Speaker_Class.cpp | 10 + src/drivers/common/Audio/Speaker_Class.hpp | 8 + src/drivers/common/Button/Button.cpp | 5 +- src/drivers/common/RTC_PCF8563/pcf8563.cpp | 925 +++++++++--------- src/drivers/common/Speaker/Speaker.cpp | 23 +- src/drivers/common/Speaker/Speaker.h | 13 +- src/ext_confs/Lilygo-S3-T-Deck.hpp | 2 +- src/gitTagVersion.h | 2 +- .../ScreenShotService/GIF/TinyGIFEncoder.cpp | 8 +- 24 files changed, 983 insertions(+), 506 deletions(-) create mode 100644 assets/jackalope.jpeg create mode 100644 src/drivers/T-Deck/keyboard.h create mode 100644 src/drivers/T-Deck/trackball.h diff --git a/assets/jackalope.jpeg b/assets/jackalope.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7ad856a7727087268b600deef8cf812e307c9d08 GIT binary patch literal 156064 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ⅈ{|ccu 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 !$JiWoi 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 %@{smw17#> z(p1cuCTIng2f4_pkd(Gud4Lre8=4>vBmVSeO}0`@5g5eP&~=uG#O8e}v&6m?>E18t zpOEU-1@g_U&EOcy(W?bnrKwHrc;qdw-mM{?&_)-mE;oE9JIppf|(;kr#dc}$ zrNvdaQFi>TFhz3Mv%2S$Lk`Sv!l$)tT1R_^B*xNxO=oK9w!k*~Zl!l^BW@P7cX!XPvs zYQEBI6H#>q^+mWq2WEDOIjl9MYpW<4<+7$v`F)LcX*DmTP!w%V`6R(;_x{z>w>ut+ z)=MLsV6vx_5ttR<;cpP@yc^YQ>vT58uS)N`QKQ|pZu_bJM~?h@)<36p%hqly0$E0K zat&&%U$d*U9>6~k!w>{O^`jr*^`C~kP1AgH(68$JFVqdDdvNOZl-|)?J)YUe)3NMp zNJAAU49e}EClOy8^qqdIqH9;Gcz0QMr}Yaa1>0u~v+^?V$s-{8*T485@q0t!)Ul!K zcJ1^|x?gFwPy9Zh_BPn?Px%gg38vig$6Uq!g5|wiX>{f6U$=GM(_2>oiCGM|;E0Gd z@?_oVdL2fV?Y1kUyLB!$;MXl8xd8isB7T+i{-dRIeuIChb%WD%_VpT;Ynr>8erXXeH*ySA*Bv=Qzj5>ytPl8hNi<_gL0=JQR-9*@Vfbz`E} z+a+!51G_EFqVoBLu-RLXIY##GAjH>ZtD|1(c9-($Wb3S>5o>VSeF!_3-B?JDWaBl0 z(`zoJZM#FRMXV->II-B~SNv!~RCwD%nTUj3#e0X!ogM*ddy z^0r`~Kc>2Ry`C-CdIkRg5A_GpoBE5rHtpipY+tu6V9)%rPE2;>eI~w@{{Yh`gU?Vp z{{R$q2R{u*dT(01D~+ac2IQAYP_zqobKsW+%&V5y#iD2EK~? zJ?VNs4R~iqqtiIQq|sVSA)WUdt^~6mSu#oYt>u4in3L;I){V8fcyCs)wpYx($Q;+q zKZ@G>S2dbz7n|X$Uq-klJfQyorF*Ad@g=m=Zno2I>J|XB4Zef@_OFn?9z0ERO@6`B zfpvp<%XS>*IPF&n%u9H0ldIV+X_rxKtG$p}!Ea^LZU`WP0Dyhu zSFPo^y@#jUTY5`73kzXH6YrXsf=3W!f&s1`ov5@ds@ZT+Jh(GB$gb63`BNt#h^#Om zO6DMUF;m(y@+F(N_ox7zkr@3dYfvtu41!KOP?~uR5xa&9I2T;}u8v zc;R|Yq?3Y8UiE?h02bv|L;^=O*W;6s8I`4Av>X+X)5sw6HS#y&{{Z2wufp!TXRY)b zZEL~3UsLePB$3lKW=OT|X|u9;GQEWTa1WPpf%NpM?zy7rooA!<9+B7d>8$Cx`z>cx zVfb`Do`e`6jtB;_>4sMt`DdYcnVU{D*GS7QVmBx`gX`Y6om*RO=Cw6>xVEEC@CX|) z!~1@Qyl&2vcx%L+Tc90cbsJg>=G~1^IlF6=W&?)WKtAHV2T!X<(Y~K@9ZEs-12+dT zBm2~{Jv&x)$4y?N<5{_P;O=iBUdPw<{i>?p@QalmW*b)%1J)|jR86~A0^B8C!h{RK z?#&1dXu3GJr_w&A`zl#Q+)SK*+?cF1F0IyWXwuJ4 zzO4&4ZowdLPN#g+3M_Vo~mbfPNsW*Hk zGUy;>j}S?pu&8`1e%+qC((e9d$}X2uuW_eym|#qHKT6D!-In}*p=scBtt;CABU&C* zG63|ctS<6I5KjQtH$-u%>FIe%Htq!~i~xZH(}U|)mJwBm!H(0~y1YfPmf+x=&$TfG zjzFKiO#rYW3iJN}ng@j>9!I4FG0q9}#b*3^0O;C$5&UTpj>fd?Nf07LMAmc1$A3hy z1_$Oov4c|d);+wb#usUiO7yP}fW0X=Ew(4NYt9OSU>nj{P%;~z@SJ++ls zf;%dKBDx_Bxh)?3su8ux`_KFSm1yEY+us8js^SOc8ISd> zHuc}aaz7)g1}Eb1afrowIuO4qlyN-qUTgSJzwnx_(Qsg9FIbwfTPmtRl7CvLc#v`fb}>ec zA5rPeb2cD01b?wazEBx)9f9Jg>vskWo^b-2<;hVof!K3EZ4y4dw8GZqhyec70l&Bb zlw&m$xlx19t#zABSLG8ug*D4NWRL*HNT9902ogv&7XHM<_w}yJw$ze$NaiEGb1ktX zNIrm8Ln~%cX_+9V-h0WaITq-+faOMGaL+Z}rd53{(69(o z5M%YOc0~gseJiU;v}xWB-*~7zqsGazQb{~7+OZ6zl38GPp7p!&nEwEZAgRLgd;RMX za76k?>0GaFvBbk8bA3R-rZd`1{{Xn6$%1q5NRKhZk7GqdMoOQcrYrMc4%}3XBLw%w z2w9$IoKyg22=(GUeLre&d#wKeS}mcceoP!t5LADZPkN%)q`}nNV$cB@ANQ|r)2N9M zcUvDZ=M~|-G8Xa{kDHEj>0axlU~JeUl8c|Ubi=1SyGpk=fNqjl2*mN~X|36NtOKk3 zJOwc%eQ41{V<(U%x-`i01njvXgq|a`R^(**3nKN|vg%bqheNm+?M14vY}>bR%b6vV zKp$F@ru5rdI~OeU-8P>|X25sZr%#5G%vp$0#F9_c*G=oU&6NR1pUSfw{p(srcV1fV zp6Nv!H*O$$MR_lYmA149i6TXN9=6I0SHh#8ER0Dfy?G~!6#0ozGHaGi$CdR(C}Dw> zI6eNgnA9ow><)7|J-sVe)s>2=Uo2Px#P97`baIG1{l1jI$G^}~`hKxA%3zL2 zgWsQO(E2cDB$8wIq%a5{DB#g9NSw|GdO`>@AJUp~5guWT3>nQiQlbQcMmx{7I2>am z?N1w57#TV3KvvYuG4?0>)RV-p5DpCh8nQL@pRlF`6K9VkR*(uwVi9 zrV+>)9`sXyAQ{i}sC79|KXX%o^)<_@!bl(Ys7};cvo`=7{VEg#c$2kex-~_*k4-h{G=vx9ThC z{{Y0F!3$QkH}Cj4fJLA99YxPD9+uqm+Xp`N^Y2*b7qohZv8-E~eM(3vaR@(fYnQ9n zj&mu)jny?f2AS=!05Tu<-l7UVDh=+J17c6@RQi=VTY}}nZCxBdffdtdUGbPs#)X2+ zGc~C+TF_~A52U##;tj{m<{(JzS5|IVYfXO9W>7zhjDMPID`Q!6;wz$ykptAg=B{+Q ztvO9awzR5easo_8d=Irry{{TxXl^aXiwp?clqWx>X*y?A)o6c)yIx2kf6M3%VXa=d zrLZkrgf|FlH>3tr-y^X8m7rU!_mC#*fkb>^fd1h6S7#d@htqZ1eR&SCYfwIQCJr-> z)j2lpmIPc5IYJowe7B;|CuVI;oceRm(daL-AkHa2+EiOKZvA%DadH_k~lTJ&}(hmv+?cPxpK)sHCij6 zl1yUdv+EHff+N;N?f(D__(W>#>r-xr^Ky2j--mAQAgNP{_Q3`#Tj4(mcweE57cJ@a zY*c>_<6hmjouP4$LFx9cc}GcS)$ifIg>Lm5jj7b?m}x8!Rkr!PO3&y|>CS7_I@RqD zPU)63Iz$$kLAZs%0tn7)J<_~Fnkx^Z(`fBkKmiE3AamRO;;Z~asJ+%(OxG`qb^?MO zPSQchkJ7nM9#-zPa+9Vn#eGHWEZKxo2vOO=_U$n>@_*vTiPq;;_;&%mHXXp{oC)-= zpnO}@6<1jIcW(GjZIWUnn8)c~Dfq_W>K%6DmtcS!V4$3j_r-d##!EKia<0czmpC%>&(_+P4ZK9STC<(t0?P_YC2>KJZQ>%c#)Nz*hpEonFEto~^eX(HLd zS>^^o2l~~p>E*ADTH99(5WSA&^c~t*DJ$XmOZRPWWha%6+NxR!6Hxes_ibZTw)noFb;G5ztXI1IBSefK+O8qT%PIR zD^t-lF-rvho!&4Z7S`3vO!##ny~A4($=cw%fRhWLyu4g z{(nmA@ya+}`l)o`k&hX~NIy#QZ^duK%@=}tR;#FME(E%lMYOdi_=n*xc7#P{IKHjYX`~ zu8XFFcp`j8R^ETh#C<6^D;wf1YF%=>#@mVp(SmBW`diWT;K%@l3bH%!E2pSm(dxD8 zZ7eMBE6fjC;p&VSi&}FkqjL}SrD`ax=+^e8&@Ap$OoQIEU29S_T^8MoFqbZoyUW6^ zPJ3nq)n`kzZfZ+|iQGNvr^TIRG}o^vxxa4POOSlLvHD592}m1q}3Ls9_8h~t-g*)kkQDAkFRRhei`U5 zc!$S69_Yk1yM0GifvyWtu{TWMbB+ybOl|sa;Cpwp{uk-?H9BkBJC>}VHgEjsN`gT$ zXC(LUT2x)3m;pZLisI90zayqg3v}JuKjubT-nzYkfJRLoXg0V>CjfmaCnw?!{!m9F zG%X;p24KJ8SF^l1iTNO!F1!ejT=7OoA|N0$O>`rC?S!36eST`q!oSa@WStskP>~gFcZ{ z6DMBD0G9Is2hjbh7Q+&IV!Q4#TykVb1!FbL5YGd&8rvwX&hEr|5mY`dRs4e;+#LS^ zrD(1Vt>iO`&G@Y&rn|DkVsnbk>0`~V21Q^oApPpO)c$5jkQakiZU>uaoX8VZZT|o~ z!5Ey5YnyLa{3?&i>vr?;0fFgWnBp7|NLBW)HT)$%!s;0f3?@cTy?SA|xmFXqy!Wp2 zr!T1Xh$KJ+=j%c6!>Qec9)>82ZelJEFTFU4Czu%#$fnc~U__HR`cUmVWZ=me#Yz-1 zK|WviiU~oU5Dr+y16tgyL`w1pdJDank~;xiDnacHkZLsA>~{cH(2ApwqLVF|>?%dJ zc1SyR!24A13+0YhK?C=sRDrl0k4hoMm1~GdEJVTdsYR7>=El*_0CuNR2$sb1D3!7T z_N@V7w`#5c2aoGqnv&`V!-lqb{{T1IyNDkQ5Yx^;;;Z#c?4XY*CO{dQgO=$fMj&^n zZNpqbGw33x2+bspI|^h9tYnGpPzVaY#dRc!A$Tl%01qVg6$X;+>#Fy4B&uA0iKevn z4Xd_Lf#kR(`GKEGd$(=sdYWhn(P~AjLsNd$(ta(YKf-lbf(Z?o1QAo*1)6djB%bqA zLIOzlTIkS?_U?o7@ zZM3o`Ge7pHAk0A#6YH7|&Yq;)RrO&9u{HD-mrTFmdUji$WktgeYWep?^O2AbamcTB z=~srMMWg|wt&z1yrF6rmJe^jpo!({&)8DbK>j*=%ux-N(d7k*LZQsLJa9Lyt9M^4~ zr~#JTMpiN>>0M(koiR2V<=F*Klno5dIShJ(G^ zWcD4+7i__%U8R6*%{ayn{%YwC4`l#xNOnA*SmuZc=jNJy-ki})Jkg)LX1R4{5DxL0 z?e0J%M{45MW>XE2}TJVeR!ubW-%OtLK&4*uOpZ7uTnwS7kmUAPK zRC&i=X}_q05P9Of{{Y0j3#WLB$+6Y+;_v`%y12NWklc^yTmHS~)L+2b8-rOrOA~bS z#7%Pg>x<{_8U7b)`cQpePqh6{r?1ViX63c_UjG15US+81ibKJP1o=4jHTEvzt+{4< zMk2C4Df~X^-XvGOrrFbV`9BdBQP2HD`-;@R+pNp`e8HmCK9^3{FM_*Im>7>^^s98# z+0@!gx@L_<$lMu8fys!^-nu+r;C`Xu{Yx)W(*9oi7`J?8)$gI=vU*F`^f%7;dknc! ztJ{J+1KanlvujtSu+Owz2oR4eqsU+fC(zZ! zo0lyzy`Wa=!8?u!jy>^NO%?05S#60LR-Kna*@%jEl*6> zUVoKM#V~#o5wuC|S0BUIk}L+ZaX>9?jF}veezi-Zv1tQdu{)dsg*ZQIu(NXRqUPeF z)yW%KMnOOCy-g<7Jy*k5bWi!sGhVZ~$-idp&xvK{6SRT>_a8$`rF8zIZ&Rp!b;4}v zjlat&FbFVr1H^DEVWid$pl)fktZiP2Qb(1K*Vo#)uW4>+uQ^5*0Rc_2Jf&+EI!u;5 zFRAHo=^p#o_z2gwwr6<;ARl8msrseGvllG1+P7&ez&t_0j`ditbxxB@eBAu2F+28Q z3Ctg?MAW@d>Hh#MU0Y?fGV7Bk)K;{{`FWR(^;UitP`=9F^2y`n3Tx(@x@)?fTj~?f zE-$sPB$fXFFt4J25*hT~9_n`Q5KXoR)G$0(i0HKGan-M@8(~|_h8TAv*v5XTr*iE`eLOiinHZ+X5Q z&GY4RkSEL__X4#lX_?Z7I%jaeUY+Zz3A7TEBI0lwJAsk!U7b4b#?0OCqxW0QEvjvXSZtC*O5)TC^-_ZrIee*0kkJFq>eK z14n;MKf}BtA!1#yH!d=K$!gq`J}`$pf+ud(G#43T)Ir>*U*25c9;AX%PT`c zKU~*WhyX2oFaTU78cq^>)L(}HGeOM0G5!l!`GvwGV)o1#=R#6k4`0KIxIg4KF|gY<}QTe)y6qLMIS$PxE7is_2aZB$zt zdzxL>tfRM;t%-s^{F)=Ut+K!5Ea-H0tfiK>r#A`=ZD#Er(>1I89j$tQO1FOgqWcyO z&ZX98+qZA&HDBWEt~BT^KIKsi7)(L!?^pgFwyn|{!#V%IUoTg zhhZL>CcO)T8mZ! z+qUJV_}(LV;1Yc+?vMQx^c!QLb)LC*N^R;cYYv*-(k4+vw4MkiD&8xd;}_N{31Y=^ zJ5TRU%h+%SdL&aLiH)1Mm1{$nAqu1<7-M$SfEP9_E=W zl>{XEnBzUGs?E1~XTo|OVuhVnOw4j3x26^Mtc~Yr$m6j!n(ZT(_-{G=R&&oQjm0<_u9>Ttjj>_o6u@ z?j=tioY5#~&LGJ%MRLg63Z1^O!J#37!^U|7HB};&a=n@%b3)k=t&t-gjTv4%`ShnY zi{wCV{`5cwD9gSIFYRDU;fHptq+x$twr>NW>cNxom?b2_Cf*G68boAX~Pq&fb6tC-$a? z4xaX>P};5b4UILo_*Q-*vfN@Pc`9+XV5tTO%_0dW%g>;o>78pq;!c&N>U|ed+MNce zH(0vXp4nml0JXp)^r>D6EI}Bl@Nu|-7#YM@W{D!(DC7bGHO?}oV!Cu7%kE(f=~53i z@zMYQCP*d#uR3p-fdt2XO?qFB?U06X<~SYe%~)iE{{WifdvuN?ELeyj`cRbz)P3<% zF_s|wp!!TuFu=#!jRXie5ILS`0N&D0j256pE6-9D~@JZMgE0k6I(EMnG}IlRsMa{)P+m%^Nlc!olJ_tHbnP^A-UH zay!L)XNO|%MbWEgdcg;{h_0A9`{#K=-ll=@dPyhMWoxUSns zF5OlzB~IzCth%h~712ukF$ZZ@8O}v=UDbRRjZKjD=Pf;tp`&kxHmPOv3~p$sZeBW@ zN{KfFf~vfj%t_*wgVfu$G}qBBJ;fI><~jP$C%CU9@p6V22s7IpoY$`mcxrrEg#LiRi#v8-g)J-l0~l5Jcd1Lh--Ls<=Cd8RQHuIr9$TE69O zUH&9RvABsm{RGWqwZAwq81IVa=-`1MflF)=#zgT?gCq|xy)WA}QS@+GJ4DFO){Rsy z;St{knN&y&PdUvV(e(7H=4D`FIT^@`J_w)bOn{7>4*2axqHqp*pl~DuL>oG)XX!(F3$f-ZO(dJs%(e%uVbP+~sW!(W z1CI4LK2-$dXX`^|+$hH$xtfuP-!mY`9M@RpBpzIi-&(fm3{|c+Jg7@%s?l?fMO*Zh z44RYjHp3rZtr39hy1Q0yhP&lA94gArPiofw99y2df;S5-Bkfr}sKvDmSON(I0m!YV z;hOF0_nh#$a$+ku_R`;0NWAh4gUnPc3ld1@)~D2y@$MLrGoJMZ21X!f(zeKOXCJ)@ zFib?Ab2NV}9C7~sv;|}meKF}!36b0Or6eCQ%yMb*1NmfQywV`f@P6yNQ3W0gK`bO zSftkrB84!Zb2Q+H5_#v?R1VTwdz@3VZA^)QlRQwc%A9BQq{An2&OVh#o%N_U?-Il2 zn#*7Ljz_+0Pu67JxMMqx1!ix67=kb+KDEc|taE`4A|-kCq!(~JWcD=twtquNah_(1 zi&dr5>$LYYy89NjI%|V#T6K`qUQ6RY!Bo`-zv0=sst^1-H}Nfx`VaFDW199MgNX%s z$NTo92g(B;4``&eF7)`5SE1MVdr@#+wi4pt^ak2X-n3G+j#6f54CicZj$Y5 zqw0pm%X)2H#CyzktO(saeKQrHL3$X-YnIp*EWDgZk^O7Sx^mceTY8O4Sqyxy&%+hy z+AT%hD*QVS`IWXkc^pjD?RBQdL#)4~GEk!3FjsM4jqFDgT5UF_A7sV+47+Nb@T_=<2A17m(Hvf(Oq9CJ42)$-k;j8*wa>;HR=}GZ77mA0x)K} zZCtt$G@V@lw#F^qY%npwHO0~F*wizGX45o+P!e)^tG2y$FDQq#Eb&b5JODQ|1D9mL6zC-$!_@ZV2uZj$B8iND}mn~K8$ zNq}Rt5(N4h_TR)U4b4YN*IHK~U(>cW@WU!csGsXuKf_%DYI-o%>{QeXBYw~36AY); z15I)AT}``q`QgFUFWu-jbiGTaJ6^HWbi~`*aq*Tg!?OSxe#W_a!8bZbSn3Sl!nWh` zn_xPZxhl;$$e*}1wDCVp9X{5Y&BgdyKAY6;Y7vmm`*#Ge`l&2MWIE=8_02A$NUFlm zP`=@a+7j)A+aymA;F%l;2DgVZW>Zy1thkpo9Wz#z#mgE^BPttlHywGnyRdkTz3Q{B z=rpF|>YCWnYISVdo3h7n3`C&^jPc&IeSI6HbQ}6jDqXxkEp1n9TuW$KNbMn*0!gYH z8nLPApW+(Gv!S(p3vQA@R}jP05h6XST=vStrRZ*Jeh_=2{reYGZxQA|vOa`ugY4Dr zz5v&aS47YYDC%x*^0)s0ZB&qF^!@AS*40?)>8#f2ThFQ1Tx)8g8rXp<-*4+)-S}~> zYuz7C?00H!5pQh37#YXjrHp0M>wm*_xSbP7t#G)41HkiSny>so)u8FURemb`WVX(V z*xbW0>`Yf*fsy|J_Tm6VGwZ za~AaBjOFl`iFKCs-CwEeZ(C>5Hnp!60s&)@C*LNPqTAcQr`1^tX4%pJZOp?uiDG_- z_Mx}@8@k;-pvw(;n%)sL|>WtBeza+LUc~RMA-Jt97+^Cgs;`>_S9{?OgsB zW2?8V>N>DWX)UWGkCmWd1o{uzqPPAU=vQrT>YCOouhk(evl|ru04#kgdfIPEwW({R zbdtAH+}Tj2z{9D;{?&vj0NKg*1M^^@t!b$ZW+ z(7J0jixbG7uh$i(emOd>tyKt6ei0mTn#xKm>NOY^?JGR7#wzo#U$nyGBN9sjRGRbO z8TBvl&kjAXcHY)7P(2s@iqCCz5o&xxZ{u0nC|=k@2bmw%v0Y24T0auf#n%@LSxK;cG(iI~=!l7|niMbo3g{b)Swrq<{d&(4W12wtfS6UrXWN z0d#b>5d2*&w|7bYGqUa^Pi)gK^5d6JP`&_V#1k?nKU(Ev8-!%~RJX3%7p+@6nTnHv zz#g`sTee!G2vm!zx^) z1Gg#`H-Qoa3LlCX%Nd?Q?Oe>D z7$dbO9MyA^`HbZM06|tPpiB<=j`d$~f5b_Q`*B!p>Hh$Pg?=uzK_WuT z3iW4Y5ESJ^it>NLSp3$xOq>Yy_pe_v|lU|K8Mnk z&C?);2cK1_!8k1&JNnH#^oIf+3e zi~~@SvM2ulHPf|LB>iL3g`(VUJG~%sCmxCR>4MewZ8wxHJYlOov#Qg<8&eqd%F7{qlV|7u~Z>7uEbpCzT z?W>k3cEd;z+!KyFRCibwf&&TrAN8lPa_8l~9mf|Nb1*wL`ALwZ4oDcD@j#<=mNIGx zE}{*#?SPihZB!WAI|1$OTIPS7G9EaJ^7l|&w*&f3dY_M1a=Dxb$cYBL zy5h^r@tWg%be%Yy5bc>_Dlj=E*p@iY1JG2r1i2iJ{)UC8gWvj8X~J}N?Ydu^k9NT< zo1C6O2lXB5bhwV8k+&%K0ht z8HE6kekgYx?Jb7LSb{1*BnTbxBAJwcz<~hJOQb)@Leg4lK`BG@trjM zNh7qAUd`b7xzRMmh++x$1lLR)@?Bc7dvk8StfWjT#C__|O=(!#aSCnuPV@}>J*%503BkJl6f@x%O2;VMbU zUO!J-^54ZKz5WxaJv^#i+^$*y7RKO71G&c)>de+2$oOjMb8M2+$T0+0p7`HQd5aak zr%Y_a+G`+^-N-Y<9wW75E}F-;igkcP>R1U@JAnrVM{i2Q-)HzL_fz3rAQ!e9a8u|E zXX{(8tQh=MaRUGzJ60=Q=D^AO*Er~}lb%Q06u@#o%{=lwOw$k;0BWP@7=Q=>`kEmi zOyrr0ZPG>uA78Z@5dt>);+(miM3QhP^r8g&5!z{h6P(E8(XLdJ_o@g;1asb;DDNP9 znnRHQfOC<>5Rzgu`h6&c1Vr#D0o?cODex3X1hp?P8OiM&&^qV55Fx zQO~I&O#lS8PnUyP0~sLy0N8ygK`}mT;(aOSIT-rQC_h;f5kR0u00Y0hEG`ZJ?aee2 z2$2UMQ2{wpGr^z%AjjzfjZC;Bn3`d34|pD#qg4Q(EQsXQ4{Ui@uO^f6wr~q^ z9+b=q9B|o!d7@7;mLtvTIG|1DVg@}sQQaUT?&Jz~AZLI8gW7`Z?0$GW9%ww{t48++ zyGZ&?XEgu^J95z`D@D}LnTCF2kG*HEoz6xH-8m8Vt}eLrg!AQ-I5?(XHy9&<>r1hM zM2|{!TnQ2M7^6do0ztuYir?-iPL;T@%m?8 z(OT*qKT~clS-Hp59>jJdBC$*5x;q)h;q6|J_$VE+zouU0z#et~0H|lwcdr%b9Z@uoXF;n|V*1Fo?89r0+4Qf}eeZ_T zx5Kyw8AW{Y_|g9WrcRyX3paYtg97yL5U6LprdUflvT{leExGjhSo$2-RmVN?Upi^8 zJMI@2Ol3U>BaiJ@oiqLp{hRA_hIJ&p(ntfedsm+H{;96;&bH@G>$WfHZfVK1!sWfJ zgmSD8A4>E-koNVue~6B^EU+qAHy=tjW}7aZskMFA;sI+}ZvYRKyMjHdS!bxOr%E>k zXA%Os?I8R6f-3>h8ui^nXz!Ieojsy$Tq_3RjPQH?D`nCXN7XbRn6-EQDCMKfyv9e~ zrjv-!=&sw;X)Ro4+zu{V3m_4Vr{1~xmXvBP5v#W9p?2GFzG)qgsO??-KSuU6za6Yg zsB?WjC>x?7ziw*RNpjCwuyo+XE-PMX%MKqp#~1A4_WBv3V?BU?m+xhWLZ% zPi`mDw4E!Z=?7E4s(Wj!)LrZXBu3OZKUnwdYumpI^~tHbX3eJBEg)pf<>MplKdpH!)LmukXGQSsU59(t zkMhJQ1Hb-j(0>M+QsYP$5IMNf8&qL`Qb?>-%ctFb0MuKx(rnp$d^=nDF%yjbmEd3c zkJODaE9mw!Y417&EiB1!2|_(MbnS!gE7bfUsJOikPA%JEt`MPEf{aN58aT!b@q=Cu z`1h#0)DvH%Hd{@9NpP*}4ugHQB$41x||ng-5SSO@kdX&VJ}?O*wkFR)CrK^3;+>eV9DV6A8N8a73-Zhq_(Q( zNa)usEsI*V1<)LARRn@L8~|(48%24pvk;*)<7+X%9)`I5H`6WL>Q_3Q?HI9o$`uGM z@7f0$9M3h|)~_9CHmyCoOLXl456pc`_Wi4I&exlDk#kqnb$W}pl`M;31qTIG{{XC- z<vMBqTZC1xHlE@jFNj)eQE7j(WSdY2mWAtz~EI^oApz3 zQLh%;a-I7?-Cj}nk<`~$)>BJi=FX8eWuJetWbtX^Jyc1ceZEmko zskmjX+$?_Pua0xH&hemc*i@!FgHC|ny^>xsO!HAgF$w{m0Ie5E=_B&t@1HB3%mB#) zwRFnNV-t3)d;!yc#ynHfthJM=U(H*?03=R%$LosyfAIB-W2Wic6n9%_yo0ob0Dwk2 zMl16d@K?gRuM&8tOK(AA<1xGz3v3D`a@~b~o%C*+x*nURv3Q1iXcrGT9Q|`#H|%He zYL>?1xQ)jc;-e>F3OQ;pHf;j}b3znuE!>zHsN_KHEI`i`>i$*{<}||GsT1!=E&++4 zeZuea4bud~fGa=aJ9|0-T$cR86F#~9t4i=#u`nZmD?8(Lj*A3m<0opDrH?Hni>>7t z?d$fhNAQ{d0EGe%2kTyQw`d5gumqZgn3K@-xZ8|YbC|T4EsSd?TRucNXRh) zDaZ~E`BFslQL{2QTaqz`kOB5J(adE@QMcvpO;PxzKlxqYBw$3=fGA8=b#m(xr_J7Na zPpr@u;IRr~ir^Coj^LV%DJ|*;5#FR=TtMLFsEN01F%vQE^{DSY*Fsnr`GFEDV6Z&h z@y$oH{9h`-D+CkTpqEaD6pZH{^)wrVl>vet4{8KO2&2&YQHdzzDR=EA1yC0@u-p`Z zAO$>ED+akcn5Y>G5mo}*Tn!@w8TFyNY%+t5%ba@9akap<*aanGag#pP8ZfzP-NklP zY{uB1V>zye)27x9eES1r}@EOtG+n(7L6g6bAIisrf$ zm289DcC63@7?}GS>(L`Kn4Tbe)CEu=_^cEYf=_zr(3MNTDLY0^d)3gx_~;*k=OQpk z#d$@*RnH&xuV3-~k{0gMK>`Yy&?$i10S^)%Z~HF;)f&vvy<9^82Pb-9C1Qad4V5a^`nr&0m00V zT2T^AiTRBIY4E_#XO7kEUJYUX1ULTxD@mI1>i{jt00Z35_pf8{BC~WhJGK#aIhgmF z>4$E4H5LuGwTaqz{{YQ(T19AP1OX;Vz%>@_g#1C4t%{pw&84_nZGuA;!J5c;z$jba4B+l! zNbEtZ<8J1d(! zedtPv7{nNXPniM%lb+e9GwU#Tn!O|G5d?ak^l)RyM13%659S^FQNjEF0KC<5JRRP~ z38w=FWiLA!&OQi&=&PTUul&oZo4)m>q0|k3cN`MID$MmhaBMSuN9B~G% zZ81)btGECsXuev+aYXDf z$ruyF(n$tak;OTMZ1?ZY1dFwmMB-`KLYNbuyiiY+V0%SB90?wiS7KN=8OX+H(T>)ta5VQ~50IFk z^UkQ-iDt=?Ns7;2B$Fh8Jo5sy8uR{H#PBOWaQUT)iQ>4r#7a)jmvHWAmziR)DF84= zOoB`t(oi@99-hAS6l{FQCnp)CA%H5gI31`|@Ny+EQ*!0Kudpq^T301N$i;e};n$Z_b>j-Yzf4ufwr@{ER!~W77>OdQ zyhqlocz34V)#?yC>?JMk$$>NL+OED3u&r^B1yEbp5kK0zi^e@$^Y^uyy_>DtvX-qO z@4Y4e0A`BmZlf5@*ULYQABi0k@f*Z_9@1!k#QN7$L|Zz}lWCo|mMWHh9^KcBM7JZi z5n1k>HNFY!TE2_ojW(;MU(%IRX8LSq+&685kunHBrA6UC$NrW0L*bOS;7C5Ot>B!4~5vv!f_HfGiQZ0B%+JuR7^Jh{wb}CA>P2)IU$xUN=swSE+qP+jq|{ zUF5hXH&3jHty#w1aJh57pGnxW{v)N*YV@~vZfQplTHN=?KJ{tQ9^X&Dc@W;Qa^n!t z1}=k;e!t$Z{tW9s;ToHLGpPl%%X4JALNS~X+H;>-2Dg?q_O-WlO>G|C({Zg{H%8FR zpbke7Ijr>QV}H|i&8X9AH6zZ7v3k4CVn_$^QUQ?nm!ie++7RhPLI+HO)1ax@|jXbpZJt4stO$$Ef$MYF9ff zL3a7FwuRIe3;zJj6D3ci_pA?%JUs8eP%WEUi)=0q`+LvQy%VVDHCk($0r_jT@3l!B4+!qD7x-I-caT{?yqCEkTShGz^`9n$hK9|!(5 zt=I}kWOrE`xY}TVNd8}H=<2;!PvOp!ZF;7n<=r*KEvC9x&u4ANPc6kiD3E{Yf;fX) zFT{@x^$v-uvDdsgrPJ#5ntjFe*BAJDs|;oBoQTK-d*i)fHN8usb*)CC<=rD%uq@rS zY+JHL%`&hBTw6SaXxur1eJLC5^Y2jc0llp1!&;x3yi)C*C^LF_Pd+Py!( zABP=VRexKfy=>U&ZF1GkQBUUD0V+LUlloVp$*nle?H5mGH$ORM+grPTOsEaTmXc(j z)DNJqPy8?Gm$W@k^0%H9U6SdUlL3JGX07_4;ga}sL8QN{Mbx5sm8Wjl1PS#%-&(cs zj*%Mvr>Kp{*RHPHP$5_%tb^|r&c^q{=-&&gX?!_vs9RI0vw6jhLV*}kLXq#1J@H;a z_@&c7#=665QsH~sKxa(M2%mp(=xf{h73H_#{-2~_@mci%?A#>4E&XfG{9T~4r+2%i z+^KN2%Xb$ALChbeB;O8L-B-&#D)8;y4z|U;O5U)4FY$betfV#q!RI}_&1%05I(v9@ z^!;k-zAm?}>UJAf?L#f0EPk-{7{+z(tJGP6c!Y*1Y zGa$nu?7({04^8Q|lc@AvZi&en1Ro5Ro#j{i9MdVQr&*Tf+Cip$1(9aaTOps}TH1M@ z=jbak>#ph@R>{+8*8YOTEz)ifR0A7<^&}h`yzvFwt*0Li?4`@r&%?QIB^Zdn`sS;; zj-YsJ!mXs!>aJhaYE&zw&I15E!@t_B9(AqM*w*#ix9=zLEHSvydjnKHCh9xLxS%VC zWnda`ct3F!WzwwvS52&Y%>Muy;Moy~-TuGQvi()=YW3Gq&dr4F^e5Dc&8^3rej)W& z({#%kG5-KFQzg%^IsVn=)@>Ipxb0O0lk}_a80w#>bw|3yd^;dp5#QAQwNq_M=?+2o zjrt1fj~Kbxyq%plr|!9@XA)b?!}?dKcz?pJuCZ+{!tcW}_8x+=UK#1l)OB{ZF55QL zZZW|0uciM047?q8#Jyul(t2t$T_^aZAd5--(tTr^<8QUwTGV>){+T=~IxeeGt(SsvZ! zx39d6@lCl|?d>FgzS}a(~<`1=b^T}q3$1Prm;I#OfYee!6eev3{k8NbWxC-52 zw{-i|I-4f#iUdq1}i<84)A3Rrrm? z&Y5~L+fNxac-GjFw>Y1zQuvG!p}a~NC}fW2F;euiw~^cs=W`wo4s%u4fEUn-rzURBoJeoW+FsJ?go2OAkkC_B=*m>H0B4|XaizE!2PM2;IEaAVyFOJEd;qY z8~nsX)PN~@Zb0TJ7{~+=q&IQJAda_pd`2aJ8&3o2=~F^sm;i8dQziNhP6Mk^#j@10@Jt{l=3T{ z;D>xkn2IGUVPOO;&PgXZ?@>F;4CmUSA!R#HC)k|S7ZU)S`c%c`p`Z~Y4kn?xL2_^> zwDVG^4%iCe2qIKAb6pxBrNX$&8K1WmS$9cl?xx17=fpRx$yj5zA~L*JZiutrkUX;$ z23yC787|}%RnBquuOYkhG|$-cUccjTMXTd%LXSzWAl9>3TduaQUMQu7w2jP1VK|c& z%P!p`j^I1zumj#|IP#MR12rwlCRjk)4opPmC_K3!8Hs>nHI)acoiB-KCw<@=a}v&9>6=s&gi#`&R?*7Oie?I5InKpzE*};wcH`A(ed5^sIM^lr@X8RYIgp5=bLI+O)SX zxF}ZM*)kLe6Iq`UD?Xazx@D(v85J_=XKx4V1f50oBo!Hm`D+QURUxMY8OeyP?^^!= zn)`SvKqu?{zrA64iI#9lJ5Qx>byNam6)~BbS&0M*{pdg-100A19w`t&BRDCH0tCz+!dB6Ao9jwb`kV2PrI+6V$;ieNmUunfj(MS^D>`b7gMoq+YCyHB6I3REUrvTy!9f{{Y)Iod7#Z90Xou+$; zARN_Bpy9W7JbTs42u3wesy;*X_2Q*!DoBia8no$a<~^H%p4D2=K@kE+HEq&U_=Kt4 zOmpd3joz1u0B0O_{*+sRCR#B}G60WgpgY`Tz>|vT|{{UKufC}b28YFIL zC*o!RB505Rqy#cZm2x!~+9?#dGTi!?5T6o&c%XjnNV-o2V5! zTe3XcOi+2}Q6qu0=6x!L;PaBvwr3u-d(@k`$upChqPk?6Fa{5)`_~s(h-Z<&jOLsI z!~n;f=d~@k&P09amPsX!2g@FmQ357oJQUC+MqiE zFL1*r1GRdO;q|b(jYi|jkEMBjoK3)2F_E~}sD2**0QGvSR|67lDF!e^?c_{Z>jp!k|v<=@H+i?yW#E_?lZX1u?qf9W&B zeG{vup?a31Ql#!{0XBh|`H!t$WY~)|I!by{Fc??@N*j+#H44 za7Y}+VyJHZZpO1ss zqF%A_8pB<-A5DLjw{RREY}O}kllpv*;X4*r#5#RtrEA)y*Ij#`2ml>j3oQC%wm7e+ zJPfybhfdXPv2Mnk+FeLev7M|AXVWLvzF_dPH%IGQ+g(cE<#oDELA9x7aI!NDo{-Ux zMz3n>o-H=KJ7-Jau$r5iy)s((uW%y`@Cfvf1ARXA(HpNG_?xF|{1<-CmgT8OQKvhj z$_OX>fmvU}z%F$CKFh~#tHc&OF(+{Y_7#uuMysWGcU!8~bsbfk+B->XX>^F&zBR#U za~uG`&(^XY4g6NW()D_cUb5fB>Gm0}4K=HNd1Dd!#8%kX53%}ZQZ{@>G{)w|)1bV< zKwzvh&H;+%@y59e}nCW!^uA;f!#0_viXke6umVy?d&7p6})Dbl~?avzA>$CBY^b z1z^312ae*Vx6}%1#+OfRz_u3JLk4TJ^AHCge@gOZ@k460ud2~r{PoK|e~9W55R552 zpVGKAzlxn_N7UNuTGQIL6xg=QbSBKtaAshN=XtKvi24hn^pcKmslPiv>?EU>sQt1}VAa4}eEh`*;xmmQxX+etmlv6@)tN#EFfRqu8cdZq!g7)#b()PbU(@M|;gp3pVC^4ne%1EvojCZL?>_e1oyP)`ryTD(b=iA+5Lvd#YzPG7 z^sa(oM1vE6G5gd%3^lOIK<`qiP>&~ZKQ22}a{;%wO|@kvcT^V!(0gs|Qb0QM6{ z{{XE|db-LJ?IZsHHAmvo4@0>!q+CN;y)1c)ZD%`Y*jJ$VF6G^}ZKA2Rz?N@9IQ?tS z?tlp)a4TowjZ^7uTiA9f5W|C6$F;4^^k7NcL{}<>07DJki4@LDJccPY_ONN~98_);BTTTFz{vVkvUpSFjw%*rTcJvMLdaleK9tyN zR~F-yU`YTGD**ohts6lgD1c}G02Lb+Fc-_)ij7xj;&UQsBrJ107~{ParI9jw$u$+Q zEvOGSIg{y2QPi}3KFzzj`{|~)ag`Ll31h&ITA^VD}gTKmt4Gf&lfdk^xykG6oJm@mw>ILlKyR z-n#|+Kot0?xWo{X7WvRNarl;@j^IGM_Paomb|2O$*q0?$ZZic2Hg@BhnxY4GEEoKv zu)(SHVEjPDj1kXz1+wh^OHG_k;e%2D`extxcXeNw1_SS!vl@yY9Vj;LlCU-cf7ZNm z@Y`^OgWm&~uW;*KD)(O9@R@7|O{Cogi2Dl0So|@4RmdR%VpE4zl#ZNuYrDpi@ zx2EP%=C{^daVLnVjQ8eGXs=U$!YfY${AT$KJm2uD4u14Q@RO%PGxdFQXFtQXJ-rQ2 z(#?IN%9Y{aPkegQ$JAqjYt~cnpQNBWx`$C?nDZc?{{VNIn$O{1Lk$hJ7ThR>7tPih#)d9C{8*bGZJgm`tH3~NZ6qA5C6@3kb`kkwH6|Jz;DH}*tCI~*m z5meoB{mpH-(dqRrV`)!?01_vXMOp+F(EKt3Ir0`0nVviMq4;Qu${3ZBz%eBAo@wc` zZy4&n0`Ug2>1#R*YBylr)FP2R;;63v2>72_y^a2rU=xptsbWYz!E5MJo7WIP%*J@3 zavyf}GGYj+JUF%QUp-s@0MqwfE}xj|eJf5Fu#s-#oPCF_c3S@c)3;C|h0hV`qCf`T zk&KS!39oy&8GsIQGoETN462zCk^tuwuhYe!YhH8!K9NTRgWoeiaD36kO&S>_6OqrY zc~p2OGCs6Gf0$$sUi8b!1LpQL@=gqqG4`klK@;2o_NK&c9D|Q)LlHkI&poN&msB9B!2Yjc%BbGN+GTv;gV;ZRX(rf0toHJTwIcjLHYyORW`2* z+jGRmCZ%dCOpXtr`qjrt!7(0VA9|=6D;XsA#ar}|3QuBt^HMc>Tuj6cX*Bvs9fzej z07Q}xA6gMI4D-!t%xD1tff0r|^P9zZkR-l-&ki&5p&$UQ=#17&rAY`zBq+nvDK^sg-nt{NB0tuf^J?odK zjk-&O#DR+GEs`gL6BWtSjOeceA~8XM*S1b}kT5x_D}&5QIW>3Ghn$S@^{Pjm*%**a z99I`uiAFth8TF$C2?NSW{{X?D-GQC0KEJV|1e5b*MCY0)$7$eT&MCkk8Df5&sxu@L zgBc{6lpL7I;O2@wE^p+-j8~}sA1=%Ki>eF|7e1Bc);Ih^@W>Y+#^K&;)cgX+_~e)b z;Ec^&duJ}5hL;B5c9KBA9qL9v>M*-VoCr0{msEL4+-EtW1Og81#K)y|b4lN)%X@lpyL$J9df4fmO5UBB zPM+XbnCNaSG{i|8lt|iNsS6O|n6(py_^D8uCpHW_Mq0%OwPQ^7AbqRX%&4J}+ zwhzvyz6{4Tu)o#%M^EY3F7-WSn>O^8_iwv!Y}ib0p2T;p%XFDeLw>^qPltH?CTs;V zLFYb(yz|H2FVXalhi6gLjA<_=)!lAOTDqh#2h<$n{c4Y^{xWHF+8t)Ep(VbduFz^N z*}0|s#=~?LE4fU0hC!c7`Nzc_YhB`RAKd={;yZeqdRupr?ypK&lFgxj6+q)~81Z?f%A4Tsv#Rt! zPDt;@1ubV+wX4$|7eGe6t-gx)MXCNAaLh*;&(zgko2zPdT|&lvrg~u4L?;&+D#9Lbrx^6rug=l?IaKhGr`U&bzK#&16Z>0FC&WBHN0tB?_aikUo4t}vUqUl{&EO-xqbgMWm5 z9sDAiEnL3A_FuiUk$RmdztvGyL(Tz`eW66;#s zdi2dL)=rJ1A0N)KwTZ-g37YktcZ7#ee}Q*Y1@%$pxOW$yZ(78;<=;(TTyJlTKM^`d z=lY1T)~wyNtVIZ?aUsOx99M>Tm!<3VJ!$X$Tv*cEV!B}F2g6en^qTv>#9kb;YhG^Z zS4XRGN5Z{%g6&b;J^ujKu)m1iAENbL6Lj9I(Dc@I&!r;Iwlz9?V%DJ}b+Eewo+tIJ<*n&wPr85f=i#kCLhv@1UgLJRTwR7H zQezR?SDNKFViZ=~v71+5Yrdsg6L%OtAvAOcK) zGhX$ezws@m^>U<03uvM#`f`5!*I4pr{Hpt5bePX1%>sqm0VP15^~{=;atFqp-^u}5 zKGV&1qV6HBt1#dKFeI>h3X*rqNebboK{j<0N@VuQ_`nOrvQ=x z1kZl;sqo^1r?y(%XS;wxo$1K&h{Etv6E_7hh>!(v^+4C(zGo>o8|-JwC49 ztrfI^t|Kgl3SbXfS%S zbNbf5OMg?@;0xe?6KWlWzKN?KRNjXZsoF|+P)lv?~3#z z@kk+b>H2a_Gq)+TduRn!bKRs+ zi*EaY_+-y;O?LbwgZwec2h`J*Rd4_RdUmTkbLqD?z`B4cHLw~1@|f*Vt&5)#i(VfN zZ~|sM&33(@pcOkwVc!&6VT6gNq&BY_MoyKGt zuE1rZa2fQWC-|1hU_d-o^@h-LZAe|=iZXqUCr{CK9w!T=g^*LSAN((Ddh7@ zBsPXcu{M=LsQEajV{+*M2O|=4XrK@U!2{S+E8s-VbLmzmNOYHM-bT5lzi#rY6eS!m z4h~1x)Ka@^cg-q6fK8FmO4=G>0ZF;dpuU^`XoI5HezTq_7Fj z;95lXr4nOy)!YG}=|whKK?@?1#GTSO%^(0+Cm`+v=}hbpoInC++JFJr_a)36$?r_d z=fNgh0*S=ja-?P;A6f^7fib+C0si8NptA{(JMuG5PUbE8X8?LovXv5G0$_qEbI6K| zv{y9fUe()+y{!f*v`kMpr)6UCJa?%%W`Q`KC`j^vCviFKYLv~lZb67S0%D>Y})j$w{}S~VVNi8K1wfwEXUow)U>Gl=9L?LsHG?*fW43d954;(-AW7t_-b zN)J7zoMags88b~Jl13x%H350HnWQ|?+65s5+;NlZHQC}46Qt?z0V_4lY;GVN zXPTSD&$p*((OVly0z1|CF%}RT#zs^|1lO(f@GbZ|r^q{uobg^srzBi&I6RDs^|7|! zg}OpPU*VtDn6*`HoQ&j2iU}l7uiA=Z=FifiCuk}L?Bc5;AeF%|PG}jhW4|=}fl>bR zO&#;^Kr?}fj!aYFPVD>fNI#S5`_mJ&M0~#01CnzXG#j()7|kFp>#n z$e*a1A-XVXB|P$ev}3l@kJ^CZa7`oxH1n9irr^gDpVFL3d>($(5-UqbaoUe6S1?EV z)M{nm$I_%T<&GjMgA2cL6YI@NB(jwo57)g$gKqh09@QvayqV`7wL%A#Vh3o7;_Ad5 zCEddjn(aVT7%&H|aCMRfjfjXiGn&Z3Ys?tHKfm6oSi#H_JP%sA>Np2+0K{X1RO}$c z0hz$#(AOtehmBLW2LyKgeQ6jOaszsk6zcZJHx_X|VVa6D132KGDZrSKJ-`Bk z;#=U|SpfH`QNAD_30>wRVix{`>p*$|{A4*W1_ylCsrUs{erH5}F1QDfj4E?Lrd=H`5X{~Di06U?-WVYR?_DCjvwY+8AOtq%PQAi-LAiy(3u)iPy zMpx@XX5F}JcMfs_(uN<%<$)3+Ij*{{dpX=z9PI*66(xaeFoL9Z#X|SK8v(ZAo^UEN zsBq`u*(@eLVG~!@n_K*QN`lgztQJ(qzZC|nP}XdMmnU;W0y|Yn>LT61%co^xK=Uvo z^{W1(;#AXHK>Bqldh%IPZ$vY2IL<{ZvTl>NmVO|*-0K>R&=-s!-n@&%mfR~}Kp1={ z)7=C{>ref`gI?v=yd|sZnwQmnZ7qC5CeT?R`pskdkA!r(X1v{2?f25iwD&CSKMcXk zCp&YJ0j_flw&^m{&w6gU@^t+zol2c77Wgf3rI%Y#t6XUL)dbsdJ+>&0qfj zTB~t`+w+Dj-zlEpe@f2&Jv!em9c9g3ooaNRm!-CX;)m6{!8>;D$o~M^Mo0Fl9;m%n zs*Bod7cNGU<-H!EoQ1sQSITq9oCED${UgKOMCq(v>X)x+?`ri4vgkQmYA|4P=?1NO zpMtdwuIhJgU%l|yoBBJ6^OQ&gkUP(6*7SD7bfI%s)pXZ-hNkbpvdu2oa7Q4Yw-wW> z=vVwtuei^1^43|wNin*8ef{dD((7+NrsHYurLT!MLn{KT26^Dfn5#_{``W{#(ObKG zYVS13KtDn;G`opEs<+d4cd2xasnoPS5n*dls6@AN_rxE?KxK!ZttW;&A*AW+eLDT? zHm}^&kArVpwwEq)797Fw1Pts0Q-oEsXek=s1Fk8dWG$FruE%eyjtu05Q_oB5#}S@57xDs zK9yqUh_p@7p8Kw$*5;PTwdAr)a>tX&HCxei`ri@t8+|t2+ih~?ux@TyDlj*Gvx@h> z26zhopGih*IXDf}+Zwo;w00=hm&fa+CW@(mW|=rQ7N0cpXja*WTl}JBmpX z51{lFwbFP~Pib}6R`0>ld{5zpX=Ov$&Sy2M=-vkDU0U2;*6z|HD=XTS7fJ)fcJ=#J zou3a4FHN`rZA&?KH+M`i_Vg9X&FQ(6jW>Z;r*z#xtGAc9&6Qt%haE!O8xW@E?yY zX|+9j#CBg&bh>rBdiASlONRddERSGo(~cg~Pd&c2)?=uCBzUjIT|i#yejvQJCQwer z26%y9`}kj~>pmms?ww(c=Fm3PxWqXakW}*(@?Cn*;Gg1FqryHQwWZcvFVgiyTGS(C z1vuUH6U}zZ3G1lmGrrreeDObpZ1v4Gt!2w9y+tSZ=sfa!Pj9VxwxP9pEBiI?=Z`(B z$VdV^dwbWfb(=cwldibBTc|V_P_>{Lq@Kik99N#dQn%ES^{%aHE~T@%THx~|46<$+ z5znEopC>PF_ucH^7kk&0PnEFWv-e(o-{{Z}7*NU#s5Na_?M}8he3Jm^{%C;)88x;cBh%<~Bs>@qeEZLh@!9`nWKngtp6)ah%TcGt_Us>qgBVE;XH+4Ges;5zY<Y6k+)ou*tsafQz@9m)%^W?n3a~lz7_9!6 zD-sA%Ca?5ve59{`PwiS|ccx+G0E6DGED^Q61yt#-3~d=0Ggg{*i)M2qcCE&0#ed~Q zz(0SrOrV=)1Ver6omh~6Secrin|nbja6lL$w1QL?mna>}PVVcBRCdANC%pyLV0T-M z+i+*UH7%=)a9X@D9vFQMCFN-qBIAHZZ|O=#F@SqwouMuq$CMfpcPtSx`qq%-Vn=56 zq~NQ}NFB{L1%Qb9%@N@s2&ohoVWKcW5lRZ&8%HyNPS9XL!0L49(D`g8z1rsN+qGc$o81GWB366az$F9&604Iu{K}!+9$n?by2{W{hLrK6A z2Q!KRCIK@vHZU*>kGC;Vx6Lwf&w6pRMEVL%B#aHb(_x%{mx>X%sGN>O;*&8Uvk~Yy zr$mfS*gtBZ7<0^yGun`qgzq>$luR3Qa75$OiV-`e4tolU1VGKkNu#)TiDqI5@AaW# zP)HI<;%QtVS9HJvMkt8H73Ydf0lO#szoi;4m~eURO$u(To^j0Pf+9n43=J_^36l-! zQZm5D>S{2{aFw)3HsE@5?^l2pmI!8oJtx1V0G-6F$-qC*RH_MP5TngLov3Ysex`B- zMTWT~<#zg1EW}^|p==Sl6mdn5 zJX6GD5HV6u0P+Ng%|-wb+Z>uW&M-Tk=DvGpn2{_el07J*06fzHB*f4A#Vw$jn2hK8 zP&;QJN34zoF5X!H4C0(bb`WEVU_?MFV;N}0KtnMfaYSb%#7<7$jj02PZKL{{yV7_st}3cr(3?g_&3SqKX)(+C zTVsF-B7DYZ*N#M*yh_Wt$J)O-(ruUfEMTW?DU6@a!& zDfEL{^vhijA<~_<37$d8=DllB0{DNWAs~MMbN-dfqx>VYX#W7j^_$P06HcT1)}^`@ zlI@K?o%I@suz>_91jpL0K0J$K5_#roBXM2WFY@4nTZHhpOHnslSDC{<`U;lEg*p|N zax7kRb0wPdG~%`Tc_!loR~W`zGhT$A8R)8{4HB>;`I(GOuW3@j@{{Uv* zO*^I}k=xp)O*WzY>8HNJGZvWt0BZGwO{GHY3B(11Or?~tM`VTKD_^7jO}xIxO4r>5 zlS8Rt7>j2WI&@B?+e+wf4rg!+9=w|Lt*vm6h^5F}mNB2T3aU&57$ozb^rz^=+W@{7 z>em3BGN?Vx)gRuax8Y8r#x8zcV8I6VYkO|mmM376CyptS(nt_N=1pJHi?$(rDXnG< z_q3`w%bt67sguGwox^UgPYej$14V3=0*$0BvCnZxTh7xP4nQ1x)t)R;1iT?G}z82H9mV27}fno_3fP-2+fm8T+BzF{=*mvEC;{vt%c$;U3hBRt6omQ#i zx`hDx<|(fDPo?TXONUo=8d|2hzE3C~IUenP4{xYht$hs^2P`2@5m+Q$cr=our>AuDjMj_<+it zyLU!o(xBAa-MN2|w3)?Xiu<;~EL2m~1hI}ms^ zV|KtU*9aIMyojzQMk3*8UBrorkpd}NR%;wwVlF-~L7sC}TKzb>RNRJDyE{q)xPAN8 z)~?vQaR4Dk>_DC~SkE8pH9arGn%!Q9Npo8E*Wx%0=2Qkr0Q3Io(_~x>0o)IGorMhBs;?vvDd4~X>o?H^px+tO<_Hcp){BA6$1haXzA@otMttkNL4 zsIa%KlWOzc5+Bn&kEK(1JE8vohLib=Um5i_?k&4dl8n8_+luLp-Yn%gNvP?TJU99K zoe_UCdft^$?nj>E7V?GqAKI?GC)9jF;-3`%0ETsacBQo!ZK%6#S36a3xZrx$pTRvN zL)WwqsVCsJm5RQh$N3Kt>lLZ9sMG5@ifa5j(+-~18;t)YxQ^6O=tLO)^HDU2e7S8ojr?)ZD_i#tR#6B*o=CQ^{nom?zcyy(|izYx~U?` zKxD>8zA8NjUf1dM!McTwKwz=_A~3$DIQmuTn=M!PyTH1geXTjufvnYn6|P>pupl`m zJ!|40#=iq~zJu0Y_1h?PPq-!9Pq<*5G4+c50UjaK>Vw75j8E|G>X3zRd9NehkAt+w;o0x_M!&wXhO*cCFuvKLz|z;k_-*XXQUT zphGQo%K}t(C3&oWOSCLs-Kn>6Hk|nmE7`evaI(kT{sXnB@t5JpO1A7iK9bMn-r+Fb zT!;VQon^yYBTLTJiZY)?1HHj`6D5csF0BZh@fq7A>Q_ zfU#~!dQ!YS!vCffSp7vd1%s z^fl8Pw>vdmI*oZ5Ei3^e>lMwXyBDn@k`DE6E+^~y)lJKX`QC9SAGJM=OFi}4q!P+! z?^Pm`z$}Bo{Xge|+Mk@vAI#k*wMF)k$rYFIp-X)R+FK*wuBTVCZv=j3>8%4?hR=0~ z0)w$na0u_ZaaLAbDyhtpJJn(^Hvv=TFae0GI{+UnF(sxu{{Z5wtk}QOjmvCq2Wf#B zgB76C%Uu(I0G{C1cTDK1<}n6H{{X*gzR-=%+n33<7d+OPtuB#%#yRz?%`0Nw>;s6b z_K~M(1be}&of{AY@DHt6!$GEOuV^_HX{Ne1dglfrsWi^G02r9>R<>M5L5cO?R^nB? zw`gL=gWjgK=AGVQ5Nndd4X_W?n(Vgnf?FMd?ONJtCATizV}XupD@rU`V2kj=vyi+% znWD5{dq^D7Tz#rpw(U4LCP}NKWULBWX9~*552&XwL7c}Ciib}k#gGUDEj2CrU}qqj5V913f@$aFlQ4VtrUa6^<1OpO12-*zM`JV~N{IpoZ+`Uf6wY%r;1aoL z#zgQaA80ZOByb0{0xr8&pbktQtqiKL=1c-}M}`eQH)Ay({3%fj%<-C;!QQiI{-eOv?;Tb9CJgB+l~nD+|ht`jv8_zfsc|gyMq~zdJ+QQ z9|?d4M`~+nve+!3Ga1E61Y0CVV{!Bp7MJ)$+m3g0`_M20bH)sV=|O1u_MXyeSR}FC zF^M%AfLaH94CX4DM{z;62`Ip4maKVzIz62WrO1}VuP zxhHp;XRw+ph!WgL5+t&Z-m=hC`I~gG0|T`HU>r1LW_wYUAgabY&m-$VB&pyS@7PsC zDc>eWc{~wLNt^)!03Ni_JD@HG2NZ}QfB?)uC%puF{N%=Fkz6n_Bfq^lL4iE+BZ?Oa zM(B_ar==D+?RXDOZ0^6UzSF=^0j}GA3F(WMy{b9S@iF}?NQ{1MzCa_4{c1@)vIxnn z{+>V4wszNpdOAXzSFW+*Zkk$7h0ry2zBf*{V_9Wgtrxd<;x6?t%OJ#p2#(dH18L_V z3g*ys{TEEroj*&`Sa3TvosFni6r~e(tk&@iFyZ2wlUMK5O^hPq;$P1 zf62<28L@w-v1gn;}KLC7Ws{BG?g9t%iZMEvN!LF;ndz zPC=a0?O+Z9h^=ZS!l9N-nfC8dfe_n>C!9$Y&?QVr7{vevRL>paX`^V$v18_JMgSQsq1sRr*UVjexSL*-D-J0XZLDjP9H04XOu<|+OFVdjS1b0%oEi1o%Pd^m%* zcYkWqIn9@A%4`JN{N?%j3Y^(iCv!A+2ZAV(V9@8l7FTtQaQ_fgPJ?W6h;si|)@7Tp9=Mr&1>&fmwpa6M66YWH? zCp>qWc0!><&e0}&&F0B*qoY19+j08t?jV0#J?oQ!>Fqs=S* zDMzn7(V&6;VL8XO5{P6tnUnOPWtrXbgE2+{kO(j_^{9p|9q}}nNRm!i{b*n)1|olI zDU|;JG2KN5RZqi$(jydScO_zZgTem*N?hcgk=FD6i5ILkqaNOsL8$!+) zDF{o3f$Dpj3%*wyjwE6z{{V_M0}@G-*b0W|V6I3d=6T>%PTcpLvAWjbi31TGs=co* z)4f=bU~Kd?+Wux{P)RBX5-X2UXbX>JB@^e01DA*{=lu0M##zwH_1vIJ>3L zGbXpKUm81Xhd&M`;0LxKee2y@YFxOsuByzCj&eTr^B?}GdRD*1P2nv!MOCP-jAf~DXMG5p5~oF4Azy5iH};g>bJF*HEDNKt+``k z9lLGFEMo-v*Jpt=+ABUA)9AFFO7-5OZqCb>7~ec zoZ8NjV(*8v_jH<{hS$#PN}Luazj2D=)mhUezsu`xT+&>UEx6^>_x7$&&FU<5O-g9A zSMKRGL;et7@_ZBg$Mxc^`j3Y%>$+}{HKyh5R+r&zX2vE=de?CGJx%o5y&%+Tz*}Q=$34#q zzV+H?H05#Kdi9M({eH9aZ+_b<+l98P0cX?cRkyEoEk3huipv{JrAZ69na6T}wPWmf z+*t^=gX#z*q9EECh9~J=OX5DSV&$ZL&35;gr2L?s{*}3utoqoy*WT5aOLw(a3#x7+ z<$y>&f;(5A_>aR@dZJv_X|CMU^);V8fv^tyNWdbsT7>FM{{R}ztC!eA}a(<8jn>YXD;;+~ppYOS@h0evp2=-GDJ`U>+i*E*+z^_O(lx|QHY zJ`+ht9gR%Ar!jHW?dU!Q{2lP;gifzjrqw@F)m=~*^H!E^v}JL|d(|(D)2&%zoj0ep zuQ@w|ZeMQES$ltorp~!+E}{+mdBF=O-mI*6iEr*vbgD4|;;WJ;*!HLDWnt+h2ZrtI zx>lh^tXZ;?=eKYbZKQfeYtRm$T|#Zg!@&hijAu24v2)|H>F>UvqwZ9>@jU6@=tr@o z(=O{eef>_8R_9e{9oDZdKV!l6uDD&sGmVYgkdq*ai%WTbF>Di!!xP?Xg>M$}@5xXg z!21zWY2B9U?p_Wfo@=9%pTf`o0Lqa`+(xHWA}|l;E`P0P!=3D-`LXCCYbD_`x2CgQ zZZ%q&?0@=)tvX!Z&`#X_=#^t?;UH{-$rW*@XWRkiDvrSob%4P@A`VD3b)z7d$O2%V z{_{px)-9#mU^eAbAZ%@?^&D09i3OxfVVTuN)!cFfVyLu+6=RTi{{Tw5(y;R6OlGWR zuk?;UUfXfztBo^-0Gt^Ted>!$!cPTcMO;}R1L}K@^{B;OX>JmV#K@c;^=WD10V8z4 znxoU*19tNn2aamq%V5WEc&)*1mj>BBU{7l8v2YUt2=uDE4Jtt($Qb%pU6*BL+W!E< zAbEDl4fU-jZu@>vzEj=_H8qxz9pu*<-G#>!$m5!w8c(E7W~ePWKMu|ha6d|!S{6?= z&uBs{7--AXBoEOpYc!YNuxd1kNHL ziWLe9wEJ^LyMth!DkR3uz%F+my%di9ps0`zX)pk)fhr6V4doI#2gB~_SU zZpJ>8?E=aL)qp@!akrdPukr#0(rezADSV4@z$frOVSTT=EW&rR>ku@}I+ery3aY=9r z#?VCIa48c3z?RQ{r3i&_xJZKnW+|mM@8ZtjB*gZpR^Vb8GA2R(wKRFW;7kwv)NCLk zfVpo&aN9lo^<$WlmxA`EsE02J+*;2t~Bs4K9TgBYU$ zKm@^w6ael?5I}9SQ=o_iRD%EoD z2iuxvfVT??%r-xIA{7-r8f1t$^zTb?*zwC83W7bd7^3cx88Jd-fCNh#lw`1zyOJh` zI3UCd2;SetLaZi4W`%6*MHb0n$DHmzV^VXpmXRN&F%q`&NFJjc)Bq5dB4Bc2n3K4S z0riNAGE9=NF&t2o^A<2iaS{8~{{UhK48TJM%;aK`^QKxzBnYA;GcdL}zy}m8n`CYh zGI7NQp#rctp2sxc0Ecke0rjCm!AAaL6!yqvFiQet5rJA{L;&n_0MR$|NS+4ZIHcat zrg#~eOjs*qgFS^1WO=-^=}ZThoNCA@|pku-Y1{hoM6B*BAu@$ zZ<(SdjNpzz0+E#si5;mE9GH<&IXq@L#Wv7K+L>D%P9TV-l@r){RZ*w_#DL1btu9y- zkEx-E1~NF!F#wg3g)>mu=gLkv5Gog4>^qQ1^@CZXmg2x7;Tub170GzF z!(nby%wu*Yx^AGhi@$TRGaS#bt}Cx`cSziT%#Omcu6<3heU~K}JI@EwsC9QW7B=1T zt)=A?81D|ecEKv3Cv1;9mhg)Xi z1z3y~_JT4i&$K#iPl&avbF1m?+Ue;b3Zz_MI6J0mSFcp+I)*m^Hq{^?waNExD<7`w z*LrrWi+W3z?OVZ93`+U}G5zb!mRqk*81TElWBfO#YZIc`w#C5OUGumIkb6yeFNkhh z(`lPgsniqHP0h}h{L;RFdd*ALJX@#KuBOJC=BK7zX}BHkV3_$z_O8zYcrU4S{T%coi{+SqPL>E)fVQm{m0n11AM;QYfGx|>9Ee)TehxTME?Nk!^?>E zt^WW<@SjZTIz2a1v8osCub#;c2r$gR0lQs>SU-r(?mk{4x{DkM*jawcst9OApoh&FeZ<5-eN*ypAOItiOvt z^(E4}755fy9ZsSOBHEGw>`i>_<6p-A01)`MR@Vjg)7uT@0Ol*U9v>y@X^gzMPTx*0 zuTRnzB7e}Vm3u^G!89^^_`p>0MX#7FbwSFUgCEE-v+dEJ*dV76qYj>sUu3EeBboR8t z*UHP6j^9e*GO^p%BGG8{x{Kcq?fpgDcE;1S$vCSWZOtD>(F=!86)-KW$t8y}M<%lg z)4GO=?)BETn@FoSbGeE1rqFf$ZQGX)ui)w}kCWmNDhFw=Mj3MDl;OkHy7F~BQ95gD zrC_QMTLwO}z^pfkd^4u&mRnhB-PYG>*e%4or1SjJI2G!eu7PiCu3RgtwdDY8NJ*$S?ggQ?i<e6>waagE;$H-OWpY?!fRmUd z-ay-J+`VtkhtL?3KD<`6=D_%LrHwW9a#WpOrHd3JChHiVYSmb9`(cB3C%E*jCci^! z#gnMf{!>e)a?cj+<0fYkX0ze#J;Fh-{fPo1py^vK+J$*xv6Z&W?!m|J`&HhS0s5Kr zC+$@Fdqe;bVn@u_{p#CGcX3r@j6rpRC+k)-SNdWWHjuFcjMdJGr(>ukdC24MRC;FE z6d5vS<%kt?rfDRV;K?NZ^`>g`PkSyq2;|khr^^N;f(8vxTNv9s2>R8%yQg*_~NCbSjnXZ+1XOK3Lfy~zBM_@Zb&zO4BCP15+ z4a`&u_!GG2*MU+i1_DSB-iN(j&}28nB#t{16vO2Z+<_jGOLxtgh#r)@u$lRYffG?m zSHF}46!W=GM9*PN#H6f&>oiQOu=zyDAarw6moh?uC{D6|WlFpN}+W?*g~PijSm(6|8hsJaU6E6fAP z9GV+s27}22aZU(er3TR$0y9V~l?u_%wP^sScR#48npOxIpI>^E$Rc};eJERQ=FVhP z=}DA@Y<;8Nqh$r8FbroA`qZXKx>`s8AH4*L9P!N1L>Fpc$lf4&QG7gZ!ZAL*=__v9 zz)1`^JW_On1N_nf6hJuIxE$b)JJMsFz!=+~N=#)pj2I*Xns5Pm9EFlN&P_&ogTaI&|N)}%!1myN6XuAN!iO<@E2pGlz&(ecV*!XcR z7!k=Pk7(MU002C9H5;bnQNi4#{VfC!jPgOW)3O0 z79MXcIVWf$B1Ix5V3Q_*PcUY3ew6VtL}XxtkF7g#=FH6Zp|Nc(BHOeDv|p3~#brcz zBr!AT#W@)D$33Y9lj|qeDFY4L(=|hpxlgCCq@>KON79&&D?$AYKbcEpA4$anD{fFo zh(4T}K%L%gzclmBIR|J26CK4yK~h3Yg8-30`=<;^Q;8hX4Ix30M2>0N2oeG8ao&Xa zT*$lvdNd>I>Nh!(gA$uJKm)4e;a zF6fCkiU7!{6tdum1Vj_uQif80oRb8KDB1GLUvY@8V!6n{B>n1QqUxSNo_LDlyQpgn z0E7$9{BAzRr$~=gaH1o#gxaKnM=&!L$n3WjO90ZiVd+79o5YPr%IPW<sEJe3l|XH zy>Vm8KZUh^qO#s7@ivP`r)ROM0_Id9T(_vn{p%TBM)8}h-&E@zM5dy~ff)N-+Jk~c)4!qXl2y}Wd?a4Ox7o< zXtg~&{%5XT(~FGImV*MuPI3)+GRsx;F~@~K@b6jiUtG7M*=I+nzHl_xcQ63*!;E?g z`m@1aAAKi9wV>8&Mx$S+K#z9X?GG3PSI^!Z)9AcE)E}x`Lu&2F3$&Ig^sjU9{{V{Y zUrTou?X=tm%b>t>?hZk$Z)udjA2t5~>ldkYK82ys=vKw#w(NG?*#LU^tKwz5aa`O- zaQ^`21kdYVtRIVB2i5){cxklnr?aVVn%F8FH`BN^`QhS!!EYAyzNx4hPJyl}j=%)d zmIPPO@nw#lOr@xN8Tj$z4+dykL!{~#H99l$Te|1SeT`Lk!|`Lpo-$?p{<7t(U>Qqp ze8<$*d#!k5tn@8k<@(=E)M#&&4YK8;rYonzUK8p*Dc3ho>E91>?Pe@^o-3ut9q&y0 zWz#-bu_cKl@=Y~;0ntD7ljB~fjdtn;wz-5-NgmbfpM+ofU(o1>=e$YN4!cw?lv_HY zHmn{<{{XdTFD@ANOf8#y{rE5V9oByndhVI8>8@#d9kvgs)Lc@b)Msk?&3(t>rMuy; z2rotHYTYNKShg+Ov0*kf(mR7&dvDVG6Vg5&uI8UfV@|)qwP65J?E{+fe-rqw&xpE$ z4L+syx{u|vAM(`wFJt)htaj2NRE@xZtCuZf$*U~ z&-AY|)!O6yWwgux03W6z+lXS%0RFWWo5dXqS^oeJ)6`pV(m}Rc%~cwnv8wBLQ%?OI z?S&H8H5Vi=+ltRyzi&s?Nc_F~mj)w5f(=||nY{M)E}5s+HL%tNturuyb~GQbHA~`7 zo1nRGcB@LKRc!K#Kqh;4uD+Mo9@dWC%T}97*^=`RNcR;!tE)b_HnrUil0H{PmXD$0 zzJ@(Kd3MQZ^y#lsek-f2n|BIjOyC*hcB{^hr?J#D_w-uZR?)-dHsMdIpGxfLVCnT2 z6I*d^Sh{?rhCRWpHLjJVx2&_Q>9-csDs5|O(he%tcBZl5t9SJ6X_w+z-SdUqKA8Ts zOLN24x=xz@pYnqCn)4DZ?mJhv2ZI&pR&CtUnYI{7mNw=L`*t+Y^#-J?;XMRGh2@r z^c^*;ZrW1842j-G(sRdQUQwyBW2Ao_9Y||~b*GtA>ODu&uG!PpG*)bzDR)iqpGwMh zd@GR2{{Xp1Zhh*u{+`vlioXd^6qpgCFA*l%zAgGlWazs*TapwSp70S^>L*l2^`OH+K*e|?M|0#TGQHF zW*Cs+fF1E53gbfdz~0-4Fa$`CPH0wxOKsk zjD&|husAYnOtcp6le_-_X&l#mhVvm)xMu|Wdetq9jkpEF6%bBHt1B1C*fYIE=hKR) zz0=%?V*vM#^3h%Xak^;1V zDvHCXSe?Lva%Q{jUEs;%K52^7MWNI!t8Dw47c2)j^r=?n>&@mRMr40_ulUh!GZPaT zscm1MI3Ot#B=(@R7k2L8&!tY6pvV&=f+STy)Z4k|v6aMj{i~%eZ3~$sW~>&U7Xu)k zfALa_fu!;Y?N!ToY*zCEy{4yEP(yBzJq2B}r+O3dB4FU3aYs9d2LfV7BDk(zHl@)T z^hOsZJw)?Fm&M?}0Pd0IV59~1&vR6F0KX8zmY90iaQU%B(cQF;x7)~NVI294y zy>~$dKp=lwDT222+97t3->ow-00K{&6UW-5Ar1~BFnd%t6MdUfp@?n5dysKb!0hq{ z$sTZc$KI06iCk?kKkZBmf_9K&A|f+K-dq_Gkwp56051VYq|yL_3FF*S1$@|?W3?tA zHcIj{_M(Ogi*TTM2il?+2j=Zr5X{KTeWE|PsqS(y023Lg#fxVByMztsr9mnt37DDz z+5pMmWO~!L%*S>&iN*<{af7x@b5Xlb4am>di_tr64do}9pfX4x4bj1=FvmQ43Vg4gqT7VX^( z)?9$WTo06$Ai?ZGs3vtR8)<+>0UzF?K49#=Wr!pH05vNy+~50iL-X^TW^oiyl5oR= z6&`2I2h4VgmBCOkxA)Bn%;03s4;i3h${1(Q{U`#E;FvHZj^omk4>Wge_z=Si{2tJ)dr>6ggFKVk zon+5%rxZvfQh5h8P>e_-B%fKQjE+F1AQ+5iH0OeS4OBXwIi1vj#K$v8o&@l5^rgm1 zoOTBWqS|$nPMC<24WV zQO?yd=}Cm{lM{&@sTGsy^rwlK6bd*I$El`KBxGZ?J^{%SA9_HE82u=v4Z97P%{2PR z9jJ)fcf=}7Q@l=k+bAVH5z(9l{$`bU3SawakN0*C+u z12Gu-&=Al-jj_cI6d3;isCTCV400lz102XAoY{AKzV4whF1J;N`2*mRS znoMIppXo&cf?!AxyhRk|PCvCgOBnPRG|IroufKX4JPo8sGtDA1#1BzRB}o_*#|%k6 zxZ;aWA^<*bT0{r|uy<2#4FfPeX$_!~2hHhFCBQlQK&NYh6}Es$??_2(kEgvc?FK%y z2&|u!5!>lS9D3mML&WhBH2B~QV~*8S;Ek|wL8PtbBpHA~5y#esM0sZho>Uei9LcDV z+rClX21PJnL6Tt2BLmb3=6$FnVhkPK=p-ZgRiK6kiWXwCy9PaJgN0HFmGq|XI3SEu zN^#{Z2{1sV@kaIDFu;hQQYCiqXB@>l6=2f1Fj(TE3**30!)ysr6Eq(YQ2aZ%#E{L3 za1K0ZkZe3ytP&V=as4a_R7iGC_Nr>(5Pj=}^ z34Lye;N$hEIInyQcR=_nby{RZ54WXduJw+W)U|qzCr#9!jbTH&TewNuNdV70sr@R~ zsB7)JF;sL|jo=7r9jgV>d^3BcbzZa72DA8DyUx~8?m$~)&e=Zm1KzpX)QxKN?LMR% zw^HTHXatXlOA%O)6ZGvR^*vc+OKWhFN2jfL+GtZ% z)sn`B-^JB#-*WBLE>%w;0(tt@gT>x1PY_#s9uxS_b%*@twi)^CdkWBaFT*d;`e(+} zBHY*BgK(Ax5!77F9+7K zhF0>qV)lRW?M{LprG9BNw{w=13gxdU!&%#nbdolc(v#88_~(0QDquRkyl@hO}<<#<6zc z^RNSKnf|qu>fL``@UH&=iEFNCtdk!N4o)kJtaSL|_1l-4#-ppQvr~5s@bCxkSzQZW z=_m$~E5Q)%X*?s;tz5CDwXfOWQiX8)V2{&^@f{W0wk;Amr{*l$X+>)?zRgR3 zw@Y>h$Yp2Ny|ak&UTbLjR@AaKn(eE4ag%o4-#YshKh}!JP`T6F_&Te$+F&x<+@`B^ zy-3{oZYG}iAUN`pee=y*Y1dPESlqj0Ado|(1CB&gv|rlmI_I+2UiyT9LonLJ{{VV@ zPf)$6iMAj*y>0-rcWZwzGn&bz)}vW^<%^bB zF;bpVcq7pJ);CwC((BZXcAUMtN)`4Ut@R#+dseSStO(m~`H{2c!6VY4>%A%NvTAMF z0EGcrd7tl!+)BdQ>9_nhtXrCU#`Ul_TE2tK$;ek7{Wl8rPYrmnw6>GuBVMw{ch1n* z`FN0hjc09Wh0PYw2Bypsn3hKFpiyXSUD2oJx@kjfsNZFzqlk~Ot!;;)w~6$^w&ZOR3(xmRLEv=F^UHHs>ME>>HV&t%5 z2q0!ErCVv#TiACH1c^0er?>^C*`G9bHAimj1%gx(WPPi-ZnoJ-SZR`R{`soH{{T;X zm$w2KfFSc$7H+qe2>=c~b5uHe&AJ?5WFJiNRu=AnGGY|*llJwiv|ii1<7h7jwkpQm z;tB%72qyxlE!-C%u2q&q;E(TCI(v}EcoPP5#wyCn-qqhPoB}h)f2|TFt4U>2+FL~s z09XUI{6IVgMg4R9kDG5EZyQu{(f+ite`TepBD=`qqbSwjj3L5++Zr8Vm>^ z91%E*feCA+f!ZVOPK&h=1rP}n=|R+Pg4=-t21y)!=_3++-cuuv4Mn;KU?UQH(e5Ph zS_qi!T9uKu9YoCj-&!c)6yyVtFg~<68)9d))2YdYFjhXbL#|X1B>Id{VZdT@CSdVW zsV8PK7!H29sF{G@7~9P9b44H-3l;!_H~@B{BhG+;V0Y*Arh>RF5t)d@(r6Eo zSkG>10A-(01_0x|F$dy#kF^`PUCN9D$&JQn7EFf_e7>Ib6cR*%m6)B}3UYStjtYp8 zPJxhxKAE9$y?|Vpi1wm^Sy`4h7EzhvhiA`#(sD&Qi34el#8U-3ax*6c_NOTi3IO0@ z4{557v(x&PvGmK)HTF6^yPBnbrF!0&HT$+zaJJZup@{)YFfgRV7^`c9{4_Wd$r+#x zzSxtr{{T1F?^CwACd-%`RD%ExDlr92VWZNd05;s7@IHc@<;)0RCaM{h1jKG1+M{4L zv~%kjoKck^DVdL$@llW+nL#t2G1`S9WCEpt`u3o4=0D3gh{&SYcB~PCBz6=GL&#D| z27#@ByM(l#^M2IKB!eK}5-64f5?Gc#{7^cV+!Tc%M4rZ!&<+%N4CfOA^{0a1tH3eO z--;&kmC1aGGnk~NS*MASj%ff80xJ=N+@IEfc^ZF~bDnBW$8m!^drcLl`%)@6jnaG5=WN7glNsFr^NI(EXv|Nn(jCE{ zdPW!q_L@Pbw>{_zCmfDxb`W6CG{A|157ZiPA}5H=0^5j^JO1>Ena_OsicOe3z>FFo zCk8NaJk(P{#xwV#ffF!6`qNMOm`AUAM8NeEK(GOW20bYV$&TF795y5XJt>5=4YTdc zP^K;kCAh^S1amp&iagPdM0PYLNFV|427tSOz+#Y$nE+CZpGcZsQG!IC{6!X?a8GC% znit{%kGY~U<~wokLQ~6=Bizjsbnqf3X$6v2Cmb3^2r<1tLpJZ3Regk~l)=}cg@agJ!G1P@s> zh=ZAf-lB#I`$scNX^Gt#6vqTdZsL^Tz1R#@IuwIGn`W9MjEEn%(w=!MkFRP|lNc3{ z(Sk5!(m!dSH&=PLlH8H)Pb3`i#c0`t=gL5yY1y+A27P9j3BVobXSN7E`_!on8VKCP z0osI|5F-ceLQfwtf^!(+nbdjW4(*eQK*wtFl)5 zn@n9yv>DIVp7x~b2|;shq%v+W+q>F(im$t^OQo&YPtC9pb~IZU?oS^|&8rpNOH?gv zZ8o1_B1=q&{*hR%cZqG?yxMK1>xtcVKvADw=jmE5wKuHXO-7(ya6s7vTONz*Pu9H0 z#MefV6hOY^a8Te^EUTt6Reyz>=Fm3_OA)?pI^0U)t1xlc?oLW(03oD zYJ5Z1R^`^PBU60LT3#3G)mhQJ4|l1T)m}EPLjcCo?q&8-{p+4Qy&WvP57BOQJqD8Y zrPoHv{{SVI3Q6=e>^c$BG*%k+rutj8X!)-@Mn`W-^Y=>~J4AHWtX^BFrEOarxBW-b zy!TLgzPqV>00`4H&6e#9h4ns@UJpJWyN9dAmmIyTt9a9*brrd#wP@=tiBijN%=O}) zGHd!xN@@CigwWg6pDnat*CV+nwORFF5$L=jZtjbx#-m=)w~0R~jsdKvhBTc|#NH~k zZr!ET>h3qi)ZJ(Dq7UU2=ffXYYj)6d>%&WG-k#mdg|qQ4KMU_Zl}o7cIMi!f;N3>D z4#3eHfbJ_}<9`nI*3-Sa14`E1ZB0Fu9#!=wynCp0olipuI;Ep&CvhO~Ij>F`%Hx(T z?~6K%-tdjVqf>KNbPINvA1ab!Po;UsLebdp{{V?Ky&J?AKQM3Ut^8kx_$23=(R9xc zX!`DeXmkap(cKp@zvw&HkM&(uo)&Equo#2PYL<`L?p(5MCg5Bfqh) zJ-XrBx1n3VrL}GKN-nBh6B7U*w-rUy`lY6GH%k%#ljj54Ydd4A>-Cy}YSqK%89~SC zTV8|Vg}B20p-i#!2>|_l>z%HWGx`^^ds4p>P@#Qov>(&fw%sFD`7NK9>Q{`Ii-sfG zrq*~TMR^+Kv<)MWHoE?mOq~|~fUfm>+HyI3Ha$*3toEZw)@-fKIb`Glh6wgGCWBLU``cU2;P5vb zAM`cb3_iJMc+-cY-_&Vt3wNy>E`+NC%zFEZ)gGH?s9Q#nX8PrBTM;!qogLe%qWz?} zfcaZ&u%fei=7#3mh>M&sUnBi}4SOrhp2D3u+0=sHDFtqk�QW)9cqtROySGeEc?l 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 literal 0 HcmV?d00001 diff --git a/library.json b/library.json index a64f389..615c57e 100644 --- a/library.json +++ b/library.json @@ -22,7 +22,7 @@ "name": "LovyanGFX" } ], - "version": "1.5.0", + "version": "1.5.1", "framework": "arduino", "platforms": "espressif32", "headers": "ESP32-Chimera-Core.h", diff --git a/library.properties b/library.properties index 4dd3ada..ea81a06 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ESP32-Chimera-Core -version=1.5.0 +version=1.5.1 author=tobozo,Lovyan03 maintainer=tobozo@noreply.github.com sentence=Alternate library M5Stack/M5Core2/Odroid-Go/D-Duino and possiblly other ESP32/TFT/SD bundles diff --git a/src/Config.h b/src/Config.h index be0e7ad..69e90e1 100644 --- a/src/Config.h +++ b/src/Config.h @@ -3,17 +3,6 @@ #define ECC_XSTR(x) ECC_STR(x) #define ECC_STR(x) #x -#if !defined ECC_NO_PRAGMAS - #define ECC_PRAGMA_XMESSAGE(msg) ECC_PRAGMA_MESSAGE(msg) - #define ECC_PRAGMA_MESSAGE(msg) \ - _Pragma( ECC_STR( message msg ) ) - #define ECC_NO_PRAGMAS // stop flag propagation -#else - #define ECC_PRAGMA_XMESSAGE(msg) - #define ECC_PRAGMA_MESSAGE(msg) -#endif - - #define HAS_SDCARD //#define USE_SCREENSHOTS //#define USE_NVSUTILS @@ -25,6 +14,20 @@ #include "pins_arduino.h" #include "esp32-hal-log.h" #include +#if __has_include() // platformio has optional esp_arduino_version + #include +#endif + +#if !defined ECC_NO_PRAGMAS && CORE_DEBUG_LEVEL>=ARDUHAL_LOG_LEVEL_ERROR + #define ECC_PRAGMA_XMESSAGE(msg) ECC_PRAGMA_MESSAGE(msg) + #define ECC_PRAGMA_MESSAGE(msg) \ + _Pragma( ECC_STR( message msg ) ) + #define ECC_NO_PRAGMAS // stop flag propagation +#else + #define ECC_PRAGMA_XMESSAGE(msg) + #define ECC_PRAGMA_MESSAGE(msg) +#endif + #if defined ESP_ARDUINO_VERSION_VAL #if __has_include() // platformio has optional core_version.h @@ -650,6 +653,9 @@ #define ECC_LGFX_EXT_CONF "ext_confs/Lilygo-S3-T-Deck.hpp" + + + #define HAS_TOUCH #define TOUCH_INT 16 #define TOUCH_SDA 18 @@ -659,9 +665,20 @@ #define TFCARD_CS_PIN 39 #define SD_ENABLE 1 + + //#define HAS_BUTTONS #define BUTTON_A_PIN -1 #define BUTTON_B_PIN -1 #define BUTTON_C_PIN -1 + + #define HAS_TRACKBALL "drivers/T-Deck/trackball.h" + #define TRACKBALL_UP_PIN GPIO_NUM_3 + #define TRACKBALL_DOWN_PIN GPIO_NUM_15 + #define TRACKBALL_LEFT_PIN GPIO_NUM_1 + #define TRACKBALL_RIGHT_PIN GPIO_NUM_2 + #define TRACKBALL_CLICK_PIN GPIO_NUM_0 + #define TrackBall_Class TDeck_TrackBall_Class + #define SPEAKER_PIN -1 // LoRa mapped pins @@ -670,18 +687,19 @@ #define LORA_RST_PIN 17 #define LORA_DIO1_PIN 45 + #define HAS_KEYBOARD "drivers/T-Deck/keyboard.h" + #define Keyboard_Class TDeck_Keyboard_Class + + #define KEYBOARD_SDA_PIN GPIO_NUM_18 + #define KEYBOARD_SCL_PIN GPIO_NUM_8 + #define KEYBOARD_INT_PIN GPIO_NUM_46 + #define KEYBOARD_I2C_ADDR 0x55 + + // Keyboard_Class( SDA, SCL, KEYBOARD_INT_PIN, KEYBOARD_ADDR, nullptr ) + // #define TDECK_PERI_POWERON 10 // #define TDECK_BAT_ADC 4 - // - // #define TDECK_KEYBOARD_INT 46 - // #define TDECK_KEYBOARD_ADDR 0x55 - // - // #define TDECK_TRACKBALL_UP 3 - // #define TDECK_TRACKBALL_DOWN 15 - // #define TDECK_TRACKBALL_LEFT 1 - // #define TDECK_TRACKBALL_RIGHT 2 - // #define TDECK_TRACKBALL_CLICK 0 - // + // #define TDECK_ES7210_MCLK 48 // #define TDECK_ES7210_LRCK 21 // #define TDECK_ES7210_SCK 47 diff --git a/src/ESP32-Chimera-Core.cpp b/src/ESP32-Chimera-Core.cpp index 326c40d..82323bd 100644 --- a/src/ESP32-Chimera-Core.cpp +++ b/src/ESP32-Chimera-Core.cpp @@ -115,6 +115,24 @@ namespace ChimeraCore } #endif + #if defined HAS_TRACKBALL + log_d("Enabling Trackball"); + TrackBall = new TrackBall_Class( + TRACKBALL_UP_PIN, TRACKBALL_DOWN_PIN, TRACKBALL_LEFT_PIN, TRACKBALL_RIGHT_PIN, TRACKBALL_CLICK_PIN, + Lcd.width(), Lcd.height(), + [](int16_t x, int16_t y, bool click) { log_d("Trackball Interrupt: x=%d, y=%d, clic=%s", x, y, click?"true":"false"); } + ); + #endif + + #if defined HAS_KEYBOARD + log_d("Enabling Keyboard"); + Keyboard = new Keyboard_Class( + &Wire1, KEYBOARD_I2C_ADDR, KEYBOARD_INT_PIN, + [](uint8_t key) { char c[2]={key,0}; log_d("Keyboard Interrupt: char=%s (0x%02x)", c, key); } + ); + #endif + + #if defined HAS_AXP2101 log_d("Enabling AXP2101"); Axp.begin(&Wire1); @@ -223,16 +241,25 @@ namespace ChimeraCore } #endif - #if defined HAS_BUTTONS && !defined ARDUINO_M5STACK_Core2 + #if defined HAS_BUTTONS BtnA.read(); BtnB.read(); BtnC.read(); #endif + //Speaker update #ifdef HAS_SPEAKER Speaker.update(); #endif + #if defined HAS_TRACKBALL + TrackBall->update(); + #endif + + #if defined HAS_KEYBOARD + Keyboard->update(); + #endif + #ifdef ARDUINO_ODROID_ESP32 BtnMenu.read(); BtnVolume.read(); diff --git a/src/ESP32-Chimera-Core.hpp b/src/ESP32-Chimera-Core.hpp index 9e31ca1..d09d7ad 100644 --- a/src/ESP32-Chimera-Core.hpp +++ b/src/ESP32-Chimera-Core.hpp @@ -4,7 +4,7 @@ #define _CHIMERA_CORE_ #if ! defined ESP32 - #error “This library only supports boards with ESP32 family processors” + #error "This library only supports boards with ESP32 family processors" #endif // #define MPU9250_INSDE // M5Core2 : enable this only if plugging a secondary MPU ! @@ -66,6 +66,18 @@ #undef HAS_RTC #endif +#if defined HAS_KEYBOARD && (!defined ECC_NO_KEYBOARD) + #include HAS_KEYBOARD // "drivers/T-Deck/keyboard.h" +#else + #undef HAS_KEYBOARD +#endif + +#if defined HAS_TRACKBALL && (!defined ECC_NO_TRACKBALL) + #include HAS_TRACKBALL // "drivers/T-Deck/trackball.h" +#else + #undef HAS_TRACKBALL +#endif + #if defined HAS_SPEAKER && (!defined ECC_NO_SPEAKER) #include "drivers/common/Speaker/Speaker.h" //#include "drivers/common/Audio/Speaker_Class.hpp" @@ -244,6 +256,14 @@ namespace ChimeraCore AXP2101 Axp;// = new AXP2101(); #endif + #if defined HAS_TRACKBALL + TrackBall_Class* TrackBall = nullptr; + #endif + + #if defined HAS_KEYBOARD + Keyboard_Class* Keyboard = nullptr; + #endif + #if defined HAS_RTC void setSystemTimeFromRtc(); void setRtcTime( uint16_t year, uint8_t month, uint8_t day , uint8_t hours, uint8_t minutes, uint8_t seconds ); diff --git a/src/drivers/ESP32-S3-Box/Audio/src/bsp_board.h b/src/drivers/ESP32-S3-Box/Audio/src/bsp_board.h index 526d71c..1ca25e3 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/bsp_board.h +++ b/src/drivers/ESP32-S3-Box/Audio/src/bsp_board.h @@ -10,7 +10,7 @@ #include "esp_err.h" #include "driver/gpio.h" #include "driver/spi_master.h" -#include "driver/adc.h" +//#include "driver/adc.h" #include "audio_hal.h" #ifdef __cplusplus diff --git a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.c b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.c index 4aaee79..efab103 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.c +++ b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.c @@ -5,14 +5,11 @@ */ // attempt to detect esp-idf version -#if __has_include() - #include -#endif // esp32-2.0.2 and previous don't have the guts to handle this // which is fine since esp32-s3-box wasn't supported before #if defined ESP_ARDUINO_VERSION_VAL - #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 3) + #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 3) && ESP_ARDUINO_VERSION < ESP_ARDUINO_VERSION_VAL(3, 0, 0) #include "bsp_board.h" #include "bsp_i2s.h" diff --git a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h index 4c56439..f8728ca 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h +++ b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h @@ -7,7 +7,16 @@ #pragma once #include "esp_err.h" -#include "driver/i2s.h" + +#if __has_include() + #include +#endif + +#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + #include "driver/i2s.h" +#else + #include "driver/i2s_std.h" +#endif #ifdef __cplusplus extern "C" { diff --git a/src/drivers/ESP32-S3-Box/Audio/src/es8311.h b/src/drivers/ESP32-S3-Box/Audio/src/es8311.h index b64bf75..7aa6b36 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/es8311.h +++ b/src/drivers/ESP32-S3-Box/Audio/src/es8311.h @@ -25,6 +25,7 @@ #ifndef _ES8311_H #define _ES8311_H +#include "rom/ets_sys.h" #include "audio_hal.h" #include "esp_types.h" #include "esxxx_common.h" diff --git a/src/drivers/ESP32-S3-Box/Audio/src/esp32_s3_box.h b/src/drivers/ESP32-S3-Box/Audio/src/esp32_s3_box.h index 6464e58..d74a985 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/esp32_s3_box.h +++ b/src/drivers/ESP32-S3-Box/Audio/src/esp32_s3_box.h @@ -6,6 +6,7 @@ #pragma once +#include "rom/ets_sys.h" #include "esp_err.h" #include "bsp_board.h" #include "es8311.h" diff --git a/src/drivers/Odroid-Go/Battery/battery.cpp b/src/drivers/Odroid-Go/Battery/battery.cpp index 6c790b2..aa2b3b5 100644 --- a/src/drivers/Odroid-Go/Battery/battery.cpp +++ b/src/drivers/Odroid-Go/Battery/battery.cpp @@ -13,6 +13,7 @@ #include #include + Battery::Battery() { this->_enable_protection = false; diff --git a/src/drivers/Odroid-Go/Battery/battery.h b/src/drivers/Odroid-Go/Battery/battery.h index 8abf1c5..6d329d1 100644 --- a/src/drivers/Odroid-Go/Battery/battery.h +++ b/src/drivers/Odroid-Go/Battery/battery.h @@ -8,8 +8,27 @@ #pragma once #define LIBRARIES_ODROID_GO_SRC_UTILITY_BATTERY_H_ -#include -#include +#if __has_include() // platformio has optional esp_arduino_version + #include +#endif + +#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + #include + #include + + // adc1_config_width + // adc1_config_channel_atten + // esp_adc_cal_characterize + // adc1_get_raw + // esp_adc_cal_raw_to_voltage + // esp_adc_cal_characteristics_t + +#else + #include + #include + #include +#endif + #define BATTERY_RESISTANCE_NUM 2 #define BATTERY_SAMPLES 64 @@ -29,7 +48,9 @@ class Battery void update(); private: - esp_adc_cal_characteristics_t _adc_chars; + #if ESP_ARDUINO_VERSION < ESP_ARDUINO_VERSION_VAL(3,0,0) + esp_adc_cal_characteristics_t _adc_chars; + #endif bool _enable_protection; }; diff --git a/src/drivers/T-Deck/keyboard.h b/src/drivers/T-Deck/keyboard.h new file mode 100644 index 0000000..d3845b6 --- /dev/null +++ b/src/drivers/T-Deck/keyboard.h @@ -0,0 +1,140 @@ +#pragma once + +// inspired from https://github.com/moononournation/T-Deck + +#include + +namespace ChimeraCore +{ + + namespace TDeck_Keyboard + { + static uint32_t key_scan_interval_ms = 200; + static bool keyboard_interrupted = false; + static void IRAM_ATTR ISR_key() { keyboard_interrupted = true; } + } + + + class TDeck_Keyboard_Class + { + + typedef void(*fire_event_t)(uint8_t key); // event callback signature + + public: + + TDeck_Keyboard_Class( TwoWire* bus, uint8_t dev_addr, fire_event_t fire_event ) + : _bus(bus), _dev_addr(dev_addr), _fire_event(fire_event) { init(); } + TDeck_Keyboard_Class( TwoWire* bus, uint8_t dev_addr, gpio_num_t pin_int, fire_event_t fire_event ) + : _bus(bus), _dev_addr(dev_addr), _pin_int(pin_int), _fire_event(fire_event) { _has_interrupt = true; init(); } + TDeck_Keyboard_Class( gpio_num_t pin_sda, gpio_num_t pin_scl, uint8_t dev_addr, fire_event_t fire_event ) + : _pin_sda(pin_sda), _pin_scl(pin_scl), _dev_addr(dev_addr), _fire_event(fire_event) { _bus=&Wire1; _has_pins=true; init(); } + TDeck_Keyboard_Class( gpio_num_t pin_sda, gpio_num_t pin_scl, gpio_num_t pin_int, uint8_t dev_addr, fire_event_t fire_event ) + : _pin_sda(pin_sda), _pin_scl(pin_scl), _pin_int(pin_int), _dev_addr(dev_addr), _fire_event(fire_event) { _bus=&Wire; _has_pins=true; _has_interrupt = true; init(); } + + ~TDeck_Keyboard_Class() + { + deinit(); // detach interrupts + } + + + bool init() + { + // Check keyboard + if( ! _bus ) { + Serial.println("No bus instance!"); + return false; + } + if( _has_pins ) { + _bus->begin(_pin_sda, _pin_scl/*, _i2c_freq*/); + log_d("Starting I2C bus sda=%d,scl=%d", _pin_sda, _pin_scl ); + } + _bus->requestFrom(_dev_addr, (uint8_t)1); + if (_bus->read() == -1) { + Serial.println("LILYGO Keyboad not online!"); + return false; + } + if( _has_interrupt ) { + log_d("Attaching interrupt"); + pinMode(_pin_int, INPUT_PULLUP); + attachInterrupt(_pin_int, TDeck_Keyboard::ISR_key, FALLING); + } + return true; + } + + + void deinit() + { + if( _has_interrupt ) { + detachInterrupt( _pin_int ); + } + } + + + void setInterval( uint32_t interval_ms ) + { + TDeck_Keyboard::key_scan_interval_ms = interval_ms; + } + + + void setCallback( fire_event_t cb ) + { + _fire_event = cb; + } + + + char get_key() + { + if( _bus ) { + _bus->requestFrom(_dev_addr, (uint8_t)1); // Read key value from esp32c3 + if (_bus->available() > 0) { + return _bus->read(); + } + } + return 0; + } + + + void update() + { + if( _has_interrupt ) { + static uint32_t next_key_scan_ms = 0; + if (TDeck_Keyboard::keyboard_interrupted || (millis() > next_key_scan_ms)) { + char key; + do { + key = get_key(); + if( key !=0 ) { + if( _fire_event ) _fire_event( key ); + next_key_scan_ms = millis() + TDeck_Keyboard::key_scan_interval_ms; + } + } while( key !=0 ); + TDeck_Keyboard::keyboard_interrupted = false; + } + } else { + int key = get_key(); + if(key > 0) { + if( _fire_event ) _fire_event( key ); + } + } + } + + private: + + TwoWire* _bus; + + fire_event_t _fire_event; + + gpio_num_t _pin_sda; + gpio_num_t _pin_scl; + gpio_num_t _pin_int; + + uint8_t _dev_addr = -1; + + uint32_t _i2c_freq = 800000UL; + + bool _has_interrupt = false; + bool _has_pins = false; + + + }; // end class TDeck_Keyboard_Class + +} // end namespace ChimeraCore diff --git a/src/drivers/T-Deck/trackball.h b/src/drivers/T-Deck/trackball.h new file mode 100644 index 0000000..dcfd9b3 --- /dev/null +++ b/src/drivers/T-Deck/trackball.h @@ -0,0 +1,190 @@ +#pragma once + +// inspired from https://github.com/moononournation/T-Deck + +namespace ChimeraCore +{ + + namespace TDeck_TrackBall + { + static int speed = 2; + static bool interrupted = false; + static int16_t up_count = 1; + static int16_t down_count = 1; + static int16_t left_count = 1; + static int16_t right_count = 1; + static int16_t click_count = 0; + + static void reset() + { + interrupted = false; + up_count = 1; + down_count = 1; + left_count = 1; + right_count = 1; + click_count = 0; + } + + static void init() + { + reset(); + speed = 2; + } + + static void IRAM_ATTR ISR_up() { interrupted = true; up_count <<= speed; } + static void IRAM_ATTR ISR_down() { interrupted = true; down_count <<= speed; } + static void IRAM_ATTR ISR_left() { interrupted = true; left_count <<= speed; } + static void IRAM_ATTR ISR_right() { interrupted = true; right_count <<= speed; } + static void IRAM_ATTR ISR_click() { interrupted = true; ++click_count; } + }; + + + class TDeck_TrackBall_Class + { + + typedef void(*fire_event_t)(int16_t x, int16_t y, bool click); // event callback signature + + public: + + TDeck_TrackBall_Class( + uint8_t pin_up, uint8_t pin_down, + uint8_t pin_left, uint8_t pin_right, uint8_t pin_click, + uint32_t width, uint32_t height, + fire_event_t fire_event, int16_t x=0, int16_t y=0, int speed=2 + ) : + _pin_up(pin_up), _pin_down(pin_down), + _pin_left(pin_left), _pin_right(pin_right), _pin_click(pin_click), + _width(width), _height(height), + _fire_event(fire_event), + _x(x), _y(x) + { + init(); // attach interrupts + setSpeed( speed ); + log_d("Trackball enabled"); + } + + + ~TDeck_TrackBall_Class() + { + deinit(); // detach interrupts + } + + + int16_t getX() + { + update(); + return _x; + } + + + int16_t getY() + { + update(); + return _y; + } + + + bool clicked() + { + bool has_click = TDeck_TrackBall::click_count; + update(); + return has_click; + return false; + } + + + void setSpeed( int speed ) + { + TDeck_TrackBall::speed = speed; + } + + + void setCoords( int16_t x, int16_t y ) + { + _x = x; + _y = y; + } + + void setCallback( fire_event_t cb ) + { + _fire_event = cb; + } + + + void update() + { + if (TDeck_TrackBall::interrupted) { + // Serial.printf("x: %d, y: %d, left: %d, right: %d, up: %d, down: %d, click: %d\n", x, y, _left_count, _right_count, _up_count, _down_count, _click_count); + _x -= TDeck_TrackBall::left_count; + _x += TDeck_TrackBall::right_count; + _y -= TDeck_TrackBall::up_count; + _y += TDeck_TrackBall::down_count; + + if (_x < 0) { + _x = 0; + } else if (_x >= _width) { + _x = _width - 1; + } + if (_y < 0) { + _y = 0; + } else if (_y >= _height) { + _y = _height - 1; + } + if (TDeck_TrackBall::click_count) { + if( _fire_event ) _fire_event( _x, _y, true ); + if( _fire_event ) _fire_event( _x, _y, false ); + } else { + if( _fire_event ) _fire_event( _x, _y, false ); + } + TDeck_TrackBall::reset(); + } + } + + + private: + + const uint8_t _pin_up; + const uint8_t _pin_down; + const uint8_t _pin_left; + const uint8_t _pin_right; + const uint8_t _pin_click; + + const uint32_t _width; + const uint32_t _height; + + int16_t _x; + int16_t _y; + + fire_event_t _fire_event; + + + void init() + { + TDeck_TrackBall::init(); + pinMode( _pin_up, INPUT_PULLUP ); + attachInterrupt( _pin_up, TDeck_TrackBall::ISR_up, FALLING ); + pinMode( _pin_down, INPUT_PULLUP ); + attachInterrupt( _pin_down, TDeck_TrackBall::ISR_down, FALLING ); + pinMode( _pin_left, INPUT_PULLUP ); + attachInterrupt( _pin_left, TDeck_TrackBall::ISR_left, FALLING ); + pinMode( _pin_right, INPUT_PULLUP ); + attachInterrupt( _pin_right, TDeck_TrackBall::ISR_right, FALLING ); + pinMode( _pin_click, INPUT_PULLUP ); + attachInterrupt( _pin_click, TDeck_TrackBall::ISR_click, FALLING ); + } + + + void deinit() + { + detachInterrupt( _pin_up ); + detachInterrupt( _pin_down ); + detachInterrupt( _pin_left ); + detachInterrupt( _pin_right ); + detachInterrupt( _pin_click ); + } + + }; // end class TDeck_TrackBall_Class + + +} // end namespace ChimeraCore + diff --git a/src/drivers/common/Audio/Speaker_Class.cpp b/src/drivers/common/Audio/Speaker_Class.cpp index c04e78e..1bbb8f3 100644 --- a/src/drivers/common/Audio/Speaker_Class.cpp +++ b/src/drivers/common/Audio/Speaker_Class.cpp @@ -1,6 +1,13 @@ // Copyright (c) M5Stack. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. +#if __has_include() // platformio has optional esp_arduino_version + #include +#endif + +#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + + #include "Speaker_Class.hpp" #include "../../../ESP32-Chimera-Core.h" @@ -456,3 +463,6 @@ namespace ChimeraCore return true; } } + + +#endif diff --git a/src/drivers/common/Audio/Speaker_Class.hpp b/src/drivers/common/Audio/Speaker_Class.hpp index 9bb9cdc..cebd890 100644 --- a/src/drivers/common/Audio/Speaker_Class.hpp +++ b/src/drivers/common/Audio/Speaker_Class.hpp @@ -4,6 +4,13 @@ #ifndef __M5_Speaker_Class_H__ #define __M5_Speaker_Class_H__ +#if __has_include() // platformio has optional esp_arduino_version + #include +#endif + +#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + + #include #include #include @@ -233,3 +240,4 @@ namespace ChimeraCore } #endif +#endif diff --git a/src/drivers/common/Button/Button.cpp b/src/drivers/common/Button/Button.cpp index d56da4e..42d6c79 100644 --- a/src/drivers/common/Button/Button.cpp +++ b/src/drivers/common/Button/Button.cpp @@ -68,9 +68,10 @@ uint8_t Button::read(void) #else pinVal = digitalRead(_pin); #endif + if (_invert != 0) pinVal = !pinVal; + return setState(pinVal); } - if (_invert != 0) pinVal = !pinVal; - return setState(pinVal); + return 0; } uint8_t Button::setState(uint8_t pinVal) diff --git a/src/drivers/common/RTC_PCF8563/pcf8563.cpp b/src/drivers/common/RTC_PCF8563/pcf8563.cpp index 49a45db..afd337e 100644 --- a/src/drivers/common/RTC_PCF8563/pcf8563.cpp +++ b/src/drivers/common/RTC_PCF8563/pcf8563.cpp @@ -1,459 +1,466 @@ -///////////////////////////////////////////////////////////////// -/* -MIT License - -Copyright (c) 2019 lewis he - -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. - -pcf8563.cpp - Arduino library for NXP PCF8563 RTC chip. -Created by Lewis he on April 1, 2019. -github:https://github.com/lewisxhe/PCF8563_Library -*/ -///////////////////////////////////////////////////////////////// -#include "pcf8563.h" -#include - -PCF8563_Class::PCF8563_Class(I2CUtil &bus, uint8_t addr) -{ - _bus = &bus; - _address = addr; -} - -void PCF8563_Class::check() -{ - RTC_Date now = getDateTime(); - RTC_Date compiled = RTC_Date(__DATE__, __TIME__); - - // Serial.printf("%d:%d:%d - %d:%d:%d\n", compiled.year, compiled.month, compiled.day, compiled.hour, compiled.minute, compiled.second); - - if (now.year < compiled.year || - (now.year == compiled.year && now.month < compiled.month ) || - (now.year == compiled.year && now.month == compiled.month && now.day < compiled.day)) { - setDateTime(compiled); - log_i("reset rtc date time"); - } -} - -void PCF8563_Class::setDateTime(RTC_Date date) -{ - setDateTime(date.year, date.month, date.day, date.hour, date.minute, date.second); -} - -uint32_t PCF8563_Class::getDayOfWeek(uint32_t day, uint32_t month, uint32_t year) -{ - uint32_t val; - if (month < 3) { - month = 12u + month; - year--; - } - val = (day + (((month + 1u) * 26u) / 10u) + year + (year / 4u) + (6u * (year / 100u)) + (year / 400u)) % 7u; - if (0u == val) { - val = 7; - } - return (val - 1); -} - -void PCF8563_Class::setDateTime(uint16_t year, - uint8_t month, - uint8_t day, - uint8_t hour, - uint8_t minute, - uint8_t second) -{ - _data[0] = _dec_to_bcd(second) & (~PCF8563_VOL_LOW_MASK); - _data[1] = _dec_to_bcd(minute); - _data[2] = _dec_to_bcd(hour); - _data[3] = _dec_to_bcd(day); - _data[4] = getDayOfWeek(day, month, year); - _data[5] = _dec_to_bcd(month); - _data[6] = _dec_to_bcd(year % 100); - - if (2000 - year - (year % 100)) { - _data[4] |= PCF8563_CENTURY_MASK; - } else { - _data[4] &= (~PCF8563_CENTURY_MASK); - } - _writeByte(PCF8563_SEC_REG, 7, _data); -} - -bool PCF8563_Class::isValid() -{ - _readByte(PCF8563_SEC_REG, 1, &_isValid); - return !(_isValid & (1 << 7)); -} - -RTC_Date PCF8563_Class::getDateTime() -{ - uint16_t year; - uint8_t cetury = 0; - _readByte(PCF8563_SEC_REG, 7, _data); - _voltageLow = (_data[0] & PCF8563_VOL_LOW_MASK); - _data[0] = _bcd_to_dec(_data[0] & (~PCF8563_VOL_LOW_MASK)); - _data[1] = _bcd_to_dec(_data[1] & PCF8563_minuteS_MASK); - _data[2] = _bcd_to_dec(_data[2] & PCF8563_HOUR_MASK); - _data[3] = _bcd_to_dec(_data[3] & PCF8563_DAY_MASK); - _data[4] = _bcd_to_dec(_data[4] & PCF8563_WEEKDAY_MASK); - cetury = _data[5] & PCF8563_CENTURY_MASK; - _data[5] = _bcd_to_dec(_data[5] & PCF8563_MONTH_MASK); - year = _bcd_to_dec(_data[6]); - year = cetury ? 1900 + year : 2000 + year; - return RTC_Date( - year, - _data[5], - _data[3], - _data[2], - _data[1], - _data[0] - ); -} - -RTC_Alarm PCF8563_Class::getAlarm() -{ - _readByte(PCF8563_ALRM_MIN_REG, 4, _data); - _data[0] = _bcd_to_dec(_data[0] & (~PCF8563_minuteS_MASK)); - _data[1] = _bcd_to_dec(_data[1] & (~PCF8563_HOUR_MASK)); - _data[2] = _bcd_to_dec(_data[2] & (~PCF8563_DAY_MASK)); - _data[3] = _bcd_to_dec(_data[3] & (~PCF8563_WEEKDAY_MASK)); - return RTC_Alarm(_data[0], _data[1], _data[2], _data[3]); -} - - -void PCF8563_Class::enableAlarm() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - _data[0] &= ~PCF8563_ALARM_AF; - _data[0] |= (PCF8563_TIMER_TF | PCF8563_ALARM_AIE); - _writeByte(PCF8563_STAT2_REG, 1, _data); -} - -void PCF8563_Class::disableAlarm() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - _data[0] &= ~(PCF8563_ALARM_AF | PCF8563_ALARM_AIE); - _data[0] |= PCF8563_TIMER_TF; - _writeByte(PCF8563_STAT2_REG, 1, _data); -} - -void PCF8563_Class::resetAlarm() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - _data[0] &= ~(PCF8563_ALARM_AF); - _data[0] |= PCF8563_TIMER_TF; - _writeByte(PCF8563_STAT2_REG, 1, _data); -} - -bool PCF8563_Class::alarmActive() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - return (bool)(_data[0] & PCF8563_ALARM_AF); -} - -void PCF8563_Class::setAlarm(RTC_Alarm alarm) -{ - setAlarm(alarm.minute, alarm.hour, alarm.day, alarm.weekday); -} - -void PCF8563_Class::setAlarm(uint8_t hour, uint8_t minute, uint8_t day, uint8_t weekday) -{ - if (minute != PCF8563_NO_ALARM) { - _data[0] = _dec_to_bcd(constrain(minute, (uint8_t)0x00, (uint8_t)0x3b)); - _data[0] &= ~PCF8563_ALARM_ENABLE; - } else { - _data[0] = PCF8563_ALARM_ENABLE; - } - - if (hour != PCF8563_NO_ALARM) { - _data[1] = _dec_to_bcd(constrain(hour, (uint8_t)0x00, (uint8_t)0x17)); - _data[1] &= ~PCF8563_ALARM_ENABLE; - } else { - _data[1] = PCF8563_ALARM_ENABLE; - } - if (day != PCF8563_NO_ALARM) { - _data[2] = _dec_to_bcd(constrain(day, (uint8_t)0x01, (uint8_t)0x1f)); - _data[2] &= ~PCF8563_ALARM_ENABLE; - } else { - _data[2] = PCF8563_ALARM_ENABLE; - } - if (weekday != PCF8563_NO_ALARM) { - _data[3] = _dec_to_bcd(constrain(weekday, (uint8_t)0x00, (uint8_t)0x06)); - _data[3] &= ~PCF8563_ALARM_ENABLE; - } else { - _data[3] = PCF8563_ALARM_ENABLE; - } - _writeByte(PCF8563_ALRM_MIN_REG, 4, _data); -} - -void PCF8563_Class::setAlarmByMinutes(uint8_t minute) -{ - setAlarm(PCF8563_NO_ALARM, minute, PCF8563_NO_ALARM, PCF8563_NO_ALARM); -} -void PCF8563_Class::setAlarmByDays(uint8_t day) -{ - setAlarm(PCF8563_NO_ALARM, PCF8563_NO_ALARM, day, PCF8563_NO_ALARM); -} -void PCF8563_Class::setAlarmByHours(uint8_t hour) -{ - setAlarm(hour, PCF8563_NO_ALARM, PCF8563_NO_ALARM, PCF8563_NO_ALARM); -} -void PCF8563_Class::setAlarmByWeekDay(uint8_t weekday) -{ - setAlarm(PCF8563_NO_ALARM, PCF8563_NO_ALARM, PCF8563_NO_ALARM, weekday); -} - -bool PCF8563_Class::isTimerEnable() -{ - _readByte(PCF8563_STAT2_REG, 1, &_data[0]); - _readByte(PCF8563_TIMER1_REG, 1, &_data[1]); - if (_data[0] & PCF8563_TIMER_TIE) { - return _data[1] & PCF8563_TIMER_TE ? true : false; - } - return false; -} - -bool PCF8563_Class::isTimerActive() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - return (bool) _data[0] & PCF8563_TIMER_TF; -} - -void PCF8563_Class::enableTimer() -{ - _readByte(PCF8563_STAT2_REG, 1, &_data[0]); - _readByte(PCF8563_TIMER1_REG, 1, &_data[1]); - _data[0] &= ~PCF8563_TIMER_TF; - _data[0] |= (PCF8563_ALARM_AF | PCF8563_TIMER_TIE); - _data[1] |= PCF8563_TIMER_TE; - _writeByte(PCF8563_STAT2_REG, 1, &_data[0]); - _writeByte(PCF8563_TIMER1_REG, 1, &_data[1]); -} - -void PCF8563_Class::disableTimer() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - _data[0] &= ~PCF8563_TIMER_TF; - _data[1] |= PCF8563_ALARM_AF; - _writeByte(PCF8563_STAT2_REG, 1, _data); -} - -void PCF8563_Class::setTimer(uint8_t val, uint8_t freq, bool enIntrrupt) -{ - _readByte(PCF8563_STAT2_REG, 1, &_data[0]); - _readByte(PCF8563_TIMER1_REG, 1, &_data[1]); - if (enIntrrupt) { - _data[0] |= 1 << 4; - } else { - _data[0] &= ~(1 << 4); - } - _data[1] |= (freq & PCF8563_TIMER_TD10); - _data[2] = val; - _writeByte(PCF8563_STAT2_REG, 1, &_data[0]); - _writeByte(PCF8563_TIMER1_REG, 1, &_data[1]); - _writeByte(PCF8563_TIMER2_REG, 1, &_data[2]); -} - -void PCF8563_Class::clearTimer() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - _data[0] &= ~(PCF8563_TIMER_TF | PCF8563_TIMER_TIE); - _data[0] |= PCF8563_ALARM_AF; - _data[1] = 0x00; - _writeByte(PCF8563_STAT2_REG, 1, &_data[0]); - _writeByte(PCF8563_TIMER1_REG, 1, &_data[1]); -} - - - -bool PCF8563_Class::enableCLK(uint8_t freq) -{ - if (freq >= PCF8563_CLK_MAX) return false; - _data[0] = freq | PCF8563_CLK_ENABLE; - _writeByte(PCF8563_SQW_REG, 1, _data); - return true; -} - -void PCF8563_Class::disableCLK() -{ - _data[0] = 0x00; - _writeByte(PCF8563_SQW_REG, 1, _data); -} - -const char *PCF8563_Class::formatDateTime(uint8_t sytle) -{ - RTC_Date t = getDateTime(); - switch (sytle) { - case PCF_TIMEFORMAT_HM: - snprintf(format, sizeof(format), "%02d:%02d", t.hour, t.minute); - break; - case PCF_TIMEFORMAT_HMS: - snprintf(format, sizeof(format), "%02d:%02d:%02d", t.hour, t.minute, t.second); - break; - case PCF_TIMEFORMAT_YYYY_MM_DD: - snprintf(format, sizeof(format), "%02d-%02d-%02d", t.year, t.month, t.day); - break; - case PCF_TIMEFORMAT_MM_DD_YYYY: - snprintf(format, sizeof(format), "%02d-%02d-%02d", t.month, t.day, t.year); - break; - case PCF_TIMEFORMAT_DD_MM_YYYY: - snprintf(format, sizeof(format), "%02d-%02d-%02d", t.day, t.month, t.year); - break; - case PCF_TIMEFORMAT_YYYY_MM_DD_H_M_S: - snprintf(format, sizeof(format), "%02d-%02d-%02d/%02d:%02d:%02d", t.year, t.month, t.day, t.hour, t.minute, t.second); - break; - default: - snprintf(format, sizeof(format), "%02d:%02d", t.hour, t.minute); - break; - } - return format; -} - - -void PCF8563_Class::syncToSystem() -{ - struct tm t_tm; - struct timeval val; - RTC_Date dt = getDateTime(); - // log_i("syncToSystem: %d %d %d - %d %d %d \n", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); - t_tm.tm_hour = dt.hour; - t_tm.tm_min = dt.minute; - t_tm.tm_sec = dt.second; - t_tm.tm_year = dt.year - 1900; //Year, whose value starts from 1900 - t_tm.tm_mon = dt.month - 1; //Month (starting from January, 0 for January) - Value range is [0,11] - t_tm.tm_mday = dt.day; - val.tv_sec = mktime(&t_tm); - val.tv_usec = 0; - - settimeofday(&val, NULL); - // log_i("syncToSystem: %d %d %d - %d %d %d \n", t_tm.tm_year, t_tm.tm_mon + 1, t_tm.tm_mday, t_tm.tm_hour, t_tm.tm_min, t_tm.tm_sec); -} - -void PCF8563_Class::syncToRtc() -{ - time_t now; - struct tm info; - time(&now); - localtime_r(&now, &info); - setDateTime(info.tm_year, info.tm_mon + 1, info.tm_mday, info.tm_hour, info.tm_min, info.tm_sec); - // Serial.printf("syncToRtc: %d %d %d - %d %d %d \n", info.tm_year, info.tm_mon + 1, info.tm_mday, info.tm_hour, info.tm_min, info.tm_sec); -} - -RTC_Date::RTC_Date( -) : year(0), month(0), day(0), hour(0), minute(0), second(0) -{ - -} - - -RTC_Date::RTC_Date(uint16_t y, - uint8_t m, - uint8_t d, - uint8_t h, - uint8_t mm, - uint8_t s - ) : year(y), month(m), day(d), hour(h), minute(mm), second(s) -{ - -} - - - -uint8_t RTC_Date::StringToUint8(const char *pString) -{ - uint8_t value = 0; - - // skip leading 0 and spaces - while ('0' == *pString || *pString == ' ') { - pString++; - } - - // calculate number until we hit non-numeral char - while ('0' <= *pString && *pString <= '9') { - value *= 10; - value += *pString - '0'; - pString++; - } - return value; -} - - -RTC_Date::RTC_Date(const char *date, const char *time) -{ - // sample input: date = "Dec 26 2009", time = "12:34:56" - year = 2000 + StringToUint8(date + 9); - // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec - switch (date[0]) { - case 'J': - if ( date[1] == 'a' ) - month = 1; - else if ( date[2] == 'n' ) - month = 6; - else - month = 7; - break; - case 'F': - month = 2; - break; - case 'A': - month = date[1] == 'p' ? 4 : 8; - break; - case 'M': - month = date[2] == 'r' ? 3 : 5; - break; - case 'S': - month = 9; - break; - case 'O': - month = 10; - break; - case 'N': - month = 11; - break; - case 'D': - month = 12; - break; - } - day = StringToUint8(date + 4); - hour = StringToUint8(time); - minute = StringToUint8(time + 3); - second = StringToUint8(time + 6); -} - - -RTC_Alarm::RTC_Alarm( - uint8_t m, - uint8_t h, - uint8_t d, - uint8_t w -): minute(m), hour(h), day(d), weekday(w) -{ - -} - - -uint8_t PCF8563_Class::status2() -{ - _readByte(PCF8563_STAT2_REG, 1, _data); - return _data[0]; -} - - -bool RTC_Date::operator==(RTC_Date d) -{ - return ((d.year == year) && (d.month == month) && (d.day == day) && (d.hour == hour) && (d.minute == minute)); -} +///////////////////////////////////////////////////////////////// +/* +MIT License + +Copyright (c) 2019 lewis he + +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. + +pcf8563.cpp - Arduino library for NXP PCF8563 RTC chip. +Created by Lewis he on April 1, 2019. +github:https://github.com/lewisxhe/PCF8563_Library +*/ +///////////////////////////////////////////////////////////////// +#include "pcf8563.h" +#include + +PCF8563_Class::PCF8563_Class(I2CUtil &bus, uint8_t addr) +{ + _bus = &bus; + _address = addr; +} + +void PCF8563_Class::check() +{ + RTC_Date now = getDateTime(); + RTC_Date compiled = RTC_Date(__DATE__, __TIME__); + + // Serial.printf("%d:%d:%d - %d:%d:%d\n", compiled.year, compiled.month, compiled.day, compiled.hour, compiled.minute, compiled.second); + + if (now.year < compiled.year || + (now.year == compiled.year && now.month < compiled.month ) || + (now.year == compiled.year && now.month == compiled.month && now.day < compiled.day)) { + setDateTime(compiled); + log_i("reset rtc date time"); + } +} + +void PCF8563_Class::setDateTime(RTC_Date date) +{ + setDateTime(date.year, date.month, date.day, date.hour, date.minute, date.second); +} + +uint32_t PCF8563_Class::getDayOfWeek(uint32_t day, uint32_t month, uint32_t year) +{ + uint32_t val; + if (month < 3) { + month = 12u + month; + year--; + } + val = (day + (((month + 1u) * 26u) / 10u) + year + (year / 4u) + (6u * (year / 100u)) + (year / 400u)) % 7u; + if (0u == val) { + val = 7; + } + return (val - 1); +} + +void PCF8563_Class::setDateTime(uint16_t year, + uint8_t month, + uint8_t day, + uint8_t hour, + uint8_t minute, + uint8_t second) +{ + _data[0] = _dec_to_bcd(second) & (~PCF8563_VOL_LOW_MASK); + _data[1] = _dec_to_bcd(minute); + _data[2] = _dec_to_bcd(hour); + _data[3] = _dec_to_bcd(day); + _data[4] = getDayOfWeek(day, month, year); + _data[5] = _dec_to_bcd(month); + _data[6] = _dec_to_bcd(year % 100); + + if (2000 - year - (year % 100)) { + _data[4] |= PCF8563_CENTURY_MASK; + } else { + _data[4] &= (~PCF8563_CENTURY_MASK); + } + _writeByte(PCF8563_SEC_REG, 7, _data); +} + +bool PCF8563_Class::isValid() +{ + _readByte(PCF8563_SEC_REG, 1, &_isValid); + return !(_isValid & (1 << 7)); +} + +RTC_Date PCF8563_Class::getDateTime() +{ + uint16_t year; + uint8_t cetury = 0; + _readByte(PCF8563_SEC_REG, 7, _data); + _voltageLow = (_data[0] & PCF8563_VOL_LOW_MASK); + _data[0] = _bcd_to_dec(_data[0] & (~PCF8563_VOL_LOW_MASK)); + _data[1] = _bcd_to_dec(_data[1] & PCF8563_minuteS_MASK); + _data[2] = _bcd_to_dec(_data[2] & PCF8563_HOUR_MASK); + _data[3] = _bcd_to_dec(_data[3] & PCF8563_DAY_MASK); + _data[4] = _bcd_to_dec(_data[4] & PCF8563_WEEKDAY_MASK); + cetury = _data[5] & PCF8563_CENTURY_MASK; + _data[5] = _bcd_to_dec(_data[5] & PCF8563_MONTH_MASK); + year = _bcd_to_dec(_data[6]); + year = cetury ? 1900 + year : 2000 + year; + return RTC_Date( + year, + _data[5], + _data[3], + _data[2], + _data[1], + _data[0] + ); +} + +RTC_Alarm PCF8563_Class::getAlarm() +{ + _readByte(PCF8563_ALRM_MIN_REG, 4, _data); + _data[0] = _bcd_to_dec(_data[0] & (~PCF8563_minuteS_MASK)); + _data[1] = _bcd_to_dec(_data[1] & (~PCF8563_HOUR_MASK)); + _data[2] = _bcd_to_dec(_data[2] & (~PCF8563_DAY_MASK)); + _data[3] = _bcd_to_dec(_data[3] & (~PCF8563_WEEKDAY_MASK)); + return RTC_Alarm(_data[0], _data[1], _data[2], _data[3]); +} + + +void PCF8563_Class::enableAlarm() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + _data[0] &= ~PCF8563_ALARM_AF; + _data[0] |= (PCF8563_TIMER_TF | PCF8563_ALARM_AIE); + _writeByte(PCF8563_STAT2_REG, 1, _data); +} + +void PCF8563_Class::disableAlarm() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + _data[0] &= ~(PCF8563_ALARM_AF | PCF8563_ALARM_AIE); + _data[0] |= PCF8563_TIMER_TF; + _writeByte(PCF8563_STAT2_REG, 1, _data); +} + +void PCF8563_Class::resetAlarm() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + _data[0] &= ~(PCF8563_ALARM_AF); + _data[0] |= PCF8563_TIMER_TF; + _writeByte(PCF8563_STAT2_REG, 1, _data); +} + +bool PCF8563_Class::alarmActive() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + return (bool)(_data[0] & PCF8563_ALARM_AF); +} + +void PCF8563_Class::setAlarm(RTC_Alarm alarm) +{ + setAlarm(alarm.minute, alarm.hour, alarm.day, alarm.weekday); +} + + +// constrain() macro complains abouf type limit, but we'll ignore it +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" + +void PCF8563_Class::setAlarm(uint8_t hour, uint8_t minute, uint8_t day, uint8_t weekday) +{ + if (minute != PCF8563_NO_ALARM) { + _data[0] = _dec_to_bcd(constrain(minute, (uint8_t)0x00, (uint8_t)0x3b)); + _data[0] &= ~PCF8563_ALARM_ENABLE; + } else { + _data[0] = PCF8563_ALARM_ENABLE; + } + + if (hour != PCF8563_NO_ALARM) { + _data[1] = _dec_to_bcd(constrain(hour, (uint8_t)0x00, (uint8_t)0x17)); + _data[1] &= ~PCF8563_ALARM_ENABLE; + } else { + _data[1] = PCF8563_ALARM_ENABLE; + } + if (day != PCF8563_NO_ALARM) { + _data[2] = _dec_to_bcd(constrain(day, (uint8_t)0x01, (uint8_t)0x1f)); + _data[2] &= ~PCF8563_ALARM_ENABLE; + } else { + _data[2] = PCF8563_ALARM_ENABLE; + } + if (weekday != PCF8563_NO_ALARM) { + _data[3] = _dec_to_bcd(constrain(weekday, (uint8_t)0x00, (uint8_t)0x06)); + _data[3] &= ~PCF8563_ALARM_ENABLE; + } else { + _data[3] = PCF8563_ALARM_ENABLE; + } + _writeByte(PCF8563_ALRM_MIN_REG, 4, _data); +} + +#pragma GCC diagnostic pop + +void PCF8563_Class::setAlarmByMinutes(uint8_t minute) +{ + setAlarm(PCF8563_NO_ALARM, minute, PCF8563_NO_ALARM, PCF8563_NO_ALARM); +} +void PCF8563_Class::setAlarmByDays(uint8_t day) +{ + setAlarm(PCF8563_NO_ALARM, PCF8563_NO_ALARM, day, PCF8563_NO_ALARM); +} +void PCF8563_Class::setAlarmByHours(uint8_t hour) +{ + setAlarm(hour, PCF8563_NO_ALARM, PCF8563_NO_ALARM, PCF8563_NO_ALARM); +} +void PCF8563_Class::setAlarmByWeekDay(uint8_t weekday) +{ + setAlarm(PCF8563_NO_ALARM, PCF8563_NO_ALARM, PCF8563_NO_ALARM, weekday); +} + +bool PCF8563_Class::isTimerEnable() +{ + _readByte(PCF8563_STAT2_REG, 1, &_data[0]); + _readByte(PCF8563_TIMER1_REG, 1, &_data[1]); + if (_data[0] & PCF8563_TIMER_TIE) { + return _data[1] & PCF8563_TIMER_TE ? true : false; + } + return false; +} + +bool PCF8563_Class::isTimerActive() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + return (bool) _data[0] & PCF8563_TIMER_TF; +} + +void PCF8563_Class::enableTimer() +{ + _readByte(PCF8563_STAT2_REG, 1, &_data[0]); + _readByte(PCF8563_TIMER1_REG, 1, &_data[1]); + _data[0] &= ~PCF8563_TIMER_TF; + _data[0] |= (PCF8563_ALARM_AF | PCF8563_TIMER_TIE); + _data[1] |= PCF8563_TIMER_TE; + _writeByte(PCF8563_STAT2_REG, 1, &_data[0]); + _writeByte(PCF8563_TIMER1_REG, 1, &_data[1]); +} + +void PCF8563_Class::disableTimer() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + _data[0] &= ~PCF8563_TIMER_TF; + _data[1] |= PCF8563_ALARM_AF; + _writeByte(PCF8563_STAT2_REG, 1, _data); +} + +void PCF8563_Class::setTimer(uint8_t val, uint8_t freq, bool enIntrrupt) +{ + _readByte(PCF8563_STAT2_REG, 1, &_data[0]); + _readByte(PCF8563_TIMER1_REG, 1, &_data[1]); + if (enIntrrupt) { + _data[0] |= 1 << 4; + } else { + _data[0] &= ~(1 << 4); + } + _data[1] |= (freq & PCF8563_TIMER_TD10); + _data[2] = val; + _writeByte(PCF8563_STAT2_REG, 1, &_data[0]); + _writeByte(PCF8563_TIMER1_REG, 1, &_data[1]); + _writeByte(PCF8563_TIMER2_REG, 1, &_data[2]); +} + +void PCF8563_Class::clearTimer() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + _data[0] &= ~(PCF8563_TIMER_TF | PCF8563_TIMER_TIE); + _data[0] |= PCF8563_ALARM_AF; + _data[1] = 0x00; + _writeByte(PCF8563_STAT2_REG, 1, &_data[0]); + _writeByte(PCF8563_TIMER1_REG, 1, &_data[1]); +} + + + +bool PCF8563_Class::enableCLK(uint8_t freq) +{ + if (freq >= PCF8563_CLK_MAX) return false; + _data[0] = freq | PCF8563_CLK_ENABLE; + _writeByte(PCF8563_SQW_REG, 1, _data); + return true; +} + +void PCF8563_Class::disableCLK() +{ + _data[0] = 0x00; + _writeByte(PCF8563_SQW_REG, 1, _data); +} + +const char *PCF8563_Class::formatDateTime(uint8_t sytle) +{ + RTC_Date t = getDateTime(); + switch (sytle) { + case PCF_TIMEFORMAT_HM: + snprintf(format, sizeof(format), "%02d:%02d", t.hour, t.minute); + break; + case PCF_TIMEFORMAT_HMS: + snprintf(format, sizeof(format), "%02d:%02d:%02d", t.hour, t.minute, t.second); + break; + case PCF_TIMEFORMAT_YYYY_MM_DD: + snprintf(format, sizeof(format), "%02d-%02d-%02d", t.year, t.month, t.day); + break; + case PCF_TIMEFORMAT_MM_DD_YYYY: + snprintf(format, sizeof(format), "%02d-%02d-%02d", t.month, t.day, t.year); + break; + case PCF_TIMEFORMAT_DD_MM_YYYY: + snprintf(format, sizeof(format), "%02d-%02d-%02d", t.day, t.month, t.year); + break; + case PCF_TIMEFORMAT_YYYY_MM_DD_H_M_S: + snprintf(format, sizeof(format), "%02d-%02d-%02d/%02d:%02d:%02d", t.year, t.month, t.day, t.hour, t.minute, t.second); + break; + default: + snprintf(format, sizeof(format), "%02d:%02d", t.hour, t.minute); + break; + } + return format; +} + + +void PCF8563_Class::syncToSystem() +{ + struct tm t_tm; + struct timeval val; + RTC_Date dt = getDateTime(); + // log_i("syncToSystem: %d %d %d - %d %d %d \n", dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); + t_tm.tm_hour = dt.hour; + t_tm.tm_min = dt.minute; + t_tm.tm_sec = dt.second; + t_tm.tm_year = dt.year - 1900; //Year, whose value starts from 1900 + t_tm.tm_mon = dt.month - 1; //Month (starting from January, 0 for January) - Value range is [0,11] + t_tm.tm_mday = dt.day; + val.tv_sec = mktime(&t_tm); + val.tv_usec = 0; + + settimeofday(&val, NULL); + // log_i("syncToSystem: %d %d %d - %d %d %d \n", t_tm.tm_year, t_tm.tm_mon + 1, t_tm.tm_mday, t_tm.tm_hour, t_tm.tm_min, t_tm.tm_sec); +} + +void PCF8563_Class::syncToRtc() +{ + time_t now; + struct tm info; + time(&now); + localtime_r(&now, &info); + setDateTime(info.tm_year, info.tm_mon + 1, info.tm_mday, info.tm_hour, info.tm_min, info.tm_sec); + // Serial.printf("syncToRtc: %d %d %d - %d %d %d \n", info.tm_year, info.tm_mon + 1, info.tm_mday, info.tm_hour, info.tm_min, info.tm_sec); +} + +RTC_Date::RTC_Date( +) : year(0), month(0), day(0), hour(0), minute(0), second(0) +{ + +} + + +RTC_Date::RTC_Date(uint16_t y, + uint8_t m, + uint8_t d, + uint8_t h, + uint8_t mm, + uint8_t s + ) : year(y), month(m), day(d), hour(h), minute(mm), second(s) +{ + +} + + + +uint8_t RTC_Date::StringToUint8(const char *pString) +{ + uint8_t value = 0; + + // skip leading 0 and spaces + while ('0' == *pString || *pString == ' ') { + pString++; + } + + // calculate number until we hit non-numeral char + while ('0' <= *pString && *pString <= '9') { + value *= 10; + value += *pString - '0'; + pString++; + } + return value; +} + + +RTC_Date::RTC_Date(const char *date, const char *time) +{ + // sample input: date = "Dec 26 2009", time = "12:34:56" + year = 2000 + StringToUint8(date + 9); + // Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec + switch (date[0]) { + case 'J': + if ( date[1] == 'a' ) + month = 1; + else if ( date[2] == 'n' ) + month = 6; + else + month = 7; + break; + case 'F': + month = 2; + break; + case 'A': + month = date[1] == 'p' ? 4 : 8; + break; + case 'M': + month = date[2] == 'r' ? 3 : 5; + break; + case 'S': + month = 9; + break; + case 'O': + month = 10; + break; + case 'N': + month = 11; + break; + case 'D': + month = 12; + break; + } + day = StringToUint8(date + 4); + hour = StringToUint8(time); + minute = StringToUint8(time + 3); + second = StringToUint8(time + 6); +} + + +RTC_Alarm::RTC_Alarm( + uint8_t m, + uint8_t h, + uint8_t d, + uint8_t w +): minute(m), hour(h), day(d), weekday(w) +{ + +} + + +uint8_t PCF8563_Class::status2() +{ + _readByte(PCF8563_STAT2_REG, 1, _data); + return _data[0]; +} + + +bool RTC_Date::operator==(RTC_Date d) +{ + return ((d.year == year) && (d.month == month) && (d.day == day) && (d.hour == hour) && (d.minute == minute)); +} diff --git a/src/drivers/common/Speaker/Speaker.cpp b/src/drivers/common/Speaker/Speaker.cpp index 1932172..6185efc 100644 --- a/src/drivers/common/Speaker/Speaker.cpp +++ b/src/drivers/common/Speaker/Speaker.cpp @@ -5,8 +5,15 @@ void SPEAKER::begin() { _begun = true; - ledcSetup(_channel, 0, 13); - ledcAttachPin(_pin, _channel); + + #if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + ledcSetup(_channel, 0, 13); + ledcAttachPin(_pin, _channel); + #else + ledcAttach( _pin, 0, 13 ); // Note: auto channel ? + #endif + + #ifdef ARDUINO_ODROID_ESP32 pinMode(25, OUTPUT); digitalWrite(25, HIGH); @@ -16,7 +23,11 @@ void SPEAKER::begin() void SPEAKER::end() { mute(); - ledcDetachPin(_pin); + #if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + ledcDetachPin(_pin); + #else + ledcDetach(_pin); + #endif _begun = false; } @@ -89,5 +100,9 @@ void SPEAKER::playMusic(const uint8_t* music_data, uint16_t sample_rate) } } // ledcSetup(_channel, 0, 13); - ledcAttachPin(_pin, _channel); + #if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + ledcAttachPin(_pin, _channel); + #else + ledcAttach(_pin, 0, 13); + #endif } diff --git a/src/drivers/common/Speaker/Speaker.h b/src/drivers/common/Speaker/Speaker.h index 1da9d15..8027f2c 100644 --- a/src/drivers/common/Speaker/Speaker.h +++ b/src/drivers/common/Speaker/Speaker.h @@ -2,7 +2,18 @@ #define _SPEAKER_H_ #include -#include + + +#if __has_include() // platformio has optional esp_arduino_version + #include +#endif + +#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2,0,14) + #define SOC_DAC_SUPPORTED 1 + #include +#else + #include +#endif class SPEAKER { diff --git a/src/ext_confs/Lilygo-S3-T-Deck.hpp b/src/ext_confs/Lilygo-S3-T-Deck.hpp index f09d41a..a7e904c 100644 --- a/src/ext_confs/Lilygo-S3-T-Deck.hpp +++ b/src/ext_confs/Lilygo-S3-T-Deck.hpp @@ -86,7 +86,7 @@ cfg.y_min = 0; cfg.x_max = 240; cfg.y_max = 320; - //cfg.bus_shared = true; + cfg.bus_shared = true; // I2C cfg.i2c_port = I2C_NUM_1; cfg.i2c_addr = 0x5D; diff --git a/src/gitTagVersion.h b/src/gitTagVersion.h index ccc7b58..414dc3c 100644 --- a/src/gitTagVersion.h +++ b/src/gitTagVersion.h @@ -2,7 +2,7 @@ #define ECC_VERSION_MAJOR 1 #define ECC_VERSION_MINOR 5 -#define ECC_VERSION_PATCH 0 +#define ECC_VERSION_PATCH 1 #if !defined _ECC_STR #define _ECC_STR(x) #x #endif diff --git a/src/utility/ScreenShotService/GIF/TinyGIFEncoder.cpp b/src/utility/ScreenShotService/GIF/TinyGIFEncoder.cpp index f0e3179..26bf3c2 100644 --- a/src/utility/ScreenShotService/GIF/TinyGIFEncoder.cpp +++ b/src/utility/ScreenShotService/GIF/TinyGIFEncoder.cpp @@ -410,8 +410,8 @@ void GIF_Encoder::DitherImage( const uint8_t* lastFrame, const uint8_t* nextFram continue; } - int32_t bestDiff = 1000000; - int32_t bestInd = kGifTransIndex; + int bestDiff = 1000000; + int bestInd = kGifTransIndex; // Search the palete GetClosestPaletteColor(pPal, rr, gg, bb, bestInd, bestDiff); @@ -489,8 +489,8 @@ void GIF_Encoder::ThresholdImage( const uint8_t* lastFrame, const uint8_t* nextF outFrame[3] = kGifTransIndex; } else { // palettize the pixel - int32_t bestDiff = 1000000; - int32_t bestInd = 1; + int bestDiff = 1000000; + int bestInd = 1; GetClosestPaletteColor(pPal, nextFrame[0], nextFrame[1], nextFrame[2], bestInd, bestDiff); // write the resulting color to the output buffer From 66ecc6caf46bd3883dd2d718fed243baac5116c0 Mon Sep 17 00:00:00 2001 From: tobozo Date: Tue, 10 Oct 2023 19:05:31 +0200 Subject: [PATCH 2/7] fix bad macros for 3.0.0-alpha --- src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h | 8 +++-- src/drivers/Odroid-Go/Battery/battery.h | 25 ++++++++------ src/drivers/common/Audio/Speaker_Class.cpp | 4 ++- src/drivers/common/Audio/Speaker_Class.hpp | 4 ++- src/drivers/common/Speaker/Speaker.cpp | 35 +++++++++++++------- src/drivers/common/Speaker/Speaker.h | 11 ++++-- 6 files changed, 58 insertions(+), 29 deletions(-) diff --git a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h index f8728ca..1e9cd87 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h +++ b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h @@ -12,8 +12,12 @@ #include #endif -#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) - #include "driver/i2s.h" +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + #include "driver/i2s.h" + #else + #include "driver/i2s_std.h" + #endif #else #include "driver/i2s_std.h" #endif diff --git a/src/drivers/Odroid-Go/Battery/battery.h b/src/drivers/Odroid-Go/Battery/battery.h index 6d329d1..0a03851 100644 --- a/src/drivers/Odroid-Go/Battery/battery.h +++ b/src/drivers/Odroid-Go/Battery/battery.h @@ -12,16 +12,21 @@ #include #endif -#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) - #include - #include - - // adc1_config_width - // adc1_config_channel_atten - // esp_adc_cal_characterize - // adc1_get_raw - // esp_adc_cal_raw_to_voltage - // esp_adc_cal_characteristics_t +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + #include + #include + // adc1_config_width + // adc1_config_channel_atten + // esp_adc_cal_characterize + // adc1_get_raw + // esp_adc_cal_raw_to_voltage + // esp_adc_cal_characteristics_t + #else + #include + #include + #include + #endif #else #include diff --git a/src/drivers/common/Audio/Speaker_Class.cpp b/src/drivers/common/Audio/Speaker_Class.cpp index 1bbb8f3..ab1cf8c 100644 --- a/src/drivers/common/Audio/Speaker_Class.cpp +++ b/src/drivers/common/Audio/Speaker_Class.cpp @@ -5,7 +5,8 @@ #include #endif -#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) #include "Speaker_Class.hpp" @@ -466,3 +467,4 @@ namespace ChimeraCore #endif +#endif diff --git a/src/drivers/common/Audio/Speaker_Class.hpp b/src/drivers/common/Audio/Speaker_Class.hpp index cebd890..310a172 100644 --- a/src/drivers/common/Audio/Speaker_Class.hpp +++ b/src/drivers/common/Audio/Speaker_Class.hpp @@ -8,7 +8,8 @@ #include #endif -#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) #include @@ -241,3 +242,4 @@ namespace ChimeraCore #endif #endif +#endif diff --git a/src/drivers/common/Speaker/Speaker.cpp b/src/drivers/common/Speaker/Speaker.cpp index 6185efc..a226c03 100644 --- a/src/drivers/common/Speaker/Speaker.cpp +++ b/src/drivers/common/Speaker/Speaker.cpp @@ -6,25 +6,32 @@ void SPEAKER::begin() { _begun = true; - #if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) - ledcSetup(_channel, 0, 13); - ledcAttachPin(_pin, _channel); + #if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + ledcSetup(_channel, 0, 13); + ledcAttachPin(_pin, _channel); + #else + ledcAttach( _pin, 0, 13 ); // Note: auto channel ? + #endif #else ledcAttach( _pin, 0, 13 ); // Note: auto channel ? #endif - -#ifdef ARDUINO_ODROID_ESP32 - pinMode(25, OUTPUT); - digitalWrite(25, HIGH); -#endif + #ifdef ARDUINO_ODROID_ESP32 + pinMode(25, OUTPUT); + digitalWrite(25, HIGH); + #endif setBeep(1000, 100); } void SPEAKER::end() { mute(); - #if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) - ledcDetachPin(_pin); + #if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + ledcDetachPin(_pin); + #else + ledcDetach(_pin); + #endif #else ledcDetach(_pin); #endif @@ -100,8 +107,12 @@ void SPEAKER::playMusic(const uint8_t* music_data, uint16_t sample_rate) } } // ledcSetup(_channel, 0, 13); - #if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) - ledcAttachPin(_pin, _channel); + #if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + ledcAttachPin(_pin, _channel); + #else + ledcAttach(_pin, 0, 13); + #endif #else ledcAttach(_pin, 0, 13); #endif diff --git a/src/drivers/common/Speaker/Speaker.h b/src/drivers/common/Speaker/Speaker.h index 8027f2c..dfd6f9e 100644 --- a/src/drivers/common/Speaker/Speaker.h +++ b/src/drivers/common/Speaker/Speaker.h @@ -8,13 +8,18 @@ #include #endif -#if defined ESP_ARDUINO_VERSION_VAL && ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2,0,14) - #define SOC_DAC_SUPPORTED 1 - #include + +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + #include + #else + #include + #endif #else #include #endif + class SPEAKER { public: From 77699a48e4f6d5e1766b97ccccb68cffb4c7a36c Mon Sep 17 00:00:00 2001 From: tobozo Date: Tue, 10 Oct 2023 19:08:46 +0200 Subject: [PATCH 3/7] fix bad macros for 3.0.0-alpha --- src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h index 1e9cd87..b717599 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h +++ b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2s.h @@ -19,7 +19,7 @@ #include "driver/i2s_std.h" #endif #else - #include "driver/i2s_std.h" + #include "driver/i2s.h" #endif #ifdef __cplusplus From b33c9b358a3a5f9c41176d744e18caf734d91104 Mon Sep 17 00:00:00 2001 From: tobozo Date: Tue, 10 Oct 2023 19:12:22 +0200 Subject: [PATCH 4/7] fix bad macros for 3.0.0-alpha --- src/drivers/Odroid-Go/Battery/battery.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/drivers/Odroid-Go/Battery/battery.h b/src/drivers/Odroid-Go/Battery/battery.h index 0a03851..d74a5eb 100644 --- a/src/drivers/Odroid-Go/Battery/battery.h +++ b/src/drivers/Odroid-Go/Battery/battery.h @@ -13,7 +13,7 @@ #endif #if defined ESP_ARDUINO_VERSION_VAL - #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + #if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2,0,14) #include #include // adc1_config_width @@ -29,9 +29,8 @@ #endif #else - #include - #include - #include + #include + #include #endif From 07b12e24c4e848de833929f3b8539d8f28d5b108 Mon Sep 17 00:00:00 2001 From: tobozo Date: Tue, 10 Oct 2023 19:21:05 +0200 Subject: [PATCH 5/7] fix bad macros for 3.0.0-alpha --- src/drivers/Odroid-Go/Battery/battery.h | 66 ++++++++++--------------- src/drivers/common/Speaker/Speaker.cpp | 7 +-- 2 files changed, 30 insertions(+), 43 deletions(-) diff --git a/src/drivers/Odroid-Go/Battery/battery.h b/src/drivers/Odroid-Go/Battery/battery.h index d74a5eb..ad31399 100644 --- a/src/drivers/Odroid-Go/Battery/battery.h +++ b/src/drivers/Odroid-Go/Battery/battery.h @@ -16,46 +16,32 @@ #if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2,0,14) #include #include - // adc1_config_width - // adc1_config_channel_atten - // esp_adc_cal_characterize - // adc1_get_raw - // esp_adc_cal_raw_to_voltage - // esp_adc_cal_characteristics_t - #else - #include - #include - #include - #endif - -#else - #include - #include -#endif - - -#define BATTERY_RESISTANCE_NUM 2 -#define BATTERY_SAMPLES 64 -#define BATTERY_VMAX 420 -#define BATTERY_VMIN 330 -#define BATTERY_CUTOFF 325 -class Battery -{ -public: - Battery(void); + #define BATTERY_RESISTANCE_NUM 2 + #define BATTERY_SAMPLES 64 + #define BATTERY_VMAX 420 + #define BATTERY_VMIN 330 + #define BATTERY_CUTOFF 325 + + class Battery + { + public: + Battery(void); + + void begin(); + double getVoltage(); + int getPercentage(); + void setProtection(bool enable); + void update(); + + private: + #if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION < ESP_ARDUINO_VERSION_VAL(3,0,0) + esp_adc_cal_characteristics_t _adc_chars; + #endif + #endif + bool _enable_protection; + }; - void begin(); - double getVoltage(); - int getPercentage(); - void setProtection(bool enable); - void update(); - -private: - #if ESP_ARDUINO_VERSION < ESP_ARDUINO_VERSION_VAL(3,0,0) - esp_adc_cal_characteristics_t _adc_chars; #endif - bool _enable_protection; -}; - - +#endif diff --git a/src/drivers/common/Speaker/Speaker.cpp b/src/drivers/common/Speaker/Speaker.cpp index a226c03..e398d7b 100644 --- a/src/drivers/common/Speaker/Speaker.cpp +++ b/src/drivers/common/Speaker/Speaker.cpp @@ -14,7 +14,8 @@ void SPEAKER::begin() ledcAttach( _pin, 0, 13 ); // Note: auto channel ? #endif #else - ledcAttach( _pin, 0, 13 ); // Note: auto channel ? + ledcSetup(_channel, 0, 13); + ledcAttachPin(_pin, _channel); #endif #ifdef ARDUINO_ODROID_ESP32 @@ -33,7 +34,7 @@ void SPEAKER::end() { ledcDetach(_pin); #endif #else - ledcDetach(_pin); + ledcDetachPin(_pin); #endif _begun = false; } @@ -114,6 +115,6 @@ void SPEAKER::playMusic(const uint8_t* music_data, uint16_t sample_rate) ledcAttach(_pin, 0, 13); #endif #else - ledcAttach(_pin, 0, 13); + ledcAttachPin(_pin, _channel); #endif } From 033fc23eb69456e38ede3caf61c49b58020c175d Mon Sep 17 00:00:00 2001 From: tobozo Date: Tue, 10 Oct 2023 19:30:22 +0200 Subject: [PATCH 6/7] fix bad macros for 3.0.0-alpha --- src/drivers/Odroid-Go/Battery/battery.cpp | 2 +- src/drivers/Odroid-Go/Battery/battery.h | 65 ++++++++++++----------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/drivers/Odroid-Go/Battery/battery.cpp b/src/drivers/Odroid-Go/Battery/battery.cpp index aa2b3b5..6b837f2 100644 --- a/src/drivers/Odroid-Go/Battery/battery.cpp +++ b/src/drivers/Odroid-Go/Battery/battery.cpp @@ -8,7 +8,7 @@ #include "battery.h" -#if defined ARDUINO_ODROID_ESP32 +#if defined ARDUINO_ODROID_ESP32 && defined HAS_ADC_CAL_SUPPORT #include #include diff --git a/src/drivers/Odroid-Go/Battery/battery.h b/src/drivers/Odroid-Go/Battery/battery.h index ad31399..d51de13 100644 --- a/src/drivers/Odroid-Go/Battery/battery.h +++ b/src/drivers/Odroid-Go/Battery/battery.h @@ -12,36 +12,41 @@ #include #endif -#if defined ESP_ARDUINO_VERSION_VAL - #if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2,0,14) - #include - #include - - #define BATTERY_RESISTANCE_NUM 2 - #define BATTERY_SAMPLES 64 - #define BATTERY_VMAX 420 - #define BATTERY_VMIN 330 - #define BATTERY_CUTOFF 325 - - class Battery - { - public: - Battery(void); - - void begin(); - double getVoltage(); - int getPercentage(); - void setProtection(bool enable); - void update(); - - private: - #if defined ESP_ARDUINO_VERSION_VAL - #if ESP_ARDUINO_VERSION < ESP_ARDUINO_VERSION_VAL(3,0,0) - esp_adc_cal_characteristics_t _adc_chars; - #endif - #endif - bool _enable_protection; - }; +#define HAS_ADC_CAL_SUPPORT +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(2,0,14) + #undef HAS_ADC_CAL_SUPPORT #endif #endif + + +#include +#include + +#define BATTERY_RESISTANCE_NUM 2 +#define BATTERY_SAMPLES 64 +#define BATTERY_VMAX 420 +#define BATTERY_VMIN 330 +#define BATTERY_CUTOFF 325 + +class Battery +{ +public: + Battery(void); + + void begin(); + double getVoltage(); + int getPercentage(); + void setProtection(bool enable); + void update(); + +private: + #if defined HAS_ADC_CAL_SUPPORT + esp_adc_cal_characteristics_t _adc_chars; + #endif + bool _enable_protection; +}; + +// #endif +// #endif From 104f0a2cc8de0604d6f2c61cd2da53d8395ba9e6 Mon Sep 17 00:00:00 2001 From: tobozo Date: Thu, 12 Oct 2023 14:28:02 +0200 Subject: [PATCH 7/7] tweak and fixes for T-Deck and esp32-arduino 3.x.x --- src/ESP32-Chimera-Core.cpp | 2 +- src/drivers/ESP32-S3-Box/Audio/src/bsp_i2c.c | 5 +++++ src/drivers/ESP32-S3-Box/Audio/src/i2c_bus.c | 5 +++++ src/drivers/T-Deck/keyboard.h | 6 +++--- src/drivers/T-Deck/trackball.h | 5 ++--- src/drivers/common/Audio/Mic_Class.cpp | 12 ++++++++++++ src/drivers/common/Audio/Mic_Class.hpp | 12 ++++++++++++ src/drivers/common/MPU6886/MahonyAHRS.cpp | 9 +++++---- src/drivers/common/MPU6886/MahonyAHRS.h | 4 ++-- src/drivers/common/Speaker/Speaker.h | 5 ++++- 10 files changed, 51 insertions(+), 14 deletions(-) diff --git a/src/ESP32-Chimera-Core.cpp b/src/ESP32-Chimera-Core.cpp index 82323bd..1545241 100644 --- a/src/ESP32-Chimera-Core.cpp +++ b/src/ESP32-Chimera-Core.cpp @@ -128,7 +128,7 @@ namespace ChimeraCore log_d("Enabling Keyboard"); Keyboard = new Keyboard_Class( &Wire1, KEYBOARD_I2C_ADDR, KEYBOARD_INT_PIN, - [](uint8_t key) { char c[2]={key,0}; log_d("Keyboard Interrupt: char=%s (0x%02x)", c, key); } + [](uint8_t key) { [[maybe_unused]]char c[2]={key,0}; log_d("Keyboard Interrupt: char=%s (0x%02x)", c, key); } ); #endif diff --git a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2c.c b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2c.c index 855abae..46099b3 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2c.c +++ b/src/drivers/ESP32-S3-Box/Audio/src/bsp_i2c.c @@ -11,6 +11,8 @@ #include "i2c_bus.h" static const char *TAG = "bsp_i2c"; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat" #define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ @@ -134,3 +136,6 @@ i2c_bus_handle_t bsp_i2c_bus_get_handle(void) { return i2c_bus_handle; } + + +#pragma GCC diagnostic pop diff --git a/src/drivers/ESP32-S3-Box/Audio/src/i2c_bus.c b/src/drivers/ESP32-S3-Box/Audio/src/i2c_bus.c index a0d42fd..bd68d56 100644 --- a/src/drivers/ESP32-S3-Box/Audio/src/i2c_bus.c +++ b/src/drivers/ESP32-S3-Box/Audio/src/i2c_bus.c @@ -22,6 +22,9 @@ #define I2C_BUS_MUTEX_TICKS_TO_WAIT (I2C_BUS_MS_TO_WAIT/portTICK_RATE_MS) static const char *TAG = "i2c_bus"; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat" + static i2c_bus_t s_i2c_bus[I2C_NUM_MAX]; #define I2C_BUS_CHECK(a, str, ret) if(!(a)) { \ @@ -466,3 +469,5 @@ inline static bool i2c_config_compare(i2c_port_t port, const i2c_config_t *conf) return false; } + +#pragma GCC diagnostic pop diff --git a/src/drivers/T-Deck/keyboard.h b/src/drivers/T-Deck/keyboard.h index d3845b6..9fb8ad5 100644 --- a/src/drivers/T-Deck/keyboard.h +++ b/src/drivers/T-Deck/keyboard.h @@ -25,7 +25,7 @@ namespace ChimeraCore TDeck_Keyboard_Class( TwoWire* bus, uint8_t dev_addr, fire_event_t fire_event ) : _bus(bus), _dev_addr(dev_addr), _fire_event(fire_event) { init(); } TDeck_Keyboard_Class( TwoWire* bus, uint8_t dev_addr, gpio_num_t pin_int, fire_event_t fire_event ) - : _bus(bus), _dev_addr(dev_addr), _pin_int(pin_int), _fire_event(fire_event) { _has_interrupt = true; init(); } + : _bus(bus), _pin_int(pin_int), _dev_addr(dev_addr), _fire_event(fire_event) { _has_interrupt = true; init(); } TDeck_Keyboard_Class( gpio_num_t pin_sda, gpio_num_t pin_scl, uint8_t dev_addr, fire_event_t fire_event ) : _pin_sda(pin_sda), _pin_scl(pin_scl), _dev_addr(dev_addr), _fire_event(fire_event) { _bus=&Wire1; _has_pins=true; init(); } TDeck_Keyboard_Class( gpio_num_t pin_sda, gpio_num_t pin_scl, gpio_num_t pin_int, uint8_t dev_addr, fire_event_t fire_event ) @@ -121,14 +121,14 @@ namespace ChimeraCore TwoWire* _bus; - fire_event_t _fire_event; - gpio_num_t _pin_sda; gpio_num_t _pin_scl; gpio_num_t _pin_int; uint8_t _dev_addr = -1; + fire_event_t _fire_event; + uint32_t _i2c_freq = 800000UL; bool _has_interrupt = false; diff --git a/src/drivers/T-Deck/trackball.h b/src/drivers/T-Deck/trackball.h index dcfd9b3..df44ae4 100644 --- a/src/drivers/T-Deck/trackball.h +++ b/src/drivers/T-Deck/trackball.h @@ -152,11 +152,10 @@ namespace ChimeraCore const uint32_t _width; const uint32_t _height; - int16_t _x; - int16_t _y; - fire_event_t _fire_event; + int16_t _x; + int16_t _y; void init() { diff --git a/src/drivers/common/Audio/Mic_Class.cpp b/src/drivers/common/Audio/Mic_Class.cpp index 3ac28f7..c3fa974 100644 --- a/src/drivers/common/Audio/Mic_Class.cpp +++ b/src/drivers/common/Audio/Mic_Class.cpp @@ -3,6 +3,15 @@ #include "Mic_Class.hpp" + +#if __has_include() // platformio has optional esp_arduino_version + #include +#endif + +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + + #include "../../../ESP32-Chimera-Core.h" #if __has_include () @@ -313,3 +322,6 @@ namespace ChimeraCore return true; } } + +#endif +#endif diff --git a/src/drivers/common/Audio/Mic_Class.hpp b/src/drivers/common/Audio/Mic_Class.hpp index 169daaf..e2785d0 100644 --- a/src/drivers/common/Audio/Mic_Class.hpp +++ b/src/drivers/common/Audio/Mic_Class.hpp @@ -4,10 +4,20 @@ #ifndef __M5_Mic_Class_H__ #define __M5_Mic_Class_H__ + +#if __has_include() // platformio has optional esp_arduino_version + #include +#endif + +#if defined ESP_ARDUINO_VERSION_VAL + #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) + // version>=3.0.0 => 'driver/i2s_std.h', 'driver/i2s_pdm.h' or 'driver/i2s_tdm.h' + #include #include #include + namespace ChimeraCore { class ECCKernel; @@ -145,3 +155,5 @@ namespace ChimeraCore } #endif +#endif +#endif diff --git a/src/drivers/common/MPU6886/MahonyAHRS.cpp b/src/drivers/common/MPU6886/MahonyAHRS.cpp index 8f64de8..4e06905 100644 --- a/src/drivers/common/MPU6886/MahonyAHRS.cpp +++ b/src/drivers/common/MPU6886/MahonyAHRS.cpp @@ -29,10 +29,10 @@ //--------------------------------------------------------------------------------------------------- // Variable definitions -volatile float twoKp = twoKpDef; // 2 * proportional gain (Kp) -volatile float twoKi = twoKiDef; // 2 * integral gain (Ki) -volatile float q0 = 1.0, q1 = 0.0, q2 = 0.0, q3 = 0.0; // quaternion of sensor frame relative to auxiliary frame -volatile float integralFBx = 0.0f, integralFBy = 0.0f, integralFBz = 0.0f; // integral error terms scaled by Ki +float twoKp = twoKpDef; // 2 * proportional gain (Kp) +float twoKi = twoKiDef; // 2 * integral gain (Ki) +float q0 = 1.0, q1 = 0.0, q2 = 0.0, q3 = 0.0; // quaternion of sensor frame relative to auxiliary frame +float integralFBx = 0.0f, integralFBy = 0.0f, integralFBz = 0.0f; // integral error terms scaled by Ki //--------------------------------------------------------------------------------------------------- // Function declarations @@ -241,6 +241,7 @@ void MahonyAHRSupdateIMU(float gx, float gy, float gz, float ax, float ay, float #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstrict-aliasing" +#pragma GCC diagnostic ignored "-Wuninitialized" // false positive with "error: 'y' is used uninitialized" float invSqrt(float x) { float halfx = 0.5f * x; diff --git a/src/drivers/common/MPU6886/MahonyAHRS.h b/src/drivers/common/MPU6886/MahonyAHRS.h index bae082d..c3bac13 100644 --- a/src/drivers/common/MPU6886/MahonyAHRS.h +++ b/src/drivers/common/MPU6886/MahonyAHRS.h @@ -16,8 +16,8 @@ //---------------------------------------------------------------------------------------------------- // Variable declaration -extern volatile float twoKp; // 2 * proportional gain (Kp) -extern volatile float twoKi; // 2 * integral gain (Ki) +extern float twoKp; // 2 * proportional gain (Kp) +extern float twoKi; // 2 * integral gain (Ki) //volatile float q0, q1, q2, q3; // quaternion of sensor frame relative to auxiliary frame //--------------------------------------------------------------------------------------------------- diff --git a/src/drivers/common/Speaker/Speaker.h b/src/drivers/common/Speaker/Speaker.h index dfd6f9e..341f5b2 100644 --- a/src/drivers/common/Speaker/Speaker.h +++ b/src/drivers/common/Speaker/Speaker.h @@ -12,7 +12,10 @@ #if defined ESP_ARDUINO_VERSION_VAL #if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,14) #include - #else + #else // ESP_ARDUINO_VERSION_VAL >= 3.0.0 + #define SOC_DAC_SUPPORTED 1 // why ??? + #include + #include #include #endif #else