From 96d5e390da27320b12c0372137407c766f8cad3c Mon Sep 17 00:00:00 2001 From: Robert Stein Date: Sat, 12 Dec 2020 00:08:29 +0100 Subject: [PATCH] Rework of the complete structure for multiply displays --- nextion-ui/SegoeUi64BNum.zi | Bin 0 -> 2251 bytes nextion-ui/SegoeUiBlack96Temp.zi | Bin 0 -> 4186 bytes nextion-ui/hmi-data.HMI | Bin 5308263 -> 7517095 bytes nextion-ui/icons/211.png | Bin 0 -> 2344 bytes nextion-ui/icons/212.png | Bin 0 -> 2540 bytes nextion-ui/icons/230.png | Bin 0 -> 2792 bytes nextion-ui/icons/231.png | Bin 0 -> 2649 bytes nextion-ui/icons/500d.png | Bin 0 -> 2587 bytes nextion-ui/icons/500n.png | Bin 0 -> 2459 bytes nextion-ui/icons/501.png | Bin 0 -> 2188 bytes nextion-ui/icons/502.png | Bin 0 -> 2244 bytes nextion-ui/icons/600d.png | Bin 0 -> 2525 bytes nextion-ui/icons/600n.png | Bin 0 -> 2475 bytes nextion-ui/icons/601.png | Bin 0 -> 2268 bytes nextion-ui/icons/602.png | Bin 0 -> 2078 bytes nextion-ui/icons/611.png | Bin 0 -> 2191 bytes nextion-ui/icons/721d.png | Bin 0 -> 1833 bytes nextion-ui/icons/721n.png | Bin 0 -> 2195 bytes nextion-ui/icons/741.png | Bin 0 -> 1844 bytes nextion-ui/icons/800d.png | Bin 0 -> 1618 bytes nextion-ui/icons/800n.png | Bin 0 -> 2241 bytes nextion-ui/icons/801d.png | Bin 0 -> 2449 bytes nextion-ui/icons/801n.png | Bin 0 -> 2827 bytes nextion-ui/icons/802d.png | Bin 0 -> 2289 bytes nextion-ui/icons/802n.png | Bin 0 -> 2303 bytes nextion-ui/icons/803.png | Bin 0 -> 2023 bytes nextion-ui/icons/804.png | Bin 0 -> 2729 bytes nextion-ui/icons/air-quality.png | Bin 0 -> 1914 bytes nextion-ui/icons/humidity.png | Bin 0 -> 1926 bytes nextion-ui/icons/pressure.png | Bin 0 -> 1188 bytes nextion-ui/icons/temperature.png | Bin 0 -> 1722 bytes .../img/ShowWeatherAndClock - AirQuality.png | Bin 0 -> 1069 bytes .../img/ShowWeatherAndClock - Blank.png | Bin 0 -> 122 bytes .../img/ShowWeatherAndClock - Humidity.png | Bin 0 -> 956 bytes .../img/ShowWeatherAndClock - Pressure.png | Bin 0 -> 1060 bytes nextion-ui/img/ShowWeatherAndClock - Temp.png | Bin 0 -> 1066 bytes nextion-ui/img/Welcome.png | Bin 0 -> 15694 bytes nextion-ui/img/weather_cloud.png | Bin 0 -> 4715 bytes nextion-ui/ui-template-design.xd | Bin 27010 -> 197210 bytes printermonitor/Debug.cpp | 65 + printermonitor/Debug.h | 18 + printermonitor/DuetClient.cpp | 49 +- printermonitor/DuetClient.h | 9 +- printermonitor/Global.h | 21 + printermonitor/KlipperClient.cpp | 47 +- printermonitor/KlipperClient.h | 8 +- printermonitor/KlipperPrintClient.cpp | 414 ----- printermonitor/KlipperPrintClient.h | 104 -- printermonitor/Macros.h | 10 + printermonitor/NextionDisplayClient.cpp | 50 + printermonitor/NextionDisplayClient.h | 26 + printermonitor/OctoPrintClient.cpp | 47 +- printermonitor/OctoPrintClient.h | 7 +- printermonitor/OledDisplayClient.cpp | 170 ++ printermonitor/OledDisplayClient.h | 43 + printermonitor/OpenWeatherMapClient.cpp | 621 +++---- printermonitor/OpenWeatherMapClient.h | 5 +- printermonitor/PrinterClientInterface.h | 29 + printermonitor/RepetierClient.cpp | 49 +- printermonitor/RepetierClient.h | 8 +- printermonitor/Settings.h | 65 +- printermonitor/TimeClient.cpp | 308 ++-- printermonitor/TimeClient.h | 9 +- printermonitor/WebConstants.h | 94 ++ printermonitor/WebServer.cpp | 349 ++++ printermonitor/WebServer.h | 45 + printermonitor/printermonitor.ino | 1496 ++++------------- 67 files changed, 1835 insertions(+), 2331 deletions(-) create mode 100644 nextion-ui/SegoeUi64BNum.zi create mode 100644 nextion-ui/SegoeUiBlack96Temp.zi create mode 100644 nextion-ui/icons/211.png create mode 100644 nextion-ui/icons/212.png create mode 100644 nextion-ui/icons/230.png create mode 100644 nextion-ui/icons/231.png create mode 100644 nextion-ui/icons/500d.png create mode 100644 nextion-ui/icons/500n.png create mode 100644 nextion-ui/icons/501.png create mode 100644 nextion-ui/icons/502.png create mode 100644 nextion-ui/icons/600d.png create mode 100644 nextion-ui/icons/600n.png create mode 100644 nextion-ui/icons/601.png create mode 100644 nextion-ui/icons/602.png create mode 100644 nextion-ui/icons/611.png create mode 100644 nextion-ui/icons/721d.png create mode 100644 nextion-ui/icons/721n.png create mode 100644 nextion-ui/icons/741.png create mode 100644 nextion-ui/icons/800d.png create mode 100644 nextion-ui/icons/800n.png create mode 100644 nextion-ui/icons/801d.png create mode 100644 nextion-ui/icons/801n.png create mode 100644 nextion-ui/icons/802d.png create mode 100644 nextion-ui/icons/802n.png create mode 100644 nextion-ui/icons/803.png create mode 100644 nextion-ui/icons/804.png create mode 100644 nextion-ui/icons/air-quality.png create mode 100644 nextion-ui/icons/humidity.png create mode 100644 nextion-ui/icons/pressure.png create mode 100644 nextion-ui/icons/temperature.png create mode 100644 nextion-ui/img/ShowWeatherAndClock - AirQuality.png create mode 100644 nextion-ui/img/ShowWeatherAndClock - Blank.png create mode 100644 nextion-ui/img/ShowWeatherAndClock - Humidity.png create mode 100644 nextion-ui/img/ShowWeatherAndClock - Pressure.png create mode 100644 nextion-ui/img/ShowWeatherAndClock - Temp.png create mode 100644 nextion-ui/img/Welcome.png create mode 100644 nextion-ui/img/weather_cloud.png create mode 100644 printermonitor/Debug.cpp create mode 100644 printermonitor/Debug.h create mode 100644 printermonitor/Global.h delete mode 100644 printermonitor/KlipperPrintClient.cpp delete mode 100644 printermonitor/KlipperPrintClient.h create mode 100644 printermonitor/Macros.h create mode 100644 printermonitor/NextionDisplayClient.cpp create mode 100644 printermonitor/NextionDisplayClient.h create mode 100644 printermonitor/OledDisplayClient.cpp create mode 100644 printermonitor/OledDisplayClient.h create mode 100644 printermonitor/PrinterClientInterface.h create mode 100644 printermonitor/WebConstants.h create mode 100644 printermonitor/WebServer.cpp create mode 100644 printermonitor/WebServer.h diff --git a/nextion-ui/SegoeUi64BNum.zi b/nextion-ui/SegoeUi64BNum.zi new file mode 100644 index 0000000000000000000000000000000000000000..a37ce8be09ebe29179ed38d9dbab903c89ee41c6 GIT binary patch literal 2251 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%0A_2Ob34IpF0wdB&=lG=gK7lC?;uL0~W~k`UPip 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 z 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 X77RV6H+ZIJ5rE!t?Ba6IzU==3Nnyqy delta 6463 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 DV3vd@ diff --git a/nextion-ui/icons/211.png b/nextion-ui/icons/211.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5a3d68f17f1f9328e9e38b415df799a19d8e76 GIT binary patch literal 2344 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 Hu0mjfAPeh; literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/500d.png b/nextion-ui/icons/500d.png new file mode 100644 index 0000000000000000000000000000000000000000..10273ebf569ecfc3f0d31e6dc09478513de91d0f GIT binary patch literal 2587 zcmV+$3gq>PP)_EGD0wgfNwx1@sLpi*ujrJV4)QZHy)ryX8n`+nWmG&Laub~ac z-1-L=;AJ&}?I^WxyU~_~s;#beQ3C1CUbWo!BUP47or8(0jW1dJY_w1IKS^bMuea3`wYfD$lzfU>ptu1z17 z_FRBofD$lzfRYR2+(E!18TizePy$8|P_8UsJoVv=3*{0p#shLJFrKvvrSB%dM;^xF zX>}vE440e9WO552(}J-a-u6N;?uOS-{r-5l1b4Bls9x8@OU*NusXz(I0l625erwLO zjGFuwm~2Ook`RoIC5V-jm9_*E3AG8pSXo%4m7_MZS2dU({+R$Oc8 zW$3=j5T5cPAox_go^N=mqkgHt;$FRhNHb7dtL zFgI=>Txv_v39odtjQK_{J{sX$ymc}perJk=f2@2 zB4ZlJBGL^N#9$&wc%J%m#p?9r@uOfU{_ zt%I-L6;G=$5BmQ{{a)(#KZ@TgJJRmK?J#`a_zZ4_H&biqN?V+E80y5-z$PF`yP>#1s?Hc_MAH5&t!|=Le zeuYSZsF*bk)H<#UUQI#;!p8xOoySRMwIS>C@XxP|Kc6|8NdS;Geq%vTCOuD~d=BMk zv!NY-7f%VU)b`BB@+T#Oyp%0u%Y^YJv{y6>}4Rolqal zdS2Cwy62ywz^UvzOBux4Vn56&wa&391Vv7(>ph)T7HY>Y1vX~2iS~>0e9xYLo@1F> zhnIrYB$kOjtP)!xy4U6_EnsX?>uBj6g0n<{l&reZyx=o-*}F%*{K1mRPCYQ9UX#G5 zw9MT0HX29U*rv}dhNIoR70)h#A>cF6*&%H68{7Lmdm&Nb;=hcWX zE-nve%GoIw-^8B~ppwN1-s=B(GEa2qoA?ug(?x|~HjLVc)S-0}clBih5Uoa}lhE`K zcTKzvF2BHHo~s5{A|umYY69H?#xU+Fv&_k<$GIoc{^dRZ82v-ZSc$EDgTXrdVt}#zj*T zN)g0_I}O)5w2^YU%kB}N3K zAB4{u1F4I8-7?#B?c0AuWbMyFQl{lLjPIvf%GT9|t}$FEH*9yz?{B@rs2gFt83{;u z2eNg2uMB>J1tTS6+;q9=03^KYffyT*^^Q-;E+p%sr1K+q@Ggo`D7ioK3Y1n=ji+NY z92#At8HHz1T9??qascEJJme(>;V|_7)CWgdiDDrS!r($_L3u0jJrp3}8^)t(jlvY2 zkv))ySb;S44NGj`@-E}0x=@bd;{f?U_-q9xyvnryg9|_@K<)^i{RAfbNbg;Wb`irx zl&w?)4R88F`0Rb`Pv1VseHGC8{!k0)2e%WH8fEVsJ*kk4YQk{+7=3Xm#_l#)$#AV> zo63b#QshsV0vheUG+A!IW0c?902k-?gt{BFOX=b{Cs3_`jZ-)3l(j3xtb7K4(v5NG zvbBzuRuWLkTgDFefbUCUN209H$T0}p)H{Y-Vt9}8eC&~_>G_(c-a%z=S6;Y9v3p|> z*Oq;~#*_oC=J*nGmM{8=jX+KDXr|tz&Z$vP-#4K)?TV*Fj)x+@Ew!b7seHz&Fkc3I zOR5hSq2)a~1yVyPb$AjaCk5e$SYT8V+rnU3j0kcA<02*)MJ*&OWl%cA2&1Tld}b+c zz=Sv5#R{VnAT^X~=>AxsXu#O|KJ@+PSYdPqq=xdKq5KX`oJ-A2d>s0G9s7k$#`qCE z`K^4*3hapLsI6i$!Q^DjAJa*pUl8;F#2|otW-*r%Xm_^260u)w}37WW@sHJHva(`b%4RQ{5QOIviq-k|9423pGI*he$zAfm~;~ z!w-UWgdkW)2-XpTU>zY?M+ky-gkT-fYdl@0088cS+7J{L6oa-#7vzSVv63KzaF&5CrQ8!8$?^tRn>L z2tlxp5Ue8Y$)gY_~PdWz%S7|>FGZK1^{dN6Nv_fxnuwU002ovPDHLkV1iyczFYtR literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/500n.png b/nextion-ui/icons/500n.png new file mode 100644 index 0000000000000000000000000000000000000000..8e89be53851727fe90817be15c1945076216f0e7 GIT binary patch literal 2459 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 ZzyR<{fHM~o-$eib002ovPDHLkV1jn;jc5P> literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/501.png b/nextion-ui/icons/501.png new file mode 100644 index 0000000000000000000000000000000000000000..57234990e5c77443e37d6e421538733f13e3030f GIT binary patch literal 2188 zcmZ`*X*d)L7pAf=V@hKimr+PAQjskh48~5bY>^pT#+Yo`U2E3tpS2RB?4uc(EFoje zkY!}adU1`6br8`c_32N)zVCgWbKdiu^FHVNI?p+&)|SQsyyCoUY-|E>6GPh*uKZ=( zoF`taISKlUf?*E9w=rJ9q3(g6Y)}sj!c!WKcK7zQ^>p_L59s&QVPoS~h8sfd!e%y~ zZUxM02t9%i9cO8AYir!)C|69eg|6~e*gXj3NK?$#&b}MB%)49{YtCVJd4yf$>u{li z*eUWUX_n44FiJ-}hurD1xr8kCJQ@5OLdj3$Rw=9~*J{0>ko*-l%!G~0*9dH8J9Dx+f?%SkflwsI%%_QuhcSu-xPU^5Hjlr7C@r$o&kxNvU$D2t-tPe^eb z{G!o55UKoX^;K_+R#w*e9^D?W@mx4q&s^Z9%f5RCy@ZkLw%rmsUE`)*T{V7&7oDW?uGFJ1HKHMM?fmB%B^x-PEF#Jx#dA5b`Xs7H^6rw3U#A2XAzTiw&uL9S z6hk&6=ABdZPXV^}cP>&PgJDHnxUHOg)w**d31CTqW{FV*$4$R+x@*>-gWSl<25g-A z=@_=d+ieU5^5cm_DYESQoIT;K{3c6d8)EQ3S1D5&vU$vDLG3o?b%L)m@nXo&g!)-5 z&@bT|y>Ax#fZOfhQoj|wP*C+YG@cq8et8~WVm<4(lY2jsdQ6_7dM?K~TwT0ktlF(! zYjQxkdCZUQOH|7+)4KjSt=kPh;*~_&lwhTV3Zoh?@HV05;-_qM3d{*ZUa7>!p?Ega zX@$Yzo;+&_E7$DpKRb_Zm3>wT)ko{Fm{qdKVBZ_1nm-Fbds2K`K6qC^5G?(8E;i^I znNFxr`!~I8cI<^@D21~(U&4RQJyde+p57bOLK>zW-f;EMv4Ne{G1K{J8t|pMJ$THT z+N9^u8ra$p9mwD6hXy?lSn<+#iR%SM6IlD!&`ndt}3tg z)S@pjmAvB-^%MQ9FG@kh_E<4bs!iyJ(G6yplJnbnq+&BJQ0^i{Xj)9ADMP~T z&e@9ZO75!aDC(@$P5C^h0BOkQF5FF>TSZA%=M9;NVyDmrV8FuW*w zM4GH05$kvZHi}b8j#g26p~I>0ezcrV1>v&l|6rFR@%=fX>ND}$7E7~yVs8ToqT+8h zXkuQRSok_a(y>WH*M=#Jgcr7M*3u96my%KD8d|s}CZBVykd?{P;BNrP^^uU4M!_7k z&37K?%=nAfrv85Io4D!E=*hw-Jv'eed+A7Y8`{IG|)uzhlYEoLX-53L5I&>BGr z!JejPk<3M#!KXpmW`KxcELVQMwE0eNyg%a})T2>{;eqNL1qi5x5-Z2L_{~ zPr8onMsDNBJi@jewLdDic{T&yju;e9=-R9J5FSI?Tjn_;U&%u#FskyAv_c;>bKxkl z--sqpD+!3W%zH2%`{`MUOj1i+VQrRkcB#ihfP=k?bOG3Xv&e4ZEFDMNY=ksfu1tI= zXpUZOtD5{PxgmDNT7p1&k|2UbOR{A4Is8v{)x1Kt(qKL7Qq=`Ym_baYT6L-dRqWbJ z8^Achb#Wl{ib#=;BLtL*nVhN$+{IzyovvZ?@`V_gn2%x1+H^brN}cwx5*&M$*kp}g zL?;3Vj@XH;QFK%7IX9SE4{rCud#D{so~hH*O>pYaT=mH8%C=F7p><+zj3m>zewaOD zl;sIm0zIn_Jq@CmQC%e(g)OFZ(wiyNxQn9dJnP2?mv!Hvfm~uS} zYZawJ@_hDwrVH6xxN&M-27zV(T>1~u@scX%mu!(GvyLD%d@0Y46o_eK$Wb_!6<){p z_brq%-`)~|-p{xZmHqw+mwewH#1O+`6$7kJVe1kHs^fJazYhT$n+MPEc*{Mn&}R&? zM93T?Jcc)znWXt-oQ)8HoVzmF(pf*^}fY)N%vh51_~g9myO{p;GtpsN7^qDIH8uS;$g wpv4drEDb0FRX1h`~Uy| literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/502.png b/nextion-ui/icons/502.png new file mode 100644 index 0000000000000000000000000000000000000000..8deff2b6d68fb65e8fe527dcd47f1d5797c809a7 GIT binary patch literal 2244 zcmZ{lc{~%28^m5p{p+l$*&O0>R9ghX*dEq>;Crks}eX!P8cdy9cLF{<|fZN*?sb?E8^QmMb zc-BZPneEDNF7gQz&N3*_MX!MO2nN`CWK~-TLfavl zF8kEeKOIE%*MUKbrUcbXP;{oxWcI|Ij?3fe+5v0?$wt89%0yOk={W{n4LT^M2^3x8?m5LfFJ=vV9*%ZFq6E>deG#v^ z6sv6XFIW^AfuE-qdfm#tZgJtZ)$j4(2RQ*BNnTUyQ{Q?-%u}?e6wP|8*QvS|2I`uP zjGa`J zMk^_)@QvwbAdp+$!xew2U=Bh~Ve@?OUNfoV1G(M0?-sRSr&F-Oqm_ zJ%LXnrP!f-E;=RZn7XfYK?4Ol5Ip7$6w_#X$D)&0Q?@UMB;H0mI}R2*=iG~__g?2B z2^_zcA%C>G;0Aj|B!cdbIL5jVtznHO2g|LFKInpM;X5F5SmQzD)Mh+uM2G6Wc=AC6L-dXE)956fnHbV3)HV z{WNJ`!9e5mJhS^xsr2o*q1=H)zD*L)`Z3?aVlA_-uqgWll%v!6*WF)>-Wv(JDoHZB z$?TwS-4n3zVkTB|JWr@*e+I+P14!bC6waLjau}L;7y!lO06YPoL_}IWvdLF8h1cfHNV(lj~i z8utUuV0)Qh%(uvJwuYD|%~ln>74ucIv~_t&Uw@WAyI=S*#z)VLfOuDw7ZPk`JSH6W ze0r*v5d znQGj-z-*n12bs(J(WLUODR!tfnN(gaMHPe)Y^7zC`TJc4GU@DDIq#Fv5OV)I0THlC^K(I1saNZ+zr6DFo12K^`@ZQ2y*6=qGde*~aAJLmH? zz+b9t>)hzSd>>|#POhiw9QhyVIGsm_#(z&?L?n2UgFxXp z=y4^p{IaotOPlZl;gEkK8k MsUZqU(Z81PAC+AiZ2$lO literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/600d.png b/nextion-ui/icons/600d.png new file mode 100644 index 0000000000000000000000000000000000000000..37221b24bfb95f2d3e39f0af24539721e6b58701 GIT binary patch literal 2525 zcmZvec{CJ``o_mLb|(97tj$PFwlI?hBbgXuh{&$7W*Zty$=F8O#=d8XEcsfJT?k(z zOQ9@HmJvzTEQw0FzQ5l&_ndp~J?DMi=Q-y+?|J_HJj7y*xjDo*0002D$yF5Y)XV=7 z8}M|CHpl7zW5Gr@f-U{sgF{>hc!2&be^)%%#Mi|GkHfp%3JV; z_|T}Y&e4@(Dv9(~CW(}OdXg6*>g;IPLh@iz zcUafwL_-MJK1bNztt~5zn9 zq;tBhIKPzD+3`{?Wlmx!u~$0@+4dTDJ?HmZNX1z>>JfkHYPf+;mKlqKZT8Fs0cNCL z+!qB>OQv=jvkL+}(0`91^-r&55Mf<=W<2-J#MZ&CgTAiR#%js>#D+UUDeCb8WstIT z;l0o01)q~my`YHVo?uD&?XXJ=l`(e-oQrGeg-u#NKV)^=sKRXC2UOsLi<<>SzBs2Y zvHeXw6WddOW^c)t)qdU7Pqw331o96tH&q+k={61^$YyeuhYzYrp|`hJr5v$!t*Cde zCCgEW9}-4|>_NX@usQ@A(s|aPSI7DJhs846ze+2#tI6JK6>`KaR3)OaKNb3IH#g9M z5hk>#YbxtZn)Ca)PDN@mA~wroXFrZS70l^!JVO&cG4~CzKND6T>BD;1^X*X|#(X1} zC}{;_YGQ0X1Dy6*=%up-j1=n5Awfo}a4HlJG?_g=wYloz;jCviswdR zHonp5&@9gu1$$btF1JhX5O76eO3JJDF5p?fPBV=qM(e(A>*`_#VTQ-8<^VPBuT}Z^ zyw##Nn? zVm>aMvZ?AVcQlWN@)jz*OVktJ9Gyoz&KeBPN(so=406$$ik~wcWgqjDz>%Ld=8;K% z7a5+rWTYWz2%v_Rno3 zTPA$X0~L%)u1~;SnGr8ZLpc#vJnbHGE8u^L4lMs>(ujVT4*zn@Eh2bBqRno#C|yJ@ z=Cf|H`(2NK^92tNsd$BCxhWDV0DN=EV}&0rJXFzwlx@3@qXPXOmF))*M;lY~{e_Ww zr1(WU{x`Lzn8w(>IhItxqWz|USlpBOZiZAW7nV5LG%Em}xEKq;5(_1E{)wi>*PS8o zZB}-BF7Jj?+4JDmJ}l9(J4HXKR3Bi2{86N?msfc^!kVxWUN0&C{V$&GLy4=k!`S>y z&5v_EQARKkXz>ji=XWTaj>P>GCoW@*k`z;N7|)Bo{Z1aElz5_^i@9*zXTU~l@(g2 zSg6y)BWhAS-fqn~Lcoc8ESD(KB+o&Y**fP3aEnaLuP>%GcMr z^f1DIX7ctc6{{(~*DoK?ar`shmZNwjdLfjB?l~nt*Vk(Fq}ZL1dUN zm^m*+I{NihG_Y9eA?DipfMNjUQ+bm%} zV&hX?R&RBdOFO6Z%6G*+V`-ZT>h7~XBqT)D!LL9gTE+Usy-aa4tyn#I=2QAX8k~aA hX~DliDEg0}GoU7nIh({!9X{nXfQb{mYy`n#7yQEb4+X_WNYqtvbm2ib0jnO8EVdQ*9f5;C86BRqO7@( zr&7e6$)o6@Ay$c>{(JuTeP8eI@z3Y`eZ9WlKfX6E+L#>|ga`rvfa4bCIQ(I*`t3l0 z!zkIBg87}oO`O6B6yNYDuTUQVhD0Iyz%0mKem-~~FH%g%ppO9naMaoYhp~&E{!;pH z{dpP&MmRyb#tr|{vPGR*s(b_BQD&AHE+SApCL$e%s$4pd) zF3=JV46JNbTObYUOiP*rA$cVbX6Z>tFI8a}=73#9gL~1fFczWD-`-P>)fn2`=3EiM zW1rdFbsn_C(}|@mLN50}`m1B@3zoe{$OtNw$?)eia$u$w+m&Refd*n=Z~qK?RGc-Z z)R22bxN<=@CGt8fP1bY}qJBc-=4Yr(+(o7&BZMhNOoS{bvDBjct4!E-u1e`l z@vvkQ8B_nPvOkA^q7FW`N4&Lp{{nEBdt9by>}`ay%2N55hmgC;^q(?)OS^nyytW8#tAuNWORuay65?8jwXa z;YxJHf}ihlS@y;BJ(A?AQTY8}UXoX=C)*k8pQjkUI2yyNvULCgN4vbx`8^ zc5W^xCrMJOaxRV;)eowQLs+&eqwtpM9wg}nv<%EV3L8kXFH!mdpJk)do0>W~14{hu zhL#sIZ{zAeoTk7}t!00m&Eao2H8hw)um6JvXIo7PpsZ1FUONA;=) zlBKFvd-(Y2QxXG4u(o4&!K-|DnyW`_SjhM1G&LtzY#mMQKEjfAwcdDu~0)JAm zPP=ob;1lxh04^rT(D8BNjFRG;+cTGMH{kB(!K|5XhLdD{v1Ph3TP(=9-?`_uS5!(f z(0iEYph{LNUu-A20 zezlW5*nh`)zUj@oTYYoWWzV*|m~@41gMlygK;pwx6smyroj3`2|DU7}Eu( zBQ$nr^+YOKg}a88Lj|Xz5h65lI+YH?-VJ-;Lo&8z(MXolu^yi@E(*(=yO(DC2h z{XpIuuZ!PQ=}wIgLUTe3snpTKS_ z#yJY4eP}uj<_cWqTN>kVD7f#g9iJlnG5FN2E1%^4#Hz5F>j4|%ajGfY)8>gBs@khE zQ!1P~ug1RNJ=b?c6ABfTU;Db}xxa5q-+$UIuc$F6@Dpgr=SPm77w=u1&3KBV3kkPX zIt@T}^{hU^mXQU893T~HFi$LgaUUoWe;$+%dyTq~77L`lB2rZgh`OM`!16i< z&k6Nl_s?_JC5nMJpWKNxcg__X-xn$dCJn9DrNYcDmz9IrJ@+M&Hfqkr)4+r3EsMYQ zFQO>vK{__lK7@k&_*C4pGm0H+^)8aMZPE9zB`v8n^zbqhWm|0`(Q#4MoFhK z67LoAR|(3vP18lj7^V80&)}tWuI?V_)E&klEwhA;!?;!p6p&!;DwP`|{YM8Y$$GjUHP#$6s1FwfdTQf(2*e;oH z@izRbI+yeVFQ+?s(Bshc4&nG@Z8T*wKrcqV4>He~G$?zjx7N2Aqw?(^IHX3pB_}7g zSpp2e@$nsnnF9{N@E!sb0RTlvM|~bXROjuIcm^LH+ip*e9VUNGaM~*)c@@h>-{Oi> zO^`)d$tayVk@{Vurq~=p9m)-9Ec07xoC`RF%6AAz0Z{(R#_J+oq0@>z37MZ-?RLm+ zMktrhY3i=I3tvjx_3X?lo1ST%;0Dw?Z!pcex-ik7y{p-1BVP&Nw@Xt`P%DPn8otl) k(J6@k-yftPA$B0B1!xP|K-dfkyZ+vog^3OB3D%SPKh~Fg3jhEB literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/601.png b/nextion-ui/icons/601.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b0b6dff5e607c388df4b6644922499eea6e9b0 GIT binary patch literal 2268 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 literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/721n.png b/nextion-ui/icons/721n.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf976077dee1fcbc0b366635ca8000e125f3cf3 GIT binary patch literal 2195 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 literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/800n.png b/nextion-ui/icons/800n.png new file mode 100644 index 0000000000000000000000000000000000000000..79371f326777b65fe6fc8303517cf2a7194d84fa GIT binary patch literal 2241 zcmV;y2tN0TP)Dwrwl*GE?oPYE#wjRl8H|wk*qgECk*K zsM=DsZF`x6YBMYbt_3(ztyXQLTGPtV@1I~ra3RFGYU{Q?ORVXJ7dd)E^|Day%H)GC zc#V`mD#WQHZ}=ow7=jR@VUMK=+0P15z1*l)5AbzgkrG@Ib)w+<`ku6#yDLL4VI?zT`dVlowfS1dH+zdjt?TVeD#RwUMYTH#i zwd3pPnl5bUwY2j_tDMopwXhF6=a7AtHxi~Hh#d09B5(YR7!jlo?^qQNCrC)ETf~SU zy|5C#|1<-`@plN)xp&l_QM#A;n%NNq>8p^r5q|8W5+mD9!HXbQp`M!~IAnmuxhZ%^ zbKZ`$kQuUwAtlHxWJ^Q!2NkNBHwHi6(P9tGWZ-LLwNFMK@|}fu9D0bS>ppAF6pvYu z#?#e;kL;8fZv*%E9Kjc{hpdHO<-(JwjlfhNs3S*pE!$|N?6QP zBVRB3vJ>}^SCWu9qIW!T?D#%%$Vfe8Gu8@l%j?|=u9rMACJ$-0w07;Z`#>sd$q{>a z$;d+X8^L>T1F?yu(x$LUI9$&Hx#mfT3qPQL$4WMD9Rj=d19@b6A$u-(Z)j^Bcbw;UHY)fsB5)7 z>2g#wj2p5gf(-T18j>{P3Mqvx$d@sDNQ**iPPLtghYWR#g4uE_xwaZP1xhN9)(}39 zgvS&I>>;~`uVdi$k%a9j#Z7>M6s~9dH)P|Ouq_egJ0umRhwMrWTU;g8cE#gD!V~0F z@ZR7LjxtBMNK%U%WEHOOG-mG2MUZV$h*XCCat(< zJZK3I>Dx=b7k=!9u}K8!Q6*$F?kq3RA?kdb$g)JxhvMh`*uUr4%+oo>a zfiMMzKj0-V4v#gCg}ETdylnIZUh>(za@)G4F=+t{Hhy971~2LS#_c@uVE*?MHQFcf zRi<{DIT{+eB+g~_o>SkQ(p)HWdo5f4G-e2D5sCvShxU?%>;Xd`%CcPMd=nQBhgA(J z7QGncSUfDUKAu`cryYCsk}Y}9j~TB+J3fcx=F}~6$$bImVY~@InCWaxv)rAxM2 zy;6Vbc3VX7gtSoa>=m1zyjJEL&mMA-Vjg6Z198TpT%2nU`Q|i5V^x;MsF9kLy=P`- zX4A7$U!`oMC88WnoK4n4J{OF$MU+v9vB_fgtjBS744m7gNlo@+j~?$@s_*VLu0tAk zOx<8x2G5-jvvI@s6ym+~=mIJB&KFw_ymBkbZLaGnjaOXtv>#&h zAj&2;Z)v>Z0WpRv%9DYs#O*Y7G=Gg4Jr_EU4{DkwW}At_O<{~wj3CM+gy~`RIAggM zo#6WDk#%gL+=S+J>lQ{OdU^)eE2M)y6UY4K+S8FM6{>R6NvqZm8`JrdKt$+kq3xb+ z#_l_9?s*5^-Uz=MLZIe*mL5D|6!X$$BBInn(FyqwD^bo*cF=#{n@7rtg;zZ66VlV1 zf120XK-YgQe2g@LwDp$iMXzKYD-7Kim!C^BcCHru(KJa3^2}T6it&bo<_A0D6_24` zXqjpcm}Fgxvd&nD+FQT3Nh!c@k>I;P2#rImTRX~}gsEPx68D(e6MoVM2gLdVvJvE? zQ2x#cGnF~pTO-8iLvwb5d?ZdS$~Q%vPovfO;U_Id^W@ni$Xbw(DswH)*MW=kB*M>0 zo@k38e<{w&cuxH~9r1FGCNI>_9^a)ZLIi0i(3$a|Q%@p2ns#SA;ny4lh#=hwbyoa8 z^>-?cUO)3Oo$Gx&`}_N>4&#IX00000000000000000000006!CPk;dc9TM=;1{V1@ P00000NkvXXu0mjf*vu%Y literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/801d.png b/nextion-ui/icons/801d.png new file mode 100644 index 0000000000000000000000000000000000000000..5a18d1f49a1058065592e6c97e1f9c39a3d400d3 GIT binary patch literal 2449 zcmV;C32yd@P);u{M}aqhXx~x@7MQLP`~K|6;-~pqu(&URiMrYD9`W1fYBU= zQ$zPK28>}s=?o-A!-eNa$bn(u8Z{k!O&3N7^PFHL5bJ|})h=K%dWYhIw2VtH7h;TM?}i z@D(sJ%;UmXAL3W-;Hz2~bInjb-=M{)jN`~e7j5Z!JQ;zxq~nOrEsgLLp6QF?Nfj%#{2%mx&|3%p@waUIj<87z8Y7zsG4YL(JiQw6}P&OdP zU$;oo5yAn=3Ixe_@$Aqi$A)r;uAt#tn`Oj)Ok?g{2%#YZ^JOwA8aM*R*Qmr_^=5^> z$^Pq(=;n|uJyh2vwI7^hJJx)k(!^7G)_c#MLMIWxX7Vv0fkc!rxyiOL#uJxL& zhBIrliN?40!d~~Ln=2LLQuufF7U!LGEk?F6Ht4QEvbM~8#_Lkh>*JX{W8uuR>;z=? zYfC%niuRrGcRmIVo=MBZN~mc26zSPM zQKE96^B6(PlkYX~eKS1{CsXf!+T53>)4FbyrJGHWunYh~^E_sV?r)DR+GB(@+xvYd zIQO1BPY%dfqM=FT8G+bmf=}rRwy_5w`>p1>)%pr&;vZ+TKVNnU;~H3CvTQ z4*ne|d}&_QcaCQKW*L~Lw*9J@>*>(AaqgG2+)BC*)Ki-V8-^6m%$xVwv75s2b+%Cw z6uNg=ESSGF?F;gOo79qV;gt!{#TW(oc*a8GBJ4aONd%lSFFbA6Jk1e}SkMc{sN zj-}h7D~R7Ze6z#aasJ>c;Y{Ak{LWAeTu4CaIA<`LVKv6^=pge^wKs59OejnG{KLUr zvq=1$33!qA@(0F{;(1Xcp)wLLOCdkRpbTy+723=2FXqRk8Y0_B^0(9`0nbZ=C7{eh zuK%MKsk;DMpiCkOjW~vHh%rBVuH~cO3Qj=1H@SAWV2B0 zAvPGTpiFU0dVsWwdkKU^w@oc*6ry8)QL=N!A8CLw`?Y6xmxe|44wN<#?;Egkl8t|5 zD7lQ=p@BSGL`9Kzt@m$j@ovua4&u_IIhY^~{zir327pj4Dgz=4Fq{=_ zS5&WpF0MO3DZZxVV1KqX=0>LM>j{)z7FaR2fNl^e-;9h6!_zXfit$8IZax;@s8hbK z0&(W7qSQGv(q-?%Me5O#qT<5ALu71$7Wb=}&Z&*)oNPEX$X3sJ?76&sF&orNwDinq z!*NXZF(R98>D72O5%P(>M`WHrj(^_WHNy;_KIA+ZW)!9qud&o9875SXU%Q^1kuy0)oz|LeF@ z2!IrTv!IA+UT+g>F+WjbW!)Eq5ClOG1VIo4K@bE%5ClOG1VNAn{U^Wxx%9@rqfPO2 P00000NkvXXu0mjfp9+&l literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/801n.png b/nextion-ui/icons/801n.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f342fbd7bfa83f064b259f389b69b93017c987 GIT binary patch literal 2827 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 Y0*JDT44i)F#{cU?-8Mncb?u-19}=BG5dZ)H literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/802d.png b/nextion-ui/icons/802d.png new file mode 100644 index 0000000000000000000000000000000000000000..d28f9720d68cf79214919c83f5eca25d03b2a175 GIT binary patch literal 2289 zcmVqZcamyyB`<8 z0$5}jLI@#*5JCtcgb+dqA%qZGMmZ*Mr(qbHiC_Jc=lKH`%d%@s;8fMb?>%CwlddoU z0!V}a5&pbP=XXJ7JrY6-WgbfzlC--VAg+N$s>6wwndY)Dq*{l%c#x?GWueijql2 zN`uHqlMR%>2$aAGj6eyDK$!@XzzCGUh^#`{Mr4B;7{i9Ll{vbYY_JB#Frl;x<9Mx7 z!f-Fj@r|Eu!td|I^r2W>Z24Z+z!(;kR$vs)lmK>v9qlAc#SBmaqbE=r!zi8I4sIpx zzjOp8FnR)|5scEo-7v3=zW`9k)A@L()`hS3np1`o#{ z9T!_&t_dac))7a?#aGE_^eMM^IvgN3A?ElrM&FFM0|BxNu|FnLLL|#0gK-sdvRSe3 z%it!m=DP9l{>vDf?UWBrx>5MX~?%a<58k6s0JAAX0Q)T`5c|UVhIK$b=B2$%*FDgLJ z7ZJt!zfMBo!w9~SVEWWlt^m?KjB5#^kJDq7jF|V#Cr1vXjEbUvxXt|Et}0%ZcIjq( z9C+;k(%s0p%L18wxESR&OP`GmkoIA`%fj2lf2sF!ccZQQzX8bQU=+=B44ao~87*x< zId!1255X|kfx&2V1bviF5_vq4Tz>j_=0%Q>&!2OZ30vKSm4xzEcg9D~JQWJhJGHO* zCPOd7XsJ?ID=S2lhJ&fv;yr2ap;p|^z#?6bVBEUc3nSsYvryhyYvY*WUUD{j*%-hq zT`*qpUQKFAwu--}vIDV)CJU(@!)CBr;GPS^`aoNS-|Adk7ya6?y+Kqg7QX-5;Qs3g z*H_&wSwWSVLz~bK(3A^3bc#jwFLg6CHm7wEHGjX+%VRDK>Pt1hs3NzWE4u|3DX(q8=pZs4 zvmfP?50Ssm@3K=#6w&0`eEHIglol5Yv@$Q3dN$&pkg*Pom zkjA15!;SnqR;DQ1dt=bwY+^S~scD=(sV2mY-E~`~yO<5rX!a9{igxV3rRn}*j7k$m zrnc<*VXf0=CprS7>wcxG%9sqGvvUp@{c66qDL;G#GP9(Hy5xd{eDJjUEAg~k>(n~Y zG}ZI_XO~o7Qt^S=tUkYgR9B!Ep+9h+FY;>2J%M1C&5i*cO$8hvb zacmGZkZ5_Sv`|H;Ku&#=7+oVGBuWp+sm(x%SrHKu>2$A>0FoVq%j?zDFXnl^4;9F% zvo8hn*hI)VfP7N;ZUqy|NUq?SYX5!6K&s@n-h#$rQV9mf(BHmv*4l;Zqg^tq#uXoS z10J*cr%Y=1pPy0yliD}ujf>DqU@Rx+Jq zfCPF%FzLB~7@Ytqp*)Ts0p$l6 znN1=9yb1l}SEu{3N8@Z{wA{ms)2R4P1b`T-&gFCckQ{}-&!}u+6GRaWKggPpQ7E7L z2W4IBzcaSV>gt%C$~J$D3B<*KyZ}=~N&)9v;G6`ZDAoKpLijo62hDxC5xHnoq>Nr= zKV~Xy&szB21RpN`{Z;<=fdd2(LI@#*5JCtcgb+dqA%u{7{VTu#{fAcR5&AO)00000 LNkvXXu0mjfD)c(p literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/802n.png b/nextion-ui/icons/802n.png new file mode 100644 index 0000000000000000000000000000000000000000..647088be25ee5b077e3b9b74fd0cf5c782bc303b GIT binary patch literal 2303 zcmaJ@`8yMi16GZOF_Da+P01~zoJ%(MHCMUG%usHYvov$d@Nr)$Qi8q-XudpZ+C~hAh7gqIo1-?`=fA()ziKMx!yMk$r3+f=6OUc?xESyg_Zg`t;i0n@+8^@W(&3w8jTn_NP?$M2r1+Uneh zP=EcJC^6tS2C4%MgiiRKPmCu-!4TT@5VB6;X7=Q2z~+f{)lQQ9Dtut`N>mmqLx%+6 z+2_0XnZLZC{FkO^SRC`1xclmsJ0bt*rw_d!fZp2|(VKFs@$NbdX^;Qzq7aJC69cQ* zEEa}#ik)2ESWqucZoYW$ch$KI-6Tv|xM2&(cU|4~3VQZB>v{?d?C8r57M4m1a`40H z9juZdaHG$uwUEYJ_AD3v2VhcM*rweycGsGg8#Hrrya1k(R$Un4f%c@!m>q)ND1S zmzz{f*AnMIM28^9t}V3iEvLo`51n1eGs#pAx@5t&i^*4NPqk>eY9z>yT zT$c7kt^e?HbCG?9>Ef>cle7-BGs6FPeK=*kgt9NEyx3!6mgMtZX__K^ z>rTp2?+@x^yvWpIfmM>}D{+>EtbrDRLEVyDLCb&Zxk@z~D}0&4dQNfuz7yfbfr^am zU$7{`N)F?Anc1VI=Tbgownz3@%MLIi^~viG_eW0jE3kG3637Yvqe*fhRykP3q8jX< z4-68^0amMpeff_0WMR zSa{G{IRZM?ixp%!4zqov@*P=T2Zm^PA&v-YGZfp_sUXTm`16&Ht={S69ab1Z2w^Mk z>M8U2$P|3Sx1b?e4o`Pvb~gKP4o&ub5$S7vmq``J4Ob{zY437n>C2L4P1e6&Ix9IN z;V3txNs=y4ThQ1czfGF3$%d}_I4e}#SQ|zk z+pylC{mhj@k*a(r&MMvXCjP)~CvZ>=|FUd5QQdV(`|jJi_aWPv zT0ghX3EX-<{IxV^(m)zXlf>uprPao!?V%K{zRBvGUooAJ~D`Y zvR}IPUf+eWa5D`{>=yZH_=vgedP+NuF8VGwZ_>3s(>ps&PVj`m8YulAS_+ghV2?_5 z@7l(J;3=+&Uq6e%4I*@_5H2mgaLq{Cxo6mbth+h^_O-H3k_`{FB#6m$#fFJ6+%;?k zt8%zg(4*Av-MWb8pdLZ9+I%5FX6`EgJZmPgE4X?x`b~?R-OVY3Y?*)# zmfssv0(GBXGlyEy>lEAOeaR-e6W?^}b>v&;x9`}>W$w0tE5?2DUh@d``BP)e%G!8# z#Zqc-_!oC^3*GTq)<_|kn28Q4qyq!>*p=7GOtF-A%~)cwxLkL0_foX70#peu27 z1*9RCMkjvh4;ci_arvKeh}gw6%y>82sEs}gtGe0wYNGYk(=qL(f1N=qRN<&tGV^g8 zQ-VnTK==^B7Fz(lYVnvkH7*~otiM$mx07*1yNJzc$jm_LMn@3jamDvd+&*YtSG;VNx)n%Qhvm z4aby(rTYnvTc)CQYR9D-_Ezvg?vo0z(ck*sY1drE|LZCI$#fXUQoU@IB2Z-MoB;4| N*;pT=*MN2-{U1D%Fq8lQ literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/803.png b/nextion-ui/icons/803.png new file mode 100644 index 0000000000000000000000000000000000000000..ea621b9bfc9186f7c7865b2a48c27492dc1bfcbd GIT binary patch literal 2023 zcmV z>mpbj!O9u15iA=4brIl;04@UL2*43wM<6ob)aSv=?k)E8Jkaa=s#JKZv_ka!>X~lM z^o<00000000000000000000000000000000000007V#5=>yv@p#PYkIejYQXlDs zQ=iQt?2;roU_AusE55w`kmGkFzKQ20OC!=J`MVbB4l5(bkG$WsK0X;C#^zu|`dA<9 zTANQD%65oxQXf@> zsCH@cm1*F6okhxlZV7nWkc-4LTR_N?teTA(~Cp0ed)Ty-g-Y=WRIW6J(T)14kynQk0W zwyX=QJklXq4{VTo+JJeM0UN`$+gkSU!F0973MGYU1lPg+yvMzTYwmJ}qWrrlQXapy z&C<~}j3+%j!5%RN7v&apU9YR257164>~x(J&!7XC$bnAPhs?t@jl7{7ik=o*qBJ|> zP92{16uUVEfH{i$*s$6_hWEAKZKr*sv%zZb8?>O?@wVX>FWHPS>8itY-MqmGWXJ-m zU9_b(KS{*xX~aDi3mSDVu-g9($hfDu0H?xYKN@d_cWm5ClC5wIW*9rh83qyD7^7u$ zE!g%%8%n8Y#)A*Y%pOxFy0kn!Z9})+20?yOoclL2Q=_rjE!~R!z?)zueg>oQNh;%p zjio8Tv_@V|-S$DzZBLqh`_*)pt(i{$5At&6F;bg^e}EeDiZXbjS!c| zu&|!kzg@;nQSB$-9 zAPd`@4{WTLl=ynfvB!^-l+E6xaALx~(%rFTA?YQbaxG&=G0GQ<=eow&;Rzje>fxRk zQ93!Q#6gUbf{7XRK97Ff6Q*SUm2er5(d+Cg`MfosS;ViDy>lL-3DPV(EdoEWWqrKJ z-}TLx$maTS!07wNPB&+QZA_Hc&SR~b-i8A{_M|3F6ly2kBJ>T;0_3X}EVt~eIG3#v zWq_Rz7I;I18KhXM=gtQkJYp|}nL8Ge^{Y1GSzvum)Ac(L^6-`$*DqZ-J^?vRHW*>L z4(DdtFUlRoNI~^scHxzSRx-_(Y!M?wjx{#67cUSaIEZrU(5vP)7v2ZIC=5lEv!Gtm z!8;O7!_OL81#@Uh@5nqwxReswdwWTTF#zL6h^Hl`t7R1+d?d<^v!0aoUnn*YHiFdT zvfoMpo@R_|X7@fYVHQ5Z%xx_#Pft(5%}J1&GHicgZit|jPv`Eniuz(4hTL`UHCdan zvLqe_LqUse8O8rf0ZNyxN#B&%7nEqqC{9F>ndQklQ?nXC8{F8Ej}-w83--YkTT%Wt zR*WB6un(@-Ij$I*gm;EAww0%cCVJ!`4 zQO>t5H6Bu!Vq#G8S#j>}q+;783@hvlN)KtfghBQ^dQ1D1wjPph8x&%cxFfSXeSI!S z%`|g%W`!8t_2apcDHH&qy<_HFD8MZIw_P2U;w8a?uZnZmzfyD&tt2lDZtNJOBwvs+ zYJebhCBe7vU1%P)nm!CcjN08hiuW#-DvOs>UmRSAeQ&wPk1ne9l0@C$x)VcTdvR^y z`z@kGjL~-Va@;rxQ6k28CBYr4=^u?}WlTA&^p1-d7cO6x9^H2Rtb%XY4Q&+T{OHEk z_X%)iMHk*nA!f>g_F=O!o*TGVY{3koAKRAes6@0$Ly{UD^Cr~Lf@FL zC{G@9$^M9)5aKjYn+r?Z?@hF#tUp2pEHcBW9KEjTk$lB*;_9Khn*2gW+*si}6AGpAy$^GZB*{I0;nX=b_l0 zve>=9AkW4gvJ#QEGjJMa-T7=i=v9tSf{^<7qyF<7Z83PS_@&mupT7HGCZX=gcuVQR zDJC#1WSsadRE8u8eRn3u_;o}rpdob6UqaWOPh#Dz5vHumEoi%5b6r;IUgjW`i#JK32oS*l5tu|?RJATNmYRIZINXY*si z1N#vH000000000000000000000000000000T$g_Z7y#W#v@I}OOLzbP002ovPDHLk FV1iF@xu5_5 literal 0 HcmV?d00001 diff --git a/nextion-ui/icons/804.png b/nextion-ui/icons/804.png new file mode 100644 index 0000000000000000000000000000000000000000..4297951c750ae2ff1660e35e0e794bf9d7321c71 GIT binary patch literal 2729 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 Kb6Mw<&;$TX{2fF9 literal 0 HcmV?d00001 diff --git a/nextion-ui/img/ShowWeatherAndClock - Humidity.png b/nextion-ui/img/ShowWeatherAndClock - Humidity.png new file mode 100644 index 0000000000000000000000000000000000000000..fffcc560401cf4f69b5fc2c9c64ed74ce1dd06eb GIT binary patch literal 956 zcmV;t14I0YP)+2C07iSi1e}7-D z;^yW?7lbYVramhx3x$P+aCCGu3-tQ>iqX+g`RKU{T>!qmzG!Z4hQGhR#Zw+1AIsGo z9UW=Tf-ZoHiV9?8WWdJ8#$tfa&rd8YETFfy_s;_)BqYckv+b1ZRA$y5Pi zV`EWMQv(kV51gK!!pFx)^;BGNeSM9-zCNt2tr-Wfv$K<)PfAL{;^HDkMn+9?2>gvMdA>v?*%8I54o)zt_I2~lIf?Ch*ug*8*m0E1F`dwP1Xva(|4gB?Nr4-E}f zgg84plOom)zf-*5Np*ZEdyu8rV)P&&RV6$LLOG{{LYcmEA9UU!wOaY=Es7Y&JU?4cK zezxfQ`@75!>VfVeIa9E-oxOK2o=#L}0T-pFrlP2*2+q#VI6ptf zkHamvnny)23TArSs1cYB9|KbjB1%Mn-}Yk_zbJ;vzBb?(T4Scqn(iv$G@V*J`=|v^v$Z e?mxg^&%h4}{E0Aj>oI=-0000EG$TDD4CKX zlnonUVaSjyq?BSSk|A>lncbeZj@*0ybI$J$-OYVB=bX;>z5nwL&-1>&Myu7n;~$zv z4FD4p6ZrV};O*@VXJ==4etuSjY-VN#cXxM~o15eC@DQ)BuSP>t1;E+a8I6sNxWB(g zcXu}q4h|F@dwYAMq@)D=tgEZT#l^*+0l=sR1_p3@dyD$|dhG1%C_47@^Fu>J1NfPp zosE-|lm7sIJp*h!OG`^};O6Fro}QjBl^{PqAE&3Ma{ux1Q5smu6r0e_&JHatEeHw< z`tA-Ls_lW#7k77eQC(e)o12@TFen0Wa&nR`4h|0fh~W76Sh~8iv(q38N=r+H1)iRs zu(Gm}`&(OEXliQ0<>jS106gXI?~lB^JcNaX;pyoK6B84dpP!e9^S6?b|GvJyh>3|o zdV0E)aD9DU7__~;t-b`hlQuRsC@U*NTwEMpUS2RXG=#CSF@uejnwpBj!a@%Hq%oK&on5hClCroKhH@%F0TFhK33?`}+EXf&`|N^ax9{w6rAbpg!m`y#P2=IE*MTk174ja*ru$>BW|UvPZn2S$j*blK0I5hN)D0?Q^T4PS e8*}ix|9=CQKTkiK&>kHC0000u(!8IVPPRsQc|$Fxrwo{F}%IKAtxsXQBhG?US39j ze?M++ZX^)CzP_lar~p?bJ2^Q)Pfri__xB+I@b>mbO-&8L!^4rAn~Q^k1928ZF+M(y zy}doOx3}Zy=ty!0_m-5DfUA<7o}OZGa1e)whf)APKR?vf)gdG#1W8Frdgsi{%;5a| z94##^g5J<9EiK{f>Ws1yPUkei#^mxPGr{POZ*ULj)q3knKE9w-?fF*-Ub!YN6@ z!UJrfjg5`qB*e>?mX;LHiH(gFG34u8TU$kCm}&yR-`^kg_4Nn}3Ia<{uGi~cz~N+a za#H-Rt*uQADKtuPSy`FvK*Gcu8XA(9VqE~;DahEXi~(>GVkik>XapD;8IcEYadAOI zLxTtb$E}r>6-AFmM@Ng78-{?{&m57f0#?iI?X4tVv{k?^mYSN1wY4>I`2GF8ECl74 zr5YC(CkE86uCAXaA#Vx`3lj;&I;O}>O-lJF$ruvlUNIPYap;>B}`FM*kZU#MRYR%=!FGWn>Gb kew))2{~eq2B4cNL0FA0lKh@?=8UO$Q07*qoM6N<$g26TCl>h($ literal 0 HcmV?d00001 diff --git a/nextion-ui/img/Welcome.png b/nextion-ui/img/Welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce3fe527d885be3198883bc4744c804ff1e067c GIT binary patch literal 15694 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 literal 0 HcmV?d00001 diff --git a/nextion-ui/img/weather_cloud.png b/nextion-ui/img/weather_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..70f4dfffe19e1cd50d5ec3adb78215dfeca7559d GIT binary patch literal 4715 zcmV-x5|r(UP)Y091J$3In zbB5)1_pQIazPGA+x?4T@p65YK6tF}AB|uuz6B0(Q0_q9Lkb;6m3aBUEm6B~ye>fkC z0O>peb_t-yNQShlM;wnvjaefl+i?c0YQ7pRKw8xyt_LGPx=w&)?N@(TEhXEsK5;r6 z0n+L2x3BR6q@J5sWpCcv`B3y_v|i0k2~k&+=@XTYlVtC6duWLwoEjt8Sg z2#}5=U{~`6NW1#O`DoPel~S^ur@$fs1W1cILqY)rNTI+g1=KJp*;aLk>%pjDD`X7m zIs`VgUp+2B+SDJ;$09&FkAPhQsK=H|$+oLY+>SYk$U-UEg)va>GN61h;F9x!D=+px$=KebKBNav0DF)5 z-(m$75Fk%$!pv8>1W>7j4`SH%)ptP7QU9~^@R^Jn_Hk|Bzxuty88QZ8R@pP9I9(ma z(!P10|8cp*tKYxnUdd)AtX3MRd_}tOJNI#8U^08UW=;V~2%BD?{%oiV8ONPlPG?Qs zZKCd{`Zes5-O$>!wbj>^f;kZpm0KrYznFC}HF zslFKqTlz7uCMPo|KN$xkvtp-e@fWQ#1yPpqS2kr{wp4un=xYX`IClHGc~QSizLAX%axt_ze(@@h)F4m)nN$=r0sqJh6$O!~H`tL_l*U^mi+T#9| zpeiX|1KocDn6)kXC0zBMAKj8&y$o38hVK(^WZgKqd<#GYB){>Kt8(ir$Z4Hm?XYNOHyC z<&FL@Bub`w&Wp|%vc^?FyCljq%kqqE{tP(^##uVs%kLn@c0RM#Um1vsMFvQA%J1q1 zD`o5$f=D2vXe}xNEh+?yJZey?9udfp98W#gG#HG`4wE+elb0wPmy7PN5nO|(*G8i< zs2*?FU$P%*6s&A*_zak_HOd&C9Xn6V?)8FcvEv{xd4v60SP$e~Re^@(&4qk>7qEDj z`F6H%K`7hZ4BS}KJkq(@!0Nr`+ZE*&s=LJ*l4Yt#J##sxZv~hgGuhhT4Ai{JyoFD! zvU`%Fy3e(y+8DU(0yEL4Z^?WZV~XTLd9|57`~C$yxzcQ#qV!h3vlPgmR|Ohf zYbFIt^rDZZU{TrL1^8P;nmTK3Gm83@&P}*Rvl1o8jR@%Ap zpnm&T`$~4tEa1A!_0eJ(8nZ&*Khr!3r){xM3G0C5?D2ux`awp~A0w`uMk$G`Fz%@28pydtzN7wdz2~2ob z*Sl!^)WdV^DcQBI20B*LZ#c`&)Xn<-E_e=T0+hZ)zop}uCBM}758Kl!AWg(%sUEUe zN_BofIQH&kP`bAt09a*gG4+ro8InTwHW2dF%>Xl`SV09?WojF&PYzye&x~6=G~14n zoh#xsdUzc@1q@lF=j);uXWb)O0vE)2er0}5R_+1jY_~%x^`HenQoylo^aUBW8u-|v zagToFMdx{YC7@L$z2lww7U(-)&o^u@D}Zc#9q`Ma>NS~s~m+F>gAi3r^s+FD) zEG>QJ>G_J6zn&X4ZPN}UCo=a{*TZMU9$@wddcNZ2E6}GQaJ}Yb*yq=#zig`qUQ2Ju zeyA>RQz<=sMl1#P{Zr3ZynF?C!gs2nr^bqpf!EV~!lxa`ad+u0PaHi73|y!utazPK zfRmf?cj+ne`9Fb?OZ9xi@={&Xm?1fl8PZIzY0E7*d-Wo<&#P}kpu$h|;_CTEdar(| zuCvltvg?%9FDHLm1$_L4o~Yt=wgRoI0Ie(QsgiD;)%`^bB(vhrO8Y+m;Gc_Ms3%m{ z*Yy0vtDpkRj{O?xDRbl`z|zf=fA<&upNrCp1V~O=_#ue8m$UMUKw)_1iUn8TrF(*H zOF*eV*M9jOwyFDPhEuYOT?o`I3pA+^48pt(U%nf7ZCltjxt*fiiX zXwD_|A6FJlxd`6f_HTLX^}w%hPHmh7lhrGg8B_gcM)D<_W5eInO1?D5ldH?j)C%e1 z-Z-&&q)9j}XDMg4WY$d9k^+)hu}dv~vJ#ekb{rV?c369NYrm7*hTGn?Il#;$%ed+s zFhg?5=FwZj%Zf4S-pc`Aj=)2b!tLtR?EUc;z*U!~W?%94!UQt;{ou<*s`GU7l3ll) zpBan7W^VDvC}PPgz+qLrB%jKw6UC`-d?w`7G6!n zalw}tDp*szd=Qo!P#Ozam8T95d0EcF& z7;{cuuMefVPXkDn=ytaR7mj0!cXNPcy8xDCvFIp3INRI^WFBhX zPJXGE>;mTRkZc$o1PhNe6<`isiE*$v(x`eg()%uLfqrITfNcnWO;c932cEI7=AG&sjjW|I3+@&Ft8%uD(Qbw*&l$i2^YNm?f(jywGXX zlC!g<$_wPUpX+DGe;fk_y(JwX3Y@I~mxM;O*5~M>L;jF2X8#A0V}Rb8w@Py3fp5wr zMqn&lfn-=x?OyRqHeu9FwTu4-Oxq;gAqvD-U{G_Q(iM6N<>e_CNM0IzN%QCJC%*xD z{ncLt7ZU~IDR9FTz~JV3`jDvyPTx1B+P>m>^{)jU)SS$a=Bbh$^^|tpi$LmT$q}5~ z90F9^DW2D@9?(GZMVCG107w4gxYE*mEd@9P?4$Y4%G^Y^5m3LL;(3$W0T*igqUUdi zfDv*BpjKyyldr&2ck9i#KRpHvSOBO;=X>6mJM`q6_#UwO?|Q!CB??f1jx~Umns0;X zG6PW0t?|5vvh>93J{$N_%C(+Y;+3la$B;vB(-UL(VnEH_=6QGDlz0QC)c%&d%Or8M z;$f2lvpVZVGv@<9?L6ptIy0en_5du|VxoYl0?d#)j4j#;s85c1-ZhscKEz)(0Ng-K z6fjlb-kLxwjVJi-JP0Vy)4L6J*dlM~aC8rV6lJ zKi*PrEA0&VtI2vh6faRAzXFv?h5+O*1xO(+paPWz$bibpW}zq$4v>>ViB)#$fC9Nd zYQA7qdkoocu1sniU?-F&63Ahx2J*3m0H@_*qJXIat*QW>H6C#L$x%S%9Pzxe#S$Ol znbp85c{N93p~Rzr0{7ek{7T~u5Fc`3Jo|v>RVkTR#kaD7Deout6Aw`!zXHQ<2Xq)? z!cz-&cwXzOiA7{O?K?NIpLmD@`4yOYpWg3nU)u_(r&f7hcg-gbba+MXr4iiB6u71s zF!mRE+YEUVP`&4Pp6&)uza!&FJ!!=&raGAiKQqt0 zse8I)Nga`0_F(zSd!U5I zjEKJ32mBq0i30f*7=JfVuDG5qIY)qAbI$mxyg;_C2JoY6lhy(YvUR=1&jkg#)bZc^ zrE3#b0W8@uQ>~vnbCVY*HQ9)y=Xbq3kkEX5Fsi$X|?&Zlj;fsMq+FXJ<$LTLB>XkIa&~V@djR9KcK| z3+8TO83aboLC8#gQ>~sYcwctaD}m8>nu$v&2h0;F%~XrNciG~8X1qvqm=|kt_t$|> zj%Wf&w?Vf7wKdlzW4q;;VC3S$4-|drr3LvFVB#VtrZCRm4!pFsa6MJaLNX*>Il+1Q z9<$QT?f&z%f3W3o-eo7j-5aAi2@475xB$7z3EG31EsAi?#x+n0MY3EGx!Z z&IFaHa;n?Tks)I{B9Kih1{aiL%jp{dW=)xi2iGwjTgE`-Vz=p7F>kytz6Z?HNKERs zr}dtGmJ6lf`?K>4$c#xSd6s1FPlvp6OkD+Pm-ByYlWd>!c*{QWhi^KjT4(~vo%Klp zl(C=)=Z^jUjGW(xPxveMVnwe2*PKgS?2ijMZwN9zj2AUw9IFW<_hAHNs-ZlW^n_F_ z90g(khO_rGdo_hI7s%#M>6Prf!FQ+$bf^(_b7cQfR^ZRe{Zegefq>*eIJW4PmE1tr zG+6PsUjYuqhA;GoVL>b~kUSVu|Ik)I`OAYGTDHkF1qk7=w~|{)QOzcpm+bsPc4P_H zc!qSQb%3eA zoOR3lR|2lRTmTKTW0TqU-Y)@`?zEE}W9BD+seDFWSqPQ&+KY{0JUP zGGR=or5(t0HeQZxp8^7;eSP9|M5^)F^pP(XkbD6CRIHIfWzRfo79jB4~} zDcP<=U{m{5LjlsJ{%}4P0n&K{>=HmV{F9VyySl{fXjB6M(rp4PYrOzzS%6fCmGVN9&tPx0n%{* tY-_%%`-F@kZR-@5;}IZT?tKf}{y*F`JhPN+yK8VKL0@O@BX_@d z&w1yL_kRD~HR#dZtE*So`w0 z#dwT3pk2>sc+=6YgGfH|*hP~{yF`emkdv!CwHNGC>FnTDYBa*?O?OpG9~kIbtH;v4 z=21oM-O3bXJDT@9@z)hj$S%6sN%_u^-nae`;sh$=G(#zDSAc%Oe^`$ck zkA=;`zRl!$L(agEg~0WrS5I` zIR20mOk#Yq2|5dhv(%irmHooRMd1FqndMVcW(fXL`o zvFlD^OC)QTES1}*aHfbaWBIC|jRMJ${3*sgjY!#rN?)fWMReRyWnf)#9fJs#@OZ;)5-g)wN{rGCl9pmKS?FPyBtk+;> z>D;CdS0T`fu#cJrxqJ6znW`}K8wJwdVp{&-R1$Xc~q0zK_$ z=^H!BZ`3)cFR|6Ph8wCG6uv0qsDI|1Zn^ZM-{wvksMD7de;yVkN358H-MJbCy?R_7 zTw(EM6``v^r0a-E?QK8JW@tP~cC`@A&En#5A`jgAo=X$$?o5YG4@X>n)3h_nBfMVy zAEy3OvOdW_+D47n*jsX!cDL@|$*<44PrXA#nNloz$H*052!}H6tBGZR<}%g3e)VRZ ze@&_b?6yYwlWZj*ahk|}DEiuC3W}46Ba6j{S|O;`-Kd7B=q^8HRlO=dD3kA1^_BL7 z+fS=xi}TGKTbQUP>_?Fi&w(G*K5^zjL+2utBX1W*+zQjnTxTRdJV71AJw6kM`wQ+4 zNoAtk3(|PhMbID_LBn67XXB_%xKAAZNWSYA8Mz?!A)q-3Knu#Dh1to&(Ee0fuM3#5 z=Xz8fAb8Ita9pgaOZim)totB^y3HW{!`96xlD%4?}a&536k@;lUMF zi1RIGs#%+4yFtB!IxKzgs9Na%WWH9qeWtg(+ zV^{B%L{)DwI@h7mCr00f`+RkjrO#i7O@9+wfQlm@01i)byJiy3qx9X76k;&BLx=Vf zD2XV5Dd0;-oe7qo5HcKYw(-zmxfG`j`AJav?F^l%=(3=>j%r9^j)W~5CR|yQ5hrR8T z$f%m~xfAO;Jq#$Sl5Lb*phsLadL+0BV=<7O*heBfsmrFMd1BQM>cyYu>2r1%^$;jD|Sk8+9tpqgWvu6l0P1mT;rgD`DAm^*xj z=VQp1zK{DAlRQYc%v0faTn$YQ`vHXz_q|7|8F%=e z#AEUxOR1?DZ%sC~7!euyb;6uh&k82_gxxn8 zT{vC$FkAv0m1<7PYXLC_YlZ0bvZwG<7ByyF#;)Cl7LSsk5)js2iT z;G~Z$qKO)wqa>A>rxv@31Vv=2*a=H%}`cyX6H4< zdpvM)u!=HMw>2T8J(8BU$ev1`vRP*;HI=O1wgCvs(+6%%`9~+B$Oy8cZRfVv#wxSH zX~vkxuOEC6yDz^8`L2nuMKFj;?z}X{>|+};*Yc_kh<*si#aQqOHH2TW>$JYMm;^th zX7}*GgI!qdU3f*F&s+@|$RAhaqRj}#V1h1oE^__F6LIg}LN627h6<4yITThyl*YzYq z_ux9?5xoaX#NCE0Lstga%X|ktdyq;_Dr&}vriG&2qy=W4^ZKNXxL!pNnyrpo5Vw`u zk1;{J_l|MCF2iCWf)N$?F+sfbqgjs3^VMJ@6yIUQ5v&mkK7}unvEzPi$?}NRc77`i zlV9f;I}bEXFB<$wegVi0Hrsuod)h86Ut}+Al^Dogr5l1v1!V}1BUk@y33wWsR$hT6|Fi9ba;Sif!cxJq?|VzLP+s7~~xHicjAVUV}_=XIpUD zmEn~HC~LHAKbn+sqJ$AmIdn?qRS4@R*3=cPDW22Skp^jSTHFJIMxV;tb8VC$yys8_ z^WiLZ5c|Ga&>U-c!d&$GBF<=jyudf85NUq0gcdHEOo7{R`o2tP;#4Y4R9% zvRZ!DzbhPLfWsgeoXOR+vr_~+fchmGfN-g9I5CMavG{S@rpg}?Xe&IpRDM@RJv&bpSutC@n&>ZLnWc9MQ6B6}u0)lM8Zj@$VOKS&V>a%Yh z)Rfld!qhrEO6*Ebl3*)qSsxd$hL5r)$j27MZ%!>Lf-K}E;AQXhTMi{ehJ&ksmoW7o z>`DOg`S)oyYRW&FxY-I*i~puwl)6f)l#-4vU`ifVUKS7sH$No@EBhY@Gv)6$wm<$@ z*x3dC_@n&WK`nwzDdb{qA)qcL^S7}e--M~H+}xZ5*w{QhJy|`uSRGv~**N(5`PtYx z**G~_AT3y2y&c?uUMvo-G`~gsDMJeE3UaY_`b`Kaf6D}#Il8+EQ&U5Jr~Lbc*gO40 zxP$B8C?m+xp3MvB#0Hr$+kb6r4*Ex1CwCXSKc-<0VguWO?ZFOiu8{T|e`ycVnUc~! zy8O4|?d|{4!_`gN12V(EUG0C{!&MVPb=lOxu8!_5Ah5ItWMrB@CJ7l$K+**abaQmk zbab>6ruG84K`88Be*;Sa-N3@soa~(JEF7FH>;O#;b^$IP0S?Huax$@VKvv@)9h4l+ ztu4I&+JS>ZlY?7;n_Yl|ot1;1_y6AGZy+(~QRgXvPlYqsIShUH_}D z|B(j%M~(m2y8eGt7xF(D9@qgw>pUU+?Vo#HhDuRt+1176FbGgkbp%jQY7m|XbaC@^ zbg^ZFyqh@!UCde7xd9fO=G@#Ye8AsGnui<2V#dx6gzyC*FE^h#2+YOJ!)ECMbh5Gr zx&Hlwq@#ly1eUP^EkUEY2CkU^+-D|o^4m8}l$dF)bk<8Jic1z-Zueh*93x`#l0>&k za1U8LuHOm5WGNiI{_)gDC`Xz->^b)9lkI-tjC~QY<@`m7-yy%Ca{K2)2?f+A_mlMU zl-{g~*BTN8>0gjreSzvV)TpbvUd<$z?4DfXIA6x4aQmfML*hXv>cpGJ#)7MKPpneD z6ZJAI>k)MCiC5*0i!hjq9n)>2~fkT#fL!T(v+a^@X#2BUbJXCa)^>wIoRr z)tHo`Qp+gqRg6zT*M*`F3-1WsI}l2T}A!U-7)A zsx#mf^;F?>p}Q;#DjSjsHJ}M)me$FnaV`?LYG)kjUPQxjG+f$3^YG}G{n<0{Q~khu zmUL(e@J(E(J+};RgnV7O?AO-VbvtK7qLJEiwsQN>uLZ>0&PqXaLzUCEU7!9o?u+2$ zUqbTK_~APb0rMe_F`XKG#?xyj5luB^wlK3vUHDz&?CIoR`68)OnaMQ}sYTPwP9!L2 zJ+k^=hr3c=g(m#^Mf*q_XVsT*)&@Og8F)%Y@$B#7<wFdI>$(GQ;M%-z!*bl zEGX9G$P*;!LZWF-D1(}aExCt`QJz0~tVk=ZhP?M$5t+|CXCFBS&*63VrwB80c%fGx)eRVrqG#zqj{KHmL($rg*YTZ(s?%~t-eJ*UT$$4};=0h9h z-42^2|neKyC79CahTU`&>_3$9ipsU5X5b;APwmN-s;{r3@ zf*d{F7&O^BCf$Hfm#*E58=T}Y6oo@x`EBn-()v(}FxYhDVV(S6eDoP>%-JdBSWFvc z^HcH;*E;#OJ5E|wJtd=-DDQS9{3<>J1sZyxef{^|hEhnAkE?%7F4eK%NMerE#YRc> z$||Uys1d@h^sbC7t1!PXBy`iIs7&&uQo(`2s0=y?S*@-0WEt#RTy!n9e1+jYIU|ot zNc5H6D1TC~bM@@F1F7{1bBL>-n5}Wseus{(PxXssv(@WBMRd*S>me6{z})2HGhyS60;)CfML^;{X1dosGhwG(BTJt9ngPn)GNc1glm zh;X0urF`27dYf~b$w5fEHhbSnnNiZhgNL#nocH#fM&@VIDQn6wcHHV5EBxa2ic)b` zY2JPk=?k_Q3*mTBJP7aR2x}vgkT+woplX=Ght5=wv1bg?fNJ8?u6&PwP*>jfP6#gh zIY0llzC)_3PK+CQ2%}pr2KclIE3FiT0>hPmZ+pL~!ShjWy7IO5);UkM{b^d)Sy~KqMWBs9 z&Y-uBL2(UB3+Q=i@YiIOvP|8z<7W{S?zAB4r==y=VMB__XN2&yC*@6evd782=gT=4 zrq*M6b2h}@s!*=T%jt;EDkr(=ZrH1JQ$h+M5%eE2!`ztR=3U{3u^Sm`)h!Y>rf6a> z4z!6Ui~7XoC9kvW?d~pggbWOkVvn6$CTR~KlIIy zjTSsF7l=ONI-x3invVbU|M?T1X>#o%s*r#zkWWW>sLdC{S6Qlp{P1yxqpzK7-UL|i1>ucr!JAT+V=v68-1S*-z zK*`u`(}f7XJKDGNs%81!nodd*JGD4a>lXD5)u{8+|HmBQrU(jieHi9w-49DAW;a+L)Io;@(7e;edJG#N8kXznL_OfAU6%W+l82c0_1;@a5?$RfV{krLME64$j!nH0DxHd0YDH7fD6FR&TGMKVP*mT zd!GGo6R!5M!!iK#DFr^4MQ0{7@o|pU;bG%dC{7+md0%ibLsSGaGH%Li_RBM02EAr4 zgBc?>{0D0Jo?)l4EUrS~=Cops7Ah2p{fiZPE^0Dut^ zA?7_qC@?DO^)60p&MMZ7uE@~qi_>(w zN3)qltZMzN>Z_CV4vK5T%KJTZ%C$JN<;+GnlO~ zM{0Ug91rWaet0{3tZ!e=H%+ia?cNjVb6zWg;$sLq2{l6meU84O(}_@>TNIEE&u#Gr zC2^2S)Td2|;KjuKamUXSXI)-vK32U$v3`;zCt_~kBkPKsCg9As;D{0ZVpNuEFtnoR za|NzvM`)l%szG(ZGmmV*)sLsN-Q1(y-IIr-xbj`f5IK2J|69B^#N+rMpewO((6&_Y zq_J(+kwH)9mzh^H3pj&eu~fl+usW0my3EK>W{q*6^Kiy)1uS!JG+`>gP3fW?a<@(}8r>%tX3}uRg`lA+VCpX3FrfD$ysCAS<=FY|H34 zSZ#Qn+v75uZq+Zfs8?ht=bNLAkjS2Q1871+Yq3-i_OG5XyL4QV?J>g^9wnw56>D7P z<$LTMSK7jZja32UG83PI9K-+dj25#$gW=lOLd@rhyMVmg|vx1wQ`)b+yR(Q_aY_nQ0CUGj}b3 zl#@DO+Cnfw-FPr^ooW7gP_@S569tJUW>hddkSe%y+-xWv5xa{|TJKUjlXr0mECR4}}Eu)@$O_}ezP11gh-`AhD=RPU> z-%~P$0;OBMqa1iKADjGNOm^U6lzWl$r$u9(Wh^EvR37kLf?(#R(|R%!Ryzah93KT^ zzO4(BtlOhGGSRjC*j0yp?jQT5jp>z{F)X_HbWQMA&-W?hOZWise5`-v`CQ!moO~7l zE*1+53kcNa<^i(+&B0tOK(HAXA2)!Ho7W8R?>&DJ;`z8wDZ%5Z<^C52_>KPOaIo~9 zLeU8D((3qFdbkXXN~SyOzOs6HLM;9EucS?wqn3At@3LI$={+Ux)a%W~gS|QLhN8df z^BSU{KDE*B<>RCmE+t3W#99wskoQTaYkBWzY4x=Nl;6K?ju2w}&JcCQtUOF=>)EYZ zvyim8_B>bDLFiNHq2m@V8AA@2s_M`56QL;WE_=#?*rMztrnrXZsp!~x5%E2lr(ONd z{9b++mT$pqnr-21r7yo>gAN+&2Pw_MI-@#`mDknJUa^ycOQ_r0HHeXBG7aIDKXT%@ zBr?DB*FSl0AxIxudXvJd;lCcDdF_1g)i%&xG1L6*M?2@)#~;XSGEJWkCerczRYQI$ zxM(Cv<0>=x)hk^Ubu%YJw!vf*;D}E= z&X$tood6BgTJQtRPxgzbmAFWD*(o8k+68J+nKmz`XHnvxll`ak?OHX~%#fg91JZq@ zHlVOva-&zK5q z&?N$aTu8bNtMro&pxcGxX=6>j2FJ;_6z2hRIc1QVGqnAb~#mGx$ex7ew>>HD(hBLJ3k@vm4a zDErgTh;yn@Y7IbK;1!pW30LWK!5M-*+sTSygsSE_plZ;iiGQ5BDw=;qXbASZ0&(?7 z%dhdd&G)SD=1eoY5h^`~eHSzpGHrRRUKNs;$~>TdsKWhL&z*^>05sP4E=~+P{9;G% zINwIAS zF)j6Ot2}kTRm9d+Je66cbbUeFFG*)Txh}R+aWojWF1RUXLzFsOr|Vs_+C_N{j9rUq zYd4$xwrrasHJ@7RzP2vQP`<%Y8U3niTba30!E27UC)@o`-w=@wvvl#q^Iu3qqHFTH za&EEAamX$Neq;_w!>YzUTCM!FA@=MDB=+l=tt+QHDiI|>UTCyXZj7c}n$ZrhxZBqG ztKV}zv~`61JHO{P2ZGtnxwu$3Eq-qo@$hrAn1O*@EbJfvADG9S1Hi`z`uBcs z`@{tMJL5M#{gLqDLm&x%T2+-6jFliAR4@f6^ZbBLH!Qb`=eiGEh+;4bFkEvTZ`Sd> zWKb$`lT3X-w%x2^@m{A4|IdWK4@vk$238hu#VMVhwCUH!O+OJ_WjrN4n4ZTi%?eo;ZExY3s$dApi6;Z}hNqwqM!eOXe7HG4b;1 z=UBY@_sh-$a}3Uwxqs&Swptlc)W7C?{U%CYiYilob9Ye(I)xV9k-=Mb{GOkjG!=i# z_eQh<8PZf})0D9$>>nf_jIP%2-NYNB%U|h?#_D*1uxiZx?dOm6?rv+b8>olb)3rU! ziKs@_^pOCM&{vfMPqnwol=gl4#F_;D^sp2_f98VOAZv1b zhhY|&@N1Jg&pDA!oS1*-ZPk3*)=O=yN!FRemO<&^lGbEB5g1BH{jZq_Q1dg=Qd(jpPvhK zg2*`iZO9LtY_eq8muyG%{2g_tQ`F}IbI&hX&KDCo{X}$Tci5@aPYA48Gk;`z z%fDuOcSyE3`)juU4xnlNGut}{Mr<(gf9FM%v+dA>Ifl-c3+a5B+xgYo;vFTztNKvq{9^JR z&Rw|zIe$V_SzJbc!gTxr36kljul~sNVgcL^k35h}PZo355LTbEwR-JR8RQSzw;M)k zRkGjBJr4MV^G}ceT~rg{oOUXOhJtc{`xh9W7jh2-yT$K%8W6z4!p#Q+LOh-i$imAB z;xPl8f%rJgIsTo;w`mMHEVE-i5#-p1C)ZPK!?eK(1K@oadn6voKoc9LFldqPPD=f^C>;VQG{8rNf(qGo!hK1{?p_20A8!7--6SEZ( zE@Ow?k--hhDDT`0k#+Y!j1bQbO4J3rybbLEu;3N@Y%DaZ6G9ng~s*vf;{`lmpA9z<(w*Cbyzj)>zIa^)zgmk#5-ukCPQ%j z=Q6yb-0?lX9BtGQA=N;?BxkkVR)*=y1$?>GYzA5B9)LfK1ucKb3{Jg%d!5s+wH89x z1{tYcr%6j+(5&@Pnx+c=1!_d(HRcXQ*Nsn$23d`d0rRbjAkInO(ow)qHb2`0;~!bT zG1&)|4=Q54;pRphi6Y;9>HHHf%666+vGk1hvhDxd)#T6P<=vkf_6SyML29f=O{>PlA6WFxw`aJ&|?E3n;bHwxVNebTrQ5 zYYXw7m|_zZ6wJ?Xf^9R`VHR}iw zCk^*P^Vk89AzrL|lHz<{s8iQkQouG@zWZsM>smuIZpbGg$4S-2PIPZBru(MM(Di-$ zNyOqDsjFsYQGvif-5`hZTjt0|<{M7l*fuXs_PE#EMQ^9MN&BFgBC!URc=(bPJwB~2 zSjuH)HgMSZznz!0aT~6Fe@LGbsP5BHn!@X!{$`O-DU^Hk?c@Zw5BkWXqHgePv_T@0 zZ1QlwZSt^`gcN=GGjg~TRhjw{tA63}l3&~0vB6fPuZPH!WS73|zVy{e&m|*$C@dbJ$&zw0o@n57ZPBXy#pt4uD3^8r zH1&#RW|6pO665{kbxOReao+mCW=NTe3`#Ylie<_7jlC9lErePxo&BIlvx#YF@pXGg zm3#8nd8rg&V0`qH8X(qwo9uAZclkwoqpi=urvzU(GpI(69=`PXxC zbMdE%wReNcEaqK$)&Spo%oi%=Z)W5_JvV+n?H{q#o<%K=_S~$V_|28(=_G!0q%R=w zCu6-ATB+U?T1e{bW9qZI$t$%(E)tI+3$lUHq5eGY3|}VQEB5kv)z0Vw0p|@N+vPh1 z<7B!}g1GGkgV)S=rWD?(tkcvH61Y$#O{i3ePlG{TdIvAtOWGNG!3rTe11h#S9nD&z zwHq-uJlmL)7i&yZ{Id(_eB~U_g__cnPW0(0e)Na_mVP^;3>S&;!oI>$+nQk+7}!f^ z6oMA^FxTFQ*7hd@@9eq*qA@->6tM$%)P^atK9<^m(H%dQp*fq2UTKtm+TA=tKn|W* zEcG`KM3cxoFX5tvnwGCPu96v)=}Z)?i``|boCRQYk^-4cVjl!0nVPSP5D8iXg^x|Cj33@cltq*a+r^{2(XZ!St?Vqmo zyR0(ebu|4OWc|ys3Xq+L)7%Wm!D7J&;Ai3H=LWLyTW~?{djf&DK)k#>Kz=j+e;0B` zwf_mS((Y4#S5@vdARx;WW13wR_czFj`2%G6V!UCJTg7)>1|CF#FODvAe8-vv;(hZG zN(E}DpE-@yYbaY2?2F*To`o>47Enew?B)C1Lap@{J&6&thWx6OYgeK!BfP!I)W`RQ zcI2>YTSuxr*idQ8VTmY?9ecuto!M;yM{fZ$2WqBB)1C!BCD-@)I!hxxhVCJgiXIkC ziLgutL0_k1vr}hdyzQKOgRE{g`>ovfjbqcuG@}%#v1S?V2~M=YNek^Aod?3U1J+D> zzr5QizirpLjhDa!?bkP!+=w(pRje|k^C^nONkxI!;js^=FEQ3h$3$slUowPEHfLq& zYb2#@%cgO~N? z{kdj~zy6eNz=cpNO9-`M``})lcR12Z`}MCsPmZH^D5L z^>#wVfAh{t6m5}BoLLDUY-PZliF#D`Vjfap!&K8oaR0a`Bo1>PbVUu<#UYb8`SQt1 z?oii;g25n>yxD1sFZ}?i$i7QY2%- z5_mpD-c9RGzcq?(Vq%V=KR{Ogj}k>Qb>Ek0#4sOHg@gfb!YHVsJm8*mD{5N}G83Dn z^Wi*_%2TKQ;a%!hG^D0t`p_*{d3%Ha&>C1G;juxl%30_SBX4%Z?Wk4E6jv~{cbyBs zh8_z%VGvC~ZQo-OuC-W&zWB91uOVVz3oG@8RjTK-$Ud-FZ!S3ci*p*@Xbr$JTAk{U z`!k5K`+ce&;cGpjnTQ1|HOB?h0F4w#_3BHyIGP`KH(=O$uO-hYq_9d`x;m+tXt>~j zC!>C1&Ded4!3a0oi~VQKxr`p})RK}~EA?87gWZycVJzwefUB1 zPmli%vM%l%f|ns4fBvt^DL{5JZVOHxP8J|PKOYN(WI;ThhZB-axxrv_PBRW5A1CL( z^Z42S;_*5&;dH+$l~+!?P+rk@k{6rhNqyg-^d#``DUx zcbVntO^G4Vs6K11e88R6VlHv1uKl~9;!SC>jtFsi&OYvex}AnI3-Qg+oSsBl7nrg1 zr1!>qU&Rnl!O7A&;q?YU!jBZPjkW8E^*TnjGq+*(z?lPOh{xXr2ders+a~jFJAFBv zvwCeiZ9JR`PIRo@(JAfM^*1=IV%$8ZN7!2mOMT{;AciP)+y`0{hBy;VzQU{W63kEm23*bQk8(d6s zs=@Q#d00Pz{%|u-V@3Ad+v+o~idB@#amIISvh<=L8=3^BlRxH|^iYbc$z0}4VdP6A z3-C5jg8f3zb*FB+ak3{c#Dw(3`;8koDH$)u75xsK>k9z`xV=lu{qK)ktK(iNde(D8 z^6KI`H6P0CEa_H_svxJ>lZ2|RmH}?NAEkU774t)*kG!z$`ITA%bH{G~9I;*_cE*bD z5yx|~ehg06A{0SXYRQxKq`Y%79R{gHw+yj}rMz+Jsb&Qn8ep_`0T|G$R`Ey*W|AeX z$`i^9I)bMT8K8jr=qP?m%45RfLRiOh7NWhpi%xA=d)P2AqdTp;OnIF0{fuR>-!FRr zg}<@gxGePrDR{a37y1LS1&Ufsa$Ke3fZxY8d>cgFwHB6f?7=SVcgf7ZJa;N_p(!q z$y~{z_v0&#OhsAa$jCRb`5kvsXT-7mWp1xa&C>BluCpg%k~$kmPkmBV{KpH7)pe~F zq!q1AEpcu63^h2HlN@Z@>Fldow1-F0Ry#jylMP^(o$~wA&zddE77c6~&Q)q_&a|}Q zvy3vLH}=HVV;^guF{Urz&~>cX(49SuU3{&qaFT_iW-1*ih%tX1G5f$TLt!X7maT{XC z_3z#=m90%5rX^y$jX5lov!IZxGgzgK@d*=h0_MzW#M8|QXJ{F_jQ;_-# zrWRQ2#^x)U!-aGmuU&@ITm7!JMyvT$-0RHv7J5{@i`E&Tj+dTa1dSt+MWA)4y+(?) z=jNZ5^-V3lzE=Uw2Y-(vaes{?bgufVZ}b~OHQ)8;yaSA3Qcui-;CuTb!r&-9+DL*$ z4`p%RH=pe0r+7Iy{Bm|MNDdn@^A`7KKq_Gthf)nr^FAl@Jl_<&#bC9sWWZ^iWB0cq z&i10#*&c~(tkK{{h*EAe{*a*&dJs&STouJDvaJ;d=g1zcI^A?oVl;3*`tLR841ck}Olw|Aggzt))*oKV zJO2gC|N7}Q^A(@ZVN?G`S|K%2KvaDxPk{qGck|sG=#irynLfA{n)MY++(S%3$|HjU zE8zY67;eAs$*qZG%Uy~lm0JwRPf!ar!i`@aDHSVvE!nZC4n>}?YdI0;!RJ}xjqrVQFez>f-8koG`w_z4mwoMmDs@LN`bH^nWM6NKe})x+lGu$QNlyP|-&+ka zu4t<-vEjbZyZ|%HNF!$cT?i*d9vpl=f1@7k^n5M15sHzAUIs6+3f7m37&!M&^3xfP zJZnnY^i!IIZnH>bgg&MaQyt;Z>r5@eS*1#cn2BwOK-W7$zT z#4)c`>CGi1n8@w4&uO%bL4t`^Ey0e?sfZu^UxSGO(S}?VJQS2V*1zER<{ajbJzWbP z7Ct^RcF4m4W*jVL03L1@UVd&4ZlF29jFZFS-vyIZ-DQ_$Uda9~>I0(y9Aa?ZI`)7Z z*S2B5axq4I2`qMAZw56t<&J{z{T=zcPsdHMOnmlSl@!d*NT!aKo)~U8Mpnyw#Zk93 zHEAbwlgwrKO63({2m6_WMpfKva!2wsmEA`&n|fGuQd*YIIcahuvT|GM=FEHWG>VLB z>gtdissxEn)}@Y^UIM8eLfp?rF53*ZR4wO;6+Q{iAJ$ig>o9>7W3o>Pn-Be{5 zr&fk70S8ui4||Oo0b8$Y_AYz%T*=90K)%!6vH&xE&{IK?+S-S0J~pbh_!FN6;*+F; zbm^;$TGZT3J=*127z=t|JqhHTo!}zcQR`IubL{XhX{#OO(}K;3TGL&c)jXTAQa|*+ z7Noev~aP63*G!U*eDP!W_i9@t!98K@6>O_2XBPUf0QwA59saoT@>%#@u{vwT0JFHYCmDh>8mC>cUh159V1jCtY-w3Fs^y6KD}>h zu{OXcqYsIp8FN|)>@>;Q);+t>)B{}Re?KC?#sfsPsB)>v}AH$WA;+(*C)u(3ErcLKOvJzE(6XY(4 z%U-rLe`RZ%8m6$;(Kd%N^US%Bt=>{RT8HU?@dE_bDs-<0=4Q&aA z9jl=llQ|I;+=AqzR z!m}bWGpcSKLncGXw;CY?SDOk%xoa0i7rW4el;mANa`bCL^8Kd>gmyq(P5KZxwf5S4sUmi;A~5~j%*3qG=C&J#`IDTiA~!!M1T z)IZd9$sSL$GJpjPlkHy*H*d}%)cO^bP1aj)<_$ra`&>S=w>z^;VcpfJK-P(=AjGck$u>hfYs zmLCbuEp3t=xa+$i3WwW+_vz~P`D?p+%K+l9e7kx4*f9eQ`H9a#R28366e>DCJRT7! z)Sik73BRq*p>%6GYn1pZE$Sp{rxB@DBamxgrylNpQZf<1vTO{iL!h+2ambD|MoIi? z%)X^Vq(RpQMI&{MOkdgL7boeP#kWxgkqzT(AHO)8!rh5)rjaG=2n#F?#j%NyKVRnoz}lI=kbBkNvnxY2SDlJPorr z`5}ko>G*0{O~g3903>YEI7L#=*>=RVT#;2`I~}`>HtHA@`i_l9$6T*&e-eO-y?Hwpn&hwT z|3)aa3L#O1*o}VkDP2ue4c5%rDn>$*yzv@Eo;dtS)L~wC_sGd%*M_4To&RoKwI4RO zyz2rMIa}Pj09$x*IV;6uSz6n#cbNYFe=K zgMeTQP8LYT7XmdoxFC1`u=7J69peX^gLuvP__)mf?d`UIA+75a0p&Q2zURSRNMFNC z2^k_2n+6NS)JoB4UfRMFcLB!Bv@Gm)Y}le_yKO@IhU9~=I@$4PdYG2vBleK(Hf;AV zfZt`RHb?%w&r=^iF+z&KlWfQD)r_08Nx$Xn3X<1i3nDSoZ}OvDF#mi>Dq{yrEDDq}&YjU@I!zUZHL2ulSRsZm)eP){u zz@!shhk(s+2-wW7aE5?QTL{>!98to|j8ljfnP{PCObkt;KHsT2O1nbs|gujv2b0`RDMS|P*Vj-$L!?kabU=-UH6C<@m#X2DQ3L&jh zk`U6m76&1%y*E$q>7C7*qt%DwBy9Q|vh?ImLmkG_v)_je{bsF*Pfphmu<6NKsmV>y zI{7Eqe62G*66RT>6CEO5Vo)XBQ`+q@s27FAP{bS=8^VToiPsI1=!hB!ZpWC#>@qK^khmq$!MKN&*%HY%UG< z=bi7u^2Z8>fuChm$mR(j{WNKN9Mv-PX)=_>k`NqW`*YRHou~mMn`RT2b?XfJeQ`BA z!IH8IQa$^MZ_JTMBug)aPA%m~^*)mAr{?nK;92UKPg0vU3_ns|fGVD#BfMXkjdNVh zVuy=sT!=6<8=X*gp;bB}NGajPc(4Q;D|k3k@`8_q^dp)tZqzFuRVJ1VM?9P6)iuJ1 zKl$1C3+@eHd#IAM@8J1k7S|++M?vpzXVNx&BmwAkk&VHOv)F0FVclF+FkB9X56EAb zDG5Ghj!08^1t{_4z@Xdsy}QQ=+gq_fQ#4_ls>5wLtmU@HTca}6GeBCCO({lOw-(B% zF#c4^E|5_yw$dscL@xP4fjKDlo3@5I(|ZZFp87+OX3|aB{>Fwd~r_6IHgNX3}agon-tC`m7utR z@P7BTRTTmLndYiRN*S8*{;Tm==YDP);CCD{8U4Qec>OSW1rVow`ox>PG5hl1!pyvH zmmOTQS#C-OqoSYr@$HYsy7jeq?JF;9?ALZ;z9UE7gzHQT@DZH22Q~AF8$CHs&dq{f zzFwD=B71GmGn6f&vIV;sG^E$G+*Gvc!1wd*HRh&C2m-TcaH+roF=i8XRH z)?&Nchm3^p>ebr6mtFG*E>OuYsacx(3=Twn380i_I4TtD9{*O1)K+u03Voj%b)uc>Z7!vB(+B4<6Yy?dBNkpn1sDmSr~Im})c zCHG^egsDqe-B&9~NPm#}un}!Tl)!y+58NmH)Q%1v`EKQPMmqx@`$0<2a!W?8aehxq zS<`{SAOoRhE!6jMM*knS-(}X6D&Nh_4VdHA@kGk}v}eWnaqpyJ_;r#r8jr=1lW~5I z){VLPQaL^`$MNM5?Om`v=Z_%grgy4Dye|?7?H?abitOh`U6WvAhqYxZim(zm>m&w% zwCTtxQ}6s`ut0Lupc@g>eP*Hw5z2F81wZ_{b)++KGKcRMMJ+3&0UdU@arq-Ys5zlr zinNjPqc!OgM+&J#I9wo&O~vm#G3{eS3B_294~6_(632bhVUiZncuBsc)k+w39_?T2 zZN4p`d~9d#6OdEP_{a{HD3Ft)##PRYf6b~;s7O?6lB5gVD{}kr_Oke8=iXp&2aiOo zSt&Wrem|3svfs=eyFbPvTK030RIO(D2%yA_Wf>G@g=b#3(0^cr@=f7U}`(|6;n9Ku2I&{5O%^n zUp^G#gC1^6>KRkzMByf75^2TJ(-^2!hToF)ch)>X-68Xhet?-I&Yp)ZJNn8-RouSJ z?FPQw%Z_X6hE7Iwu7F|Qla>C<1dWVD#zfa18OEF8=)TaVJ1OpA7$=B;2hNu1oo_(4 z0{HDh_CROHsjt4znQ)piUki>zhhkj0f4L{FGoN{k>oyn;-jPGpku9$q`Jvshrz@PP zv4P{3Yrn$9XVz=jZm(dqqQsNUtTuL|S-iZTueHs27!G8iuI{f6Qvb9Ivq|I`8h}^1 zk^wv2Z?AM&>DbyCJipZSe**pFV8+*81c=~IWvqg5ymk22N6{88JzWY1<$^#xbcfrOjoKnL5uZ? zEGt2}+G?`+lg^`bv!=53rj6-WjubnPI?|{`UjA&$gBp`N~vMv{XX_!-{1J zOe4%p@_7({*+alzL4Y@e%8e_DPykUE;0^~kXJupHU}E4%XJug&C?_L^0E-21xm z#Dx_=KtNXjy8tvK;EaAxu`A#Q+*U|J2^z4uLF)&AfFSls2n#AXX&uaNA!`|+Lada_ z%PYyrm3YI#!ukZk!UlN-!3O#G1SLcWfWbtJAd3@33wVLM9yMMqxz^Groe&M(mZls* zPVH~)$Fm+iZjL_jUC#Ux^8x_{1BWi4Vt{q}V5tKRjYuG{@&snv12;njNP2;IPeN>t zcqXN(sGy4jue|_+t?_^W0pC0{T=1|HP5;M`ZE*xkIwNCg%N26h$z_PQjP z1XzXxD8xb&=q5QZ9nivaPfxxb&>#n>7x4$0T+3wY@-eXD2xPeyO6OW&QjV74&BHiM zoy#kDSzxV5pb$7Z=#s$X0hnzIT#Y-_z;gzuH|Oyi@@=nrabRf_=y6b}RyVLOBp`#q za-`FJ15&dKvFY8+EjVon3Ie=NRZ{@8ScWbFm<3G}3|0jJtWLA`)U0t#B z0*m$qe`^J;MFULQ!3{KeTKgPofsUg*^G*PieBy<3jV%jnfYQL9OVf7uuH71z8QCj; zsmQ^5HrH$3vE?2}AtIt&3#eV>GqKv254|vRSTCJa39)Gb(NI;(1EiFoghE>iz-mCX zU|_b>_<$xIzBEZg05q1~>jc<50%8W&Mla@5h3B@aYhOOL{>E)5icy4}#c~fzY_W36%j>MhOa$6csB4OiqH?b{{3B<+HaucPt{3 zTnmyzI*_yxI)?hj-`W$m*lh3fy5>bpYyeDc0_l1dlaQAEQ?Q{PDN>-!eDww&-|7V0NvUr zeNL9PEZkC)Z~r>7v;(pW8iry8u|XA>+(wK0*x*&q-f|A4^-r?dpT>R{27mxr(nSI* zg{CPVhnxAUBPJmXx9I;)TO6Ez)0X|~+TXRs_S@fR%fdDD|An@&-%tG3eZOl<`Qq=| zGW&?~ySA9a*0@20JZlmRp!?)vC4k*`0akv{Ei-cQ5#(8jl+ok%P>*-F!GKKl@&c=R z1>_D;Tc#g+V7ON3qJV7Z1IYai*o)>dft63faS+pg2WI3!81B7E{!JL-Xkj_P=%ayo ze=3V%|C^+Lcb<09hnCLNjebq*w{5e=ZMzK?qtc8`LjVi9-+gTXGAMue_*wb&H!SsH3IVONm5jUc~z^ zN~WpJcTP*beM!o|4-}~a`ZTX;_Sk2{1xJH0g8?$!OF%%I?^^orn)E@d1=IN_kXr!s zRB>AA0l?yi2kGZNC-ioHn*P7gmxd!#nUT)rm%cy*z%-##DX^ju zKt(RUwTD5)0|10XFMXQ_u?Y*I(Fo%IqR(DnLp3kjY~x+~i&|!6gZqU=(9i>}s8(K@ zB*2DOz)`GRBD^pGpys@v9DKrhUI_mTK!=ALglEDjy=xcXI1K1xfkFg;p;LNJL3B^g z7gZM*0R6hs`D~P`TQoKy78*fw{xUrpmm`$29NmWgMrCXR(XB+ao+(g*8z4>nT_y!U#b*4TTU6hou@5k& zuQs1sVrXpxX688A5kH!#n40It~#@nU1_K_MErY6YHY zDxra$K?6z`h__cu!-b;E2&m(;g^{C6^Xf-$xdsv*ffN_q@SC-uyUjweyMV-aMqMJX zGqk^fUukmcPFO>H#d*I=vkWAyW0KK4tBT%@?w01wdwBTQ0#=YD1dDO@CX97#s&1nLBIr{mv!v3gRlW++bWiv*6;X2 zI)LYAeX^mp-^ruZB2%E!0!DOv^t0n%4e=LM#ftnu6;L{$KK!2w$UL@%uiFBH3$7fp`_ zsLv_Hi>T^@1A=wG0W$Lyx1frp*Xpx85HS=h{S6=&*DU|$jJ&lv>1O8wvSb|~`a@bw zz~o!Ff&L>~AG*iK7r~1FD06G@3le&Bw!_u9zIy)*DM;R&Yg)g9!#Jwd1=x#(GXXrw zHM(bO)(5e9?wa(wbj4DxfV{Y$#^`b_2iPy}VgU4jiPpc#X2?A_!?(JEjeFJ@WH8%2 zFqxYEXIJu1uP4a`;6(eszyJ%}fE23L*%doCuqA&wlTwE^f8$Ih{rcUR+vCsl3f42Cd+F>gHHl1l+`TWf#OWYR=4Gz8;hn@5{!wWH2 zP^0ziXQNfwg44M88{T+3*ZrM8GRH=~9r4mn6aew+#Q)0y1ibdy;AMLo^-Q0#c39mK zOx@)k_Op2D0>n#{J`N~p2@sp&^edZ3md|b(G|WKcH0Qq!Pz%ooz=*)(#Z8bD0L@+B z_=`RsgZ#f~?^~-o$QLvO*tvCDnGq!CXWvi`;2ZuXDPm5bx%)4rmA2qm7oymmT)lvi zFZiYeEQj#RkSPJ+C7(^dD0Bw^r9!kAfVvIPbd=%~e5*6CxMW~6{sbH=`rlA@^LS8Z z1jZ>IsB{4TOIEIB5nJ2krQ0c1pzEK9)yC*?-Ig{!7N5Y*fRgv8DUol9d9gl#?z2|m z7KB<5dFDbbz&?Khc@b4n?bm0&4Zk?e{tyS|zmYCOw%@FM3k__|^%?ead;S1`M=0`= zz@hbV%Thp;14KeZMz}~w+vg<~13UwKeE#>?2@c?#4Pd$;6X0BrfJltFj*$Ui9s&kh zW+sMzf+_z5QviXe-+}d?V9I}REB*!A4r?n5W1c?S4)E;Ri7=#XN9l8ZcTa18dWn!zf|B&|boM&Y3E>FoR zze4EzemCA?@H|8mQ0@O|8^J_=uRVO?G_V^!aBr)CzvHKvI!L%5MZ&4g3%*0$)bJRw z=1ANWxJ4>OJVt&~kGAugnz$#tVYz~j50kKKQ(O2}6@O1XZMXuAXkb@Q8UIf2%xthR zt772Tm!mLzvb2$AFap$tt|NnVX(T3eftmIz;(Qlg`0O|F*^t3oAEyBr+Ie2WoQqP9 z%UI`6UsAKewMrjVL+Qv1?|iZX4{u|JajxEn1mEg0gD}FXx%XJT%;UYJ6VLeRU=MZ46fd9ewhl9!Kcas&@WRX5^3mB)l z$RQZguH6I}6BH*@?@l$sKEqCoK5R5;(ZWsCO`?%@(&@O2h{HhZ<*I6eF4Lh`Fy#W2 zi-?&lmjwrc>S;VwDPj`@fJApRRwVQJY$4vZ_FZG=e(R_ zK(X5^=hZKdTkR@4VM+Z=z^7Xu8oC?(Ob>1RGw$mt74Vv?2FFI(Ldbb}TJabm(KpcS zHH-68-i*jl@7pE69Zq`{*W)cS`E{V3HMAieJ17P1V+ITNnhb8r<=c8r2rtf{yP1+X z0spJYW%FG3%<|UHN7xl<^CwlSX!Nroj5~Slc8d+IF#0`U`I;5kZ2S@(2PPf7XmD8e z^d)mo2t75qwII1|y8Kv{{*Gn~Qc;Cg@P-)NU6_za3mBOOcC<5>!q}2Ojk~_Q=^4ON zB&)07;Wd9(y$C7jp^$XP&ZL-GI!n74^w5&1P38fac_Klz<{z3(*-{~@C9`-bIBG7N z;Bhx;7h4!F^YrG_W|L7N(bv-p>okbTsfm%FuiR~HRhxQMSGL&#b796Yq@YFE|p;)x$JG^-6{3afTtPBFJkWMM-p$Bi(bw=NytQuGzUz`< zH}WxmA3Z&!SD3Km|BCN2i%k0MXYxg&bA%zV^?Wp%>iq(a*g_-&ujDsqPVam%vsCl8 zhM=%{bm{%#xzVC7^4Wf=X}imeUvMLy9>-u$(`$0@fpSW-Vd&Jo-ZGq{@5AjB7rfAM zSpEJ*nQ1WA42f7cjFqhlogR^xBfw^NB!80)eF>_W0$wD#JWXq?l^a>QeHcp}!q!;w zsE0?SCK`Fp)m7pvBgmR)KrU%^z5yzM8%bYic}n!fCknPVY(5j~Wy_MFDTX1YhF5$H zI%s@t1Lm}}va+(RgAx%5OlF=s76EDBWw#D1gKl+k{1@zxSk)3s%SiAb-U$YqV|G4C zf=b2~N-Rguphp|`QOF2K#BcO+E0$vkU<1}03`Ye;fV*r({V4y)rW}H=R`RB3hO0c# z5I*oLxQdpU>_oHzA?E8+UVRJN9<8Ya|0%{Ua4!N-M3QsKi1$5yRnFp@0zTAJKRZi_ zNQO(OIdu01UK5GW-vg#+hY&OSB+GBgqaUV8XcPND5T~mv zcdBN6c$lR-PYO@H4=4G?q~2HXlE+2rF1iXY$^!eXZgdTCIgh(Lo%kS&t%IQ-#^S|V zZ4~8Okn~2qO$~|`n)_-^+?Zdatvmv<2*ytq<_@=nLq+I;nnHbXdM)ZyG_ zfdfXKsLP486*q4OKh((JJ!iprSTF`U-KQA5MTdt1AIlj8^S5jF+g(#vFjfX4=u1+B zhJ8MlI^|3$*flEaRIbDw6YbQy8J~j_PZlLSEPX?}_lppzWf2C1mg9;kWbtf!9|MvR zf3e6V!b!~^NmpbP@C!lEFtz`{X)M}_95$jlXJeVeL1 z3rGGbyhhS8^P^*%q(`xbe{9h4%c}LK;1j{SROD$(W~6T<956~NTj?{&WiyS<1jAi; zWyq1$%vM;2i#KMx+aJPYeIjnJGat{e%^97Fud}DxQk(9y$ zmHbIy+#SifukD3t(+KT`KM75z$m%W@BIOkH(;C-n*$?hT;GKN-;XyI{EPNBcl3N}C zogLS~b*Z(}%j)?ZDK~`CGL!?!n0q#!PAyL&x>RH)j(|SkT&XCO(dbOC?bRI;V4k=C zylKRGLSTR_N>tD?e3WtmUh_Ziy#U>Xs1H{3b$|y^f%~8C0uvLfo<18Bv%Ve^6W}E< z12#52CU!j?U427C9aaMt!~ZRJ0aD{%?t-^DU;A_$#E5`BHnFCnia|2scg7^27E zX6!W$9GJ@&6U=Y>bP8vi;>|zCY@~eln?aTtsA8EfI@{8&`i_E`Rvl0|8>Wdf6#$dY zG(;S9P0gx;;ij+QxKq00**59VpS`W=$ZH0kVzVLW6C&PQGHmH*wqP}cm^5%%MbnQ0 z+w*HsfNAPgpK+;qFL@q*K}fmG>+`1Wlrr=BQm2Q&eo`~f8|PgjE#qAeBLzq5lP+A2 z;EpWTX(wVvE;=w`H9gO(H}dRu+s3pk-zGHqSQN%D2-CzG&dpxqfYGV?MKJlg*>=L2 zDdx*|&fB>d2|eTn&*K}IjNfpV-^i52jk{ofqQA2oUOReccvzF3#7%COS0)H4bSs?h zsaXNH_wym*bZJc`=Y1PSWW*unX*Q~b!R^GACs(?A*5=M&08y5#fh7^2;7v#b^lWum zbH{D2=)O^SyXB}3kI*f=Mz;rqPHI|6L;$u4ge1eN;2wC;R5=1oe4{$y>PFYX%q0sY zHV7doA~GT};OBoP{>UKUYEUG8TRoSUMXH5YT$+U^)R#@AU-;(cdo)4?@V~zmK?sF` z5!>$&vLPs*4qgx`(+4RaE+FnT>hKxajj1Lh0jccGlN@c98Hg`9Faz-OuY|8W!O2;N z!9er0y(VDofK|MJ2(JhbXc%ai2-{ppEiOI#$YG_1!kzpjBtq|K1h2nxG1IF#80)WK zi$o0ixI_X&{OnL0sO@;9iUy`?itz<3gzAFKVKt9L=8c=!3_hiciVAUIP8a#Gma%M= zh=%Xkev=bDpc$y0*|B=_>fuQ`a(LG$SMV|ad+DBp4-+eIuyEFdI6S7JQqxT$+XJ3! zOfXwE6J{lvD&EeZHj?Gl7e?cehX}suF|VT zf%H)uvC#e)>zvBWk<7u5if1-{JjREWml0(dmm9sRTMWL)6b4^FPq~=7HM-8gvXgXt zmbPnb%RNX^#}gTfaR-;;0spq0#$3GTsFBsOcyz3%a|0d>#`!*$2c9&1Lz({1#o1kG^={Y<|z~h*FM_q2pZkld=GQKzrHrFA%GSR8|vf+sm=+j{l z76EGtz5D8PBQMU%iis(sZ~Qn4rGN80%dRlWcl2sg%^V${}KBS(W z1jwaFyEjAMDGq!Hxy-JYh(Quwmn!MY4(S}~<*aA1snd%^;+vBpHzeqLyED445HdcC ze)1_XUK7;>&228);KqwA$nPGLa&YKUoYfHwFC+x}Z7rPy8f;0hd%~h-x~+303X>rk z;V?Iv;g!<1^G-hNd}Dn&!P-z*#iaIAIC&Rl_w*}E@F1rZ#r8EcTO<>+l3<2SH561G zV@4z-59-Z=?g8xLKqMY(OlNxTG%<^L8~lZ)AO^Q`T8{>)rVRrR-+gN1jjRfrM|-j# zsE#gd@5fVMt_L3)jJ5$b?B83<*CQ}^5YH8qtgl;NY=P(hvjx0{STXPi43>fWf3tub zY&wjbdVp0s897*(Ihl0z^#RlP8L)F0>a#NgCQ<$0vVc$&|FVF=)_}zm1O!!9ln`@# zGO3|8TPaahe-hNe7AUPCJN;~tfl#I@DF!QjwMVsr1jDlyUry}x%gFI$DMU0rgeJ0O zjjn`5eCyvl_^(tHrLoVdou%q<1wVN0V zVkmaiaVICl_?G%EgcGc%#PAGZN?R#)nLjCq9e*IL>|L|kJ-%XcLFx`O!wwgI;)-=PXX=NpwHjoMp)vhdD=Lm)-%LZ!F$;sa>t5+2U1(DvjTYal>aSF2kbF*< zbr=I}!v4Wj9Wb?o{kK_YObe5YlPa?OB#UkZeWJ{X1U;I<{w%h5Dc=TVnoPKP4{6^D zBwSViU5uX+2MC4O_Thvi1H+oaR50hV`)&_ZVcVHvWK;$j(Z(w!`jJk%(n5wXn=Qt& zB7#iAN+*;}zxfGbX46Q-5!)wzJk@3t(lR1gv)yG=Nn}AK^rMrA!%~#OD}dQCn*3lW z#CIvA6;Za)TQevp8vb)mUq`rWY_@@r9x^@5RB{fo&);_a;4fN*HM`q4JPldBM!H|2>*OS&4enlMiyb7UiWDXZs^RE)=5iUaR4$BaGISI|XDyVhUpZ>TQ(55OFo4EF{8E@xTb;(_-Jy9;d)UcS4kY#KP!< zDVpqxvG7gkS;;vJB2uBCSCmM|fKLQ6;ipU?N#CS86h|0*bkE69NXqQRTQyr>w_+XQ z!01~)Gh%)frkte0LL?@iguvHALxSh5VG8I}lu@TpLSe2Gc|lQN*(5@u5jLp9saQ~l zK3Q&Wr`eFXX->#Mk1F`)Em!^Yh%C_vD)-B!uJ`*W4OYc#zs-;-_}!-*&(g~I_9HT+RiOve&w>+cWtaRLpX*&bCxQ_j=cwTW# zmJ=9U^XHz`@+INeLn>PzV(Vj7VPQy%?obR081&QWOX`2J|d)$vr0D>V}< z65H;`&F*j`{DqMVIgOzs)@Q_MxhcM((=!_4vRL-~Ba2&N?tK042Y+Nkd!O9yG8}|lG#7#h0;U>=Ly?+YfXYoPI_n(o;`8|G} zF*eBZGV}We1~m^~;eJE)lLCn||M?)63Rj2nWAn4bW3W*5+#e&@k^}0A6 zjLWsv@esu)2}*Ya58Cjx)w2-A;kC+r^_}+lE=bjw6OS(EWo0Yc`S|Ivx9maS&@hO| zzJPBbFkf&&P$8cPz>wG)h5xUi)cD@Ge z`NO7TOAQ4{bfHJ&6O-}PcPDU>pTewE)9}OAR*&X%my}`{**6122z%VE5^l5RS=XD! znXs$wW!=Y8BgVy9m?4uWO^2dbjd}{3-ta0qsFis$2x+l+s%q7tFlF1}y%BQ*I$W6B0g(Wk8|Fa<&fltHQo982*GuyQho(Q8k3&`?aB%o657) z=4FcmvP3rZ-`BrxNr+DFI#PBI>p1Z*n=Tvtn6OCAG4-VXY9iF~#B!{d9vzNbIjNT( zA{&x8J#v>G(k-J;qchBcV9`P)5yR3*XF@Y)ep?rHTARi!V;W-`>B)}2T#u-!(g`p$)> zo(BeJ59aLf_%h@7;O`H`#NJqa2 z6R*%WJ1xKbb&cafI+oPcCsYO9lvSLP4q62f zKnUQ$OTO{=K@&K&f)f8&8Fxr2Rs89p47lo#Z6z44=NBw4Eloxu;JmoGsgUUHQr{yW z4S@FlZyRM6b2X0h=RNz6hGdTD#}9QIbKFLOLZ=`Doy$?$r?p#|QGeAiLIBuELQCu#}^ z2?2NbR7F>;bpa)&VsV_;>}qEKzUaYSwf)rKXg7(Ymh+L_r#-pKGaIUS_E+pdn5V&> zOGzcKKJ`PWx923om&cVA=-0;PZKQ6uDCZ6ibj9kt*SU>+Jk4Wx#>9i;OP^^6CxtF`aq*`}r{njG@n{mu2vGeW<37Z_exwMcWFyZU}<=odVk zJ%~cWc}{&5{MR$m4zm|Cx~{k%YrhtbeHm)<9^Bbabc!Ep5(%a=W6{wm^YaTPfD#JN zMV#|)B%fQao7r~6$4=*cHG=u6zNYCCqe)ZUGsIL^f1%(}7~}gCK4vlzmR$Peo_h&Dc#2Z!L%7D0d1$47;RtE|c`8AaD8opL$6^ z%daD?lRneE>MJmC2CJ^YA31xqF{D!4gSTgI7*57RFiTu`u5LE$MSCVlNf zZHJ)727v=b!2^h^ zCr#|oxqT9L6q`=6@_>m?bX}nFHdWkZ2cDRodNwGB`D5shPq^(rhvJjqk08Ags+t*Q)!(*Ta{4!eOn%b8 zghZ&s9>79rRYcj2ueR`=xXL7vahXd;xK3+7^NLwuI3lIUmzEIDy5F}5@kO@}MGcVf zU9J&@n%js|)8lr8Ep2G46fRDvPxvK%88Aa)dav!%ka<;9dQOfP$p; zBL|V&D@Ju6|9*ez4p^f8F6j=*W`+&}$jk}Ip|Q6=8T4#2e>C~W&n5I)kT{ z{lKcS&<%G~W$)y`OEqrx++pMK|K^w(k6u( zH+j^n;EW)bmbQ%BIlX@uc$(y;ZYXM4Is{V4ED$e+f)+S@iupQJ5iQ80*sb*CoWg9yZP>4fZ_^&OHaLI2}9>GV`Mg2k>d)R7F?34LXuok+@suYCuF2J-r}6p#Z-QzGR-X=s~DZoWkAF1ICWlX zk)4{qws?&gd1>LYB5)8Tjp}1IA@ak}hirpI$m7ERdjY}ZoNqh*4YD&tw0sDpf6*M) z*0d;VOkesoLs-aQ;%+eB=+Cq0x)1DR3nV3f zh4s_Qxr@^^V)=vrcTR%NYg%I2)mnI^Z(nxfqw>O>35G&+{fm4um{oDZ^4q;GYU*5Y zREHxMk&4dOXd()vcD_;*1sz>D6L|Fv+zNl$Az+nCh63S+gjU6IO(B1aXreAy?a$qt zKITkC^EpbA90q+yPoQ#Vr)T;GgCtZ$-3+iovtG~mSO)1T&X^azzZ`fP=g05(e%G`D z?tzp>`Nb3A@RjV$qshpU8^RGL=?aR0X7Yj%ed0LIlV`5>V#(97n`_IW5|4u)ezg&+ zEPsbYt*M&J1b>*Lx<#F%Iui~Jm!G^QK&AQiA*+CX(&(0J+xGKjvwS$hCyCw+r7Ms$ zUc%&u_f_-)&E1046*7S#;>5D?wka~+-{G~sv1qd>wQMTtj>|h$(V|hjZQarFMWI+H zgZR{JNNk8oZyZC&Y-pNU;s#SD0mdYi9n6jpA7|NOBZdFd-pIEI4#o*JE4uI7mK?N1&mkQ@YE5hn+Iq_HDfq`fnQyfmufH}hW)&{?3l zOi!nI+*D~jg-K0pY#khxvlPFL4EKNG4g5(vCDsUqMv-1&OaJZHXjEo_U<;2PJX^VV zE+qm-UvWgAMEp-R=*J!;H<6QivB{(@7I~=2H(QDYA~HoB`DKyo4G~nl>c|R|2^l22 z75vn1z14Z{j84XQRHOLULJ)Ij@V34PF9kspp&%aS6_E8*EV!&eM zM(W4vtu?5PnzT2F`mj^2daT}O%_(`g4&$k=UZFqKTqI@|@utGEU2eCW%NT1mkR?zc zPdtT0ah0O75X)XtmlRpL_fP?uW>_9dI?oB!HYZC**Xbv!U#@P=&yv+Lti^rb~$0ebk{u)bA1$j}$_JBC4N2*WkpB$Ln;&_G%(mZX5zU+T7h}ZNbyI-p`V?33hsvoib`cB1a*>oZI z(-W6yuT+5MbuKnN->GwL8xn$vN6uF4#?;ofbiRU{EN89SdkbaKY9gDD8#a5dnDBUL zqxQHZT=LUHl)7=&IdYPOHOb_wql}RP`QT}hzI+@Q?kI=!pgBgpd(CwD{aex?iIGYa zwO;UhF!YI5J`^X3svmrt1l^3&x+?8Igw=(!G!M=-vtTUE2K0W3-;6 zGWi~<9PT4de~Cw#`errY0E%+HUn0LXYw}0d2T^rRA$^=*gjvYu{Nl4(GU~6t#VAVT z2UMh3nV27QeoPHm{?*!xLWe(z1jQUqK@OPE&Y(QX07-3WtISNkYJ+FM{6@$9NzK?E zu=cslXRXV1+v58i1G|J>H2Hu3bDfoG1tCcvjKg!B7Nnq{0E`R+;#n?eVd`_h(PZXXYb8>8;=Z~@OP{U#>9p1GMr>L=rYozeuOqW zX?H!^gt9p0pvU48`x{s5k$I>EescIVjaZBYo*3OimzhJYA#MF83Y$+hE2T=3JOQEJ zqQ*LT#IsDO6Dt(AIA&qT*L5$2lW|wlKH+*Tl09W=f8L}GCnO`9Bc)SyjTvV$7i)D| zNwX)2iFj4DuZq>)U7rlU2~Eu%jnHYr3g$7fuGjokgCJ?5(tseTRU(Txq){hGQU09a zZcMCM;^ViSfX1#LvkaoWjSkSEjHT`$#|B(}#2t2whprEa(mu5LFA%BOITqhkXTKdL z%@3YUoQW}XD5Lz^W+^L|zE2c&$eioJ!lcw! z$>lfEXHQxAL<$`i=4oqlp}_uBHL)W912WZV63T;XeU0XW9Ay*cG9@<~_vXw3d@*?< zyq)iw-FGaApC(6Pl@C?XD>^=(b79yzU9+mcURBw;r1MPInj7oV`+jj}F4RjvB+3y? zOjRh2pxd>drR=tYmo>XKdEai4gm&EGS&N__n8+W#ek59L>s&b+8fq#dj$36i1y81? zetbmQ_#hh+EZv5L3a$GkbZO-@Z+xl6QwurtwXyO+oXbi&7DVzTHP_vfvCBC-w5}0f z7V}Ag`!??bJ+Y3*67OK{;{>Ow-hC1($5z}}DvJ3J_f}H=wdD%+Up-=TkQ(h<6HQW< z_cK#m_uEhTnkEQyAE)83^G$Ou!KQd;d`xT1-{W6cYkz!oSwj9}G!o%@+Kcy^I%2My zT>qV2@EI$8#g)$8dTw~rV~Nb-m$hTHN8BO{Y2IP9PHGxm<<)&L&ur$8EQ5zWuz8S5 zOHN4b(y=K76JC_Q8{`3D(W#f%9W2)8Pvd-_@dbu7U4mdbpN#HJF4Hx;t>`bi{KBn< z6*F>~XV7AQf#NiG8(N*+-NTe%>rBIj>9|8*PJU%QAhoZXxkZ{j{3aZnLRQp>P}jBT zk9$&mU(S8+4FxH|>xS&=ApgUmD}YHjjZoqkX2J5kdFPdsd@}#eQz@H_;I%{+=4$n+ z%yz@sF+8<(m)>ny4<|vgLxbB_aX9Y#K{UD#uR87Js}^z@sTZ=DX5k)(o`{2TIvYbe z)P~>9YjZipxX9Lim!*UVq0jOs2Su>yl`+6pm9QC9%2zR2>ML#_W=(g-C@<2Hs5+09 zRg-4O9>ePPYRW^E?FpkdtROV(FF+7qBvq~N-wdK>G~GirRVmOcb?BT!H8owfp27pM z&`sgzPAOBux})klwW(FJcJACjjaAXmvgXuyw=T^$&MKE08(X`FYO6A!$>`X*fNJ~2 zoN3eJ-I)8UfW|L94$ignMK$%m4uk5c4~uHJL+bPv8aoEeKm6-zl>uBPN17|(Ii-J{ z^JE<;G?w~6s9Nff^QnQm;Gpg7sa*FUsIr-Bs)!1lda6jZ9(Z^JW~zef^Fj`QF2~gV zeAw2YTI$WBxO&~g`mTi!e%hUjsE#TNn$}l~YlnG4CAx<%`FBN3j(`eYC{`J0)EHRw zR!)1X3r{ndU`0#OGsgsb(N=4WUeWw>_Sg~L#&)xNefeF1%D<-R-EUHmSb-w83wmwe&4^XNfwz9QDBKY)9i5$BwT-#`P zy+w87(-f{l#f{t^WPJZ3TZZyAf_j>BG&RsIhxqeJ8B??u_EG#`g1xajrkovT1WZp0 zRhfEh38RH$B0U26=CL!tQYbP*x`Eyfru@SX3BFR&aaA6y8x&S6_-=Zk*hlC)>#$l` zvGATXYWvRzp2&qavQCF+3&Xin3^`6xNT_8Hx3`~GuS8~)C#pSt9UH|s3Rar~^Z7=) zIGJ;=v@NSFqZ{{l2fy2$V7JtenGEQS%rKtQ@+neJ>GHJOZHPJTmNU@(y3c`|5u>g>uA4DK~~gdT;xlVQj>0i8Mt@*LHo zimY*7be6ufut~y8p1>K~lJX z$U6kaSebVoX-+t5eitN2UzY=9!-R`Xb>>du%8n>zBiOUfCT_lbwOTT&8#dE)=`tsb zB_p*v)=0-c8*N41?hL#>Xs8&{G1F5_#pDd^6ou@mWcz+&Rl{#9vBltm)&9g~vQK1p z=*sbG^zMV6Ej#~6{10w?j<(>nOxvg>%nR}5&quWu4Suvo74jHw;=MAG5HP-75_~DW zexU9AoT|8X@u3s*h~+VIKH3(KdML1(X8Gh>2)u}$+x=`Nv(j)=9uM`+dEQwH)$lh) zxn)Mm+&!L;RT||iMA)b|0}bktm-;&j9^iK)DSU0sRJc*pzQ4r!3nlRCqd3@R{r8F2 zY$DD?O#(I}@5|r18LEZ3ExqTZ?U^yJyCgN4am(h+_u)Gc) zs&g#JZ>xQ=LMfIED^F8Q?TC5Dpq(mP zVDdFGYnz&0k>m!v2=GLaG0GG4bk1@>6UBr|hb4zgY>Lo_4HbA#+rX12;z`+iNHLEU z_=`P-UcK+fsB4g>>2`gaVV}JU-X$qQ(d?~rx*e9AM@7m$n1AW2F=d$wwU5Ne=CJeS zo~&;AY33O$m*l%9u~nhZOe3djbtoiSSJLH+M@@V`}@UH{(y=Ou@?MSkN>V;zr&~#0E%_(rq#K8RD*b zcqAWz)TdJTO97Vk>V56*p}E;yTny1Ok2ZP2u*9}=`?~a%GSx%?uG|#gNqZa-e&Tr> zIqxxA2EScINtH& znOd?W-91^qt{YvqJsDA%Xh(wl=EgNNjvcuru&j`~a1hYoFFUL8&87& zTr$kUI_zXCtn)qeSPNX*dsf+WxhvsQgg(j|%Ye+6qbY;MR!-=jo73B$yCaI)y{9vc z4sOqVDNZQm1Ipx7b+#wJ@8lUi1-pIyz116a$Gp;bdm*a5b^hrL-fT4;p=(_Pp4-pi zHcDKbHuT2B0pWS-1gu|N0?n$RTn=DvJVI{J6y4{xB3Xvtww*QSHtg_M46_W~Sfn=` zhn&CdevlQST(2~oj8DB$D6)~6pp<0mH#8zMo$quNs@g6X|IB8%GaGlx<6F;;t?1!1 z?^!=yUCmJ~iT5s<_tkjBP#o(kl+3dX=9=}=tBs^DJMVk*625Q-2X@w9UiNS?=qgU~ zelSZ458c4jN5x(?XQSi8f83mPa+#VfJGEvd=L-&R_OlJ6e2xFbOhi-4?PL6Xpsb!| zf#vSWy&<#m*B(Qs-4@Gg?sn#zEcRs-7w`kbtHi_Rv;vW-)~F@9QlYAA(lr`DgmN?D z$hHjCAFdxU9ic!|aaXU;fW7A{tHiE7)~qpE7GK86h@sH#b+c?YouNL<@Yxfd{VI1} z!fjjX_ra@2usya|$SHhFU!>WhuHB6A;z(w}cx)2uufyXPfcpfQ!VdK^_Pl7JVQbC% z>~!4~=8Vj=IjN3FocTmdfnsnRc%5!D=Dj(!46cJNhX&t96@M=2iw_4lHt=HS(e@+` zxm=3$?7HR+aF3}@*$S)?m?7v%?uU0|Ul8OGHR{~32v8y9!5YiigFJpD|D=|=ZOr(g z;dGo%h$tM|)eHqY7X2)tgPYi8!nKwl-$Rzy8-3!NfU74G-ze0s1X}FtusLZ8(-lQ} ztZoG|JO79(-d0Pc~s6|atdN3y%a<;q$%x~rP`g^1pITw?D`3aj(UgagAKEd2cRbT<|c zM}GPXZ4=JxrItxM)meWd3=7AwBCN+AHsb|Lr<{`c%@+TeSQxK$V{uZoMSccxvwqP?ma01w+=fk||d=ly@Ud+)F& zo`3OIL_q~XMMS!aihzKC^r}cvnt)QIN{jSfLx_kJrArejp-S()2Bg=}Lk~TakU$`m zgd`Wg=leP5+~@bZ&vSqG{CD@+XJ>cjJ+m`AWoP!a@0k;O3^KcjMSvQGlruWqI~zia z36P}PER7AE${~u)^Jdii7d`V-KA}IZicw3~I|5ujhtnCMXs-~D%$c<2KGE-eJTj%< zgAacWaJ=rl|G-F5nUX#0*1JtJ+t=1(?H`k(Wao2_=m{Q@5)4eCX`YQf$2SBrE(4p6 z))~(zeWubqLR{Ci8}$J^~I5UJ~%4_+8fxVjbaMFv}NMYd=T|9+t|>g)C7A+xRy zrIf`z>QC zSL<7XHd+Ij9H5=MtkOPt_k3!u!_L05-@c^lJ$|}i5VijmnC#stb>sabbOEvvd4#s9 zUv`12Rk_W48S1gFa%C5}2NY$CW=3^dQtdq4og4$nFYS~fioA}R$xyG0-^o&mkB3m!W|q>7ZP=eb0q`em1M=D5 zqvgs3+LCoGZ)#Of^_A65Wv)+kUj2}^o6RTvX&0Tv;J7Kr_3_DN1FNy^I1y*htGRkfY^wIrj%=R=Ynn5WJ8>j zrZ`uB-DMUplE0~(i&Ig~3!_>PmWq~?+Sx+^;v=Q9{c?^!DhFo%pTgT``B>%hj}X~z z^KvcL@8&0AmSIsu3=2?X<|$vbdP0^prR{Uc_>Eq^3%ST=PizU1fwp1?fenA!QTu@r z+0%dy=7^s^w%d=OmKQ}CUIl&JMC5RN&1g)0Af==s%APD=5R>`3g*$%9uRShIfRV+9 zZ!uL!cg%=lFe2p-O0wsvpVH{pFJb>r$o9U?W8m{;iark8T(||0$|0Fvr`Xg6&O6*WwkirXe+hUK?@D#^)s ze8t9&+48DZM{@kLdHyKCVSqWa#_}6l*qWR^z(=fMD=Yk4L3Vn3&;+jcD)-_s)$%*Z zZ**O37@lp_LK6r2z;5A9Gqe?aLRBi9C8(g=+>KdXAgFKX>bS@wb@uJ9s(6z-Z~KQk zZe6fWMCIP;vQ@R6)bhT=ZI6~H7!oim3oz6c-iR7|6E;@R-5OkxZ)|9DV|nJ$HzUBv z=6|u;bcSD(w-G929`l;v<3YZ@VpA1PV_70?@}B+ zrIOsZ{)?p^a$=lzN<#gb{ry)oHfUmINrSnUHUVLY2A+Cs_nNv_F|k(Q2V1!!5zWO` ze7}YrM6&`sY4fB2Zoj%w&km9=i1-5$+b{7uY0%sqk@Lrn94}Uv!Nu%HP>sjGX zXM-1oHCIE;u#d3Uo@C#>PHR#lI$RcM_cTFq^dlRy_M^zW?+GNi@d>%1Ve<`vNGy0j zXi@+6QhC{mg})ph6rEV|YA8E3u`~5gX83e!H&>pINc5K#y?zdN1C3B$m#l8jO2L;2 z&*rn7rZTjM(aCq^qCfh)S>N4n@E^Afo(cP2E=-+s7izu6Ba;+p=k``sS7%a)zB5^S zaOC}452~ULSI@iU9Qyjvlsl4@(ti>HQZN7TDOuKZ%lAmX7XB+|?DZcd{N1;Xeo|OZIjYx|v3HDqz_E9+)zzO~ zON2gO3cY`u;?uC+y2||knzv>a{WIHqI4;HAA$56KnK;E0d((D}$9;I5r~F5|{ST^$kZaTa zZycnq!D_oM20xIHjc~abd|Oa{;ME|n>Bv(>o53mNkEge+;x1VwzF~4^5f(yxUQd+M zxjt%T=c5)*T-u^dB)fOzD^$HQM;l{I7^fO1vFv#MV2d9;kpEmXtuWr3=7hn-a8{asgXqk-3zc%!d{%16M3ro z@XcUwAt-*VxXd;~Q2L76??U%TVVd#-b=_qfd7W-L9q~7|N4EHsM50y{yhrl6xPSDY zPj?WJ!Gd?%43<n&>|^Ob7_ST$an0lx?MzzL%G)q_%Ok658h0h<``T+^#weY+LhZbVdJjh9Q38+Jv230rIp6h#0B=|xha`Q_ z_TddlxyC9`G&-a?%|ontH!{0x=#LX!7PKNoKPsECySHg?T zTZR@7zkt6?3n-#)2?~5cl(|9zh&y*53EuZwhB!5!^di@r1Fm+TZ`CyZza{`JvG}PWPDApY|0+AKyLTe=zo>)@{rB zu{M7W%u=s{c+VOr={otd-Y%iKU$sc(MGg}%Ivy74(s>jVzq_6@X+CE6Zj6_!MBx4{ zkhY@gquGF%%9hk>w#WQ=KlE`zpaA<2LYCImWc{K2# zvKeMQljShr`*RN4fhSdsY_FB9udNA5`X;1)@3nn|n$IjL7k|^sj{Oupe?R&tK5ph` zpM!BIm-{y~Zaz;1r zSKA;o88*ys=XUNt?Ph^2=gUoAf&SipsTa?DwMVD6q+o|j3Nip5JW~;eFh`I_&RCy>w=nc9?@l(XN-MJq&Q;J<4 z-04may~XUdn8eoZ^kp>x&q-*mkAR`c;9_U(^Ckk1U8kzJiTKcyZaI`D+Myp{GrO4T z>|yj4tnpEs=d+$Ao$sqdj~DK*toYx3s4F$1t2J|6Xmk==Q2ymfnG0Wc-!aS+6V?=6 zyR-fvFV~6W$kVA?dc(lV=S>`~Ks89NV|T%!NGPSz$o}^ypyHN9scYKY?}Qlj2Vase z$CRHI>#b8fL3lbDg&Qa^D@#|+8y&j14Oqxg%lF2O{=deo+;V9-kDK-{k$GRZc$}rg z6(u#E(`2gXm!c<~MRI%N_c;LtU*7BwooLQf%n0>t*!alKSY>dr{j}01=Gi>csfI(1mA`ED$N8}C zoUK})_`Vi#T|>dl#6CHv$$5U`tnq&V(M%g*A)MvD;8e$LhR^MvJ1&_~9xatA*l|LB zUl$S_Ub#f8D+fM(cBB#Jx&8bVB<#!^&jHl%OXvS?VZdgxHl7@$?oe);}awF_)kW(&OYig`BvM_uIUw1<&|P&rsFeq8MT(Y`To54yWQ}2 z9dRR}2C~7|iyt=F6iyaBPg&PrY_Wjkr+HpitIW;we_;PbK4B^h5v50ED?+T( zA-U%MzR=Q)aR9{KH)-genZ?x9eWeoLOq|H~l%12#$zx*fkhPLkArP-XlVt^Q@KNATX+2a9M$dr)O$ z-z^dEmVbl^MIW7%j0(>|=776vgR4rzd@zy>_)A^EqQ<80uju^)Xc3S81w;Rd4~E74 zFAV(`?DXzh@Q!Z!-@wp+Zf;_+``=(FP%^oRvP6NW^R9${rjR9iQwi(Lpu%YB%FI~j zav4H1H8SCFB26VJ<-Rl>Sz_`w zhhA#?VhxL7UYcuh)=^#t)prg~WTw5HaZ9;(+4Iu+?o4XitLKxmt<`^3jYg#n*JZ-PsHy3 zia*UL{&)B@{r?DmnlrK^OI#tladpa&#dAFfHZ#*CXJtjmqv!FIlQ(G}2#{CyB!={+%f|-=q7gicINqeB<$VYMaNE@56qYYq-VBJ_h?z^aw*w5+(NB3ptJ7 zr|xSqK>GC{2L`U1&DN(;5UW?D(fxfu^zd6*LLs(zZMG#i(zc6t+~n1a7TF7#04@Qvo=uY2r^db2WZ#abC1G4KK%oqPY63Kpib zmuxMG^%cQY-*6{iG4{A~^vQRvn5Y!hsz&gq`N_=e`%3$MI7`Zi4%bcjm4FG?w3Ul% z2aj=CJ!=Fe5e^*Jp~wu=;>}3<@+keY@FSgXoe%CV#G%g;XMt~$lf!R2`qI^_4~XCf zUp8W&9qo6EMv+{3IHTQac+wB^^-(%vec#Dg4J=d9@bQ zhVTWI^v5r<<+MqcYL?ZMqmaM5H5+B9aG7-=^*i9*X5;$>Wo>t?AZlZ|r+aM=*C_0_ ze9SLDHI>2i{V688u2FB=*?xl6fa;GvhZ zL^cCX$eQ3tmAhfJ<^b2q;^`-X#DtgoRy8p+#%#KtYGscV=M>#}x9y_il5FJrmPo&f zG2iXc;!qck@$MPYKJziAp*j0DL1U-K|7^Q%-}_t_Iq&hQZjk*5P5)$MO=A}9X(eyn zI3VD{oScqBSGT*S)0?7ee)R^!S=B?_B1|?v8}j*0HdY9Rr{6Dk*T0|2>i_W0Fr3#u z)(Qn|b7Fd4`$PiI3{wpgZzpC}gjvXi+;+QU< zzDzD-jbSsyJFPM$w_jfyQr$lYrzy+@yEEx@>`|`2&T4-B@ZfNkN|G|pD|qW#$i_Q5 zn-AQ0W4HmWC&)%&u{J*{biejB+*_5~rMXC1D)0ysrx(FfS@Dg}e}&5VzSKVFH*P?U ze?hv($L2kgPlV~h9FKL{Iq}a%I^wNbvIOUHkDAra%^~sLA(6w?iX-I?Z%0sSkkj*1 z2N|m{zn`a~eR-?uEjRZs3%^NI?o#e#l#7f@j_2#<=y~9=3SBDT_8;6=Wk5_A&|UYX z>v{HVE#5gxyiiK~ebudBt`K-@nl|p}wFFG0p{8EX=k|T`XsVrHLvqMa>`ye}xszz3 z!S$lW5wm$^hrGo0)wL=6t_7+|Hhg@fx#Z#F83#+=N(Rr;x<`?me;U{6C*a1)eKNsb zkP(OLwE+I&QGtQXzJS=431U{zvp*JYhS^Wq4E4DZ^LdRJxdf2;dww5YTA7*_lX zBT|~VGV&qt0LieApkz+9bFfKU3h~53>_^kb8pZGP|6%btoa9))>iK=$bR_*|nSRAm z-}PbQu11- zOqX1e9D@(TqhwF^sU9lBECpQildY5#>~D5_2aU;SjE*AK1K8Lnhi{Zf0CxyYhfbSA=f&VrXd z58^#zg?-nbOSd(%7gfg%nf=ndRSYouTHKl^w8X_RcRgRLeac0wL5*uQwwmJ=SGo98 z2$gE?iv}3gy23s}>a?FlNhQ2MAP(Yn^OoA9*!crQbpWUq7PvVp?weL*a~!Zj0G4Y zNJi#RlV9G?)_irt@23gvXz-seetz^jbnA3va_$3qW$wd-|I@|d2BmqQ53a7Z0*T4R zD=SSyU6q#wD47O0z=p}w1wRdJRx;}3nw#xv&N-w%!gJ4g#2Ts&cWZt%g;7nmrMKj`r_2+qw;s!@0ih1J1^Nu6+3i@(AG(-=wAn0u|CgwE`u6g z6>jhTh`|;%Nq274dE@IhcSm#&rDFG$k zpM*XSs4w->rI&wWnhb&-1;{lPF1xh_psSSVVF;Ad>Pi`e`pxpL;m;$^^j`bbkw+IeZ7{eC;9c5H_>>EiV5O*4+6tXEz0O)$ zbq@A$sa&mx1Fb^{1vRpzehcpymNIDuUSS&f(qcluUL#R7Q+_yc_*fn+z;8a&wfe%- zj)MR5ZLy=-dbU!`$gUrBY2^m1-KE_riiNy|2a$GlQ?~Yiv;a>p!7{H#Me-YR!5!LT zphGTnsIL0x^v#Ie!z)1xvh_r?X=o|)q1f^8%+kr%rbN+u1^=CWG9hxVW{WyzZTVL| z;d|LO@lA_Tjca?l>c%sF;y<$+1>)PLP}5?{9b1o4sPBqD84U74SK9a%1Y;t z)F@H1@Kq6@&c8oBbN{PXGRk|ddeb4!f9{;tvHHv$sm-@mP>RnkF3^gzp}lSG1dPgG zH#od0wWP9=3RxAJOZFM`O3m3aXv9$aFW^!g()$h|4@$`z0ftr&;Ci zx#si$h=HYJKZW1`E|UDbkgGTslZg5P|1|2ep`%yrNRx-@@=XFI_K-knF}FmfEO014 z8dT*#o$KYco@?r!Yt@=)4$yshb^|qp*kib$+r|~IuUJI&=906y!=JA3*MccTZzBad zr^@8M!C@P#G?phUVnNX@<}5O7di4kDiVBLw^){63cf;4wPK zx#u?e=Q7?o=Q84WsGKL~-vjkup$xJBj%e?#1tQO;=^_HCiq;~0cjjQ`xe=)it%Rp~ z{rL?$DKM*Ce`#;f4s%JOw|729x@l4eVJ}{k+X{EmQwLS075~CJHAzSVn)6y`G>4-| zNG~sCXwkWAX>afGS~8@-J7<>+*iN%0kdyIL z-eN}E!1*CHHLbVKk}XNID;I z`QP#WxAA%5?6L`t#N7i}K3DFi=={&(1ZL{^zf1mqyE-pU^P_e<&u%DblgV1rcdrF@ z^4H{!s;1X0$xOjNg&*cN5a|AwpcQI&0TVf3leto`^(_21*hG$CAHIo^iyU_wo+~By zqiYGM#VY-Yw3WGqDpCp9zARt5t09cUzi`Nzmpcc>lX1;_@))|#Pqr>NfRPF~o7GMp zf~v(M`<;qFrKnasa=@t=)QXz=Yg2M=vp9GL7R|kH3fK zWg6c9#L*xHN>Mm~AWi-TIpQf@LNU?Bncmz8CL^sfo7u9W+%(KLxsJ(zR<5(BjASxo z^VnoxhPNi#ADNGg_QM$BRb;_ylBIj|RY(9LsF#5IN{R)f`O+) z&ejkz?aoIJa{h5?y`HwWT_-dSbR<%8e2ROHZP^8tGJ9|99!dU8{$Do3p_cQh4>Xnv zb-XT~uUz-;zw+}L`JW{GPt5cDOtaVNct-oRfvmA~>umK>>gVvUzja@xoZKJy0gooy z9ERF1bT-90&g44J)wT%T{o+Ff;-@Vp8BxPK+P0yRHPNkF%C8{D$H)AiU(a!Ja!xr4 zv&rlci7l7Qrw~~hA#v0%&(6+%)&U2^H-XldJn&~{w0$*`wf6HI9ixnL!xrHOevir>7(fu(U}~oW$@jq6<}a;UA%7_Ae80R0ZUU_y9)6#=jDCVuxDkZA zeC|KCv5j4cquefZbcB-U+CdwsIrP^H1XuPSN@d4PjB9OuMru>I%-d&CDn0RYh*6N3 zZs*&&q5y9adW)~%S`4`xhUBRzpcIE|kDDd3WCTVrcm z*kP6V{M2B}L#sK}38oREn33vdpSC@}yUDGZlLxnnPNSy6@~#@2tCSQPvN2ycKKm-n z9$VZxXuQ4I`b)HO=kyDSiD5s!OZ3@oj+kP4jxrHjKq$wiz^hfCjrsKa#XV}-5tDk@ z`d7zEf4Pn}YDr;S%d{LgVu0Z8`>GLk!xr*!i6ZDYZ?MST(X zZSzElK4Ljg*K~9(@X2A@T@H!5*z9}G8HCaI*=e$5$+TQ;phAZvy_Juz<94d{ij+#! zlWxhf0&3DC-#nnaepp-a9aseWvR3&2U9DoUmnsf^RB@!;#N%ZE<;zGHTp#FZwu$BA0ir2x%d&&d>C)Ec@oYZv|((JOL4x z4L8ZR^4-2HF*BztVHFbS-5lxYJ}~@bdIPtqIPg!#&t1u=`HWZS&|Q2g#WXMUiG5@= zOK)8I({;bF+~xFrD81eg^^9&+YBdruIH!{cFFO9k~*TaOQ7i>)i7SXH56;JM@&`?pFEsp-!!7kdS0ww{V zFur`DK;JCEky)non^8zPbp!FG`fT&j#&$I)LkIHG%REoYFu^;JqznQy&%jG&8S{_~ zG`GGZ9U35Wz=vW@d{#lPdYSTc<>w9qP|8?7=12kJI7Pj@*I>$e0QhyVm-%+9*{8+v z@%I|D7PK5Q+W?%ZkhpbbHjbliSe*gzL=dvg}rex zc{P<2%4tsdVYQf=11OsWJ&^wRI0Gj-bUo*8b=0iCf`h_NACiOSgO=X~nh$Dtit}gi zHw^Zg^Dv^%!`M+FR%GC^>B}=bMUE+U{wQVO+;A76f-#p%Vw#DN6zR&Y8GAHKt4`m%yro?;>M0iN>X~u!>pd(>Sj*Bij#VlNBFfZ-&!I zf>Nho(%C6o45vlrZ-}RjIiHnO9{G;cdpj9Ua$q{NAATfX$1rZ*U-kg*DxL%uJwp6$+b#_$X)2SlodkF^pT56TBqI^+D+dzQ*aUgJ@{4g zlOcmtN6tJm0D;HQaFK@|@3>(C_kEgFS?oA_&o4x%Z~NE3pQVq|-5x}oN;y1_eBdmI zF~lz5IgGdM8^v&?K3@kmckQTQ8vxa`y~Lx|ro`iev@_WBezbpxZ~C!kYo|aIofF(e%;qLx z>o`}m=M?%80b-o)@;sn#!%rLTu{yM(kg10>(*T2eTqv*0NNr>_ecTbCj(wK)_+@(X z9V{9(lWf|L@I1_44J;*7dVXqIYIT&40s&1TMg#(SK_gyf$K*HCJ3dI~LBN}%okK&D zAB$BxV1?Q(N&!?6Px7*}D_Ak{3>qg7LdYrf5DXw~!-$_)ZvL|iYvX<7CoTH1@~|U( zN@YcJ_+i%^6B56;MRoXX?rLLK<6SROcRUofv!<2WpM0o8N`;?xki1YvYVt-eK)Le# zMDL^B^_mIC(aBgMNJgdCa$W6f0#pbT)|}_LzVEZ4?zi}xgX2Bvyj$^ie`{%kN;#8} zg940Yk3KV7LOE+e`&AmP;WRCb;EuBn001z)eYP}pb(5~=D{{W=kpHFW&VjudKz

    T(Z8`-eGQ@7CS4??gK)F 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%0DX8Fw(id+TAzpwNU%0T*D|LP6Lyjf+>IJRR@sI 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�Uqo<&4hysa6cKC-S)+Kz4H;{T43FtKshGIv+a`l2LxJ zut7bJjE)b#R`gUTE5=tZ^$Zp(4nI;{3R|zUNrf_dk3G4 z)u~L3Xx298R9fF2=+!^Fmi+3N(ej(SH#vxtUU6aRMe8c1INXJjwN;~Y>?c*2cy34N= zS#v=lchg5U zTV-aaT;@G|$ndMLwHsye*dH==t!-aq1jN_pm{~U+YviWS!l zZ_+aupN~m&e8}I)%o?8I-s%|1#>>oV8MS1nSFWW?)|zn-bPJ=A^E9vljJ%rg^r$X# zSMQtk^h!UlX2e3I6QbIiB$_O*9!bBoO^zjRT@- zfxABH^|@$pAG2ycl1+Q(UXkOhjIIK`B;k&`O6-yFY|cR)+))&k@-Bj5?D zu(@0oRt9c;8kFCJQpoi~A&9R`nEi4lL5V;_&ul{UWE3 zTb)X_Wi`%49N2o>`Nea%|4`l12{m0VrRAk|!>B|we|vg1 zv+>?y7I%*GL&I&rO@FLIYFC`qb-j{jpGAkx57gezTN5(Ydvj}^UP<=e^{0!=mv8d7 zdrlwENFRMaHnc~h0sFxR*3>XI^u`z6>O8v+IpY`>MSgm3X73+ofHB6LTV_!I^ZSMni6!h`1Nj= zBX5_JH=2%&N~5HG{oU|0$@rwQ-lvR02OsYxHkyA5^CT~IYw}fqM=w5)a_%O!a1`=N z5I+jdcB)D4k8tTL$3bv;IQBcSL<@_@^r+!r)q2zBL`IUiY|LmUA!~DSz73sq*xp zW$Vo^?%jb~S<--3MuI_3v@?p!-G=B99+@1Zk(WF_IE>w?JC zi+A4xa$apEjvvwGo;w(knx92?#nmA9#-@FiOVWxWN~mgHb2>??#u@y=Q#U1cSXg7D z^tnH*TghwF0X1L$$JO+b}BNVkzV&ojLQ>yu}Rszvm+o? zJ#+6~F26?Po2YjYx6Y2N*9afzd&eLC4z?nsMUdht>y|Uy>vrJy=?o!-mvQYzZLbD- z^*yU9T^?IIWt>0^KFMa?nOU;hRUx}U8poH7Hwx`JR8v0Z;Gw5hySR41u4`X{7V4 zUwbIKs8xOGv;dS#*S}bLyt@3;9e;N+dkx17o=sBs)!Lb*Iv=UeuUC^}ufKnWEe$^$ z>K-$~uBYA$X_KnGnivc>hey?@OMLW_n!kp0xo!I>hd7lFxww|6;-={z@1CMz2OSGg zu^s@|4ZRq^T7E~z5Hl7}s@x4|*>$zhK<)eRi%T3CXUYX!1%~K8z1$7IINx~uwtED_ z$~`9dQM9$hu9`DL_ZhY%GMH6-tAvCOaH-PH~gmVn+wKe zpFdR|jPV{&Xl1rLS8QU+KWALSO{;ICdB%Ju1|q4sNzN|tI0w<@H6n5D52T49WgLDK z8$A`jt0obhz?-`#-6H4y_siiW%~wr_-LHDt5M3|4VkPru#GviAgp8H#lGS`)Fy&nD ztuAZlsuidV0AE0#e(b|{{{bsw(N5VWB?-h{mKoxu7_a>tFqOK5*WXv#n=nbB3 z8_#pwzl$^|#JiY4suWz@{ee6jHl=Ete>2M}4)=vQDVQ*@_)zH#-lb97;+lUYfj;6H zTY4bVKI6>(Mw#8#=8pr{y^rl}`aHO7?&{^K`*BEaADrJau5Px1zr|KfUncq6m;Qs# zKQZz}^{KG3jRs99xES&RcnfuDs zIkhEw9mnV-)B%=c7riKKKbIWodH((HhbGRwC=YrQ+kKt;<8Fd1X2rSgP0UtoU8E}6 zQoa1teWdBNh*e@aa?} zs!g)Y2{x7(H0br!&WpkW>M(Dk`LAf|2OSo&p7e}*u{S788!Xa5=GN4vGd8}Q#v=FS z#>E8gA7Yr&jvkB6SL>xrH?Fufj^AoyNKw_jFJSy(WFPxZoPx^nU5GY@uw`_2l8 zF(;5gA~b?R5;Ww!gV1|4gnk^N-_<>A_@Vo-efkZy zUmRW(k@11+_yAeW_|>GQB|+cdJHzec7B=ApjyV?9t@|MqFovqHHeSIakI&N0Ht|ZD@twhxSzGtb~!_$|K z!`mRJap=Up7v)MC5sVg%$BGiJx{5ShTQn(g0cR_Xkxaknwt81tzPY(-ehbzh$Tt3} z>g&on=)0B6oLN{$>T_+JXoaS*a<)0MeFxi zzJ0EoF3!JFHcKOtkE#kcsO2}GdC_z00hg;BlE0WvucO=2$KqOTZ$(~U;TL16jjFIZ zQHGIAt0$J=#xWv6xtE8nL_fsc=sv;MFhb^Qf8^}7dyJeetB2Y$ST%Zj){rpccYi$g zYUPDVS2GTm#)c5=Y z+Z~jpvJ%rZGNY+)vXZ;->S3_5UudUXO#H2@$M3leJ{kylkMg{ACb+az#x&WmEBKL< zT9Ryx&a&$$q8V!RC}I&u!hA5V2R9el%H()9Jld5Y;ZaMFvf(x}1%}@Hgg7#0{Vz;C z;x}$sH{z^$Tsry|6Mif`e)9Mz0>A#;`r`D|1^MxnSjh?BsY8M*PCqL4CY?{!%mNt+ zU#`A=SGoqXJAo@;{{(2PP}=FxH_@n9YDT8`Eti=02OjQ2#It0q1#F&|7C2e`A^jR@ z5p-8Hq0)f+vrK4{VEC+b&1!s`wN-5sdt$J9(K?No@jY(idy`SA>zTU;#1roIIC~$hbu04%F37By&%XNt9gPn=j+CE+}HXo@C`60 zu5zh%4Sd-xRxWxUZe2t&J8bV*L-)Gs1iy{I*UgnzR~(eoq6Gu8o_Fld^o{U)iQs>* zh@;8gsCd4Pce6)98Wl~xr;Zk(8IE+LV4WN^YH8&DzZab1&}61j|K->8Yd&ZfNOthir#G1bU;o_71*g8>n+=Sk zQnsI4IU*LTq=b_v;*?MbESy9nC@7KS(P$z@35i0X6w&`ztsJAlU#*-~v}-?x`QBm4 zATxDujxe*}X~w&IW3xvR7+W8!l`~GC61)eI;^;67o?v{q*E_5**<|*N*cQ`B70*?^ zYdCP_waRE{K?-qaLrdKc5|9xLDMiHM5mi^rj#i&lS#SKlvVN}mN5JCxIPM8XBUvzu z5o{pb7dPat8Mvl3!LBuUg2q3nDA-I7Q-$uFfmgf?eqIq<5ql{_P&ksI%=L9G|6aT|x3SxYXqrX|(W>ettL8k#7#?Nk`tO4U@7UxlR z``%W|v}QYm#60~s+_m!bh3oZIC zST7(4&x&9h+_#?$pK|6mV`w5l+h6n_y6A1oV&KL&6iq`sWn2H+q~mz)(+dkD@41%F zx(UUL%SiVf-!(gQ#?anDF#mx)%b5YVYY&vb8PQtC$w<~4oHe4CZ_%YyHb5GtlMSx4 z2ZWwD8CM_oA+-M8=I*}M^_F;|8pp_OqGH>|v>of9a{<|zsiw2122PQ!wxh@lRqAT8R@^oCY%@cZ8-_L z|ESkV(#$-_wAaE_)bi&fUWcV@W zuvKWdefZG{J4ESzTCo)+@2=qSguQ{dM>l`;ukClaw@QrGlJyq%0s9}c{H zu*wiovg@W*9m!1`_&S^UhkA331=(G?A7eN~7d`hDd=m+sxERm=)-N|242`dd_Z9t~Xn19HEHm{sA z7cf`(R=H=cS9oFw$1ZUr#|_X=y;#QlErxmtpN^ZH^VPW4zwNI^z*a6vchE%-O@TB zT9T^k!@F=Z%hjrSTm}Dkf7; zef{I-m5<9uU;1Z$PPzQxj^cvVz3}2bIJrw7zj0hGb=p77_3d2esMhVuXUW%}GS>Uh zbUx{7IIhKWYf}Qzp^uNdS{t>dCA*d${Z!&q+3R;pPg6jR5}D(Hj?Bi|1veg@P8!-W z7CBg1#BlHGDP42gkqQHYf$MJSrYF`V@*cH-a`f`N9Wmz)KNxDT6X;XtbJ(MC$7cdV z>(OoWWcJug5817DO{p^l-A_Fo3TrZ4s*~>BnDD?2G^g!{&Un)=)8DEM9t-bVH6P4= z;v!CvLSv9onX)9&;e!Of2Q9x7B#lSOWOAdnVoqJ)Bg37 z*5y{`7oXOu--?>4d2col$bT2NyU9hA=h~&u-H%2dUAh%&k{w=r|A$3f|GvyQ!P{q+ zmT2*xy;G&S<}S=lUV7KtPvjcljT=3yb3isBPq(2h0`3_#Naqt3@j`f10cRT1INcsE znPu<6OkB1)p1)}F?FAv~XeQ`o!vpx2HxBz8R{BqDG1x8LQJGdLOD5WFIG^bduJ@IU zi)1K&Dwu!vO__Xh4_seXBNxW@^hzT6vS?Bl>u|n7-F2&^#5Yby8lFn|P5RCH%2@A++sg%>A$j7S;WIgCEtJ>>hCk+ZFL$zE{{;0A;x` zaRe?no}B5zcyu&l_|EhC*~2U+mD}x1;Eyi#o!4{F-r{{l7%1pU8&g3ya$9e$_*Fa{ zla1Uot>GLC(6=!8WCh!XpEf)?vTL?W@<#|_Z!dOG%JY<5a!Q#2Ah)50|L(ZnN zX)x3k>FU1|+o4OB>7K8Qo;+8x?vwbU@0T6G2uZNZqxg@8G_ax0~hH%-#7 zRM0Y6Od2ZsekBm`jUdB?)*C-m2pY{3B`P8NhXmb2rnuKS6~|V2F7Y>|n&)cTylYHc z-T&3autDRk#+>Huh5csSXJ&LJA=U!*Y>B>id>bmR=MtX9636)SUOatgaGMa5Z^X6^ z>T$FZf9e@f@`OR{o3Zb{_h&jU>-*nk)KGf^lJ%X&afIu?@L*3{ieHR;4!&V%U%rd; z&{?;3h350lIIdX3H?4be?!`qPkl(GI9zyo;P22sh=mBVONaU{5n{^}ymLoGsW7dMz z4-8Q$|Iqbt$n0>h2xh85Z$0`pK0j=6RO8}NF|&kG*usn`K81X)6j>!y{E|ui`pKGJ zj&QrNmClsJ!%pHMFw;z^{?R@d}B3NZIEv@(Ejm5`Q%?VX? zTzS>xPiKE5H4Scpwq7CDPnIY(-~YyBW8>#4q-U9wTT`g0C!wzpc(saqHl#&unx>mfhKcxk);9=n_Y8eVp7$*Vsi_+^yO+=p~>oXHk+ zgPPLamtJs!o{}P41}88Q%mf{wOQtnYzS$f!TR&t`#HDSwj@#YqkUq1^UKMGdOH;uK@xMbmQq03?CZ2~Eh|R2s2;bji7U}N# zd2N-vBL5(KiFNGxwcAH(k5$_ZEsx`GnV6_FsYN0&A5Uc@^!4ZM8z$5h*4rvMKb6KtvLd$hBON2v)Seyh)8{M3xfyv_YZ4gV z-{s?;J|!WUYNqSkiytX4i-@cBc_p^1QhwKLZIBOWzL!Ku;gsVk^%_7e!RMY6W-Yj# z6jTG_N8KM=Oe$NZ-Hu(C!dv9huMY6~v=xLG=Dki8v$$=4wO!Vve>N*rYW?kXM|Fjs z-CxT1Y47%3d}mqM`bo9&bHk9stM>$(3x3~tjrj=C2Cbf3@y{Q8bRFvI!z0#N4!$ln zFXSI=tdnOw*nMIDF;ZHGkDI{tjO)k0T~P2%**sjj6qbu!>Y&}^(dk!}n{+JP-+5YN z)|W}JTG7!VRMsxv&Lr}yK<>AL?JV~duPH4P1k3lGWjyb+XunUlJ=&3w_Sp|MlX8d? zcMozSqBcOP;+)6SYxL8(Ilo!^+lSckna}P%t_ckd-{_xI_;J5wL)}CNm*6yXbgaWf z_bpEY`p5kn)-f97NBM8A_A-qKwU583zZuCyhkNEu7C~;I-pD$+c2{?bO>3 zdhYg>^>NX*6Z7?@#=~x${f7Pml@qf)Cbs=>txsN+XuJ`iu?{~`go8{nR&L-S@A@9ul>Hgzj#SOI^ z*R&Hg`3?EUNM@OzS3_pr#2=3gpiM^zoRqz5{rHgJ)N<4X{wj$|iK+=QjS&sJiRMt{ z^jh2}Ka~=m31ty>vo+P%>MlzxlY<@tR>LuK?AW6mV&b}kvMJpY5pzqZGzU6!@gV&h z4_Phj3?-i!i(AQMy9ad*bsZ<)-(|QwBBB{?7@s@7*nP@;>2O6yY^)%!jv~`If%h!= zw!BKqw~())y!`50oKKrnB2$RFOb_t2ZKTGlWPMHv^P@2jV;5076_QmR{*XqmjX$F) zT)xa@Ae-IKPQI-mP)LqP?Z)+kD=7o?CuLDxCp6>v1*~G%TNJq3{dC9y zO^b~-{OSjo3D0iCGxpH4;_UK1+^;IElsptH5E3Rd{WYodkWJ1(-J1zj$DL+W=Pf^K z>yTSQh{S3Q!y7~A-dVOYRbh|hMtCAK<_nsN*nZsP&Ue$3%l#DiK&Vk1o6>%$`i=rT zuUjd=blj;t+E_bwrnNg@$jZ18bv+}38CRLn*i)e$d+WR@q7Ihii;W*pfIF^G~ z>|R{qP6@_M^qwz}ZMaijuXkrxch%jd(RrpE`jW7+kFNzC6}jnT_R&U&Y~~N2mwuF9 zN64uC{QZ5o+l8JJpXM9JR$A;jr7cjV@w#CWgZ`HeD4XfjJLiUVId6w|m-}l+)7i-b_^u*Z>^Xee=@zGcUFHpr z&~u*f`3R>rSu!7M9TQz6mWBI>Tr|Dtes-Q*EKQ^8#J(@0{RiK~hV!rN%1Mp%WRChgB^X&T+ zCO)$-ZfQC>=AEj`&#SB=o@bgZC-i!4x|F{}ws*@N_f_3rWcP+AR9b&e;2rxnBk=G85n3-Q z@6$_avG2~2XE~*{r%h)cx4*uS*y!C{pGx%A$E0jN3;D+b*7*%2Nhl0m)+V3da=Ln* zoV|HC)%mS}m4ND-uMfTS?_8YTDt}#>62NWqqxX1yVk3uiOvW2KBTg2L5_)Ydez(Y* z;sH`y^&L(Phb?08a62LyLoh$AUFo&IT_=NgtD?w>Et7gIw9$DH7{T zTc7TbB59^&%qY`6R2;?3tvLd@`c#sX{Z+DH>Uv#S)pYh^sekh5e9BfnB=w3ha=u3A zv04%t<*~} zdW#RKS|jH#V`?YE`CRgq=FTJRoxD2wPtUGNzFzJAJjxMBllIN@yZgb^p55M@afAmV z8DB4Vh)VB0Sy-Srm$Ta0;k<7lDtc;!=?jZHi(06dx9mahNd=eNCh|>ZlVX!pS+-`^ zdz{aq=(LljqL|Sc2o1GK-C1C6PdR2J3*X9qT0@CsV{EoU^KRv7)G5$A-pbC3nT|LZ@SUGNC7rdDlxsU4v){}ONljk|{4 zDSF`HM^A_ZftZ`O`&#SIeN(K~L=Nak;mMPyjEo9`85tQvq8J&Yf}$9sLPDaF$!ZV= zatEufV1il@&87LOm7z=Ja;b~LZEH``=V`lVr)HBB=C>x_{80JUJEju^0z+u%bEM#m z-lv_hH1y1ZY9l`&?u|^nQowEyD7Xtc*%6qUVP?jqOL^}ygt06D3ZfiS)3Dv^3l<+B zvQl1@*YItWvUz;p%YB_^rd-jEZYj(lbW@MV6; zX;jm7dw7Aun9OQaBk5C4*)@W}_ic7ERQT@NeS*T31q|iGa_LicKSSJWn9BU=TDK2? zgOwKciBAVr>Qbmla3#`lxO``%iognC#N3gMr%3Y&IvHH8tlr}c22tL3#!3yGZzxNq z9HN(rhLk`lOw|Mh;p=G`yJm$MfEO87w%>ld4y^fXU>mS~j*ab{S7sDa2+%~HUD7(wbisBIp=`b307kX42%QRXtt@@`UjU!wHtQK6jB*o4DNdn)bCZZL6MM|*{BBWaeZ4@+i#mq4Da_- zom32+bb>xBDL+h+RIot8)&MXyz!m~=?-2l0nxm>@sRq6!7qm!GPw*i8QdJOY$#`4W zv$o&1UhFV;a9?K7!3B-&V-{*)ufRa6)Vj9cHij4u5#(-Cs7FC34WX7B->(`{m`Q@6 zsd2XqD7#${_gC|&8IKifwjImNVpPL&@eW0_4q13*)ee0U2dh0p_Lfm$;szM?IjCV9 zCNVX$OOUok15pZQE(G^2^NLS@+5=Q$4||5>4S`;6qeII!&$Nccn~GLgMo?vS^+$^0 zf+BF$#ve6lIl0|H~aF3jQ7hiLGJUjwL4`7jJGJ-}bpsu+NX4|3$n!o3}UY zs2`^Kf*DBDLf%g(j5+{DzB}}Rn*{)gP?+l5N6<+|sAUx>oEpzTkhU^vG`j_tk4YPL zd{CyE2)JJV5{FBWl?X-gA|{EEZ+oal0K)u;&Bc(|MylW!fb6jOeb2VwlELKzOcNDXyeHE_g8{dQ3*t+AYh4pf2f|5bV{za8BXOo?97BcGtuoI(In zb%T`@MTP{X*2?E2G*-`dQBx5B`Mnw2843(>&*mzC0j>b}J_bbXYJyVufP#rh2CDO_ zw$a;1Xu3HQy`)BpUw>fPK6n&t0imD-$lr-xerRn}O}0>yOK<$7zoLHGc1 zf1#6>(c(oF9kBVAKf&v&fa@RNrPRI?Ue5q}zn5=lWCy%}AS<9^^y z*(SLka1AM;qrPwq_DO?S_gfyIoWy*Fy+D)-NpP^w=a+wSVByYk-xkogBR}k{7w$K? zT-Ns{{?){}cY}Art4HDw@OmuZ5t26y0a4^Ds0e~sr&(@m#C!(GUQ84XDA~(;If%`p zh8pP!K=>>{sZb@*Odi{rkWnkj>SoSCquY28hUcI9Lqg6k8{W~3u)8e2QanU4$pirX zHftnhmz}A#W!^nRc590YJTef>FQTcLFj(m&Q`x0m$F@@nOR&FjLp&}d! zbduw;+tsWYI{Ecd>P~dsk{kh1+t2e{Mm3*#sqJDUeXE`IKVrileEuTfvcj0S9WksB z_eT)JvX<>u^5?E6)fZ@@!>MUNo~hMFq4@Ofs_jyD z9%$ZQ+YHZAoX*Ua82>B?zZ$a5$jsKT0w_Q$Us6&j8QK`IpC~n1164swZb#OgtQ$1! z;PKtATOBfRxl=W-hySAZQ=O6P{XjEV1-ZYSJ;H(@h7YOM`?(QsuO9qEBR)wZH^N-C z-Q}Iv6>e92ZQEG0e@bUY&|}qVD)L0(uZBO-q}5WJ+A7GG!_a~C<>TAk zE&_;|Os->;Fn$gBGGLLKk-}B8Z3!~a?ech03$ZM`eGwvS10LUIq_MN-KfF%*0sikF zNZQ|jq~Ukr+V0Cf0IjYcnA)!K1S_@eXt5^C_zgR{cx}BY2?4;~lRvarlf5ZBTdef# zplH><@~&t`kjawUw)@W7rn_eDOz@1DTG{P}?LBmoTW;hVKea;B&`c)srvBmMh0Z1L zxruw*MXR`muWE2dz6tiJ_)|af9xXmirus<&fLFc1UkxBzV&=0T_qDif`AltND~1>< zzRmD%!wUz%OIt3Hg0y7lq^{h^82U2vr!4GDs)SlGvx#qHYEUr+KQ5emn z9wSDJ`jIIa=#szmPy@OS$Wk%Za7t_gk|pRt zq68h#f1NO@8RWI~rMg{WguZh7WA%Bi#8=L4Ax<`sFBIhcTuM&X+@w|?z65#|C3Wg-%D8^TkhvA4=6bz2XC=wM22#lg4{(sA!GJ>dr>~zTnob5#O ztML9LU7NY=@SHxlg_KH{-8i`lH5pj4$1Of4H*lU$5>(2tQ^9X?7 z&(O<(|AsvVjYpy2N*I_DUJ>v;8t?#CK@kVTVlYUwJOWQ5q5qZdTfJvGDaQX#=+Vjl zhCLRz!2kh=MZidk7$umzk~|isL_)z~2s|EzN23+6N;su|qy6HFQ%FC+e&Ii$_g(R~ z>~ZoWqyiEKEWcHR0Z0JYDw<%vWB5{JMlB9Z@weR5^!+7Q5g=|9+O0+&MnN8Do( zz-<we%B@)0M1t(#!SOqu^`)}A=@Qmo?14|T)fl=n4eNR^V4SNED z0K_^;0j8*kgTv$zI0OubQILnBmE;lfSORbrID+(V*!$$q#0~=5&;Ez@dD_2WPl7Aq zu|yIQ20#ta9)SYV4qQnAhEO6B@MwafB8u?8&U%! zdl#&`2XQ;={~Ox#cTA%x#gK9Z;Q=aX5S4ZXK-&(OzjMRlJ?xyF+~sz@*q*KUyEsrz zqnK&uR0Pvsw5U&v#vqW38}XtY(Tg%IvGYVqRoQtW-%lrM<0ZJQhbFk+2FxdD5?R zSD_=sa6ned_A}kO(4XjH&{%{L9*I*xVB}FsNF0Fxq&K1>23XRB0`mN?bkF8760?9Z zLD_z$8yCHkt~?Q;fF%(WNLUPzD*<^41d;*@kH;cW2owQ{|CR1;w|VC|;Eu19?Pt0H z<{wB1l|y#W{cpFb`IYXkcfa_D zE_c;WbpOk}Fn*=`>ovLm(0yOGlkR`JLibm?zg{5n58ZohJL&$n%SC>r`|CQqf9T%q z+e!Dot;+kG?%)0OuWJk_bpJ|uqdV#Te^wmqBuNS3U*}){A*nY3`R#1%-xMhC{58J; i{rZka20-DbiB}^7D3B>YAR*v~1bj{yS_T>?(EkHp`t!d*+?}%*^}jcjn(>2Tvm5s4F9*5CQHtd(H589CgUuMT0@ro$?$F z05HGH!MMwEGIO@GwtDIDRc|4NQi$N1bbWl|!)fG7nyELwX%%P{;H!s%)Xz5JQA}yT z>E9f38=&Tp^D9a5`-_L$Xvo+MwJ99a1zMhk%iN*{;wD6-CBw#%S(e1Lj0EqB2{lP) z+~Y;gYJD1KR|xhXjqnriCe9gMp@vP^W#u-T7ukhG=5;X45Iq;-1)uTZAfld5b$%vM zMmlg?Oag3rNCMcUrgf^Uz|s^ zv2x^a*Zlt8gNW6Ykjew0TH&Zc1V+lV ztWhXP@l3<5-#tR)7B$&j&M7Sw*QN@Tg)aS|@adXYPh2I4EbsTzU|?()@ujR`FcBAA z!0{yus4^)NoT`cG#d>sovReFD5RQ~*xDJo7>1^6*FIwQF8G2HuFXdmATcncO@m;O- zImyi;pVT=dpick$=M0#z(}H)=V(W`nXT%USHPeBQuiQDRUuw)6R`peshb{BJiz{U8 z@2}StO08=Jx&FB6P6^a=-V!NC2gyyM1%3RC0Z^GuNe?Svig%!6d+$+<BN7@}?jF@YH^8V@P&+hj(QIevLilR&{2gSCI~9o3dp;kOQXU_AuDUUMZoMH z!$d_Qi0lZBZeIs{3ll~`6ivR)yE_6QJY;22&ZP_N=U)s?VVNfXR5;n=lb%3r_mW`- zdz1T#vA|)XEa5VWaDM}u--ow9?SE)`eeS=-lO0{W(EpLDf+iv!Ht?=ZjVOjpMJ6dB zj~*Y;%lQY4AVK8-W4k9 zUe)AN=frnEWp*zOj50qPTD5+w&Ge$8WLh89F9^Qp#Vtg0sYcm|(p+6(R|$SAUb!?E z!3$xoQWy27%&)A-2A;WRLCBBg!6Qg1uM;fIYUGk!hA}q#o)X)?_B%r!gZC}xMO410 z!QwcEN>7)?VK&N_h*w?1Wy%V1HG|*-z1T4qEbgphQ3_}|+?6VPjjwKFSH76+p4aiH zLWU4Oi+Fft;=cmEorC4QKG8f@*eNM2Ifsl(z+`j{QqbQSF?bl2=J~WJu%q zmDX66M0|tI%h+;~U;Xs0n>+1`sh=1hIiKkC%Kk8>E?Z2qUf!bnEC(Z6J}r?!H~NVF z>ldB$oVYO#RAv?2zD{bOaP7RD{3!$-#WK-r2%dR(;{mlOxPqFWYVNZXd1Ot!4T_OQ z@}_S8-tMMonV861t?%r&O{Yi`!Mxt$!RY4rK!?+IdKpeOHt{U);DRS`4AtnUYUhGN z8Ba7@%T)acjV(zo5?_?&jp#e}DYrpE_9>zF)-~3lwT)tqKGoI+^&W1&#+e`v$HUYK zdId%`s;vo9xdwilaa*q+%;rD$O!C0xLx%-36Slk_likZS3uK_v zKu-OD<01EmQ!4(TNoa8|PJ1k1i(SCnwV#UVQhH*NrE*-LO1JL>iJ1Dtkhye!DtlLW zIk0}NY(Ug|ut>}>HmcF2r=JuumU$w-+5L-)Be!lZl}QfFz*#az+u2spE|vH>;ui|9 z*=JKlSrfTk+pXG79!MsopWzh~pW5CsW%%4PEwr(E>HMkhiA;PQgAU|T0uOYqUaAi6 z*t3JhEeAShg&(Wl{&JCOeJFJU-y3}%Tk5Pk*uNo8sdPM*u_)1ewEim^(%tf2nwUYr zSUdL98`W*O18QXG4;H5CDaIi(uf`vF0g)oao}p}r?KbygbWKxRR}aKYXxnwjhm@fX zzXg|&;rfN5(V@u;F7Bq=M;rW7)Ye`C_4c%8PvjF9rsBYuqAnhNT&yoVbgB~T_PW}N zb_gcv5~JM0yyxa7QEcmm1+L+Yr@H0)-b05O>Mh-3Ma{buduZc=*KBy-GLmkxq@=D$ z|KT$=Y?4Ppt5|W&fOsGgZ61&)kBBHQh)V<{3{A#k{QuI1@xC$$3i1i?SO|bP1%xa_ zIQjVmEI5Vv`FJ>a&CIQ>g!n-qJ`3xro`=au^#2DWv=^Tm_n#G4l@g?4;NClOo$g?v zwL3>%LJGwfCWSgv%0i5^7KDke*~z80379X2Z;ImZ(TWG+IdS;%EMjxi9XGSQjQ? zUS$r^244u3F$5Z+W4S5Qwi*Jt0s1v`MT|dA%QhO>tT!rq7TFbxj*`c>h9t4UHH9Gp z4B6lmCQcohY3i2c?w`yW-q(2}wVAmuMqbrhBm7#{!~AMq2P`N02U7UD5ugP=Vpg0O7FRGQuFBbm?U$muJnC3|49 zqeUCiNj-D8-ww|8N>&kP9@@jCb;f&aZ&>EYYrc9MKZ(SX-$x&8TsQq?=PQ(y;l{1n zOk*V(n-JDbTM|&_xu;0Kuh%`3(?o@@3-(m~=*K_nS91mlt)sR~XtKDGUWOeO8DadG zOPZV=a*eV40^*fQeVfUMKPhg1;jVw`UVyAQZN83Rfe;Y$=oW*=9E zH`$gg6G{p3Th^WSDwWsh?~z7aBu$)y&&gIE^@BY{VSr0fVb8BmKOKk+3}SMtH)!kE z5|oFa;^pJD>phO6M}CT5N6D&J>7pFO29UrJluMi6H#sY}z`Qb<7*2ZG-ea>U?J=W` z1{PzxRNS!E^;8X_C@D|OlYCFz4U1J+)fYv{f#yw;fn zv!sJl-+ddNu-8Mek}$^Lg74{vUA}u%h>ko}VQNvkh<4mMKU^S)CmcCAgcV#aHyH*L z!XD@&uIOD#3zb32Kj1L`aA}&xNZX;P=Y_ly`lc@EsQb$s8T%(?)dssJ9}NYwGW7ML zmlUfZ>^^}X5BWOg$}PoFBo$x>(v5E=q227CPr1QL$gTlLeuiw7maa6O!9*1R5pVNg*pWpGVZ^?%>38@6bXgGG)J+ywwepxvw(O_ z%^GE4Rj->CrXhqrm$V5sQ3BM0Yfe8<8N1a>Z5nKuASwv$$>V-^N=WAW?HR>AsYlmT z&NJz>F{KS7C*|)-HMzr{HM}TS2a&0Gg}0!-k8~y&ExEKl3IYi!Y{gYZ5sj#J^ru4e zQG9YyAvR#-96SpPQmR?Kz6nsYc@n_`z(LVSj=t^J;k9()z<`Tc!P=2@j720(|KKfu znY7DfI8V~+kJevO2P$2CSw0LkJhlmh#Js=Az$BELJ`RG#+(diswI@y;eiCaA8_N5r z*?n$M|K;J)Cv(THCMuwkET=JT^_1W-oEL}jJ<>J$ub$%fV?ZOX8Z!0JxJjxMJCjpo zB4sSu?6@=2lqsT8H8oaigEYdp2jIG@wVUemFkW6?b_yQYMb42pw^;FK+jSIw2v8{} zTmzckc{99kY>~MS7I1!q+N|^;q_1i8$r%h3%2rBV&ZvJ5ufaf~5dNPbI!F0;`hr$C~e2RMwR+!Ist$GfBFf zP&EJO1kJZ+-*Rc49<(1BwpVs>LI#Qx^%?4qe`0L3NAqV*Mg$dx{uDXoSqjbESzLHp zL}A$AV)ewEtJ+|gBujl0?fbrRYXfu1hKI`?p91`}lBd>5r z&dEE|i*{8gc8%kaH?pWWg`iB7!EFjzZ~Mov>0O&cEQW_1uAM#u7To*f7o9kIXbDp< zA7$=iQpl1AMpl8QYBH+N_TT6!zh-|H{l+fAZ~PQv{oyzkBZ29=Z}V?{P$SO;pfL%r zQ(Cr5By=N@^Ma!DG`ieC2ptIh9`UvoI-Kz(NAUY7_)JMoXCXId_T#pC8L}+d4s#D~ zUcQK2YBe8shvTca)Y#%%t+nAwm{c`j8kE2Gr`-fFj3fDN*h&IYaMFIdEQ0~1UtnUmc z4QbJma9IF7yyi}G3Qatb=s|5np-KZ%Mc^_=B!p>ZNmEZ!gxvbaf{E&r6VQIrZAqRj zw|rkpmSEkiN!J_h;#zR4HFF=!^^7oF8O2ts$|4hXTXk-+F(XCU#7KjEMQ%L{| z3dH5ZgvkPh@$YO=*JCh)zS@uk_U-|0AP>do53r(8BDh%0tDuVLezLdE{B5J?t{A7p zmL$LRtM4X@T*C3wuYCnFiVmmM1@JrdNTCV~J@&Dgd;OOvOdPuUoQ3wC7n@ZL8894V zK0NKmD^`ZuBHRNW+z9yuD^g4XTe7^{L2~&KniILtN!*N!J_cW9KxY7E%KcPlh?}XW z!J)ucsJtk0R#qU!VeG1(ghW2BehWAFvMBu-!k)@g>WcVF-P1CUVUTX__s|qIxt!4X zMzg7l+2zz}X7VznFJ%Pr>sA>=cH7q-erG?inqg-I4cDS>>4HqSUzIxW?&r{+{`k^r z((2IQE+jWsbLNWaaC(1iZJk@O?;#&M!h^dQM_!$^_3#7R#zP=*-7}n^;5^FXlm>I=s61T}%5SvK!)@B<&i)yIgoU zZTg2(KX!|nrq-FC0R&7cy3hI}%w^{5szlR!QSq&}%Ox8JSl9*mH-Dv+95D>WkjagW z;kDjz8k04RoHVeaEPV9zYnbV(!nV_Ee+cI%daHq7XOVNum@T!}AwvcL zCLa72tE|e>kR`B@ODgD2u0k`PM4V&9)iD({hUTYCDEWUV>?b2^CU`_XDG+hE;*CwK zTBV~pWtV~ot_TPiJ!si9o{dxd_9A}k_n)JmvOuq~T@j^~WnqCv zd}%EmCw}Pr0;z$N&!1o4Iy-!_@^YAFbQF>+dR(Va6zWxJp;JWQSRAWq=TNPkY$ev3 zVR{n(Ue!A>$}R!B&s->Xr=IE|xD<2$W#}hmXgp5A$frw$?Od8$ZK&nk=j3Pf?O10g@{td6_#N0k~V{arCxn(C5o^4 zpmB=E+j{MBe!jJEW$)+h`%PjWV;s;dUeH|YeBrBc)Qj|ne4Xru z*AVMd9xf}!56<{gn3T5CY@-fHp26D>taeYWa0~XTL-wWo+lN;W6YJauc!rC0`meH9 zdEQ3NAgrV_nge4<>z&!`+EVh5n^vu}QrMobs!b98dh0p$g-vHJtyMKlvkY$RRlOAH zH@y~HdV@5i)KJc82(FPscN{m6mk0&F!H2XpRxcFqjb3s&Ylj&T?tj!nDJH#UZ>(nX zNuHLRAGQWEEeDVgVr?q&~HP1$D zzAH4G_*=3cuIR}uk|fa9=28lttkCQCMT!I-F^9Kl2jQvxP~E2{gq|X~?IiDgVJ_I} z6GT$a#!z+%D=5UC--zQBMl!gquoe5BoL47>^v~f_1cqEH-OYsBKq#Ar07RqRxdViK z{l0&bWI}rIXEbdWE{3XOon6WVzZ2aA8eFSBI#T9}8{j z4?^Gr*8&eGRM|4*Gx)RBbSU;qpai_*fTsR9`0*Z#dHO!~0MbY%ZAgrf0%G>$s@`wD z`7XW*`x@A^&?e0E(Z2cPTSypVW_)!Yi|S?$iCsFjFU^WL}P_0+x5f`Y5*1=*=P$XTSh zqi&dGwi(Q0fi{cbn>_j6%PAI)7kpMp<4?)?G|h3N9v32bDa;IN*7PW~_lO1};NOZ? zu=Uy{*yMZ9Fl94iE(+Lw>C8Az80)zC;w(>(!_P%z$+o5Dbw7^kK0em zj1yhEySNOy>I9P8%l-E|-+3HpuZAk}y$d4M6v6*}qh+D=`=*Yo0l1G$dM`Kb|Gib& zAJaG9@nL&6r7;2kuun+HOps_z)z}4^d$}=;395B-ZYrsksJ72}gizNhGHa{QF$bf# zP{^O}QB^L)K3Tv)?-Hjz+8A~|ZNd z;RF;q7lEy+41pv{Xk*LPMr>G$*Zt>Cd()$XN|i{WXmf{=cw-nLT0w?gR*DUh&jn>f zlbBoW$BB>HVGCHvIkk4~d)ENv`Y^sz_b<#JN;VkZMxYA!FhX(}P)ObbGwpP+HEZz` z==ZzOblBf1?Uy>oJG>1^rS`|26|)&$9?@`1<8e2aQek| z4s>R#Y?9w5Q;__y5~ATUFLa#l(X%?XUs@IHV8>XOJKnrgGqoC}<6f_D+m0SJ6)q+I zlJmyyg)JXTp1|Hm9~XXib`;lwk6+WDn7}tE=3eBC)|)8uD&4R)>Yiuj-s--#t0fZin>oj*;3NftW0!Vllw2_7_T>-Ia{-a@k%bkD2w;uh5->X`c-zCd6h$(FY z0f0jEe?xDn|CGD{`hQCPE2RDnH=z3iztdKK47s=aue1I)+?C-E{LX*>h5wzL006Fk zH1m`h%B2DNjYPg{A#D2!NC}K)g*~_ia){s8RApO3M~Dvq+#gu~{pz2~5-R}U>Tcy_ zXXVZ1>TIK~jC9xB|14&~+^+9RA{T?jTm#weiGmH@-X&P8z$6-g9Gw4y{$Gac?;8FP zVWj?h@bc2$6Y$O3%JXhC1L*ILKUMt?Uj~{0*fA0^t^B`@#`$CIf1fKf0RRtMPbYI{ aGdssWW~1Ik=m3C+cY6RT0I+9q|MXu!82vf` diff --git a/printermonitor/Debug.cpp b/printermonitor/Debug.cpp new file mode 100644 index 0000000..bcc0005 --- /dev/null +++ b/printermonitor/Debug.cpp @@ -0,0 +1,65 @@ +#include "Debug.h" +#include + + +Debug::Debug() { +} + +void Debug::initialize() { + Serial.begin(115200); + delay(10); + Serial.println(); +} + +void Debug::print(char *data) { + Serial.print(data); +} + +void Debug::print(String data) { + Serial.print(data); +} + +void Debug::print(int8_t data) { + Serial.print(data); +} + +void Debug::printF(char *data, unsigned int uInt) { + Serial.printf(data, uInt); +} + +void Debug::printLn(char *data) { + Serial.println(data); +} + +void Debug::printLn(int8_t data) { + Serial.println(data); +} + +void Debug::printLn(String data) { + Serial.println(data); +} + +void Debug::printLn(long int data) { + Serial.println(data); +} + + +/******************************************** + +void serialDebugSetup() { +#ifndef USE_NEXTION_DISPLAY + +#endif +} + +#define NOP __asm__ __volatile__ ("nop\n\t") + +#ifndef USE_NEXTION_DISPLAY +#define serialDebugPrint(data) +#define serialDebugPrintF(data, args) Serial.printf(data, args) +#define serialDebugPrintLn(data) Serial.println(data) +#else +#define serialDebugPrint(data) NOP +#define serialDebugPrintLn(data) NOP +#endif +*/ diff --git a/printermonitor/Debug.h b/printermonitor/Debug.h new file mode 100644 index 0000000..046b209 --- /dev/null +++ b/printermonitor/Debug.h @@ -0,0 +1,18 @@ +#pragma once +#include + +class Debug { +public: + Debug(); + void initialize(); + void print(char *data); + void print(String data); + void print(int8_t data); + + void printF(char *data, unsigned int uInt); + + void printLn(char *data); + void printLn(String data); + void printLn(long int data); + void printLn(int8_t data); +}; diff --git a/printermonitor/DuetClient.cpp b/printermonitor/DuetClient.cpp index 6667b98..fb75cb7 100644 --- a/printermonitor/DuetClient.cpp +++ b/printermonitor/DuetClient.cpp @@ -27,7 +27,8 @@ SOFTWARE. #include "DuetClient.h" -DuetClient::DuetClient(String ApiKey, String server, int port, String user, String pass, boolean psu) { +DuetClient::DuetClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle) { + this->debugHandle = debugHandle; updatePrintClient(ApiKey, server, port, user, pass, psu); } @@ -63,8 +64,8 @@ WiFiClient DuetClient::getSubmitRequest(String apiGetData) { WiFiClient printClient; printClient.setTimeout(5000); - Serial.println("Getting Duet Data via GET"); - Serial.println(apiGetData); + this->debugHandle->printLn("Getting Duet Data via GET"); + this->debugHandle->printLn(apiGetData); result = ""; if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection printClient.println(apiGetData); @@ -77,16 +78,16 @@ WiFiClient DuetClient::getSubmitRequest(String apiGetData) { printClient.println("User-Agent: ArduinoWiFi/1.1"); printClient.println("Connection: close"); if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); + this->debugHandle->printLn("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; return printClient; } } else { - Serial.println("Connection to Duet failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); + this->debugHandle->printLn("Connection to Duet failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to Duet failed: " + String(myServer) + ":" + String(myPort); return printClient; @@ -96,8 +97,8 @@ WiFiClient DuetClient::getSubmitRequest(String apiGetData) { char status[32] = {0}; printClient.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); + this->debugHandle->print("Unexpected response: "); + this->debugHandle->printLn(status); printerData.state = ""; printerData.error = "Response: " + String(status); return printClient; @@ -106,7 +107,7 @@ WiFiClient DuetClient::getSubmitRequest(String apiGetData) { // Skip HTTP headers char endOfHeaders[] = "\r\n\r\n"; if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); + this->debugHandle->printLn("Invalid response"); printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); printerData.state = ""; } @@ -118,8 +119,8 @@ WiFiClient DuetClient::getPostRequest(String apiPostData, String apiPostBody) { WiFiClient printClient; printClient.setTimeout(5000); - Serial.println("Getting Duet Data via POST"); - Serial.println(apiPostData + " | " + apiPostBody); + this->debugHandle->printLn("Getting Duet Data via POST"); + this->debugHandle->printLn(apiPostData + " | " + apiPostBody); result = ""; if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection printClient.println(apiPostData); @@ -137,16 +138,16 @@ WiFiClient DuetClient::getPostRequest(String apiPostData, String apiPostBody) { printClient.println(); printClient.println(apiPostBody); if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); + this->debugHandle->printLn("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; return printClient; } } else { - Serial.println("Connection to Duet failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); + this->debugHandle->printLn("Connection to Duet failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to Duet failed: " + String(myServer) + ":" + String(myPort); return printClient; @@ -156,8 +157,8 @@ WiFiClient DuetClient::getPostRequest(String apiPostData, String apiPostBody) { char status[32] = {0}; printClient.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); + this->debugHandle->print("Unexpected response: "); + this->debugHandle->printLn(status); printerData.state = ""; printerData.error = "Response: " + String(status); return printClient; @@ -166,7 +167,7 @@ WiFiClient DuetClient::getPostRequest(String apiPostData, String apiPostBody) { // Skip HTTP headers char endOfHeaders[] = "\r\n\r\n"; if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); + this->debugHandle->print("Invalid response"); printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); printerData.state = ""; } @@ -190,7 +191,7 @@ void DuetClient::getPrinterJobResults() { // Parse JSON object JsonObject& root = jsonBuffer.parseObject(printClient); if (!root.success()) { - Serial.println("Duet Data Parsing failed: " + String(myServer) + ":" + String(myPort)); + this->debugHandle->printLn("Duet Data Parsing failed: " + String(myServer) + ":" + String(myPort)); printerData.error = "Duet Data Parsing failed: " + String(myServer) + ":" + String(myPort); printerData.state = ""; return; @@ -210,9 +211,9 @@ void DuetClient::getPrinterJobResults() { if (isOperational()) { - Serial.println("Status: " + printerData.state); + this->debugHandle->printLn("Status: " + printerData.state); } else { - Serial.println("Printer Not Operational"); + this->debugHandle->printLn("Printer Not Operational"); } //**** get the Printer Temps and Stat @@ -246,10 +247,10 @@ void DuetClient::getPrinterJobResults() { printerData.bedTemp = (const char*)root2["temps"]["bed"]["current"]; printerData.bedTargetTemp = (const char*)root2["temps"]["bed"]["active"]; - Serial.println("temps: " + printerData.toolTemp + " 1 " + printerData.toolTargetTemp + " 2 " + printerData.bedTemp + " 3 " + printerData.bedTargetTemp + " 4 "); + this->debugHandle->printLn("temps: " + printerData.toolTemp + " 1 " + printerData.toolTargetTemp + " 2 " + printerData.bedTemp + " 3 " + printerData.bedTargetTemp + " 4 "); if (isPrinting()) { - Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); + this->debugHandle->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); } } diff --git a/printermonitor/DuetClient.h b/printermonitor/DuetClient.h index 47a832d..2e30ebf 100644 --- a/printermonitor/DuetClient.h +++ b/printermonitor/DuetClient.h @@ -29,8 +29,10 @@ SOFTWARE. #include #include "libs/ArduinoJson/ArduinoJson.h" #include +#include "Debug.h" +#include "PrinterClientInterface.h" -class DuetClient { +class DuetClient : public PrinterClientInterface { private: char myServer[100]; @@ -70,13 +72,14 @@ private: } PrinterStruct; PrinterStruct printerData; + Debug *debugHandle; public: - DuetClient(String PrinterApiKey, String server, int port, String user, String pass, boolean psu); + DuetClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle); void getPrinterJobResults(); void getPrinterPsuState(); - void updatePrintClient(String PrinterApiKey, String server, int port, String user, String pass, boolean psu); + void updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu); String getAveragePrintTime(); String getEstimatedPrintTime(); diff --git a/printermonitor/Global.h b/printermonitor/Global.h new file mode 100644 index 0000000..ed81388 --- /dev/null +++ b/printermonitor/Global.h @@ -0,0 +1,21 @@ +/** + * Main includes we are needing + */ +#include +#include +#include +#include +#include +#include +#include "TimeClient.h" +#include "KlipperClient.h" +#include "DuetClient.h" +#include "RepetierClient.h" +#include "OctoPrintClient.h" +#include "OpenWeatherMapClient.h" +#include "WeatherStationFonts.h" +#include "NextionDisplayClient.h" +#include "OledDisplayClient.h" +#include "WebServer.h" +#include "FS.h" +#include "Debug.h" diff --git a/printermonitor/KlipperClient.cpp b/printermonitor/KlipperClient.cpp index 1860ce9..0d3a2b4 100644 --- a/printermonitor/KlipperClient.cpp +++ b/printermonitor/KlipperClient.cpp @@ -27,7 +27,8 @@ SOFTWARE. #include "KlipperClient.h" -KlipperClient::KlipperClient(String ApiKey, String server, int port, String user, String pass, boolean psu) { +KlipperClient::KlipperClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle) { + this->debugHandle = debugHandle; updatePrintClient(ApiKey, server, port, user, pass, psu); } @@ -63,8 +64,8 @@ WiFiClient KlipperClient::getSubmitRequest(String apiGetData) { WiFiClient printClient; printClient.setTimeout(5000); - Serial.println("Getting Klipper Data via GET"); - Serial.println(apiGetData); + this->debugHandle->printLn("Getting Klipper Data via GET"); + this->debugHandle->printLn(apiGetData); result = ""; if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection printClient.println(apiGetData); @@ -77,16 +78,16 @@ WiFiClient KlipperClient::getSubmitRequest(String apiGetData) { printClient.println("User-Agent: ArduinoWiFi/1.1"); printClient.println("Connection: close"); if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); + this->debugHandle->printLn("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; return printClient; } } else { - Serial.println("Connection to Klipper failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); + this->debugHandle->printLn("Connection to Klipper failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to Klipper failed: " + String(myServer) + ":" + String(myPort); return printClient; @@ -96,8 +97,8 @@ WiFiClient KlipperClient::getSubmitRequest(String apiGetData) { char status[32] = {0}; printClient.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); + this->debugHandle->print("Unexpected response: "); + this->debugHandle->printLn(status); printerData.state = ""; printerData.error = "Response: " + String(status); return printClient; @@ -106,7 +107,7 @@ WiFiClient KlipperClient::getSubmitRequest(String apiGetData) { // Skip HTTP headers char endOfHeaders[] = "\r\n\r\n"; if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); + this->debugHandle->printLn("Invalid response"); printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); printerData.state = ""; } @@ -118,8 +119,8 @@ WiFiClient KlipperClient::getPostRequest(String apiPostData, String apiPostBody) WiFiClient printClient; printClient.setTimeout(5000); - Serial.println("Getting Klipper Data via POST"); - Serial.println(apiPostData + " | " + apiPostBody); + this->debugHandle->printLn("Getting Klipper Data via POST"); + this->debugHandle->printLn(apiPostData + " | " + apiPostBody); result = ""; if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection printClient.println(apiPostData); @@ -137,16 +138,16 @@ WiFiClient KlipperClient::getPostRequest(String apiPostData, String apiPostBody) printClient.println(); printClient.println(apiPostBody); if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); + this->debugHandle->printLn("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; return printClient; } } else { - Serial.println("Connection to Klipper failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); + this->debugHandle->printLn("Connection to Klipper failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to Klipper failed: " + String(myServer) + ":" + String(myPort); return printClient; @@ -156,8 +157,8 @@ WiFiClient KlipperClient::getPostRequest(String apiPostData, String apiPostBody) char status[32] = {0}; printClient.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); + this->debugHandle->print("Unexpected response: "); + this->debugHandle->printLn(status); printerData.state = ""; printerData.error = "Response: " + String(status); return printClient; @@ -166,7 +167,7 @@ WiFiClient KlipperClient::getPostRequest(String apiPostData, String apiPostBody) // Skip HTTP headers char endOfHeaders[] = "\r\n\r\n"; if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); + this->debugHandle->printLn("Invalid response"); printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); printerData.state = ""; } @@ -190,7 +191,7 @@ void KlipperClient::getPrinterJobResults() { // Parse JSON object JsonObject& root = jsonBuffer.parseObject(printClient); if (!root.success()) { - Serial.println("Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort)); + this->debugHandle->printLn("Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort)); printerData.error = "Klipper Data Parsing failed: " + String(myServer) + ":" + String(myPort); printerData.state = ""; return; @@ -209,9 +210,9 @@ void KlipperClient::getPrinterJobResults() { printerData.state = (const char*)root["result"]["status"]["print_stats"]["state"]; if (isOperational()) { - Serial.println("Status: " + printerData.state); + this->debugHandle->printLn("Status: " + printerData.state); } else { - Serial.println("Printer Not Operational"); + this->debugHandle->printLn("Printer Not Operational"); } //**** get the Printer Temps and Stat @@ -246,7 +247,7 @@ void KlipperClient::getPrinterJobResults() { printerData.bedTargetTemp = (const char*)root2["result"]["status"]["heater_bed"]["target"]; if (isPrinting()) { - Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); + this->debugHandle->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); } } diff --git a/printermonitor/KlipperClient.h b/printermonitor/KlipperClient.h index ea4c2f1..7f1689d 100644 --- a/printermonitor/KlipperClient.h +++ b/printermonitor/KlipperClient.h @@ -29,8 +29,10 @@ SOFTWARE. #include #include "libs/ArduinoJson/ArduinoJson.h" #include +#include "Debug.h" +#include "PrinterClientInterface.h" -class KlipperClient { +class KlipperClient : public PrinterClientInterface { private: char myServer[100]; @@ -70,10 +72,10 @@ private: } PrinterStruct; PrinterStruct printerData; - + Debug *debugHandle; public: - KlipperClient(String ApiKey, String server, int port, String user, String pass, boolean psu); + KlipperClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle); void getPrinterJobResults(); void getPrinterPsuState(); void updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu); diff --git a/printermonitor/KlipperPrintClient.cpp b/printermonitor/KlipperPrintClient.cpp deleted file mode 100644 index 2cba1b1..0000000 --- a/printermonitor/KlipperPrintClient.cpp +++ /dev/null @@ -1,414 +0,0 @@ -/** The MIT License (MIT) - -Copyright (c) 2018 David Payne - -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. -*/ - -// Additional Contributions: -/* 15 Jan 2019 : Owen Carter : Add psucontrol query via POST api call */ - -#include "KlipperPrintClient.h" - -KlipperPrintClient::KlipperPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) { - updatePrintClient(ApiKey, server, port, user, pass, psu); -} - -void KlipperPrintClient::updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) { - server.toCharArray(myServer, 100); - myApiKey = ApiKey; - myPort = port; - encodedAuth = ""; - if (user != "") { - String userpass = user + ":" + pass; - base64 b64; - encodedAuth = b64.encode(userpass, true); - } - pollPsu = psu; -} - -boolean KlipperPrintClient::validate() { - boolean rtnValue = false; - printerData.error = ""; - if (String(myServer) == "") { - printerData.error += "Server address is required; "; - } - if (myApiKey == "") { - printerData.error += "ApiKey is required; "; - } - if (printerData.error == "") { - rtnValue = true; - } - return rtnValue; -} - -WiFiClient KlipperPrintClient::getSubmitRequest(String apiGetData) { - WiFiClient printClient; - printClient.setTimeout(5000); - - Serial.println("Getting Octoprint Data via GET"); - Serial.println(apiGetData); - result = ""; - if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection - printClient.println(apiGetData); - printClient.println("Host: " + String(myServer) + ":" + String(myPort)); - printClient.println("X-Api-Key: " + myApiKey); - if (encodedAuth != "") { - printClient.print("Authorization: "); - printClient.println("Basic " + encodedAuth); - } - printClient.println("User-Agent: ArduinoWiFi/1.1"); - printClient.println("Connection: close"); - if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); - resetPrintData(); - printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; - return printClient; - } - } - else { - Serial.println("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); - resetPrintData(); - printerData.error = "Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort); - return printClient; - } - - // Check HTTP status - char status[32] = {0}; - printClient.readBytesUntil('\r', status, sizeof(status)); - if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); - printerData.state = ""; - printerData.error = "Response: " + String(status); - return printClient; - } - - // Skip HTTP headers - char endOfHeaders[] = "\r\n\r\n"; - if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); - printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); - printerData.state = ""; - } - - return printClient; -} - -WiFiClient KlipperPrintClient::getPostRequest(String apiPostData, String apiPostBody) { - WiFiClient printClient; - printClient.setTimeout(5000); - - Serial.println("Getting Octoprint Data via POST"); - Serial.println(apiPostData + " | " + apiPostBody); - result = ""; - if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection - printClient.println(apiPostData); - printClient.println("Host: " + String(myServer) + ":" + String(myPort)); - printClient.println("Connection: close"); - printClient.println("X-Api-Key: " + myApiKey); - if (encodedAuth != "") { - printClient.print("Authorization: "); - printClient.println("Basic " + encodedAuth); - } - printClient.println("User-Agent: ArduinoWiFi/1.1"); - printClient.println("Content-Type: application/json"); - printClient.print("Content-Length: "); - printClient.println(apiPostBody.length()); - printClient.println(); - printClient.println(apiPostBody); - if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); - resetPrintData(); - printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; - return printClient; - } - } - else { - Serial.println("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); - resetPrintData(); - printerData.error = "Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort); - return printClient; - } - - // Check HTTP status - char status[32] = {0}; - printClient.readBytesUntil('\r', status, sizeof(status)); - if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); - printerData.state = ""; - printerData.error = "Response: " + String(status); - return printClient; - } - - // Skip HTTP headers - char endOfHeaders[] = "\r\n\r\n"; - if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); - printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); - printerData.state = ""; - } - - return printClient; -} - -void KlipperPrintClient::getPrinterJobResults() { - if (!validate()) { - return; - } - //**** get the Printer Job status - String apiGetData = "GET /api/job HTTP/1.1"; - WiFiClient printClient = getSubmitRequest(apiGetData); - if (printerData.error != "") { - return; - } - const size_t bufferSize = JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + 2*JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(6) + 710; - DynamicJsonBuffer jsonBuffer(bufferSize); - - // Parse JSON object - JsonObject& root = jsonBuffer.parseObject(printClient); - if (!root.success()) { - Serial.println("OctoPrint Data Parsing failed: " + String(myServer) + ":" + String(myPort)); - printerData.error = "OctoPrint Data Parsing failed: " + String(myServer) + ":" + String(myPort); - printerData.state = ""; - return; - } - - printerData.averagePrintTime = (const char*)root["job"]["averagePrintTime"]; - printerData.estimatedPrintTime = (const char*)root["job"]["estimatedPrintTime"]; - printerData.fileName = (const char*)root["job"]["file"]["name"]; - printerData.fileSize = (const char*)root["job"]["file"]["size"]; - printerData.lastPrintTime = (const char*)root["job"]["lastPrintTime"]; - printerData.progressCompletion = (const char*)root["progress"]["completion"]; - printerData.progressFilepos = (const char*)root["progress"]["filepos"]; - printerData.progressPrintTime = (const char*)root["progress"]["printTime"]; - printerData.progressPrintTimeLeft = (const char*)root["progress"]["printTimeLeft"]; - printerData.filamentLength = (const char*)root["job"]["filament"]["tool0"]["length"]; - printerData.state = (const char*)root["state"]; - - if (isOperational()) { - Serial.println("Status: " + printerData.state); - } else { - Serial.println("Printer Not Operational"); - } - - //**** get the Printer Temps and Stat - apiGetData = "GET /api/printer?exclude=sd,history HTTP/1.1"; - printClient = getSubmitRequest(apiGetData); - if (printerData.error != "") { - return; - } - const size_t bufferSize2 = 3*JSON_OBJECT_SIZE(2) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(9) + 300; - DynamicJsonBuffer jsonBuffer2(bufferSize2); - - // Parse JSON object - JsonObject& root2 = jsonBuffer2.parseObject(printClient); - if (!root2.success()) { - printerData.isPrinting = false; - printerData.toolTemp = ""; - printerData.toolTargetTemp = ""; - printerData.bedTemp = ""; - printerData.bedTargetTemp = (const char*)root2["temperature"]["bed"]["target"]; - return; - } - - String printing = (const char*)root2["state"]["flags"]["printing"]; - if (printing == "true") { - printerData.isPrinting = true; - } else { - printerData.isPrinting = false; - } - printerData.toolTemp = (const char*)root2["temperature"]["tool0"]["actual"]; - printerData.toolTargetTemp = (const char*)root2["temperature"]["tool0"]["target"]; - printerData.bedTemp = (const char*)root2["temperature"]["bed"]["actual"]; - printerData.bedTargetTemp = (const char*)root2["temperature"]["bed"]["target"]; - - if (isPrinting()) { - Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); - } -} - -void KlipperPrintClient::getPrinterPsuState() { - //**** get the PSU state (if enabled and printer operational) - if (pollPsu && isOperational()) { - if (!validate()) { - printerData.isPSUoff = false; // we do not know PSU state, so assume on. - return; - } - String apiPostData = "POST /api/plugin/psucontrol HTTP/1.1"; - String apiPostBody = "{\"command\":\"getPSUState\"}"; - WiFiClient printClient = getPostRequest(apiPostData,apiPostBody); - if (printerData.error != "") { - printerData.isPSUoff = false; // we do not know PSU state, so assume on. - return; - } - const size_t bufferSize3 = JSON_OBJECT_SIZE(2) + 300; - DynamicJsonBuffer jsonBuffer3(bufferSize3); - - // Parse JSON object - JsonObject& root3 = jsonBuffer3.parseObject(printClient); - if (!root3.success()) { - printerData.isPSUoff = false; // we do not know PSU state, so assume on - return; - } - - String psu = (const char*)root3["isPSUOn"]; - if (psu == "true") { - printerData.isPSUoff = false; // PSU checked and is on - } else { - printerData.isPSUoff = true; // PSU checked and is off, set flag - } - printClient.stop(); //stop client - } else { - printerData.isPSUoff = false; // we are not checking PSU state, so assume on - } -} - -// Reset all PrinterData -void KlipperPrintClient::resetPrintData() { - printerData.averagePrintTime = ""; - printerData.estimatedPrintTime = ""; - printerData.fileName = ""; - printerData.fileSize = ""; - printerData.lastPrintTime = ""; - printerData.progressCompletion = ""; - printerData.progressFilepos = ""; - printerData.progressPrintTime = ""; - printerData.progressPrintTimeLeft = ""; - printerData.state = ""; - printerData.toolTemp = ""; - printerData.toolTargetTemp = ""; - printerData.filamentLength = ""; - printerData.bedTemp = ""; - printerData.bedTargetTemp = ""; - printerData.isPrinting = false; - printerData.isPSUoff = false; - printerData.error = ""; -} - -String KlipperPrintClient::getAveragePrintTime(){ - return printerData.averagePrintTime; -} - -String KlipperPrintClient::getEstimatedPrintTime() { - return printerData.estimatedPrintTime; -} - -String KlipperPrintClient::getFileName() { - return printerData.fileName; -} - -String KlipperPrintClient::getFileSize() { - return printerData.fileSize; -} - -String KlipperPrintClient::getLastPrintTime(){ - return printerData.lastPrintTime; -} - -String KlipperPrintClient::getProgressCompletion() { - return String(printerData.progressCompletion.toInt()); -} - -String KlipperPrintClient::getProgressFilepos() { - return printerData.progressFilepos; -} - -String KlipperPrintClient::getProgressPrintTime() { - return printerData.progressPrintTime; -} - -String KlipperPrintClient::getProgressPrintTimeLeft() { - String rtnValue = printerData.progressPrintTimeLeft; - if (getProgressCompletion() == "100") { - rtnValue = "0"; // Print is done so this should be 0 this is a fix for OctoPrint - } - return rtnValue; -} - -String KlipperPrintClient::getState() { - return printerData.state; -} - -boolean KlipperPrintClient::isPrinting() { - return printerData.isPrinting; -} - -boolean KlipperPrintClient::isPSUoff() { - return printerData.isPSUoff; -} - -boolean KlipperPrintClient::isOperational() { - boolean operational = false; - if (printerData.state == "Operational" || isPrinting()) { - operational = true; - } - return operational; -} - -String KlipperPrintClient::getTempBedActual() { - return printerData.bedTemp; -} - -String KlipperPrintClient::getTempBedTarget() { - return printerData.bedTargetTemp; -} - -String KlipperPrintClient::getTempToolActual() { - return printerData.toolTemp; -} - -String KlipperPrintClient::getTempToolTarget() { - return printerData.toolTargetTemp; -} - -String KlipperPrintClient::getFilamentLength() { - return printerData.filamentLength; -} - -String KlipperPrintClient::getError() { - return printerData.error; -} - -String KlipperPrintClient::getValueRounded(String value) { - float f = value.toFloat(); - int rounded = (int)(f+0.5f); - return String(rounded); -} - -String KlipperPrintClient::getPrinterType() { - return printerType; -} - -int KlipperPrintClient::getPrinterPort() { - return myPort; -} - -String KlipperPrintClient::getPrinterName() { - return printerData.printerName; -} - -void KlipperPrintClient::setPrinterName(String printer) { - printerData.printerName = printer; -} diff --git a/printermonitor/KlipperPrintClient.h b/printermonitor/KlipperPrintClient.h deleted file mode 100644 index abd8023..0000000 --- a/printermonitor/KlipperPrintClient.h +++ /dev/null @@ -1,104 +0,0 @@ -/** The MIT License (MIT) - -Copyright (c) 2018 David Payne - -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. -*/ - -// Additional Contributions: -/* 15 Jan 2019 : Owen Carter : Add psucontrol query via POST api call */ - -#pragma once -#include -#include "libs/ArduinoJson/ArduinoJson.h" -#include - -class KlipperPrintClient { - -private: - char myServer[100]; - int myPort = 80; - String myApiKey = ""; - String encodedAuth = ""; - boolean pollPsu; - const String printerType = "OctoPrint"; - - void resetPrintData(); - boolean validate(); - WiFiClient getSubmitRequest(String apiGetData); - WiFiClient getPostRequest(String apiPostData, String apiPostBody); - - String result; - - typedef struct { - String averagePrintTime; - String estimatedPrintTime; - String fileName; - String fileSize; - String lastPrintTime; - String progressCompletion; - String progressFilepos; - String progressPrintTime; - String progressPrintTimeLeft; - String state; - String toolTemp; - String toolTargetTemp; - String filamentLength; - String bedTemp; - String bedTargetTemp; - boolean isPrinting; - boolean isPSUoff; - String error; - String printerName; - } PrinterStruct; - - PrinterStruct printerData; - - -public: - KlipperPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu); - void getPrinterJobResults(); - void getPrinterPsuState(); - void updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu); - - String getAveragePrintTime(); - String getEstimatedPrintTime(); - String getFileName(); - String getFileSize(); - String getLastPrintTime(); - String getProgressCompletion(); - String getProgressFilepos(); - String getProgressPrintTime(); - String getProgressPrintTimeLeft(); - String getState(); - boolean isPrinting(); - boolean isOperational(); - boolean isPSUoff(); - String getTempBedActual(); - String getTempBedTarget(); - String getTempToolActual(); - String getTempToolTarget(); - String getFilamentLength(); - String getValueRounded(String value); - String getError(); - String getPrinterType(); - int getPrinterPort(); - String getPrinterName(); - void setPrinterName(String printer); -}; diff --git a/printermonitor/Macros.h b/printermonitor/Macros.h new file mode 100644 index 0000000..e399ff2 --- /dev/null +++ b/printermonitor/Macros.h @@ -0,0 +1,10 @@ +#pragma once + +/* Useful Constants */ +#define SECS_PER_MIN (60UL) +#define SECS_PER_HOUR (3600UL) + +/* Useful Macros for getting elapsed time */ +#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN) +#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) +#define numberOfHours(_time_) (_time_ / SECS_PER_HOUR) diff --git a/printermonitor/NextionDisplayClient.cpp b/printermonitor/NextionDisplayClient.cpp new file mode 100644 index 0000000..9383724 --- /dev/null +++ b/printermonitor/NextionDisplayClient.cpp @@ -0,0 +1,50 @@ +#include "NextionDisplayClient.h" + +NextionDisplayClient::NextionDisplayClient(byte rxPin, byte txPin, PrinterClientInterface *printerClient) { + this->printerClient = printerClient; + this->softwareSerialPort = new SoftwareSerial(rxPin, txPin); + this->softwareSerialPort->begin(9600); +} + +void NextionDisplayClient::postSetup() { +} + +void NextionDisplayClient::showPageInit(String printerTypeName, String softwareVersion) { + String command("version.txt="); + command += "\"for " + printerTypeName + " V" + softwareVersion + "\""; + this->sendCommand("page 0"); + this->sendCommand(command.c_str()); +} + +void NextionDisplayClient::showPageApMode(String protalSsid) { + String commandHostName("WifiHostname.txt="); + String commandQrCode("WifiScancode.txt="); + commandHostName += "\"" + protalSsid + "\""; + commandQrCode += "\"WIFI:S:" + protalSsid + ";T:WPA;P:;;\""; + this->sendCommand("page 1"); + this->sendCommand(commandHostName.c_str()); + this->sendCommand(commandQrCode.c_str()); +} + +void NextionDisplayClient::showPageWeather() { + this->sendCommand("page 2"); +} + +void NextionDisplayClient::showPagePrinter() { + this->sendCommand("page 3"); +} + + + + +void NextionDisplayClient::sendCommand(const char* cmd) { + while (this->softwareSerialPort->available()) + { + this->softwareSerialPort->read(); + } + + this->softwareSerialPort->print(cmd); + this->softwareSerialPort->write(0xFF); + this->softwareSerialPort->write(0xFF); + this->softwareSerialPort->write(0xFF); +} diff --git a/printermonitor/NextionDisplayClient.h b/printermonitor/NextionDisplayClient.h new file mode 100644 index 0000000..9f4b6e0 --- /dev/null +++ b/printermonitor/NextionDisplayClient.h @@ -0,0 +1,26 @@ +#pragma once +#include +#include "libs/ArduinoJson/ArduinoJson.h" +#include +#include "Debug.h" +#include +#include "PrinterClientInterface.h" +#include "Macros.h" + +class NextionDisplayClient { +private: + SoftwareSerial *softwareSerialPort; + PrinterClientInterface *printerClient; + +public: + NextionDisplayClient(byte rxPin, byte txPin, PrinterClientInterface *printerClient); + void postSetup(); + + void showPageInit(String printerTypeName, String softwareVersion); + void showPageApMode(String protalSsid); + void showPageWeather(); + void showPagePrinter(); + +private: + void sendCommand(const char* cmd); +}; diff --git a/printermonitor/OctoPrintClient.cpp b/printermonitor/OctoPrintClient.cpp index 832835b..2a6d60c 100644 --- a/printermonitor/OctoPrintClient.cpp +++ b/printermonitor/OctoPrintClient.cpp @@ -26,7 +26,8 @@ SOFTWARE. #include "OctoPrintClient.h" -OctoPrintClient::OctoPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu) { +OctoPrintClient::OctoPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle) { + this->debugHandle = debugHandle; updatePrintClient(ApiKey, server, port, user, pass, psu); } @@ -62,8 +63,8 @@ WiFiClient OctoPrintClient::getSubmitRequest(String apiGetData) { WiFiClient printClient; printClient.setTimeout(5000); - Serial.println("Getting Octoprint Data via GET"); - Serial.println(apiGetData); + this->debugHandle->printLn("Getting Octoprint Data via GET"); + this->debugHandle->printLn(apiGetData); result = ""; if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection printClient.println(apiGetData); @@ -76,16 +77,16 @@ WiFiClient OctoPrintClient::getSubmitRequest(String apiGetData) { printClient.println("User-Agent: ArduinoWiFi/1.1"); printClient.println("Connection: close"); if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); + this->debugHandle->printLn("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; return printClient; } } else { - Serial.println("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); + this->debugHandle->printLn("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort); return printClient; @@ -95,8 +96,8 @@ WiFiClient OctoPrintClient::getSubmitRequest(String apiGetData) { char status[32] = {0}; printClient.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); + this->debugHandle->print("Unexpected response: "); + this->debugHandle->printLn(status); printerData.state = ""; printerData.error = "Response: " + String(status); return printClient; @@ -105,7 +106,7 @@ WiFiClient OctoPrintClient::getSubmitRequest(String apiGetData) { // Skip HTTP headers char endOfHeaders[] = "\r\n\r\n"; if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); + this->debugHandle->printLn("Invalid response"); printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); printerData.state = ""; } @@ -117,8 +118,8 @@ WiFiClient OctoPrintClient::getPostRequest(String apiPostData, String apiPostBod WiFiClient printClient; printClient.setTimeout(5000); - Serial.println("Getting Octoprint Data via POST"); - Serial.println(apiPostData + " | " + apiPostBody); + this->debugHandle->printLn("Getting Octoprint Data via POST"); + this->debugHandle->printLn(apiPostData + " | " + apiPostBody); result = ""; if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection printClient.println(apiPostData); @@ -136,16 +137,16 @@ WiFiClient OctoPrintClient::getPostRequest(String apiPostData, String apiPostBod printClient.println(); printClient.println(apiPostBody); if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); + this->debugHandle->printLn("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; return printClient; } } else { - Serial.println("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); + this->debugHandle->printLn("Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to OctoPrint failed: " + String(myServer) + ":" + String(myPort); return printClient; @@ -155,8 +156,8 @@ WiFiClient OctoPrintClient::getPostRequest(String apiPostData, String apiPostBod char status[32] = {0}; printClient.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0 && strcmp(status, "HTTP/1.1 409 CONFLICT") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); + this->debugHandle->print("Unexpected response: "); + this->debugHandle->printLn(status); printerData.state = ""; printerData.error = "Response: " + String(status); return printClient; @@ -165,7 +166,7 @@ WiFiClient OctoPrintClient::getPostRequest(String apiPostData, String apiPostBod // Skip HTTP headers char endOfHeaders[] = "\r\n\r\n"; if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); + this->debugHandle->printLn("Invalid response"); printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); printerData.state = ""; } @@ -189,7 +190,7 @@ void OctoPrintClient::getPrinterJobResults() { // Parse JSON object JsonObject& root = jsonBuffer.parseObject(printClient); if (!root.success()) { - Serial.println("OctoPrint Data Parsing failed: " + String(myServer) + ":" + String(myPort)); + this->debugHandle->printLn("OctoPrint Data Parsing failed: " + String(myServer) + ":" + String(myPort)); printerData.error = "OctoPrint Data Parsing failed: " + String(myServer) + ":" + String(myPort); printerData.state = ""; return; @@ -208,9 +209,9 @@ void OctoPrintClient::getPrinterJobResults() { printerData.state = (const char*)root["state"]; if (isOperational()) { - Serial.println("Status: " + printerData.state); + this->debugHandle->printLn("Status: " + printerData.state); } else { - Serial.println("Printer Not Operational"); + this->debugHandle->printLn("Printer Not Operational"); } //**** get the Printer Temps and Stat @@ -245,7 +246,7 @@ void OctoPrintClient::getPrinterJobResults() { printerData.bedTargetTemp = (const char*)root2["temperature"]["bed"]["target"]; if (isPrinting()) { - Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); + this->debugHandle->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); } } diff --git a/printermonitor/OctoPrintClient.h b/printermonitor/OctoPrintClient.h index 1761ccc..e91acd5 100644 --- a/printermonitor/OctoPrintClient.h +++ b/printermonitor/OctoPrintClient.h @@ -28,8 +28,10 @@ SOFTWARE. #include #include "libs/ArduinoJson/ArduinoJson.h" #include +#include "Debug.h" +#include "PrinterClientInterface.h" -class OctoPrintClient { +class OctoPrintClient : public PrinterClientInterface { private: char myServer[100]; @@ -69,10 +71,11 @@ private: } PrinterStruct; PrinterStruct printerData; + Debug *debugHandle; public: - OctoPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu); + OctoPrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle); void getPrinterJobResults(); void getPrinterPsuState(); void updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu); diff --git a/printermonitor/OledDisplayClient.cpp b/printermonitor/OledDisplayClient.cpp new file mode 100644 index 0000000..4e486c1 --- /dev/null +++ b/printermonitor/OledDisplayClient.cpp @@ -0,0 +1,170 @@ +#include "OledDisplayClient.h" + + +OledDisplayClient::OledDisplayClient(byte sdaPin, byte sclPin, byte i2cAddress, bool isSh1106, bool invertDisplay, PrinterClientInterface *printerClient) { + this->printerClient = printerClient; + if(isSh1106) { + this->display = new SH1106Wire(i2cAddress, sdaPin, sclPin); + } else { + this->display = new SSD1306Wire(i2cAddress, sdaPin, sclPin); + } + this->ui = new OLEDDisplayUi(this->display); + this->invertDisplay = invertDisplay; + + this->display->init(); + if (invertDisplay) { + this->display->flipScreenVertically(); // connections at top of OLED display + } + this->display->clear(); + this->display->display(); + + //this->overlays[0] = drawHeaderOverlay; + //this->clockOverlay[0] = drawClockHeaderOverlay; +} + +void OledDisplayClient::postSetup() { + static OledDisplayClient* obj = this; + // You can change the transition that is used + // SLIDE_LEFT, SLIDE_RIGHT, SLIDE_TOP, SLIDE_DOWN + this->ui->setFrameAnimation(SLIDE_LEFT); + this->ui->setTargetFPS(30); + this->ui->disableAllIndicators(); + this->ui->setFrames(this->frames, (3)); + this->frames[0] = [](OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { obj->drawScreen1(display, state, x, y); }; + this->frames[1] = [](OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { obj->drawScreen2(display, state, x, y); }; + this->frames[2] = [](OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { obj->drawScreen3(display, state, x, y); }; + this->clockFrame[0] = [](OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { obj->drawClock(display, state, x, y); }; + this->clockFrame[1] = [](OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { obj->drawWeather(display, state, x, y); }; + this->ui->setOverlays(this->overlays, 1); + + // Inital UI takes care of initalising the display too. + this->ui->init(); + if (this->invertDisplay) { + this->display->flipScreenVertically(); //connections at top of OLED display + } +} + +void OledDisplayClient::showPageInit(String printerTypeName, String softwareVersion) { + this->display->setTextAlignment(TEXT_ALIGN_CENTER); + this->display->setContrast(255); // default is 255 + this->display->setFont(ArialMT_Plain_16); + this->display->drawString(64, 1, "Printer Monitor"); + this->display->setFont(ArialMT_Plain_10); + this->display->drawString(64, 18, "for " + printerTypeName); + this->display->setFont(ArialMT_Plain_16); + this->display->drawString(64, 30, "By Qrome"); + this->display->drawString(64, 46, "V" + softwareVersion); + this->display->display(); +} + +void OledDisplayClient::showPageApMode(String protalSsid) { + this->display->clear(); + this->display->setTextAlignment(TEXT_ALIGN_CENTER); + this->display->setFont(ArialMT_Plain_10); + this->display->drawString(64, 0, "Wifi Manager"); + this->display->drawString(64, 10, "Please connect to AP"); + this->display->setFont(ArialMT_Plain_16); + this->display->drawString(64, 26, protalSsid); + this->display->setFont(ArialMT_Plain_10); + this->display->drawString(64, 46, "To setup Wifi connection"); + this->display->display(); +} + +void OledDisplayClient::showPageWeather() { +} + +void OledDisplayClient::showPagePrinter() { +} + +void OledDisplayClient::drawScreen1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { + String bed = this->printerClient->getValueRounded(this->printerClient->getTempBedActual()); + String tool = this->printerClient->getValueRounded(printerClient->getTempToolActual()); + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(ArialMT_Plain_16); + if (bed != "0") { + display->drawString(29 + x, 0 + y, "Tool"); + display->drawString(89 + x, 0 + y, "Bed"); + } else { + display->drawString(64 + x, 0 + y, "Tool Temp"); + } + display->setTextAlignment(TEXT_ALIGN_LEFT); + display->setFont(ArialMT_Plain_24); + if (bed != "0") { + display->setTextAlignment(TEXT_ALIGN_LEFT); + display->drawString(12 + x, 14 + y, tool + "°"); + display->drawString(74 + x, 14 + y, bed + "°"); + } else { + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->drawString(64 + x, 14 + y, tool + "°"); + } +} + +void OledDisplayClient::drawScreen2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(ArialMT_Plain_16); + + display->drawString(64 + x, 0 + y, "Time Remaining"); + //display->setTextAlignment(TEXT_ALIGN_LEFT); + display->setFont(ArialMT_Plain_24); + int val = printerClient->getProgressPrintTimeLeft().toInt(); + int hours = numberOfHours(val); + int minutes = numberOfMinutes(val); + int seconds = numberOfSeconds(val); + + String time = zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds); + display->drawString(64 + x, 14 + y, time); +} + +void OledDisplayClient::drawScreen3(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->setFont(ArialMT_Plain_16); + + display->drawString(64 + x, 0 + y, "Printing Time"); + //display->setTextAlignment(TEXT_ALIGN_LEFT); + display->setFont(ArialMT_Plain_24); + int val = printerClient->getProgressPrintTime().toInt(); + int hours = numberOfHours(val); + int minutes = numberOfMinutes(val); + int seconds = numberOfSeconds(val); + + String time = zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds); + display->drawString(64 + x, 14 + y, time); +} + +void OledDisplayClient::drawClock(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { + /*display->setTextAlignment(TEXT_ALIGN_CENTER); + + String displayTime = timeClient.getAmPmHours() + ":" + timeClient.getMinutes() + ":" + timeClient.getSeconds(); + if (IS_24HOUR) { + displayTime = timeClient.getHours() + ":" + timeClient.getMinutes() + ":" + timeClient.getSeconds(); + } + String displayName = PrinterHostName; + if (printerClient.getPrinterType() == "Repetier") { + displayName = printerClient.getPrinterName(); + } + display->setFont(ArialMT_Plain_16); + display->drawString(64 + x, 0 + y, displayName); + display->setFont(ArialMT_Plain_24); + display->drawString(64 + x, 17 + y, displayTime); */ +} + +void OledDisplayClient::drawWeather(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { + /*display->setTextAlignment(TEXT_ALIGN_LEFT); + display->setFont(ArialMT_Plain_24); + display->drawString(0 + x, 0 + y, weatherClient.getTempRounded(0) + getTempSymbol()); + display->setTextAlignment(TEXT_ALIGN_LEFT); + display->setFont(ArialMT_Plain_24); + + display->setFont(ArialMT_Plain_16); + display->drawString(0 + x, 24 + y, weatherClient.getCondition(0)); + display->setFont((const uint8_t*)Meteocons_Plain_42); + display->drawString(86 + x, 0 + y, weatherClient.getWeatherIcon(0));*/ +} + +String OledDisplayClient::zeroPad(int value) { + String rtnValue = String(value); + if (value < 10) { + rtnValue = "0" + rtnValue; + } + return rtnValue; +} diff --git a/printermonitor/OledDisplayClient.h b/printermonitor/OledDisplayClient.h new file mode 100644 index 0000000..a8a9b19 --- /dev/null +++ b/printermonitor/OledDisplayClient.h @@ -0,0 +1,43 @@ +#pragma once +#include +#include +#include "Debug.h" +#include "SH1106Wire.h" +#include "SSD1306Wire.h" +#include "OLEDDisplayUi.h" +#include "PrinterClientInterface.h" +#include "Macros.h" + +class OledDisplayClient { +private: + OLEDDisplay *display; + OLEDDisplayUi *ui; + bool invertDisplay = false; + + FrameCallback frames[3]; + FrameCallback clockFrame[2]; + boolean isClockOn = false; + + OverlayCallback overlays[1]; + OverlayCallback clockOverlay[1]; + + PrinterClientInterface *printerClient; + +public: + OledDisplayClient(byte sdaPin, byte sclPin, byte i2cAddress, bool isSh1106, bool invertDisplay, PrinterClientInterface *printerClient); + void postSetup(); + + void showPageInit(String printerTypeName, String softwareVersion); + void showPageApMode(String protalSsid); + void showPageWeather(); + void showPagePrinter(); + +private: + void drawScreen1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); + void drawScreen2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); + void drawScreen3(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); + void drawClock(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); + void drawWeather(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); + + String zeroPad(int value); +}; diff --git a/printermonitor/OpenWeatherMapClient.cpp b/printermonitor/OpenWeatherMapClient.cpp index e3c7874..415cc5d 100644 --- a/printermonitor/OpenWeatherMapClient.cpp +++ b/printermonitor/OpenWeatherMapClient.cpp @@ -1,311 +1,312 @@ -/** The MIT License (MIT) - -Copyright (c) 2018 David Payne - -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. -*/ - -#include "OpenWeatherMapClient.h" - -OpenWeatherMapClient::OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric, String language) { - updateCityIdList(CityIDs, cityCount); - updateLanguage(language); - myApiKey = ApiKey; - setMetric(isMetric); -} - -void OpenWeatherMapClient::updateWeatherApiKey(String ApiKey) { - myApiKey = ApiKey; -} - -void OpenWeatherMapClient::updateLanguage(String language) { - lang = language; - if (lang == "") { - lang = "en"; - } -} - -void OpenWeatherMapClient::updateWeather() { - WiFiClient weatherClient; - String apiGetData = "GET /data/2.5/group?id=" + myCityIDs + "&units=" + units + "&cnt=1&APPID=" + myApiKey + "&lang=" + lang + " HTTP/1.1"; - - Serial.println("Getting Weather Data"); - Serial.println(apiGetData); - result = ""; - if (weatherClient.connect(servername, 80)) { //starts client connection, checks for connection - weatherClient.println(apiGetData); - weatherClient.println("Host: " + String(servername)); - weatherClient.println("User-Agent: ArduinoWiFi/1.1"); - weatherClient.println("Connection: close"); - weatherClient.println(); - } - else { - Serial.println("connection for weather data failed"); //error message if no client connect - Serial.println(); - return; - } - - while(weatherClient.connected() && !weatherClient.available()) delay(1); //waits for data - - Serial.println("Waiting for data"); - - // Check HTTP status - char status[32] = {0}; - weatherClient.readBytesUntil('\r', status, sizeof(status)); - Serial.println("Response Header: " + String(status)); - if (strcmp(status, "HTTP/1.1 200 OK") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); - return; - } - - // Skip HTTP headers - char endOfHeaders[] = "\r\n\r\n"; - if (!weatherClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); - return; - } - - const size_t bufferSize = 710; - DynamicJsonBuffer jsonBuffer(bufferSize); - - weathers[0].cached = false; - weathers[0].error = ""; - // Parse JSON object - JsonObject& root = jsonBuffer.parseObject(weatherClient); - if (!root.success()) { - Serial.println(F("Weather Data Parsing failed!")); - weathers[0].error = "Weather Data Parsing failed!"; - return; - } - - weatherClient.stop(); //stop client - - if (root.measureLength() <= 150) { - Serial.println("Error Does not look like we got the data. Size: " + String(root.measureLength())); - weathers[0].cached = true; - weathers[0].error = (const char*)root["message"]; - Serial.println("Error: " + weathers[0].error); - return; - } - int count = root["cnt"]; - - for (int inx = 0; inx < count; inx++) { - weathers[inx].lat = (const char*)root["list"][inx]["coord"]["lat"]; - weathers[inx].lon = (const char*)root["list"][inx]["coord"]["lon"]; - weathers[inx].dt = (const char*)root["list"][inx]["dt"]; - weathers[inx].city = (const char*)root["list"][inx]["name"]; - weathers[inx].country = (const char*)root["list"][inx]["sys"]["country"]; - weathers[inx].temp = (const char*)root["list"][inx]["main"]["temp"]; - weathers[inx].humidity = (const char*)root["list"][inx]["main"]["humidity"]; - weathers[inx].condition = (const char*)root["list"][inx]["weather"][0]["main"]; - weathers[inx].wind = (const char*)root["list"][inx]["wind"]["speed"]; - weathers[inx].weatherId = (const char*)root["list"][inx]["weather"][0]["id"]; - weathers[inx].description = (const char*)root["list"][inx]["weather"][0]["description"]; - weathers[inx].icon = (const char*)root["list"][inx]["weather"][0]["icon"]; - - Serial.println("lat: " + weathers[inx].lat); - Serial.println("lon: " + weathers[inx].lon); - Serial.println("dt: " + weathers[inx].dt); - Serial.println("city: " + weathers[inx].city); - Serial.println("country: " + weathers[inx].country); - Serial.println("temp: " + weathers[inx].temp); - Serial.println("humidity: " + weathers[inx].humidity); - Serial.println("condition: " + weathers[inx].condition); - Serial.println("wind: " + weathers[inx].wind); - Serial.println("weatherId: " + weathers[inx].weatherId); - Serial.println("description: " + weathers[inx].description); - Serial.println("icon: " + weathers[inx].icon); - Serial.println(); - - } -} - -String OpenWeatherMapClient::roundValue(String value) { - float f = value.toFloat(); - int rounded = (int)(f+0.5f); - return String(rounded); -} - -void OpenWeatherMapClient::updateCityIdList(int CityIDs[], int cityCount) { - myCityIDs = ""; - for (int inx = 0; inx < cityCount; inx++) { - if (CityIDs[inx] > 0) { - if (myCityIDs != "") { - myCityIDs = myCityIDs + ","; - } - myCityIDs = myCityIDs + String(CityIDs[inx]); - } - } -} - -void OpenWeatherMapClient::setMetric(boolean isMetric) { - if (isMetric) { - units = "metric"; - } else { - units = "imperial"; - } -} - -String OpenWeatherMapClient::getWeatherResults() { - return result; -} - -String OpenWeatherMapClient::getLat(int index) { - return weathers[index].lat; -} - -String OpenWeatherMapClient::getLon(int index) { - return weathers[index].lon; -} - -String OpenWeatherMapClient::getDt(int index) { - return weathers[index].dt; -} - -String OpenWeatherMapClient::getCity(int index) { - return weathers[index].city; -} - -String OpenWeatherMapClient::getCountry(int index) { - return weathers[index].country; -} - -String OpenWeatherMapClient::getTemp(int index) { - return weathers[index].temp; -} - -String OpenWeatherMapClient::getTempRounded(int index) { - return roundValue(getTemp(index)); -} - -String OpenWeatherMapClient::getHumidity(int index) { - return weathers[index].humidity; -} - -String OpenWeatherMapClient::getHumidityRounded(int index) { - return roundValue(getHumidity(index)); -} - -String OpenWeatherMapClient::getCondition(int index) { - return weathers[index].condition; -} - -String OpenWeatherMapClient::getWind(int index) { - return weathers[index].wind; -} - -String OpenWeatherMapClient::getWindRounded(int index) { - return roundValue(getWind(index)); -} - -String OpenWeatherMapClient::getWeatherId(int index) { - return weathers[index].weatherId; -} - -String OpenWeatherMapClient::getDescription(int index) { - return weathers[index].description; -} - -String OpenWeatherMapClient::getIcon(int index) { - return weathers[index].icon; -} - -boolean OpenWeatherMapClient::getCached() { - return weathers[0].cached; -} - -String OpenWeatherMapClient::getMyCityIDs() { - return myCityIDs; -} - -String OpenWeatherMapClient::getError() { - return weathers[0].error; -} - -String OpenWeatherMapClient::getWeatherIcon(int index) -{ - int id = getWeatherId(index).toInt(); - String W = ")"; - switch(id) - { - case 800: W = "B"; break; - case 801: W = "Y"; break; - case 802: W = "H"; break; - case 803: W = "H"; break; - case 804: W = "Y"; break; - - case 200: W = "0"; break; - case 201: W = "0"; break; - case 202: W = "0"; break; - case 210: W = "0"; break; - case 211: W = "0"; break; - case 212: W = "0"; break; - case 221: W = "0"; break; - case 230: W = "0"; break; - case 231: W = "0"; break; - case 232: W = "0"; break; - - case 300: W = "R"; break; - case 301: W = "R"; break; - case 302: W = "R"; break; - case 310: W = "R"; break; - case 311: W = "R"; break; - case 312: W = "R"; break; - case 313: W = "R"; break; - case 314: W = "R"; break; - case 321: W = "R"; break; - - case 500: W = "R"; break; - case 501: W = "R"; break; - case 502: W = "R"; break; - case 503: W = "R"; break; - case 504: W = "R"; break; - case 511: W = "R"; break; - case 520: W = "R"; break; - case 521: W = "R"; break; - case 522: W = "R"; break; - case 531: W = "R"; break; - - case 600: W = "W"; break; - case 601: W = "W"; break; - case 602: W = "W"; break; - case 611: W = "W"; break; - case 612: W = "W"; break; - case 615: W = "W"; break; - case 616: W = "W"; break; - case 620: W = "W"; break; - case 621: W = "W"; break; - case 622: W = "W"; break; - - case 701: W = "M"; break; - case 711: W = "M"; break; - case 721: W = "M"; break; - case 731: W = "M"; break; - case 741: W = "M"; break; - case 751: W = "M"; break; - case 761: W = "M"; break; - case 762: W = "M"; break; - case 771: W = "M"; break; - case 781: W = "M"; break; - - default:break; - } - return W; +/** The MIT License (MIT) + +Copyright (c) 2018 David Payne + +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. +*/ + +#include "OpenWeatherMapClient.h" + +OpenWeatherMapClient::OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric, String language, Debug *debugHandle) { + this->debugHandle = debugHandle; + updateCityIdList(CityIDs, cityCount); + updateLanguage(language); + myApiKey = ApiKey; + setMetric(isMetric); +} + +void OpenWeatherMapClient::updateWeatherApiKey(String ApiKey) { + myApiKey = ApiKey; +} + +void OpenWeatherMapClient::updateLanguage(String language) { + lang = language; + if (lang == "") { + lang = "en"; + } +} + +void OpenWeatherMapClient::updateWeather() { + WiFiClient weatherClient; + String apiGetData = "GET /data/2.5/group?id=" + myCityIDs + "&units=" + units + "&cnt=1&APPID=" + myApiKey + "&lang=" + lang + " HTTP/1.1"; + + this->debugHandle->printLn("Getting Weather Data"); + this->debugHandle->printLn(apiGetData); + result = ""; + if (weatherClient.connect(servername, 80)) { //starts client connection, checks for connection + weatherClient.println(apiGetData); + weatherClient.println("Host: " + String(servername)); + weatherClient.println("User-Agent: ArduinoWiFi/1.1"); + weatherClient.println("Connection: close"); + weatherClient.println(); + } + else { + this->debugHandle->printLn("connection for weather data failed"); //error message if no client connect + this->debugHandle->printLn(""); + return; + } + + while(weatherClient.connected() && !weatherClient.available()) delay(1); //waits for data + + this->debugHandle->printLn("Waiting for data"); + + // Check HTTP status + char status[32] = {0}; + weatherClient.readBytesUntil('\r', status, sizeof(status)); + this->debugHandle->printLn("Response Header: " + String(status)); + if (strcmp(status, "HTTP/1.1 200 OK") != 0) { + this->debugHandle->print("Unexpected response: "); + this->debugHandle->printLn(status); + return; + } + + // Skip HTTP headers + char endOfHeaders[] = "\r\n\r\n"; + if (!weatherClient.find(endOfHeaders)) { + this->debugHandle->printLn("Invalid response"); + return; + } + + const size_t bufferSize = 710; + DynamicJsonBuffer jsonBuffer(bufferSize); + + weathers[0].cached = false; + weathers[0].error = ""; + // Parse JSON object + JsonObject& root = jsonBuffer.parseObject(weatherClient); + if (!root.success()) { + this->debugHandle->printLn("Weather Data Parsing failed!"); + weathers[0].error = "Weather Data Parsing failed!"; + return; + } + + weatherClient.stop(); //stop client + + if (root.measureLength() <= 150) { + this->debugHandle->printLn("Error Does not look like we got the data. Size: " + String(root.measureLength())); + weathers[0].cached = true; + weathers[0].error = (const char*)root["message"]; + this->debugHandle->printLn("Error: " + weathers[0].error); + return; + } + int count = root["cnt"]; + + for (int inx = 0; inx < count; inx++) { + weathers[inx].lat = (const char*)root["list"][inx]["coord"]["lat"]; + weathers[inx].lon = (const char*)root["list"][inx]["coord"]["lon"]; + weathers[inx].dt = (const char*)root["list"][inx]["dt"]; + weathers[inx].city = (const char*)root["list"][inx]["name"]; + weathers[inx].country = (const char*)root["list"][inx]["sys"]["country"]; + weathers[inx].temp = (const char*)root["list"][inx]["main"]["temp"]; + weathers[inx].humidity = (const char*)root["list"][inx]["main"]["humidity"]; + weathers[inx].condition = (const char*)root["list"][inx]["weather"][0]["main"]; + weathers[inx].wind = (const char*)root["list"][inx]["wind"]["speed"]; + weathers[inx].weatherId = (const char*)root["list"][inx]["weather"][0]["id"]; + weathers[inx].description = (const char*)root["list"][inx]["weather"][0]["description"]; + weathers[inx].icon = (const char*)root["list"][inx]["weather"][0]["icon"]; + + this->debugHandle->printLn("lat: " + weathers[inx].lat); + this->debugHandle->printLn("lon: " + weathers[inx].lon); + this->debugHandle->printLn("dt: " + weathers[inx].dt); + this->debugHandle->printLn("city: " + weathers[inx].city); + this->debugHandle->printLn("country: " + weathers[inx].country); + this->debugHandle->printLn("temp: " + weathers[inx].temp); + this->debugHandle->printLn("humidity: " + weathers[inx].humidity); + this->debugHandle->printLn("condition: " + weathers[inx].condition); + this->debugHandle->printLn("wind: " + weathers[inx].wind); + this->debugHandle->printLn("weatherId: " + weathers[inx].weatherId); + this->debugHandle->printLn("description: " + weathers[inx].description); + this->debugHandle->printLn("icon: " + weathers[inx].icon); + this->debugHandle->printLn(""); + + } +} + +String OpenWeatherMapClient::roundValue(String value) { + float f = value.toFloat(); + int rounded = (int)(f+0.5f); + return String(rounded); +} + +void OpenWeatherMapClient::updateCityIdList(int CityIDs[], int cityCount) { + myCityIDs = ""; + for (int inx = 0; inx < cityCount; inx++) { + if (CityIDs[inx] > 0) { + if (myCityIDs != "") { + myCityIDs = myCityIDs + ","; + } + myCityIDs = myCityIDs + String(CityIDs[inx]); + } + } +} + +void OpenWeatherMapClient::setMetric(boolean isMetric) { + if (isMetric) { + units = "metric"; + } else { + units = "imperial"; + } +} + +String OpenWeatherMapClient::getWeatherResults() { + return result; +} + +String OpenWeatherMapClient::getLat(int index) { + return weathers[index].lat; +} + +String OpenWeatherMapClient::getLon(int index) { + return weathers[index].lon; +} + +String OpenWeatherMapClient::getDt(int index) { + return weathers[index].dt; +} + +String OpenWeatherMapClient::getCity(int index) { + return weathers[index].city; +} + +String OpenWeatherMapClient::getCountry(int index) { + return weathers[index].country; +} + +String OpenWeatherMapClient::getTemp(int index) { + return weathers[index].temp; +} + +String OpenWeatherMapClient::getTempRounded(int index) { + return roundValue(getTemp(index)); +} + +String OpenWeatherMapClient::getHumidity(int index) { + return weathers[index].humidity; +} + +String OpenWeatherMapClient::getHumidityRounded(int index) { + return roundValue(getHumidity(index)); +} + +String OpenWeatherMapClient::getCondition(int index) { + return weathers[index].condition; +} + +String OpenWeatherMapClient::getWind(int index) { + return weathers[index].wind; +} + +String OpenWeatherMapClient::getWindRounded(int index) { + return roundValue(getWind(index)); +} + +String OpenWeatherMapClient::getWeatherId(int index) { + return weathers[index].weatherId; +} + +String OpenWeatherMapClient::getDescription(int index) { + return weathers[index].description; +} + +String OpenWeatherMapClient::getIcon(int index) { + return weathers[index].icon; +} + +boolean OpenWeatherMapClient::getCached() { + return weathers[0].cached; +} + +String OpenWeatherMapClient::getMyCityIDs() { + return myCityIDs; +} + +String OpenWeatherMapClient::getError() { + return weathers[0].error; +} + +String OpenWeatherMapClient::getWeatherIcon(int index) +{ + int id = getWeatherId(index).toInt(); + String W = ")"; + switch(id) + { + case 800: W = "B"; break; + case 801: W = "Y"; break; + case 802: W = "H"; break; + case 803: W = "H"; break; + case 804: W = "Y"; break; + + case 200: W = "0"; break; + case 201: W = "0"; break; + case 202: W = "0"; break; + case 210: W = "0"; break; + case 211: W = "0"; break; + case 212: W = "0"; break; + case 221: W = "0"; break; + case 230: W = "0"; break; + case 231: W = "0"; break; + case 232: W = "0"; break; + + case 300: W = "R"; break; + case 301: W = "R"; break; + case 302: W = "R"; break; + case 310: W = "R"; break; + case 311: W = "R"; break; + case 312: W = "R"; break; + case 313: W = "R"; break; + case 314: W = "R"; break; + case 321: W = "R"; break; + + case 500: W = "R"; break; + case 501: W = "R"; break; + case 502: W = "R"; break; + case 503: W = "R"; break; + case 504: W = "R"; break; + case 511: W = "R"; break; + case 520: W = "R"; break; + case 521: W = "R"; break; + case 522: W = "R"; break; + case 531: W = "R"; break; + + case 600: W = "W"; break; + case 601: W = "W"; break; + case 602: W = "W"; break; + case 611: W = "W"; break; + case 612: W = "W"; break; + case 615: W = "W"; break; + case 616: W = "W"; break; + case 620: W = "W"; break; + case 621: W = "W"; break; + case 622: W = "W"; break; + + case 701: W = "M"; break; + case 711: W = "M"; break; + case 721: W = "M"; break; + case 731: W = "M"; break; + case 741: W = "M"; break; + case 751: W = "M"; break; + case 761: W = "M"; break; + case 762: W = "M"; break; + case 771: W = "M"; break; + case 781: W = "M"; break; + + default:break; + } + return W; } diff --git a/printermonitor/OpenWeatherMapClient.h b/printermonitor/OpenWeatherMapClient.h index 9a8a44b..7289af8 100644 --- a/printermonitor/OpenWeatherMapClient.h +++ b/printermonitor/OpenWeatherMapClient.h @@ -24,6 +24,7 @@ SOFTWARE. #pragma once #include #include "libs/ArduinoJson/ArduinoJson.h" +#include "Debug.h" class OpenWeatherMapClient { @@ -56,9 +57,11 @@ private: weather weathers[5]; String roundValue(String value); + + Debug *debugHandle; public: - OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric, String language); + OpenWeatherMapClient(String ApiKey, int CityIDs[], int cityCount, boolean isMetric, String language, Debug *debugHandle); void updateWeather(); void updateWeatherApiKey(String ApiKey); void updateCityIdList(int CityIDs[], int cityCount); diff --git a/printermonitor/PrinterClientInterface.h b/printermonitor/PrinterClientInterface.h new file mode 100644 index 0000000..ec5d82f --- /dev/null +++ b/printermonitor/PrinterClientInterface.h @@ -0,0 +1,29 @@ +#pragma once + +class PrinterClientInterface { +public: + virtual String getAveragePrintTime() = 0; + virtual String getEstimatedPrintTime() = 0; + virtual String getFileName() = 0; + virtual String getFileSize() = 0; + virtual String getLastPrintTime() = 0; + virtual String getProgressCompletion() = 0; + virtual String getProgressFilepos() = 0; + virtual String getProgressPrintTime() = 0; + virtual String getProgressPrintTimeLeft() = 0; + virtual String getState() = 0; + virtual boolean isPrinting() = 0; + virtual boolean isOperational() = 0; + virtual boolean isPSUoff() = 0; + virtual String getTempBedActual() = 0; + virtual String getTempBedTarget() = 0; + virtual String getTempToolActual() = 0; + virtual String getTempToolTarget() = 0; + virtual String getFilamentLength() = 0; + virtual String getValueRounded(String value) = 0; + virtual String getError() = 0; + virtual String getPrinterType() = 0; + virtual int getPrinterPort() = 0; + virtual String getPrinterName() = 0; + virtual void setPrinterName(String printer) = 0; +}; diff --git a/printermonitor/RepetierClient.cpp b/printermonitor/RepetierClient.cpp index e547916..c8c6126 100644 --- a/printermonitor/RepetierClient.cpp +++ b/printermonitor/RepetierClient.cpp @@ -27,7 +27,8 @@ SOFTWARE. #include "RepetierClient.h" -RepetierClient::RepetierClient(String ApiKey, String server, int port, String user, String pass, boolean psu) { +RepetierClient::RepetierClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle) { + this->debugHandle = debugHandle; updatePrintClient(ApiKey, server, port, user, pass, psu); } @@ -63,8 +64,8 @@ WiFiClient RepetierClient::getSubmitRequest(String apiGetData) { WiFiClient printClient; printClient.setTimeout(5000); - Serial.println("Getting Repetier Data via GET"); - Serial.println(apiGetData); + this->debugHandle->printLn("Getting Repetier Data via GET"); + this->debugHandle->printLn(apiGetData); result = ""; if (printClient.connect(myServer, myPort)) { //starts client connection, checks for connection printClient.println(apiGetData); @@ -77,40 +78,20 @@ WiFiClient RepetierClient::getSubmitRequest(String apiGetData) { printClient.println("User-Agent: ArduinoWiFi/1.1"); printClient.println("Connection: close"); if (printClient.println() == 0) { - Serial.println("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); - Serial.println(); + this->debugHandle->printLn("Connection to " + String(myServer) + ":" + String(myPort) + " failed."); + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to " + String(myServer) + ":" + String(myPort) + " failed."; return printClient; } } else { - Serial.println("Connection to Repetier failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect - Serial.println(); + this->debugHandle->printLn("Connection to Repetier failed: " + String(myServer) + ":" + String(myPort)); //error message if no client connect + this->debugHandle->printLn(""); resetPrintData(); printerData.error = "Connection to Repetier failed: " + String(myServer) + ":" + String(myPort); return printClient; } -/* - // Check HTTP status - char status[32] = {0}; - printClient.readBytesUntil('\r', status, sizeof(status)); - if (strcmp(status, "HTTP/1.1 200 OK") != 0) { - Serial.print(F("Unexpected response: ")); - Serial.println(status); - printerData.state = ""; - printerData.error = "Response: " + String(status); - return printClient; - } - - // Skip HTTP headers - char endOfHeaders[] = "\r\n\r\n"; - if (!printClient.find(endOfHeaders)) { - Serial.println(F("Invalid response")); - printerData.error = "Invalid response from " + String(myServer) + ":" + String(myPort); - printerData.state = ""; - } -*/ return printClient; } @@ -133,16 +114,16 @@ void RepetierClient::getPrinterJobResults() { if (!root.success()) { printerData.error = "Repetier Data Parsing failed: " + String(myServer) + ":" + String(myPort); - Serial.println(printerData.error); + this->debugHandle->printLn(printerData.error); printerData.state = ""; return; } int inx = 0; int count = root.size(); - Serial.println("Size of root: " + String(count)); + this->debugHandle->printLn("Size of root: " + String(count)); for (int i = 0; i < count; i++) { - Serial.println("Printer: " + String((const char*)root[i]["slug"])); + this->debugHandle->printLn("Printer: " + String((const char*)root[i]["slug"])); if (String((const char*)root[i]["slug"]) == printerData.printerName) { inx = i; break; @@ -182,13 +163,13 @@ void RepetierClient::getPrinterJobResults() { } if (printerData.isPrinting) { - Serial.println("Printing: " + printerData.fileName); + this->debugHandle->printLn("Printing: " + printerData.fileName); } if (isOperational()) { - Serial.println("Status: " + printerData.state); + this->debugHandle->printLn("Status: " + printerData.state); } else { - Serial.println("Printer Not Operational"); + this->debugHandle->printLn("Printer Not Operational"); } //**** get the Printer Temps and Stat @@ -221,7 +202,7 @@ void RepetierClient::getPrinterJobResults() { printerData.bedTargetTemp = (const char*) pr2["heatedBeds"][0]["tempSet"]; if (printerData.isPrinting) { - Serial.println("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); + this->debugHandle->printLn("Status: " + printerData.state + " " + printerData.fileName + "(" + printerData.progressCompletion + "%)"); } } diff --git a/printermonitor/RepetierClient.h b/printermonitor/RepetierClient.h index 7c92105..06d8bf4 100644 --- a/printermonitor/RepetierClient.h +++ b/printermonitor/RepetierClient.h @@ -28,8 +28,10 @@ SOFTWARE. #include #include "libs/ArduinoJson/ArduinoJson.h" #include +#include "Debug.h" +#include "PrinterClientInterface.h" -class RepetierClient { +class RepetierClient : public PrinterClientInterface { private: char myServer[100]; @@ -69,10 +71,10 @@ private: } PrinterStruct; PrinterStruct printerData; - + Debug *debugHandle; public: - RepetierClient(String ApiKey, String server, int port, String user, String pass, boolean psu); + RepetierClient(String ApiKey, String server, int port, String user, String pass, boolean psu, Debug *debugHandle); void getPrinterJobResults(); void getPrinterPsuState(); void updatePrintClient(String ApiKey, String server, int port, String user, String pass, boolean psu); diff --git a/printermonitor/Settings.h b/printermonitor/Settings.h index b40cee5..d8e46d3 100644 --- a/printermonitor/Settings.h +++ b/printermonitor/Settings.h @@ -1,23 +1,3 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - /** The MIT License (MIT) Copyright (c) 2018 David Payne @@ -59,34 +39,19 @@ SOFTWARE. * the Web Interface. ******************************************************************************/ -#include -#include -#include -#include -#include -#include -#include "TimeClient.h" -#include "KlipperClient.h" -#include "DuetClient.h" -#include "RepetierClient.h" -#include "OctoPrintClient.h" -#include "OpenWeatherMapClient.h" -#include "WeatherStationFonts.h" -#include "FS.h" -#include "SH1106Wire.h" -#include "SSD1306Wire.h" -#include "OLEDDisplayUi.h" +#ifndef __SETTINGS_H__ +#define __SETTINGS_H__ //****************************** // Start Settings //****************************** // ESP32/ESP8266 compatibility! -//#define USE_ESP8266 +#define USE_ESP8266 // OctoPrint / Repetier / Klipper/ Duet Monitoring -- Monitor your 3D OctoPrint or Repetier Server -#define USE_DUET_CLIENT // Uncomment this line to use the Duet Printer Server -- OctoPrint is used by default and is most common -//#define USE_KLIPPER_CLIENT // Uncomment this line to use the Duet Printer Server -- OctoPrint is used by default and is most common +//#define USE_DUET_CLIENT // Uncomment this line to use the Duet Printer Server -- OctoPrint is used by default and is most common +#define USE_KLIPPER_CLIENT // Uncomment this line to use the Duet Printer Server -- OctoPrint is used by default and is most common //#define USE_REPETIER_CLIENT // Uncomment this line to use the Repetier Printer Server -- OctoPrint is used by default and is most common String PrinterApiKey = ""; // ApiKey from your User Account on OctoPrint / Repetier @@ -121,18 +86,25 @@ boolean DISPLAYCLOCK = true; // true = Show Clock when not printing / false = // Display Settings #define USE_NEXTION_DISPLAY #ifdef USE_NEXTION_DISPLAY + #ifdef USE_ESP8266 + const int TX_PIN = 5; + const int RX_PIN = 4; + #else + const int TX_PIN = D1; + const int RX_PIN = D2; + #endif #else const int I2C_DISPLAY_ADDRESS = 0x3c; // I2C Address of your Display (usually 0x3c or 0x3d) #ifdef USE_ESP8266 - const int SDA_PIN = 21; - const int SCL_PIN = 22; // original code D5 -- Monitor Easy Board use D1 + const int SDA_PIN = 5; + const int SCL_PIN = 4; // original code D5 -- Monitor Easy Board use D1 #else const int SDA_PIN = D1; const int SCL_PIN = D2; // original code D5 -- Monitor Easy Board use D1 #endif - boolean INVERT_DISPLAY = true; // true = pins at top | false = pins at the bottom - //#define DISPLAY_SH1106 // Uncomment this line to use the SH1106 display -- SSD1306 is used by default and is most common + boolean INVERT_DISPLAY = true; // true = pins at top | false = pins at the bottom + boolean DISPLAY_SH1106 = false; // true = to use the SH1106 display | false = SSD1306 is used by default and is most common #endif // LED Settings @@ -151,3 +123,8 @@ String OTA_Password = ""; // Set an OTA password here -- leave blank if you //****************************** String themeColor = "light-green"; // this can be changed later in the web interface. +#define HOSTNAME "PrintMon-" +#define CONFIG "/conf.txt" +#define VERSION "4.0" + +#endif diff --git a/printermonitor/TimeClient.cpp b/printermonitor/TimeClient.cpp index b0753e0..c2b166b 100644 --- a/printermonitor/TimeClient.cpp +++ b/printermonitor/TimeClient.cpp @@ -1,152 +1,158 @@ -/**The MIT License (MIT) - -Copyright (c) 2015 by Daniel Eichhorn - -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. -*/ - -/* -Modified by David Payne for use in the Scrolling Marquee -*/ - -#include "TimeClient.h" - -TimeClient::TimeClient(float utcOffset) { - myUtcOffset = utcOffset; -} - -void TimeClient::updateTime() { - WiFiClient client; - - if (!client.connect(ntpServerName, httpPort)) { - Serial.println("connection failed"); - return; - } - - // This will send the request to the server - client.print(String("GET / HTTP/1.1\r\n") + - String("Host: www.google.com\r\n") + - String("Connection: close\r\n\r\n")); - int repeatCounter = 0; - while(!client.available() && repeatCounter < 10) { - delay(1000); - Serial.println("."); - repeatCounter++; - } - - String line; - - int size = 0; - client.setNoDelay(false); - while(client.connected()) { - while((size = client.available()) > 0) { - line = client.readStringUntil('\n'); - line.toUpperCase(); - // example: - // date: Thu, 19 Nov 2015 20:25:40 GMT - if (line.startsWith("DATE: ")) { - Serial.println(line.substring(23, 25) + ":" + line.substring(26, 28) + ":" +line.substring(29, 31)); - int parsedHours = line.substring(23, 25).toInt(); - int parsedMinutes = line.substring(26, 28).toInt(); - int parsedSeconds = line.substring(29, 31).toInt(); - Serial.println(String(parsedHours) + ":" + String(parsedMinutes) + ":" + String(parsedSeconds)); - - localEpoc = (parsedHours * 60 * 60 + parsedMinutes * 60 + parsedSeconds); - Serial.println(localEpoc); - localMillisAtUpdate = millis(); - client.stop(); - } - } - } - -} - -void TimeClient::setUtcOffset(float utcOffset) { - myUtcOffset = utcOffset; -} - -String TimeClient::getHours() { - if (localEpoc == 0) { - return "--"; - } - int hours = ((getCurrentEpochWithUtcOffset() % 86400L) / 3600) % 24; - if (hours < 10) { - return "0" + String(hours); - } - return String(hours); // print the hour (86400 equals secs per day) - -} -String TimeClient::getMinutes() { - if (localEpoc == 0) { - return "--"; - } - int minutes = ((getCurrentEpochWithUtcOffset() % 3600) / 60); - if (minutes < 10 ) { - // In the first 10 minutes of each hour, we'll want a leading '0' - return "0" + String(minutes); - } - return String(minutes); -} -String TimeClient::getSeconds() { - if (localEpoc == 0) { - return "--"; - } - int seconds = getCurrentEpochWithUtcOffset() % 60; - if ( seconds < 10 ) { - // In the first 10 seconds of each minute, we'll want a leading '0' - return "0" + String(seconds); - } - return String(seconds); -} - -String TimeClient::getAmPmHours() { - int hours = getHours().toInt(); - if (hours >= 13) { - hours = hours - 12; - } - if (hours == 0) { - hours = 12; - } - return String(hours); -} - -String TimeClient::getAmPm() { - int hours = getHours().toInt(); - String ampmValue = "AM"; - if (hours >= 12) { - ampmValue = "PM"; - } - return ampmValue; -} - -String TimeClient::getFormattedTime() { - return getHours() + ":" + getMinutes() + ":" + getSeconds(); -} - -String TimeClient::getAmPmFormattedTime() { - return getAmPmHours() + ":" + getMinutes() + " " + getAmPm(); -} - -long TimeClient::getCurrentEpoch() { - return localEpoc + ((millis() - localMillisAtUpdate) / 1000); -} - -long TimeClient::getCurrentEpochWithUtcOffset() { - return (long)round(getCurrentEpoch() + 3600 * myUtcOffset + 86400L) % 86400L; +/**The MIT License (MIT) + +Copyright (c) 2015 by Daniel Eichhorn + +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. +*/ + +/* +Modified by David Payne for use in the Scrolling Marquee +*/ + +#include "TimeClient.h" + +TimeClient::TimeClient(float utcOffset, boolean is24Hour, Debug *debugHandle) { + this->debugHandle = debugHandle; + this->myUtcOffset = utcOffset; + this->is24Hour = is24Hour; +} + +void TimeClient::updateTime() { + WiFiClient client; + + if (!client.connect(ntpServerName, httpPort)) { + this->debugHandle->printLn("connection failed"); + return; + } + + // This will send the request to the server + client.print(String("GET / HTTP/1.1\r\n") + + String("Host: www.google.com\r\n") + + String("Connection: close\r\n\r\n")); + int repeatCounter = 0; + while(!client.available() && repeatCounter < 10) { + delay(1000); + this->debugHandle->printLn("."); + repeatCounter++; + } + + String line; + + int size = 0; + client.setNoDelay(false); + while(client.connected()) { + while((size = client.available()) > 0) { + line = client.readStringUntil('\n'); + line.toUpperCase(); + // example: + // date: Thu, 19 Nov 2015 20:25:40 GMT + if (line.startsWith("DATE: ")) { + this->debugHandle->printLn(line.substring(23, 25) + ":" + line.substring(26, 28) + ":" +line.substring(29, 31)); + int parsedHours = line.substring(23, 25).toInt(); + int parsedMinutes = line.substring(26, 28).toInt(); + int parsedSeconds = line.substring(29, 31).toInt(); + this->debugHandle->printLn(String(parsedHours) + ":" + String(parsedMinutes) + ":" + String(parsedSeconds)); + + localEpoc = (parsedHours * 60 * 60 + parsedMinutes * 60 + parsedSeconds); + this->debugHandle->printLn(localEpoc); + localMillisAtUpdate = millis(); + client.stop(); + } + } + } + +} + +void TimeClient::setUtcOffset(float utcOffset) { + myUtcOffset = utcOffset; +} + +String TimeClient::getHours() { + if (localEpoc == 0) { + return "--"; + } + int hours = ((getCurrentEpochWithUtcOffset() % 86400L) / 3600) % 24; + if (hours < 10) { + return "0" + String(hours); + } + return String(hours); // print the hour (86400 equals secs per day) + +} +String TimeClient::getMinutes() { + if (localEpoc == 0) { + return "--"; + } + int minutes = ((getCurrentEpochWithUtcOffset() % 3600) / 60); + if (minutes < 10 ) { + // In the first 10 minutes of each hour, we'll want a leading '0' + return "0" + String(minutes); + } + return String(minutes); +} +String TimeClient::getSeconds() { + if (localEpoc == 0) { + return "--"; + } + int seconds = getCurrentEpochWithUtcOffset() % 60; + if ( seconds < 10 ) { + // In the first 10 seconds of each minute, we'll want a leading '0' + return "0" + String(seconds); + } + return String(seconds); +} + +String TimeClient::getAmPmHours() { + int hours = getHours().toInt(); + if (hours >= 13) { + hours = hours - 12; + } + if (hours == 0) { + hours = 12; + } + return String(hours); +} + +String TimeClient::getAmPm() { + int hours = getHours().toInt(); + String ampmValue = "AM"; + if (hours >= 12) { + ampmValue = "PM"; + } + return ampmValue; +} + +String TimeClient::getFormattedTime() { + return getHours() + ":" + getMinutes() + ":" + getSeconds(); +} + +String TimeClient::getAmPmFormattedTime() { + return getAmPmHours() + ":" + getMinutes() + " " + getAmPm(); +} + +long TimeClient::getCurrentEpoch() { + return localEpoc + ((millis() - localMillisAtUpdate) / 1000); +} + +long TimeClient::getCurrentEpochWithUtcOffset() { + return (long)round(getCurrentEpoch() + 3600 * myUtcOffset + 86400L) % 86400L; +} + +boolean TimeClient::isHour24() { + return this->is24Hour; } diff --git a/printermonitor/TimeClient.h b/printermonitor/TimeClient.h index dee7601..9c69b48 100644 --- a/printermonitor/TimeClient.h +++ b/printermonitor/TimeClient.h @@ -30,6 +30,7 @@ Modified by David Payne for use in the Scrolling Marquee #pragma once #include +#include "Debug.h" #define NTP_PACKET_SIZE 48 @@ -42,9 +43,11 @@ class TimeClient { const char* ntpServerName = "www.google.com"; const int httpPort = 80; byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets - + bool is24Hour; + Debug *debugHandle; + public: - TimeClient(float utcOffset); + TimeClient(float utcOffset, boolean is24Hour, Debug *debugHandle); void updateTime(); void setUtcOffset(float utcOffset); @@ -57,6 +60,6 @@ class TimeClient { String getAmPmFormattedTime(); long getCurrentEpoch(); long getCurrentEpochWithUtcOffset(); + boolean isHour24(); }; - diff --git a/printermonitor/WebConstants.h b/printermonitor/WebConstants.h new file mode 100644 index 0000000..ad151f9 --- /dev/null +++ b/printermonitor/WebConstants.h @@ -0,0 +1,94 @@ +#pragma once + +static const char WEB_ACTIONS[] PROGMEM = " Home" + " Configure" + " Weather" + " Reset Settings" + " Forget WiFi" + " Firmware Update" + " About"; + +String CHANGE_FORM = ""; // moved to config to make it dynamic + +static const char CLOCK_FORM[] PROGMEM = "

    Display Clock when printer is off

    " + "

    Use 24 Hour Clock (military time)

    " + "

    Flip display orientation

    " + "

    Flash System LED on Service Calls

    " + "

    Use OctoPrint PSU control plugin for clock/blank

    " + "

    Clock Sync / Weather Refresh (minutes)

    "; + +static const char THEME_FORM[] PROGMEM = "

    Theme Color

    " + "


    " + "

    Use Security Credentials for Configuration Changes

    " + "

    " + "

    " + ""; + +static const char WEATHER_FORM[] PROGMEM = "

    Weather Config:

    " + "

    Display Weather when printer is off

    " + "" + "" + "

    " + "

    Use Metric (Celsius)

    " + "

    Weather Language

    " + "
    " + ""; + +static const char LANG_OPTIONS[] PROGMEM = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +static const char COLOR_THEMES[] PROGMEM = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; diff --git a/printermonitor/WebServer.cpp b/printermonitor/WebServer.cpp new file mode 100644 index 0000000..0b617f7 --- /dev/null +++ b/printermonitor/WebServer.cpp @@ -0,0 +1,349 @@ +#include "WebServer.h" + +static const char WEB_ACTIONS[] PROGMEM = " Home" + " Configure" + " Weather" + " Reset Settings" + " Forget WiFi" + " Firmware Update" + " About"; + +static const char CLOCK_FORM[] PROGMEM = "

    Display Clock when printer is off

    " + "

    Use 24 Hour Clock (military time)

    " + "

    Flip display orientation

    " + "

    Flash System LED on Service Calls

    " + "

    Use OctoPrint PSU control plugin for clock/blank

    " + "

    Clock Sync / Weather Refresh (minutes)

    "; + +static const char THEME_FORM[] PROGMEM = "

    Theme Color

    " + "


    " + "

    Use Security Credentials for Configuration Changes

    " + "

    " + "

    " + ""; + +static const char WEATHER_FORM[] PROGMEM = "

    Weather Config:

    " + "

    Display Weather when printer is off

    " + "" + "" + "

    " + "

    Use Metric (Celsius)

    " + "

    Weather Language

    " + "
    " + ""; + +static const char LANG_OPTIONS[] PROGMEM = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +static const char COLOR_THEMES[] PROGMEM = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""; + +WebServer::WebServer(ESP8266WebServer *serverHandle, Debug *debugHandle, PrinterClientInterface *printerClient, TimeClient *timeClient, String themeColor, String swVersion, boolean hasPsu) { + this->serverHandle = serverHandle; + this->themeColor = themeColor; + this->debugHandle = debugHandle; + this->swVersion = swVersion; + this->printerClient = printerClient; + this->timeClient = timeClient; + this->hostName = ""; + this->hasPsu = hasPsu; + this->isBasicAuth = false; + this->wwwUsername = ""; + this->wwwPassword = ""; +} + +void WebServer::setHostname(String hostName) { + this->hostName = hostName; +} + +void WebServer::redirectHome() { + // Send them back to the Root Directory + this->serverHandle->sendHeader("Location", String("/"), true); + this->serverHandle->sendHeader("Cache-Control", "no-cache, no-store"); + this->serverHandle->sendHeader("Pragma", "no-cache"); + this->serverHandle->sendHeader("Expires", "-1"); + this->serverHandle->send(302, "text/plain", ""); + this->serverHandle->client().stop(); +} + +String WebServer::getHeader() { + return this->getHeader(false); +} + +String WebServer::getHeader(boolean refresh) { + String menu = FPSTR(WEB_ACTIONS); + + String html = ""; + html += "Printer Monitor"; + html += ""; + html += ""; + if (refresh) { + html += ""; + } + html += ""; + html += ""; + html += ""; + html += ""; + html += ""; + html += "

    Printer Monitor

    "; + html += ""; + html += "
    "; + return html; +} + +String WebServer::getFooter() { + int8_t rssi = this->getWifiQuality(); + this->debugHandle->print("Signal Strength (RSSI): "); + this->debugHandle->print(rssi); + this->debugHandle->printLn("%"); + String html = "


    "; + html += "
    "; + html += "
    "; + if (this->lastReportStatus != "") { + html += " Report Status: " + this->lastReportStatus + "
    "; + } + html += " Version: " + this->swVersion + "
    "; + html += " Signal Strength: "; + html += String(rssi) + "%"; + html += "
    "; + html += ""; + return html; +} + +void WebServer::displayPrinterStatus() { + String html = ""; + + this->serverHandle->sendHeader("Cache-Control", "no-cache, no-store"); + this->serverHandle->sendHeader("Pragma", "no-cache"); + this->serverHandle->sendHeader("Expires", "-1"); + this->serverHandle->setContentLength(CONTENT_LENGTH_UNKNOWN); + this->serverHandle->send(200, "text/html", ""); + this->serverHandle->sendContent(String(this->getHeader(true))); + + String displayTime = this->timeClient->getAmPmHours() + ":" + this->timeClient->getMinutes() + ":" + this->timeClient->getSeconds() + " " + this->timeClient->getAmPm(); + if (this->timeClient->isHour24()) { + displayTime = this->timeClient->getHours() + ":" + this->timeClient->getMinutes() + ":" + this->timeClient->getSeconds(); + } + + html += "

    " + this->printerClient->getPrinterType() + " Monitor

    "; + html += "

    "; + if (this->printerClient->getPrinterType() == "Repetier") { + html += "Printer Name: " + this->printerClient->getPrinterName() + "
    "; + } else { + html += "Host Name: " + this->hostName + "
    "; + } + + if (this->printerClient->getError() != "") { + html += "Status: Offline
    "; + html += "Reason: " + this->printerClient->getError() + "
    "; + } else { + html += "Status: " + this->printerClient->getState(); + if (this->printerClient->isPSUoff() && this->hasPsu) { + html += ", PSU off"; + } + html += "
    "; + } + + if (this->printerClient->isPrinting()) { + html += "File: " + this->printerClient->getFileName() + "
    "; + float fileSize = this->printerClient->getFileSize().toFloat(); + if (fileSize > 0) { + fileSize = fileSize / 1024; + html += "File Size: " + String(fileSize) + "KB
    "; + } + int filamentLength = this->printerClient->getFilamentLength().toInt(); + if (filamentLength > 0) { + float fLength = float(filamentLength) / 1000; + html += "Filament: " + String(fLength) + "m
    "; + } + + html += "Tool Temperature: " + this->printerClient->getTempToolActual() + "° C
    "; + if ( this->printerClient->getTempBedActual() != 0 ) { + html += "Bed Temperature: " + this->printerClient->getTempBedActual() + "° C
    "; + } + + int val = this->printerClient->getProgressPrintTimeLeft().toInt(); + int hours = numberOfHours(val); + int minutes = numberOfMinutes(val); + int seconds = numberOfSeconds(val); + html += "Est. Print Time Left: " + zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds) + "
    "; + + val = this->printerClient->getProgressPrintTime().toInt(); + hours = numberOfHours(val); + minutes = numberOfMinutes(val); + seconds = numberOfSeconds(val); + html += "Printing Time: " + zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds) + "
    "; + html += ""; + html += "

    " + this->printerClient->getProgressCompletion() + "%
    "; + } else { + html += "
    "; + } + + html += "

    "; + + html += "

    Time: " + displayTime + "

    "; + + this->serverHandle->sendContent(html); // spit out what we got + html = ""; + + /* + if (DISPLAYWEATHER) { + if (weatherClient.getCity(0) == "") { + html += "

    Please Configure Weather API

    "; + if (weatherClient.getError() != "") { + html += "

    Weather Error: " + weatherClient.getError() + "

    "; + } + } else { + html += "

    " + weatherClient.getCity(0) + ", " + weatherClient.getCountry(0) + "

    "; + html += "
    "; + html += "" + weatherClient.getDescription(0) + "
    "; + html += weatherClient.getHumidity(0) + "% Humidity
    "; + html += weatherClient.getWind(0) + " " + getSpeedSymbol() + " Wind
    "; + html += "
    "; + html += "

    "; + html += weatherClient.getCondition(0) + " (" + weatherClient.getDescription(0) + ")
    "; + html += weatherClient.getTempRounded(0) + getTempSymbol(true) + "
    "; + html += " Map It!
    "; + html += "

    "; + } + + this->serverHandle->sendContent(html); // spit out what we got + html = ""; // fresh start + }*/ + + this->serverHandle->sendContent(String(getFooter())); + this->serverHandle->sendContent(""); + this->serverHandle->client().stop(); +} + + +void WebServer::displayMessage(String message) { + this->serverHandle->sendHeader("Cache-Control", "no-cache, no-store"); + this->serverHandle->sendHeader("Pragma", "no-cache"); + this->serverHandle->sendHeader("Expires", "-1"); + this->serverHandle->setContentLength(CONTENT_LENGTH_UNKNOWN); + this->serverHandle->send(200, "text/html", ""); + String html = this->getHeader(); + this->serverHandle->sendContent(String(html)); + this->serverHandle->sendContent(String(message)); + html = this->getFooter(); + this->serverHandle->sendContent(String(html)); + this->serverHandle->sendContent(""); + this->serverHandle->client().stop(); +} + +void WebServer::setAuthentication(boolean enableBasicAuth, char *username, char *password) { + this->isBasicAuth = enableBasicAuth; + this->wwwUsername = username; + this->wwwPassword = password; +} + +boolean WebServer::authentication() { + if (this->isBasicAuth && (strlen(this->wwwUsername) >= 1 && strlen(this->wwwPassword) >= 1)) { + return this->serverHandle->authenticate(this->wwwUsername, this->wwwPassword); + } + return true; // Authentication not required +} + +void WebServer::handleWifiReset() { + if (!this->authentication()) { + return this->serverHandle->requestAuthentication(); + } + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + this->redirectHome(); + WiFiManager wifiManager; + wifiManager.resetSettings(); + ESP.restart(); +} + +void WebServer::handleSystemReset() { + if (!this->authentication()) { + return this->serverHandle->requestAuthentication(); + } + this->debugHandle->printLn("Reset System Configuration"); + //if (SPIFFS.remove(CONFIG)) { + this->redirectHome(); + ESP.restart(); + //} +} + +int8_t WebServer::getWifiQuality() { + int32_t dbm = WiFi.RSSI(); + if(dbm <= -100) { + return 0; + } else if(dbm >= -50) { + return 100; + } else { + return 2 * (dbm + 100); + } +} + +String WebServer::zeroPad(int value) { + String rtnValue = String(value); + if (value < 10) { + rtnValue = "0" + rtnValue; + } + return rtnValue; +} diff --git a/printermonitor/WebServer.h b/printermonitor/WebServer.h new file mode 100644 index 0000000..e7c37ed --- /dev/null +++ b/printermonitor/WebServer.h @@ -0,0 +1,45 @@ +#pragma once +#include +#include +#include +#include "Debug.h" +#include "PrinterClientInterface.h" +#include "TimeClient.h" +#include "Macros.h" + +class WebServer { +private: + ESP8266WebServer *serverHandle; + String themeColor; + Debug *debugHandle; + String lastReportStatus; + String swVersion; + String hostName; + TimeClient *timeClient; + PrinterClientInterface *printerClient; + boolean hasPsu; + + boolean isBasicAuth; + char *wwwUsername; + char *wwwPassword; + +public: + WebServer(ESP8266WebServer *serverHandle, Debug *debugHandle, PrinterClientInterface *printerClient, TimeClient *timeClient, String themeColor, String swVersion, boolean hasPsu); + + void setHostname(String hostName); + + void redirectHome(); + String getHeader(); + String getHeader(boolean refresh); + String getFooter(); + + void displayPrinterStatus(); + void displayMessage(String message); + + void setAuthentication(boolean enableBasicAuth, char *username, char *password); + boolean authentication(); + void handleSystemReset(); + void handleWifiReset(); + int8_t getWifiQuality(); + String zeroPad(int value); +}; diff --git a/printermonitor/printermonitor.ino b/printermonitor/printermonitor.ino index e82ca7b..000b758 100644 --- a/printermonitor/printermonitor.ino +++ b/printermonitor/printermonitor.ino @@ -28,57 +28,23 @@ SOFTWARE. /********************************************** * Edit Settings.h for personalization ***********************************************/ - #include "Settings.h" -#define VERSION "3.0" -#define HOSTNAME "PrintMon-" -#define CONFIG "/conf.txt" -/* Useful Constants */ -#define SECS_PER_MIN (60UL) -#define SECS_PER_HOUR (3600UL) -/* Useful Macros for getting elapsed time */ -#define numberOfSeconds(_time_) (_time_ % SECS_PER_MIN) -#define numberOfMinutes(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN) -#define numberOfHours(_time_) (_time_ / SECS_PER_HOUR) -#if USE_NEXTION_DISPLAY -#else - // Initialize the oled display for I2C_DISPLAY_ADDRESS - // SDA_PIN and SCL_PIN - #if defined(DISPLAY_SH1106) - SH1106Wire display(I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); - #else - SSD1306Wire display(I2C_DISPLAY_ADDRESS, SDA_PIN, SCL_PIN); // this is the default - #endif - OLEDDisplayUi ui( &display ); - void drawProgress(OLEDDisplay *display, int percentage, String label); - void drawOtaProgress(unsigned int, unsigned int); - void drawScreen1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); - void drawScreen2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); - void drawScreen3(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); - void drawHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state); - void drawClock(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); - void drawWeather(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y); - void drawClockHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state); -#endif -// Set the number of Frames supported -const int numberOfFrames = 3; -FrameCallback frames[numberOfFrames]; -FrameCallback clockFrame[2]; -boolean isClockOn = false; -OverlayCallback overlays[] = { drawHeaderOverlay }; -OverlayCallback clockOverlay[] = { drawClockHeaderOverlay }; -int numberOfOverlays = 1; + +#include "Global.h" + +// Debug output +Debug *debugHandle = new Debug(); // Time -TimeClient timeClient(UtcOffset); +TimeClient timeClient(UtcOffset, IS_24HOUR, debugHandle); long lastEpoch = 0; long firstEpoch = 0; long displayOffEpoch = 0; @@ -89,163 +55,61 @@ boolean displayOn = true; // Printer Client #if defined(USE_REPETIER_CLIENT) - RepetierClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU); + RepetierClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU, debugHandle); #elif defined(USE_KLIPPER_CLIENT) - KlipperClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU); + KlipperClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU, debugHandle); #elif defined(USE_DUET_CLIENT) - DuetClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU); + DuetClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU, debugHandle); #else - OctoPrintClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU); + OctoPrintClient printerClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU, debugHandle); #endif int printerCount = 0; // Weather Client -OpenWeatherMapClient weatherClient(WeatherApiKey, CityIDs, 1, IS_METRIC, WeatherLanguage); - -//declairing prototypes -void configModeCallback (WiFiManager *myWiFiManager); -int8_t getWifiQuality(); +OpenWeatherMapClient weatherClient(WeatherApiKey, CityIDs, 1, IS_METRIC, WeatherLanguage, debugHandle); +// Webserver ESP8266WebServer server(WEBSERVER_PORT); ESP8266HTTPUpdateServer serverUpdater; +WebServer webServer(&server, debugHandle, &printerClient, &timeClient, themeColor, String(VERSION), HAS_PSU); -static const char WEB_ACTIONS[] PROGMEM = " Home" - " Configure" - " Weather" - " Reset Settings" - " Forget WiFi" - " Firmware Update" - " About"; +// Display +#ifdef USE_NEXTION_DISPLAY + NextionDisplayClient displayHandle(RX_PIN, TX_PIN, &printerClient); +#else + OledDisplayClient displayHandle(SDA_PIN, SCL_PIN, I2C_DISPLAY_ADDRESS, DISPLAY_SH1106, INVERT_DISPLAY, &printerClient); +#endif -String CHANGE_FORM = ""; // moved to config to make it dynamic +//declairing prototypes +void configModeCallback(WiFiManager *myWiFiManager); +int8_t getWifiQuality(); +void flashLED(int number, int delayTime); +void ledOnOff(boolean value); +void readSettings(); +void writeSettings(); -static const char CLOCK_FORM[] PROGMEM = "

    Display Clock when printer is off

    " - "

    Use 24 Hour Clock (military time)

    " - "

    Flip display orientation

    " - "

    Flash System LED on Service Calls

    " - "

    Use OctoPrint PSU control plugin for clock/blank

    " - "

    Clock Sync / Weather Refresh (minutes)

    "; - -static const char THEME_FORM[] PROGMEM = "

    Theme Color

    " - "


    " - "

    Use Security Credentials for Configuration Changes

    " - "

    " - "

    " - ""; - -static const char WEATHER_FORM[] PROGMEM = "

    Weather Config:

    " - "

    Display Weather when printer is off

    " - "" - "" - "

    " - "

    Use Metric (Celsius)

    " - "

    Weather Language

    " - "
    " - ""; - -static const char LANG_OPTIONS[] PROGMEM = "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - ""; - -static const char COLOR_THEMES[] PROGMEM = "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - "" - ""; - +//************************************************************ +// Setup +//************************************************************ void setup() { - Serial.begin(115200); + debugHandle->initialize(); + webServer.setAuthentication(IS_BASIC_AUTH, www_username, www_password); SPIFFS.begin(); - delay(10); - - //New Line to clear from start garbage - Serial.println(); - + // Initialize digital pin for LED (little blue light on the Wemos D1 Mini) pinMode(externalLight, OUTPUT); - //Some Defaults before loading from Config.txt + // Some Defaults before loading from Config.txt and load PrinterPort = printerClient.getPrinterPort(); - readSettings(); - // initialize display - display.init(); - if (INVERT_DISPLAY) { - display.flipScreenVertically(); // connections at top of OLED display - } - display.clear(); - display.display(); - - //display.flipScreenVertically(); - - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.setContrast(255); // default is 255 - display.setFont(ArialMT_Plain_16); - display.drawString(64, 1, "Printer Monitor"); - display.setFont(ArialMT_Plain_10); - display.drawString(64, 18, "for " + printerClient.getPrinterType()); - display.setFont(ArialMT_Plain_16); - display.drawString(64, 30, "By Qrome"); - display.drawString(64, 46, "V" + String(VERSION)); - display.display(); - - //WiFiManager - //Local intialization. Once its business is done, there is no need to keep it around - WiFiManager wifiManager; + // Show boot screen + displayHandle.showPageInit(printerClient.getPrinterType(), String(VERSION)); - // Uncomment for testing wifi manager - //wifiManager.resetSettings(); + // WiFiManager - Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + //wifiManager.resetSettings(); // Uncomment for testing wifi manager wifiManager.setAPCallback(configModeCallback); String hostname(HOSTNAME); @@ -256,48 +120,32 @@ void setup() { ESP.reset(); delay(5000); } - - // You can change the transition that is used - // SLIDE_LEFT, SLIDE_RIGHT, SLIDE_TOP, SLIDE_DOWN - ui.setFrameAnimation(SLIDE_LEFT); - ui.setTargetFPS(30); - ui.disableAllIndicators(); - ui.setFrames(frames, (numberOfFrames)); - frames[0] = drawScreen1; - frames[1] = drawScreen2; - frames[2] = drawScreen3; - clockFrame[0] = drawClock; - clockFrame[1] = drawWeather; - ui.setOverlays(overlays, numberOfOverlays); - - // Inital UI takes care of initalising the display too. - ui.init(); - if (INVERT_DISPLAY) { - display.flipScreenVertically(); //connections at top of OLED display - } - - // print the received signal strength: - Serial.print("Signal Strength (RSSI): "); - Serial.print(getWifiQuality()); - Serial.println("%"); + // Display PostSetup + displayHandle.postSetup(); + + // print the received signal strength: + debugHandle->print("Signal Strength (RSSI): "); + debugHandle->print(getWifiQuality()); + debugHandle->printLn("%"); + if (ENABLE_OTA) { ArduinoOTA.onStart([]() { - Serial.println("Start"); + debugHandle->printLn("Start"); }); ArduinoOTA.onEnd([]() { - Serial.println("\nEnd"); + debugHandle->printLn("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + debugHandle->printF("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); + debugHandle->printF("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) debugHandle->printLn("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) debugHandle->printLn("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) debugHandle->printLn("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) debugHandle->printLn("Receive Failed"); + else if (error == OTA_END_ERROR) debugHandle->printLn("End Failed"); }); ArduinoOTA.setHostname((const char *)hostname.c_str()); if (OTA_Password != "") { @@ -307,102 +155,54 @@ void setup() { } if (WEBSERVER_ENABLED) { - server.on("/", displayPrinterStatus); - server.on("/systemreset", handleSystemReset); - server.on("/forgetwifi", handleWifiReset); - server.on("/updateconfig", handleUpdateConfig); - server.on("/updateweatherconfig", handleUpdateWeather); - server.on("/configure", handleConfigure); - server.on("/configureweather", handleWeatherConfigure); - server.onNotFound(redirectHome); - serverUpdater.setup(&server, "/update", www_username, www_password); + webServer.setHostname(hostname); + server.on("/", []() { webServer.displayPrinterStatus(); }); + server.on("/systemreset", []() { webServer.handleSystemReset(); }); + server.on("/forgetwifi", []() { webServer.handleWifiReset(); }); + //server.on("/updateconfig", handleUpdateConfig); + //server.on("/updateweatherconfig", handleUpdateWeather); + //server.on("/configure", handleConfigure); + //server.on("/configureweather", handleWeatherConfigure); + server.onNotFound([]() { webServer.redirectHome(); }); + //serverUpdater.setup(&server, "/update", www_username, www_password); // Start the server server.begin(); - Serial.println("Server started"); + debugHandle->printLn("Server started"); // Print the IP address String webAddress = "http://" + WiFi.localIP().toString() + ":" + String(WEBSERVER_PORT) + "/"; - Serial.println("Use this URL : " + webAddress); - display.clear(); - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.setFont(ArialMT_Plain_10); - display.drawString(64, 10, "Web Interface On"); - display.drawString(64, 20, "You May Connect to IP"); - display.setFont(ArialMT_Plain_16); - display.drawString(64, 30, WiFi.localIP().toString()); - display.drawString(64, 46, "Port: " + String(WEBSERVER_PORT)); - display.display(); + debugHandle->printLn("Use this URL : " + webAddress); + //display.clear(); + //display.setTextAlignment(TEXT_ALIGN_CENTER); + //display.setFont(ArialMT_Plain_10); + //display.drawString(64, 10, "Web Interface On"); + //display.drawString(64, 20, "You May Connect to IP"); + //display.setFont(ArialMT_Plain_16); + //display.drawString(64, 30, WiFi.localIP().toString()); + //display.drawString(64, 46, "Port: " + String(WEBSERVER_PORT)); + //display.display(); } else { - Serial.println("Web Interface is Disabled"); - display.clear(); - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.setFont(ArialMT_Plain_10); - display.drawString(64, 10, "Web Interface is Off"); - display.drawString(64, 20, "Enable in Settings.h"); - display.display(); + debugHandle->printLn("Web Interface is Disabled"); + //display.clear(); + //display.setTextAlignment(TEXT_ALIGN_CENTER); + //display.setFont(ArialMT_Plain_10); + //display.drawString(64, 10, "Web Interface is Off"); + //display.drawString(64, 20, "Enable in Settings.h"); + //display.display(); } flashLED(5, 100); findMDNS(); //go find Printer Server by the hostname - Serial.println("*** Leaving setup()"); + debugHandle->printLn("*** Leaving setup()"); } -void findMDNS() { - if (PrinterHostName == "" || ENABLE_OTA == false) { - return; // nothing to do here - } - // We now query our network for 'web servers' service - // over tcp, and get the number of available devices - int n = MDNS.queryService("http", "tcp"); - if (n == 0) { - Serial.println("no services found - make sure Printer server is turned on"); - return; - } - Serial.println("*** Looking for " + PrinterHostName + " over mDNS"); - for (int i = 0; i < n; ++i) { - // Going through every available service, - // we're searching for the one whose hostname - // matches what we want, and then get its IP - Serial.println("Found: " + MDNS.hostname(i)); - if (MDNS.hostname(i) == PrinterHostName) { - IPAddress serverIp = MDNS.IP(i); - PrinterServer = serverIp.toString(); - PrinterPort = MDNS.port(i); // save the port - Serial.println("*** Found Printer Server " + PrinterHostName + " http://" + PrinterServer + ":" + PrinterPort); - writeSettings(); // update the settings - } - } -} //************************************************************ // Main Loop //************************************************************ void loop() { - - //Get Time Update - if((getMinutesFromLastRefresh() >= minutesBetweenDataRefresh) || lastEpoch == 0) { - getUpdateTime(); - } - if (lastMinute != timeClient.getMinutes() && !printerClient.isPrinting()) { - // Check status every 60 seconds - ledOnOff(true); - lastMinute = timeClient.getMinutes(); // reset the check value - printerClient.getPrinterJobResults(); - printerClient.getPrinterPsuState(); - ledOnOff(false); - } else if (printerClient.isPrinting()) { - if (lastSecond != timeClient.getSeconds() && timeClient.getSeconds().endsWith("0")) { - lastSecond = timeClient.getSeconds(); - // every 10 seconds while printing get an update - ledOnOff(true); - printerClient.getPrinterJobResults(); - printerClient.getPrinterPsuState(); - ledOnOff(false); - } - } - checkDisplay(); // Check to see if the printer is on or offline and change display. - - ui.update(); + //displayHandle.showPageInit(); + //delay(1000); if (WEBSERVER_ENABLED) { server.handleClient(); @@ -412,702 +212,50 @@ void loop() { } } -void getUpdateTime() { - ledOnOff(true); // turn on the LED - Serial.println(); - if (displayOn && DISPLAYWEATHER) { - Serial.println("Getting Weather Data..."); - weatherClient.updateWeather(); + + + + + + + + + + +//************************************************************ +// MDNS for printers +//************************************************************ +void findMDNS() { + if (PrinterHostName == "" || ENABLE_OTA == false) { + return; // nothing to do here } - - Serial.println("Updating Time..."); - //Update the Time - timeClient.updateTime(); - lastEpoch = timeClient.getCurrentEpoch(); - Serial.println("Local time: " + timeClient.getAmPmFormattedTime()); - - ledOnOff(false); // turn off the LED -} - -boolean authentication() { - if (IS_BASIC_AUTH && (strlen(www_username) >= 1 && strlen(www_password) >= 1)) { - return server.authenticate(www_username, www_password); - } - return true; // Authentication not required -} - -void handleSystemReset() { - if (!authentication()) { - return server.requestAuthentication(); + // We now query our network for 'web servers' service + // over tcp, and get the number of available devices + int n = MDNS.queryService("http", "tcp"); + if (n == 0) { + debugHandle->printLn("no services found - make sure Printer server is turned on"); + return; } - Serial.println("Reset System Configuration"); - if (SPIFFS.remove(CONFIG)) { - redirectHome(); - ESP.restart(); - } -} - -void handleUpdateWeather() { - if (!authentication()) { - return server.requestAuthentication(); - } - DISPLAYWEATHER = server.hasArg("isWeatherEnabled"); - WeatherApiKey = server.arg("openWeatherMapApiKey"); - CityIDs[0] = server.arg("city1").toInt(); - IS_METRIC = server.hasArg("metric"); - WeatherLanguage = server.arg("language"); - writeSettings(); - isClockOn = false; // this will force a check for the display - checkDisplay(); - lastEpoch = 0; - redirectHome(); -} - -void handleUpdateConfig() { - boolean flipOld = INVERT_DISPLAY; - if (!authentication()) { - return server.requestAuthentication(); - } - if (server.hasArg("printer")) { - printerClient.setPrinterName(server.arg("printer")); - } - PrinterApiKey = server.arg("PrinterApiKey"); - PrinterHostName = server.arg("PrinterHostName"); - PrinterServer = server.arg("PrinterAddress"); - PrinterPort = server.arg("PrinterPort").toInt(); - PrinterAuthUser = server.arg("octoUser"); - PrinterAuthPass = server.arg("octoPass"); - DISPLAYCLOCK = server.hasArg("isClockEnabled"); - IS_24HOUR = server.hasArg("is24hour"); - INVERT_DISPLAY = server.hasArg("invDisp"); - USE_FLASH = server.hasArg("useFlash"); - HAS_PSU = server.hasArg("hasPSU"); - minutesBetweenDataRefresh = server.arg("refresh").toInt(); - themeColor = server.arg("theme"); - UtcOffset = server.arg("utcoffset").toFloat(); - String temp = server.arg("userid"); - temp.toCharArray(www_username, sizeof(temp)); - temp = server.arg("stationpassword"); - temp.toCharArray(www_password, sizeof(temp)); - writeSettings(); - findMDNS(); - printerClient.getPrinterJobResults(); - printerClient.getPrinterPsuState(); - if (INVERT_DISPLAY != flipOld) { - ui.init(); - if(INVERT_DISPLAY) - display.flipScreenVertically(); - ui.update(); - } - checkDisplay(); - lastEpoch = 0; - redirectHome(); -} - -void handleWifiReset() { - if (!authentication()) { - return server.requestAuthentication(); - } - //WiFiManager - //Local intialization. Once its business is done, there is no need to keep it around - redirectHome(); - WiFiManager wifiManager; - wifiManager.resetSettings(); - ESP.restart(); -} - -void handleWeatherConfigure() { - if (!authentication()) { - return server.requestAuthentication(); - } - ledOnOff(true); - String html = ""; - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - html = getHeader(); - server.sendContent(html); - - String form = FPSTR(WEATHER_FORM); - String isWeatherChecked = ""; - if (DISPLAYWEATHER) { - isWeatherChecked = "checked='checked'"; - } - form.replace("%IS_WEATHER_CHECKED%", isWeatherChecked); - form.replace("%WEATHERKEY%", WeatherApiKey); - form.replace("%CITYNAME1%", weatherClient.getCity(0)); - form.replace("%CITY1%", String(CityIDs[0])); - String checked = ""; - if (IS_METRIC) { - checked = "checked='checked'"; - } - form.replace("%METRIC%", checked); - String options = FPSTR(LANG_OPTIONS); - options.replace(">"+String(WeatherLanguage)+"<", " selected>"+String(WeatherLanguage)+"<"); - form.replace("%LANGUAGEOPTIONS%", options); - server.sendContent(form); - - html = getFooter(); - server.sendContent(html); - server.sendContent(""); - server.client().stop(); - ledOnOff(false); -} - -void handleConfigure() { - if (!authentication()) { - return server.requestAuthentication(); - } - ledOnOff(true); - String html = ""; - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - - html = getHeader(); - server.sendContent(html); - - CHANGE_FORM = "

    Station Config:

    " - "

    " - "

    "; - if (printerClient.getPrinterType() == "OctoPrint") { - CHANGE_FORM += "

    "; - } - CHANGE_FORM += "

    " - "

    " - "

    " - "

    "; - if (printerClient.getPrinterType() == "Repetier") { - CHANGE_FORM += "" - "

    " - ""; - } else { - CHANGE_FORM += "

    "; - } - CHANGE_FORM += "

    " - "

    "; - - - - if (printerClient.getPrinterType() == "Repetier") { - html = ""; - - server.sendContent(html); - } else { - html = ""; - server.sendContent(html); - } - - String form = CHANGE_FORM; - - form.replace("%OCTOKEY%", PrinterApiKey); - form.replace("%OCTOHOST%", PrinterHostName); - form.replace("%OCTOADDRESS%", PrinterServer); - form.replace("%OCTOPORT%", String(PrinterPort)); - form.replace("%OCTOUSER%", PrinterAuthUser); - form.replace("%OCTOPASS%", PrinterAuthPass); - - server.sendContent(form); - - form = FPSTR(CLOCK_FORM); - - String isClockChecked = ""; - if (DISPLAYCLOCK) { - isClockChecked = "checked='checked'"; - } - form.replace("%IS_CLOCK_CHECKED%", isClockChecked); - String is24hourChecked = ""; - if (IS_24HOUR) { - is24hourChecked = "checked='checked'"; - } - form.replace("%IS_24HOUR_CHECKED%", is24hourChecked); - String isInvDisp = ""; - if (INVERT_DISPLAY) { - isInvDisp = "checked='checked'"; - } - form.replace("%IS_INVDISP_CHECKED%", isInvDisp); - String isFlashLED = ""; - if (USE_FLASH) { - isFlashLED = "checked='checked'"; - } - form.replace("%USEFLASH%", isFlashLED); - String hasPSUchecked = ""; - if (HAS_PSU) { - hasPSUchecked = "checked='checked'"; - } - form.replace("%HAS_PSU_CHECKED%", hasPSUchecked); - - String options = ""; - options.replace(">"+String(minutesBetweenDataRefresh)+"<", " selected>"+String(minutesBetweenDataRefresh)+"<"); - form.replace("%OPTIONS%", options); - - server.sendContent(form); - - form = FPSTR(THEME_FORM); - - String themeOptions = FPSTR(COLOR_THEMES); - themeOptions.replace(">"+String(themeColor)+"<", " selected>"+String(themeColor)+"<"); - form.replace("%THEME_OPTIONS%", themeOptions); - form.replace("%UTCOFFSET%", String(UtcOffset)); - String isUseSecurityChecked = ""; - if (IS_BASIC_AUTH) { - isUseSecurityChecked = "checked='checked'"; - } - form.replace("%IS_BASICAUTH_CHECKED%", isUseSecurityChecked); - form.replace("%USERID%", String(www_username)); - form.replace("%STATIONPASSWORD%", String(www_password)); - - server.sendContent(form); - - html = getFooter(); - server.sendContent(html); - server.sendContent(""); - server.client().stop(); - ledOnOff(false); -} - -void displayMessage(String message) { - ledOnOff(true); - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - String html = getHeader(); - server.sendContent(String(html)); - server.sendContent(String(message)); - html = getFooter(); - server.sendContent(String(html)); - server.sendContent(""); - server.client().stop(); - - ledOnOff(false); -} - -void redirectHome() { - // Send them back to the Root Directory - server.sendHeader("Location", String("/"), true); - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.send(302, "text/plain", ""); - server.client().stop(); -} - -String getHeader() { - return getHeader(false); -} - -String getHeader(boolean refresh) { - String menu = FPSTR(WEB_ACTIONS); - - String html = ""; - html += "Printer Monitor"; - html += ""; - html += ""; - if (refresh) { - html += ""; - } - html += ""; - html += ""; - html += ""; - html += ""; - html += ""; - html += "

    Printer Monitor

    "; - html += ""; - html += "
    "; - return html; -} - -String getFooter() { - int8_t rssi = getWifiQuality(); - Serial.print("Signal Strength (RSSI): "); - Serial.print(rssi); - Serial.println("%"); - String html = "


    "; - html += "
    "; - html += "
    "; - if (lastReportStatus != "") { - html += " Report Status: " + lastReportStatus + "
    "; - } - html += " Version: " + String(VERSION) + "
    "; - html += " Signal Strength: "; - html += String(rssi) + "%"; - html += "
    "; - html += ""; - return html; -} - -void displayPrinterStatus() { - ledOnOff(true); - String html = ""; - - server.sendHeader("Cache-Control", "no-cache, no-store"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.setContentLength(CONTENT_LENGTH_UNKNOWN); - server.send(200, "text/html", ""); - server.sendContent(String(getHeader(true))); - - String displayTime = timeClient.getAmPmHours() + ":" + timeClient.getMinutes() + ":" + timeClient.getSeconds() + " " + timeClient.getAmPm(); - if (IS_24HOUR) { - displayTime = timeClient.getHours() + ":" + timeClient.getMinutes() + ":" + timeClient.getSeconds(); - } - - html += "

    " + printerClient.getPrinterType() + " Monitor

    "; - html += "

    "; - if (printerClient.getPrinterType() == "Repetier") { - html += "Printer Name: " + printerClient.getPrinterName() + "
    "; - } else { - html += "Host Name: " + PrinterHostName + "
    "; - } - - if (printerClient.getError() != "") { - html += "Status: Offline
    "; - html += "Reason: " + printerClient.getError() + "
    "; - } else { - html += "Status: " + printerClient.getState(); - if (printerClient.isPSUoff() && HAS_PSU) { - html += ", PSU off"; - } - html += "
    "; - } - - if (printerClient.isPrinting()) { - html += "File: " + printerClient.getFileName() + "
    "; - float fileSize = printerClient.getFileSize().toFloat(); - if (fileSize > 0) { - fileSize = fileSize / 1024; - html += "File Size: " + String(fileSize) + "KB
    "; - } - int filamentLength = printerClient.getFilamentLength().toInt(); - if (filamentLength > 0) { - float fLength = float(filamentLength) / 1000; - html += "Filament: " + String(fLength) + "m
    "; - } - - html += "Tool Temperature: " + printerClient.getTempToolActual() + "° C
    "; - if ( printerClient.getTempBedActual() != 0 ) { - html += "Bed Temperature: " + printerClient.getTempBedActual() + "° C
    "; - } - - int val = printerClient.getProgressPrintTimeLeft().toInt(); - int hours = numberOfHours(val); - int minutes = numberOfMinutes(val); - int seconds = numberOfSeconds(val); - html += "Est. Print Time Left: " + zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds) + "
    "; - - val = printerClient.getProgressPrintTime().toInt(); - hours = numberOfHours(val); - minutes = numberOfMinutes(val); - seconds = numberOfSeconds(val); - html += "Printing Time: " + zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds) + "
    "; - html += ""; - html += "

    " + printerClient.getProgressCompletion() + "%
    "; - } else { - html += "
    "; - } - - html += "

    "; - - html += "

    Time: " + displayTime + "

    "; - - server.sendContent(html); // spit out what we got - html = ""; - - if (DISPLAYWEATHER) { - if (weatherClient.getCity(0) == "") { - html += "

    Please Configure Weather API

    "; - if (weatherClient.getError() != "") { - html += "

    Weather Error: " + weatherClient.getError() + "

    "; - } - } else { - html += "

    " + weatherClient.getCity(0) + ", " + weatherClient.getCountry(0) + "

    "; - html += "
    "; - html += "" + weatherClient.getDescription(0) + "
    "; - html += weatherClient.getHumidity(0) + "% Humidity
    "; - html += weatherClient.getWind(0) + " " + getSpeedSymbol() + " Wind
    "; - html += "
    "; - html += "

    "; - html += weatherClient.getCondition(0) + " (" + weatherClient.getDescription(0) + ")
    "; - html += weatherClient.getTempRounded(0) + getTempSymbol(true) + "
    "; - html += " Map It!
    "; - html += "

    "; - } - - server.sendContent(html); // spit out what we got - html = ""; // fresh start - } - - server.sendContent(String(getFooter())); - server.sendContent(""); - server.client().stop(); - ledOnOff(false); -} - -void configModeCallback (WiFiManager *myWiFiManager) { - Serial.println("Entered config mode"); - Serial.println(WiFi.softAPIP()); - - display.clear(); - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.setFont(ArialMT_Plain_10); - display.drawString(64, 0, "Wifi Manager"); - display.drawString(64, 10, "Please connect to AP"); - display.setFont(ArialMT_Plain_16); - display.drawString(64, 26, myWiFiManager->getConfigPortalSSID()); - display.setFont(ArialMT_Plain_10); - display.drawString(64, 46, "To setup Wifi connection"); - display.display(); - - Serial.println("Wifi Manager"); - Serial.println("Please connect to AP"); - Serial.println(myWiFiManager->getConfigPortalSSID()); - Serial.println("To setup Wifi Configuration"); - flashLED(20, 50); -} - -void ledOnOff(boolean value) { - if (USE_FLASH) { - if (value) { - digitalWrite(externalLight, LOW); // LED ON - } else { - digitalWrite(externalLight, HIGH); // LED OFF + debugHandle->printLn("*** Looking for " + PrinterHostName + " over mDNS"); + for (int i = 0; i < n; ++i) { + // Going through every available service, + // we're searching for the one whose hostname + // matches what we want, and then get its IP + debugHandle->printLn("Found: " + MDNS.hostname(i)); + if (MDNS.hostname(i) == PrinterHostName) { + IPAddress serverIp = MDNS.IP(i); + PrinterServer = serverIp.toString(); + PrinterPort = MDNS.port(i); // save the port + debugHandle->printLn("*** Found Printer Server " + PrinterHostName + " http://" + PrinterServer + ":" + PrinterPort); + writeSettings(); // update the settings } } } -void flashLED(int number, int delayTime) { - for (int inx = 0; inx <= number; inx++) { - delay(delayTime); - digitalWrite(externalLight, LOW); // ON - delay(delayTime); - digitalWrite(externalLight, HIGH); // OFF - delay(delayTime); - } -} - -void drawScreen1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { - String bed = printerClient.getValueRounded(printerClient.getTempBedActual()); - String tool = printerClient.getValueRounded(printerClient.getTempToolActual()); - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_16); - if (bed != "0") { - display->drawString(29 + x, 0 + y, "Tool"); - display->drawString(89 + x, 0 + y, "Bed"); - } else { - display->drawString(64 + x, 0 + y, "Tool Temp"); - } - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->setFont(ArialMT_Plain_24); - if (bed != "0") { - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->drawString(12 + x, 14 + y, tool + "°"); - display->drawString(74 + x, 14 + y, bed + "°"); - } else { - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->drawString(64 + x, 14 + y, tool + "°"); - } -} - -void drawScreen2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_16); - - display->drawString(64 + x, 0 + y, "Time Remaining"); - //display->setTextAlignment(TEXT_ALIGN_LEFT); - display->setFont(ArialMT_Plain_24); - int val = printerClient.getProgressPrintTimeLeft().toInt(); - int hours = numberOfHours(val); - int minutes = numberOfMinutes(val); - int seconds = numberOfSeconds(val); - - String time = zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds); - display->drawString(64 + x, 14 + y, time); -} - -void drawScreen3(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { - display->setTextAlignment(TEXT_ALIGN_CENTER); - display->setFont(ArialMT_Plain_16); - - display->drawString(64 + x, 0 + y, "Printing Time"); - //display->setTextAlignment(TEXT_ALIGN_LEFT); - display->setFont(ArialMT_Plain_24); - int val = printerClient.getProgressPrintTime().toInt(); - int hours = numberOfHours(val); - int minutes = numberOfMinutes(val); - int seconds = numberOfSeconds(val); - - String time = zeroPad(hours) + ":" + zeroPad(minutes) + ":" + zeroPad(seconds); - display->drawString(64 + x, 14 + y, time); -} - -void drawClock(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { - display->setTextAlignment(TEXT_ALIGN_CENTER); - - String displayTime = timeClient.getAmPmHours() + ":" + timeClient.getMinutes() + ":" + timeClient.getSeconds(); - if (IS_24HOUR) { - displayTime = timeClient.getHours() + ":" + timeClient.getMinutes() + ":" + timeClient.getSeconds(); - } - String displayName = PrinterHostName; - if (printerClient.getPrinterType() == "Repetier") { - displayName = printerClient.getPrinterName(); - } - display->setFont(ArialMT_Plain_16); - display->drawString(64 + x, 0 + y, displayName); - display->setFont(ArialMT_Plain_24); - display->drawString(64 + x, 17 + y, displayTime); -} - -void drawWeather(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->setFont(ArialMT_Plain_24); - display->drawString(0 + x, 0 + y, weatherClient.getTempRounded(0) + getTempSymbol()); - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->setFont(ArialMT_Plain_24); - - display->setFont(ArialMT_Plain_16); - display->drawString(0 + x, 24 + y, weatherClient.getCondition(0)); - display->setFont((const uint8_t*)Meteocons_Plain_42); - display->drawString(86 + x, 0 + y, weatherClient.getWeatherIcon(0)); -} - -String getTempSymbol() { - return getTempSymbol(false); -} - -String getTempSymbol(boolean forHTML) { - String rtnValue = "F"; - if (IS_METRIC) { - rtnValue = "C"; - } - if (forHTML) { - rtnValue = "°" + rtnValue; - } else { - rtnValue = "°" + rtnValue; - } - return rtnValue; -} - -String getSpeedSymbol() { - String rtnValue = "mph"; - if (IS_METRIC) { - rtnValue = "kph"; - } - return rtnValue; -} - -String zeroPad(int value) { - String rtnValue = String(value); - if (value < 10) { - rtnValue = "0" + rtnValue; - } - return rtnValue; -} - -void drawHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) { - display->setColor(WHITE); - display->setFont(ArialMT_Plain_16); - String displayTime = timeClient.getAmPmHours() + ":" + timeClient.getMinutes(); - if (IS_24HOUR) { - displayTime = timeClient.getHours() + ":" + timeClient.getMinutes(); - } - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->drawString(0, 48, displayTime); - - if (!IS_24HOUR) { - String ampm = timeClient.getAmPm(); - display->setFont(ArialMT_Plain_10); - display->drawString(39, 54, ampm); - } - - display->setFont(ArialMT_Plain_16); - display->setTextAlignment(TEXT_ALIGN_LEFT); - String percent = String(printerClient.getProgressCompletion()) + "%"; - display->drawString(64, 48, percent); - - // Draw indicator to show next update - int updatePos = (printerClient.getProgressCompletion().toFloat() / float(100)) * 128; - display->drawRect(0, 41, 128, 6); - display->drawHorizontalLine(0, 42, updatePos); - display->drawHorizontalLine(0, 43, updatePos); - display->drawHorizontalLine(0, 44, updatePos); - display->drawHorizontalLine(0, 45, updatePos); - - drawRssi(display); -} - -void drawClockHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) { - display->setColor(WHITE); - display->setFont(ArialMT_Plain_16); - display->setTextAlignment(TEXT_ALIGN_LEFT); - if (!IS_24HOUR) { - display->drawString(0, 48, timeClient.getAmPm()); - display->setTextAlignment(TEXT_ALIGN_CENTER); - if (printerClient.isPSUoff()) { - display->drawString(64, 47, "psu off"); - } else if (printerClient.getState() == "Operational") { - display->drawString(64, 47, "online"); - } else { - display->drawString(64, 47, "offline"); - } - } else { - if (printerClient.isPSUoff()) { - display->drawString(0, 47, "psu off"); - } else if (printerClient.getState() == "Operational") { - display->drawString(0, 47, "online"); - } else { - display->drawString(0, 47, "offline"); - } - } - display->setTextAlignment(TEXT_ALIGN_LEFT); - display->drawRect(0, 43, 128, 2); - - drawRssi(display); -} - -void drawRssi(OLEDDisplay *display) { - - - int8_t quality = getWifiQuality(); - for (int8_t i = 0; i < 4; i++) { - for (int8_t j = 0; j < 3 * (i + 2); j++) { - if (quality > i * 25 || j == 0) { - display->setPixel(114 + 4 * i, 63 - j); - } - } - } -} - -// converts the dBm to a range between 0 and 100% +//************************************************************ +// Converts the dBm to a range between 0 and 100% +//************************************************************ int8_t getWifiQuality() { int32_t dbm = WiFi.RSSI(); if(dbm <= -100) { @@ -1119,14 +267,194 @@ int8_t getWifiQuality() { } } +//************************************************************ +// Wifi config mode +//************************************************************ +void configModeCallback(WiFiManager *myWiFiManager) { + debugHandle->printLn("Entered config mode"); + debugHandle->printLn(WiFi.softAPIP().toString()); + displayHandle.showPageApMode(myWiFiManager->getConfigPortalSSID()); + + + debugHandle->printLn("Wifi Manager"); + debugHandle->printLn("Please connect to AP"); + debugHandle->printLn(myWiFiManager->getConfigPortalSSID()); + debugHandle->printLn("To setup Wifi Configuration"); + flashLED(20, 50); +} + +//************************************************************ +// Flash LED +//************************************************************ +void flashLED(int number, int delayTime) { + for (int inx = 0; inx <= number; inx++) { + delay(delayTime); + digitalWrite(externalLight, LOW); // ON + delay(delayTime); + digitalWrite(externalLight, HIGH); // OFF + delay(delayTime); + } +} + +//************************************************************ +// Toggle LED +//************************************************************ +void ledOnOff(boolean value) { + if (USE_FLASH) { + if (value) { + digitalWrite(externalLight, LOW); // LED ON + } else { + digitalWrite(externalLight, HIGH); // LED OFF + } + } +} + +//************************************************************ +// Read settings from internal eeprom +//************************************************************ +void readSettings() { + if (SPIFFS.exists(CONFIG) == false) { + debugHandle->printLn("Settings File does not yet exists."); + writeSettings(); + return; + } + File fr = SPIFFS.open(CONFIG, "r"); + String line; + while(fr.available()) { + line = fr.readStringUntil('\n'); + + if (line.indexOf("UtcOffset=") >= 0) { + UtcOffset = line.substring(line.lastIndexOf("UtcOffset=") + 10).toFloat(); + debugHandle->printLn("UtcOffset=" + String(UtcOffset)); + } + if (line.indexOf("printerApiKey=") >= 0) { + PrinterApiKey = line.substring(line.lastIndexOf("printerApiKey=") + 14); + PrinterApiKey.trim(); + debugHandle->printLn("PrinterApiKey=" + PrinterApiKey); + } + if (line.indexOf("printerHostName=") >= 0) { + PrinterHostName = line.substring(line.lastIndexOf("printerHostName=") + 16); + PrinterHostName.trim(); + debugHandle->printLn("PrinterHostName=" + PrinterHostName); + } + if (line.indexOf("printerServer=") >= 0) { + PrinterServer = line.substring(line.lastIndexOf("printerServer=") + 14); + PrinterServer.trim(); + debugHandle->printLn("PrinterServer=" + PrinterServer); + } + if (line.indexOf("printerPort=") >= 0) { + PrinterPort = line.substring(line.lastIndexOf("printerPort=") + 12).toInt(); + debugHandle->printLn("PrinterPort=" + String(PrinterPort)); + } + if (line.indexOf("printerName=") >= 0) { + String printer = line.substring(line.lastIndexOf("printerName=") + 12); + printer.trim(); + printerClient.setPrinterName(printer); + debugHandle->printLn("PrinterName=" + printerClient.getPrinterName()); + } + if (line.indexOf("printerAuthUser=") >= 0) { + PrinterAuthUser = line.substring(line.lastIndexOf("printerAuthUser=") + 16); + PrinterAuthUser.trim(); + debugHandle->printLn("PrinterAuthUser=" + PrinterAuthUser); + } + if (line.indexOf("printerAuthPass=") >= 0) { + PrinterAuthPass = line.substring(line.lastIndexOf("printerAuthPass=") + 16); + PrinterAuthPass.trim(); + debugHandle->printLn("PrinterAuthPass=" + PrinterAuthPass); + } + if (line.indexOf("refreshRate=") >= 0) { + minutesBetweenDataRefresh = line.substring(line.lastIndexOf("refreshRate=") + 12).toInt(); + debugHandle->printLn("minutesBetweenDataRefresh=" + String(minutesBetweenDataRefresh)); + } + if (line.indexOf("themeColor=") >= 0) { + themeColor = line.substring(line.lastIndexOf("themeColor=") + 11); + themeColor.trim(); + debugHandle->printLn("themeColor=" + themeColor); + } + if (line.indexOf("IS_BASIC_AUTH=") >= 0) { + IS_BASIC_AUTH = line.substring(line.lastIndexOf("IS_BASIC_AUTH=") + 14).toInt(); + debugHandle->printLn("IS_BASIC_AUTH=" + String(IS_BASIC_AUTH)); + webServer.setAuthentication(IS_BASIC_AUTH, www_username, www_password); + } + if (line.indexOf("www_username=") >= 0) { + String temp = line.substring(line.lastIndexOf("www_username=") + 13); + temp.trim(); + temp.toCharArray(www_username, sizeof(temp)); + debugHandle->printLn("www_username=" + String(www_username)); + webServer.setAuthentication(IS_BASIC_AUTH, www_username, www_password); + } + if (line.indexOf("www_password=") >= 0) { + String temp = line.substring(line.lastIndexOf("www_password=") + 13); + temp.trim(); + temp.toCharArray(www_password, sizeof(temp)); + debugHandle->printLn("www_password=" + String(www_password)); + webServer.setAuthentication(IS_BASIC_AUTH, www_username, www_password); + } + if (line.indexOf("DISPLAYCLOCK=") >= 0) { + DISPLAYCLOCK = line.substring(line.lastIndexOf("DISPLAYCLOCK=") + 13).toInt(); + debugHandle->printLn("DISPLAYCLOCK=" + String(DISPLAYCLOCK)); + } + if (line.indexOf("is24hour=") >= 0) { + IS_24HOUR = line.substring(line.lastIndexOf("is24hour=") + 9).toInt(); + debugHandle->printLn("IS_24HOUR=" + String(IS_24HOUR)); + } +#ifndef USE_NEXTION_DISPLAY + if(line.indexOf("invertDisp=") >= 0) { + INVERT_DISPLAY = line.substring(line.lastIndexOf("invertDisp=") + 11).toInt(); + debugHandle->printLn("INVERT_DISPLAY=" + String(INVERT_DISPLAY)); + } +#endif + if(line.indexOf("USE_FLASH=") >= 0) { + USE_FLASH = line.substring(line.lastIndexOf("USE_FLASH=") + 10).toInt(); + debugHandle->printLn("USE_FLASH=" + String(USE_FLASH)); + } + if (line.indexOf("hasPSU=") >= 0) { + HAS_PSU = line.substring(line.lastIndexOf("hasPSU=") + 7).toInt(); + debugHandle->printLn("HAS_PSU=" + String(HAS_PSU)); + } + if (line.indexOf("isWeather=") >= 0) { + DISPLAYWEATHER = line.substring(line.lastIndexOf("isWeather=") + 10).toInt(); + debugHandle->printLn("DISPLAYWEATHER=" + String(DISPLAYWEATHER)); + } + if (line.indexOf("weatherKey=") >= 0) { + WeatherApiKey = line.substring(line.lastIndexOf("weatherKey=") + 11); + WeatherApiKey.trim(); + debugHandle->printLn("WeatherApiKey=" + WeatherApiKey); + } + if (line.indexOf("CityID=") >= 0) { + CityIDs[0] = line.substring(line.lastIndexOf("CityID=") + 7).toInt(); + debugHandle->printLn("CityID: " + String(CityIDs[0])); + } + if (line.indexOf("isMetric=") >= 0) { + IS_METRIC = line.substring(line.lastIndexOf("isMetric=") + 9).toInt(); + debugHandle->printLn("IS_METRIC=" + String(IS_METRIC)); + } + if (line.indexOf("language=") >= 0) { + WeatherLanguage = line.substring(line.lastIndexOf("language=") + 9); + WeatherLanguage.trim(); + debugHandle->printLn("WeatherLanguage=" + WeatherLanguage); + } + } + fr.close(); + printerClient.updatePrintClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU); + weatherClient.updateWeatherApiKey(WeatherApiKey); + weatherClient.updateLanguage(WeatherLanguage); + weatherClient.setMetric(IS_METRIC); + weatherClient.updateCityIdList(CityIDs, 1); + timeClient.setUtcOffset(UtcOffset); +} + +//************************************************************ +// Save settings to internal eeprom +//************************************************************ void writeSettings() { // Save decoded message to SPIFFS file for playback on power up. File f = SPIFFS.open(CONFIG, "w"); if (!f) { - Serial.println("File open failed!"); + debugHandle->printLn("File open failed!"); } else { - Serial.println("Saving settings now..."); + debugHandle->printLn("Saving settings now..."); f.println("UtcOffset=" + String(UtcOffset)); f.println("printerApiKey=" + PrinterApiKey); f.println("printerHostName=" + PrinterHostName); @@ -1142,7 +470,9 @@ void writeSettings() { f.println("www_password=" + String(www_password)); f.println("DISPLAYCLOCK=" + String(DISPLAYCLOCK)); f.println("is24hour=" + String(IS_24HOUR)); +#ifndef USE_NEXTION_DISPLAY f.println("invertDisp=" + String(INVERT_DISPLAY)); +#endif f.println("USE_FLASH=" + String(USE_FLASH)); f.println("isWeather=" + String(DISPLAYWEATHER)); f.println("weatherKey=" + WeatherApiKey); @@ -1155,215 +485,3 @@ void writeSettings() { readSettings(); timeClient.setUtcOffset(UtcOffset); } - -void readSettings() { - if (SPIFFS.exists(CONFIG) == false) { - Serial.println("Settings File does not yet exists."); - writeSettings(); - return; - } - File fr = SPIFFS.open(CONFIG, "r"); - String line; - while(fr.available()) { - line = fr.readStringUntil('\n'); - - if (line.indexOf("UtcOffset=") >= 0) { - UtcOffset = line.substring(line.lastIndexOf("UtcOffset=") + 10).toFloat(); - Serial.println("UtcOffset=" + String(UtcOffset)); - } - if (line.indexOf("printerApiKey=") >= 0) { - PrinterApiKey = line.substring(line.lastIndexOf("printerApiKey=") + 14); - PrinterApiKey.trim(); - Serial.println("PrinterApiKey=" + PrinterApiKey); - } - if (line.indexOf("printerHostName=") >= 0) { - PrinterHostName = line.substring(line.lastIndexOf("printerHostName=") + 16); - PrinterHostName.trim(); - Serial.println("PrinterHostName=" + PrinterHostName); - } - if (line.indexOf("printerServer=") >= 0) { - PrinterServer = line.substring(line.lastIndexOf("printerServer=") + 14); - PrinterServer.trim(); - Serial.println("PrinterServer=" + PrinterServer); - } - if (line.indexOf("printerPort=") >= 0) { - PrinterPort = line.substring(line.lastIndexOf("printerPort=") + 12).toInt(); - Serial.println("PrinterPort=" + String(PrinterPort)); - } - if (line.indexOf("printerName=") >= 0) { - String printer = line.substring(line.lastIndexOf("printerName=") + 12); - printer.trim(); - printerClient.setPrinterName(printer); - Serial.println("PrinterName=" + printerClient.getPrinterName()); - } - if (line.indexOf("printerAuthUser=") >= 0) { - PrinterAuthUser = line.substring(line.lastIndexOf("printerAuthUser=") + 16); - PrinterAuthUser.trim(); - Serial.println("PrinterAuthUser=" + PrinterAuthUser); - } - if (line.indexOf("printerAuthPass=") >= 0) { - PrinterAuthPass = line.substring(line.lastIndexOf("printerAuthPass=") + 16); - PrinterAuthPass.trim(); - Serial.println("PrinterAuthPass=" + PrinterAuthPass); - } - if (line.indexOf("refreshRate=") >= 0) { - minutesBetweenDataRefresh = line.substring(line.lastIndexOf("refreshRate=") + 12).toInt(); - Serial.println("minutesBetweenDataRefresh=" + String(minutesBetweenDataRefresh)); - } - if (line.indexOf("themeColor=") >= 0) { - themeColor = line.substring(line.lastIndexOf("themeColor=") + 11); - themeColor.trim(); - Serial.println("themeColor=" + themeColor); - } - if (line.indexOf("IS_BASIC_AUTH=") >= 0) { - IS_BASIC_AUTH = line.substring(line.lastIndexOf("IS_BASIC_AUTH=") + 14).toInt(); - Serial.println("IS_BASIC_AUTH=" + String(IS_BASIC_AUTH)); - } - if (line.indexOf("www_username=") >= 0) { - String temp = line.substring(line.lastIndexOf("www_username=") + 13); - temp.trim(); - temp.toCharArray(www_username, sizeof(temp)); - Serial.println("www_username=" + String(www_username)); - } - if (line.indexOf("www_password=") >= 0) { - String temp = line.substring(line.lastIndexOf("www_password=") + 13); - temp.trim(); - temp.toCharArray(www_password, sizeof(temp)); - Serial.println("www_password=" + String(www_password)); - } - if (line.indexOf("DISPLAYCLOCK=") >= 0) { - DISPLAYCLOCK = line.substring(line.lastIndexOf("DISPLAYCLOCK=") + 13).toInt(); - Serial.println("DISPLAYCLOCK=" + String(DISPLAYCLOCK)); - } - if (line.indexOf("is24hour=") >= 0) { - IS_24HOUR = line.substring(line.lastIndexOf("is24hour=") + 9).toInt(); - Serial.println("IS_24HOUR=" + String(IS_24HOUR)); - } - if(line.indexOf("invertDisp=") >= 0) { - INVERT_DISPLAY = line.substring(line.lastIndexOf("invertDisp=") + 11).toInt(); - Serial.println("INVERT_DISPLAY=" + String(INVERT_DISPLAY)); - } - if(line.indexOf("USE_FLASH=") >= 0) { - USE_FLASH = line.substring(line.lastIndexOf("USE_FLASH=") + 10).toInt(); - Serial.println("USE_FLASH=" + String(USE_FLASH)); - } - if (line.indexOf("hasPSU=") >= 0) { - HAS_PSU = line.substring(line.lastIndexOf("hasPSU=") + 7).toInt(); - Serial.println("HAS_PSU=" + String(HAS_PSU)); - } - if (line.indexOf("isWeather=") >= 0) { - DISPLAYWEATHER = line.substring(line.lastIndexOf("isWeather=") + 10).toInt(); - Serial.println("DISPLAYWEATHER=" + String(DISPLAYWEATHER)); - } - if (line.indexOf("weatherKey=") >= 0) { - WeatherApiKey = line.substring(line.lastIndexOf("weatherKey=") + 11); - WeatherApiKey.trim(); - Serial.println("WeatherApiKey=" + WeatherApiKey); - } - if (line.indexOf("CityID=") >= 0) { - CityIDs[0] = line.substring(line.lastIndexOf("CityID=") + 7).toInt(); - Serial.println("CityID: " + String(CityIDs[0])); - } - if (line.indexOf("isMetric=") >= 0) { - IS_METRIC = line.substring(line.lastIndexOf("isMetric=") + 9).toInt(); - Serial.println("IS_METRIC=" + String(IS_METRIC)); - } - if (line.indexOf("language=") >= 0) { - WeatherLanguage = line.substring(line.lastIndexOf("language=") + 9); - WeatherLanguage.trim(); - Serial.println("WeatherLanguage=" + WeatherLanguage); - } - } - fr.close(); - printerClient.updatePrintClient(PrinterApiKey, PrinterServer, PrinterPort, PrinterAuthUser, PrinterAuthPass, HAS_PSU); - weatherClient.updateWeatherApiKey(WeatherApiKey); - weatherClient.updateLanguage(WeatherLanguage); - weatherClient.setMetric(IS_METRIC); - weatherClient.updateCityIdList(CityIDs, 1); - timeClient.setUtcOffset(UtcOffset); -} - -int getMinutesFromLastRefresh() { - int minutes = (timeClient.getCurrentEpoch() - lastEpoch) / 60; - return minutes; -} - -int getMinutesFromLastDisplay() { - int minutes = (timeClient.getCurrentEpoch() - displayOffEpoch) / 60; - return minutes; -} - -// Toggle on and off the display if user defined times -void checkDisplay() { - if (!displayOn && DISPLAYCLOCK) { - enableDisplay(true); - } - if (displayOn && !printerClient.isPrinting() && !DISPLAYCLOCK) { - // Put Display to sleep - display.clear(); - display.display(); - display.setFont(ArialMT_Plain_16); - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.setContrast(255); // default is 255 - display.drawString(64, 5, "Printer Offline\nSleep Mode..."); - display.display(); - delay(5000); - enableDisplay(false); - Serial.println("Printer is offline going down to sleep..."); - return; - } else if (!displayOn && !DISPLAYCLOCK) { - if (printerClient.isOperational()) { - // Wake the Screen up - enableDisplay(true); - display.clear(); - display.display(); - display.setFont(ArialMT_Plain_16); - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.setContrast(255); // default is 255 - display.drawString(64, 5, "Printer Online\nWake up..."); - display.display(); - Serial.println("Printer is online waking up..."); - delay(5000); - return; - } - } else if (DISPLAYCLOCK) { - if ((!printerClient.isPrinting() || printerClient.isPSUoff()) && !isClockOn) { - Serial.println("Clock Mode is turned on."); - if (!DISPLAYWEATHER) { - ui.disableAutoTransition(); - ui.setFrames(clockFrame, 1); - clockFrame[0] = drawClock; - } else { - ui.enableAutoTransition(); - ui.setFrames(clockFrame, 2); - clockFrame[0] = drawClock; - clockFrame[1] = drawWeather; - } - ui.setOverlays(clockOverlay, numberOfOverlays); - isClockOn = true; - } else if (printerClient.isPrinting() && !printerClient.isPSUoff() && isClockOn) { - Serial.println("Printer Monitor is active."); - ui.setFrames(frames, numberOfFrames); - ui.setOverlays(overlays, numberOfOverlays); - ui.enableAutoTransition(); - isClockOn = false; - } - } -} - -void enableDisplay(boolean enable) { - displayOn = enable; - if (enable) { - if (getMinutesFromLastDisplay() >= minutesBetweenDataRefresh) { - // The display has been off longer than the minutes between refresh -- need to get fresh data - lastEpoch = 0; // this should force a data pull - displayOffEpoch = 0; // reset - } - display.displayOn(); - Serial.println("Display was turned ON: " + timeClient.getFormattedTime()); - } else { - display.displayOff(); - Serial.println("Display was turned OFF: " + timeClient.getFormattedTime()); - displayOffEpoch = lastEpoch; - } -}