From 4ef84309dd5a51da3b351e1385150cecae44bedd Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Thu, 8 Feb 2024 18:41:49 +0700 Subject: [PATCH 01/22] update ESPMegaPROR3 to 2.2.4 --- platformio.ini | 5 ++++- src/main.cpp | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 10d4314..5b1560c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,5 +12,8 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.2.3 +lib_deps = siwats/ESPMegaPROR3@^2.2.4 monitor_speed = 115200 +build_flags = -DCORE_DEBUG_LEVEL=5 +upload_port = COM28 +monitor_port = COM28 \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 8ff0f28..fa296a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,5 @@ #include - RemoteVariable pm25_out = RemoteVariable(); RemoteVariable temp_out = RemoteVariable(); RemoteVariable weather = RemoteVariable(); From b01540a4cef8abba651aa8140faf029d04771577 Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Thu, 8 Feb 2024 23:37:25 +0700 Subject: [PATCH 02/22] both light in standby and dashboard work now --- ise-display/ise-display-prod.HMI | Bin 37446253 -> 37446253 bytes src/codebook.txt | 6 +- src/ise_display.cpp | 122 +++++++++++++++++++++++++------ src/ise_display.hpp | 16 ++-- src/main.cpp | 37 +++++++++- src/main.hpp | 1 + 6 files changed, 151 insertions(+), 31 deletions(-) diff --git a/ise-display/ise-display-prod.HMI b/ise-display/ise-display-prod.HMI index 75f51bd6fa16ad2fb21db2ccac13eceb18167f83..ac9122b18c4b822521fe31a0bc3197eaa5f9fe6f 100644 GIT binary patch delta 4622 zcmeI!dz{Sm9>?+T%-*uQ?u%^hw_KKlu)B!Ry2Q$@P34kXlx^isc5S|l!U{1eMIq%9 zT5CjB%Kf&x<+4awp&}ZDh&t~V!3as=Cg&* zD#w*ojuOrWgL(}}tktSrYvX(Di%Bwtg7u5HZZK7KhXmaGU7JocO)?er)3HB2y{_}B z!(nFD3@j1o(9_ae1qKGE)Tx!!%XgleKMtH6Yo>F=mULq_r<<+56SA#;zGM@w7jkHK z?YoW}QZU&x=1tID`&Jf9Hf|m7;JiE2&B`5j&Kn*O7oBX5MBdyvb6)6;`gb3^F+SDg zjnRH}*TDhvccq%NLhPG)E-bSWPrLhlvn@8mW%h6i?Ou=_UZC8?%uPX>?>wSf)^|25 ztxfy0%<)qj*No4Lbmc`llv4$$Koz8dJ$aEKxhMW!iN7x6e`_Vmo*eIuba}N@UM-bZ zOXby4d9_qtEtNMiq|pDw6Vknr118#rHrmG6Slh@pwoUBAwyAAqAF<7C3)|8@YU6Ax z+uF9VZS7;Woo#R9Z3p|f?PxpM&bEu~YM-zP_DS2#K4qV_&)Dv^hwW*5*=KEU+sF2` z{cL~xoE=~X+UM;Hc92c9FRo777vu3R9$YBceXQM*ims4mNoufqNexj$)i5<&jZh=i zC^cG*Q7?N!nvKm`nE!lc$IX2H8|niS=H3vuq(+L>c+7e01JozLmfI?fqZ zhcBBUeG~f(>g%4{*cIie*eNx)h$F(CQ#mKXea4;Yc4tjl8throFLj$!n+JDGE$R-P z;F{x3IhYpgnVOiq+vzBEYjcmlN%K9~)6-@<-RDk@t?S7hn%vdl&hD1l)nkVz=X1CV zX1FSNs&q~c4-UG1Av3M9`%p|$gZzhl7va2qM!2&o@kTyLBd7LdR6 z+*#Rt7ygH?!NEp&NuJZwY)ud`KN2y=HFh+YUNz|dR8fFoF^_ib!73NWk);A z$aD9Ib~Q*j==;a_4m4)8@70cm7<2nwB!n5W)wjJ&L1VW2=2N-@cKGHM#f@3-n+NLe zz&hVtsf_>F(|V`3pR=g)o#&*O9@UH);XB|!l>b(WuWig8-}X}Vj4AAUqc!XM=O$W$ z+uP$~{BzGn#_aMPTcfFezTDhDZ;Io!Qf}RpF>U?#>e}}Hxqe4uLb*frXqw=k+jRHO zo%{Ib?gNe4>wDp-ME`tkuz%h@%s9T$JP2TH=Rcxh*=|C`V*;M zQR9_W6Fl>GOT|V8eWAWoo7EPzRc%w-)ef~&?NYnd9<^6xsce;_ zzEWSSeQLitpbn~Bbx0jnN7Og!sQOlYr;e#SbzFU~PNW2D5{W&={!!b>P69OO*f*=?|;2y{ap%4b) zkRJ*_K_~=;p$HU(2q*@{p#cK-$9~wYIh=v%5g+|aAn!v-*6q>;!&>UJoOL!FGpcS-+HqaIx zgLcp!;-LdP4jrKrbcQa_6`p_ucoMq7Q}8rA1Kptq^n_mUEcAvx&=>kae|QcCz(9B& zUVuT62rohs42G9r2n>Z`FdRm}NEij9VGO(sV<8z*U>u~vD=;1`On`~tf=TcyyatnD z3QUDGm;7xc7-iEpG4!jHVU_QJD@52IE2#eqYSPUP+N3aBz z!ZKJ6AHxb*39H}}NQc#s0c*emYvEH^2kYT8*Z`TZ5k7}a@CAGcn_&xVg>A4McEC>9 z1-oGn?1e1Ih8*|`zJ`6U9}d7l$c0027>>X&!=c;P%;fQ#@eT!PDR1%898a1DNk>u>}9fIl7j`g3Y`Re-8*9;^ zEGb(hlw~~UHqA$$@Avoo^ZV=hGV)d~4*ppZT>?y1v_B7TAYm7aEHNl!< z&9LU!v)FT33#=vfJk|<(0ecZ^jkUqrV(qZ@*h|>U*eh5EtRvP5>x{jMb-}t~ua&wD zC{m*Dm9)qtUq28izpsa!I5s|mSLWm%KAckd+JQiQ@??+7uye`&Ujl~9Z!!hSl7~^F z+yLAGJODfaya2obd;oj_t^?cv@B{D%xLHn(3h2pAF6jwlPqv~8lp$kE#tGt>$y}1% zJ7PGK4|oSgG1A$Sfia9gZ~?S}XTDVOYu`X5rWJlq0~dgzv&9d=3zenOSfovK3RkLz+QS9G6l31 ze^}LgadrKjmc@eVLY`v2Pn3L;=g2h4hE0Dhe0mFM@WdUJ;h?F!r54k65_9=+^~0s5 z*n+Rc1;r|tA781;JCiY7SXKD2!0+KTbJdLX!1|sw1s+r|1udh1PTc?YU|%MFxb9qa zF(JXP#JLBntY+;!V{pLj?9{;J)pzG!OwC-yC{O7fl@{Q% zuj#ev)>t`e5^+@~g>UIu`E}X?4fVM1!S9?KjBPj2%9{G8l^KJh_juu_uW2l}ON}&+ zpX$v!veEC?k&-D5u25e+xA4*Byruka+sxEoIqvs=Qs9cGi$=C0j(izmkyyD$sWyDk zLtysYMEUu*S0#1F9vNPgeuf$QK|Whm|221G1*yHYXii_7mN=m_vg=Ce#)Eb-m-ENIq5RcxBRk`t+Zji;! zpDJ~W`RtPmo{4<|X03{Lkslp~Q;OE7DCK$95${5x0)3xc!Pupv{S(#BFrX?YJ)9PaoWt`99=ql zg>ddOqQ|u7zOJRA{pUm{Hs5S%a*AY2h`&8TN11@e>1W-b$qrf+;?pYw)PHGxSTs`)J zvd7V+pXEntPl0dRg`Z3rCpN6j>LlpZjU?{Q7S!6F{_ z%eu2guBe}0(p46RFfAM(-=sMwsXy`+pQ@3lIHX+cC27cKj%jud7W`Tu(=C*2MW4nR zuRJ6Y%dgdBPNyQQ%@~}h*1z}VfE-(=)>Xq2T1feErqI_aj!@2jG%V!vZ~ zQ0H6t4Vecwnp)?gpC8Ux%;*?L^6F~ZG6=SxI_LG7z|w@jf|I2n>y^_l4>@=ieLMel zzS>?cA~fO#;l4l2^QEy>MSRUTiiHF z>ArSO_Wcj)DvlKz#zHwgXO{Xm8`$S$#%D8_d9y1vnky_7DMj|!o^Lr7ZJx5{S>}lw z18WKm7QUY1XIr{tawSZDP)KFJ+pHUX{q`4y@lv-#5GvlmM!v^d*Oq6x_dJCWey@+w zr6MDq$kDG;rb9d!1(Wmg^4SK_L0(kSBCWZNDqQ?oI4quTbTH)PbPclKx$VXI__38j*lqm2xde4}PBi7fbrn6N)Mmf~G_E77 zjmB1RI|zr=8CxBV(#An`n==T4ZxVe2YsC80R1YYS>&iLYw(auaF3to$ONi z9zFljS5w4OE;qgCgWkkr_ z4T=^#HZfbzigdGbus#ykl5WWFA3Ss0BR_@8NOQJs_42^Mh}p}DMH5$>U+lZYbon}0 z<@ejPCsCl-(e}VB*v?8Qm?OI2+HyT1t0+W`%cZeL+v1*6|KTo*GK|N+noJUh6^MMdY}x#rQw%+0aCJ62y>3*i##+pN5O*NeIy&k= z_MGafY47xJcbcpq#YcUKt;gNzn&=j_mvG4qH;g`prtu%KxKxsZ{CvH;Lh5Ll9dpdD zF|zrNBUyWlqTI+^vvABuP!uwg2xDsBDnbWMoTqh<8Yb(IdHZ1zn=)wVL1K+$X!lQ@ zUW?gCTN>Z1vY`RryD8VA7Ns8b51bd$9{ZIJZG|gZ-=yg)t4T^*Rzk6Q!DV} zZ?Kr1TYG^y94D|;!$ljTQ6f4!85**bT*nRvi@`wjLR$U(>NNdcv) zf+r8wmpOG#oz}egKBn%6biuL3;9m1@*6MB0N&P(CLw?6E*MCh`FJbjrV{>FQ7V52H z(GJErMcNv>ylFcqMqj_>G^jodO^$RH&Z&AS+`D$?6ecRMPn`0{;YGLM8jZ!@NPeLf z5VI&tYq!JaMd<4VezKg%=TaaSzO+u3d*$Hbu|wuTJi43jbRG&&F$p z))qEG(D>(X+XIeg3g%NEcG$|hV6#xqVotewpr7e;UqAXKCG1SsxRUJrF|rL6opn?uT?E5{<0%+u~Iy*T(m{N$JXc;x%1 z&c<>g3W&4?%#rwo1yNo*_96+_Z?ad5*EM1a2bqIPD?IPTp49SaKzB!#O{{EFtc%@T zG5D$U%gwH@X5&qho6F}R)^cY}P5YPc*dB(=yYRYz@oe1mH5Ewd+aFJ-+JCdY ztl{O61%9pV^4@^)yE*m#+M2wa%uHGgcUkVqvW2)FDN@E{{;Zs}7G8^GcCRipM<0vA zzpFNkYuxtosnzqbGmO}LbARNZ46=br$JqGH>6tX21igz^CEuu;vHOLRewVv8zl)+B zOq4EA@F;FAeG{-@iY8sc2tPF3) zGgoEZN48>uD!Ie_?b~YiT#`v^$`?Z+J_t4)udg_8uTb}?)7{nkih?I9Ew0v$zRFbc z6_^UYkkzZWcDS>YL+TRSY4s@kJFUJ)zx1?y%8*NXd^mLd*#V60N=|0a^w!<*i^guu zc#Z>Sp0rO{FR7`=REX91hspbd-A1%z)xNDA^ItWyxis`H)MIncp)vDTvVCd{3X2cZ z4`ayebGk2HFFyZ6!aT|PqMsD6HmwI@_8UWGa))8Q!`{-;Tc!tJr@nO&CVcwvYBKP> z>FQ%4G~Ph`P}O=m1{3z9GE?=_vxcd&yq^byI9P5TSQuSsJ`vf21x0g%QQ@YJsKMNu z$qt42Q{5jk`jx0u`SVl~#k`F~u70Q}@w|ThmjIMfR6rfxN@yTdG}eS^=3X={57&te z_aZawOqFwX%bkvv=M3Yidh@L*XFK$324(v4`Gz$Im!eFRi95!x+UB@o)Jfp4M}HXd z)J$)qZTI&RPWRffHweOu_Q(s@KZfqP9TwI@d1}uoiVNlowFhtCYSEk;j+y)*cWtaj zHRc<^9o5J{p=Mt1DfIQJ){2~a_wQ)OL~hGsf1m1Fuf``?&n8~io!rkXkd*EHkx}3{ z>i!Ssk?C6LB|>BfM*pDyd`Tx6HS(M5gu1CR6Z?C$-#=!}2CrRu`Tp9Gv(G1zIA@gj zWSLQjpRreJ_6%kyu+lmmIP>-}s``6ns{lQ%!l(9qLRT(#^98u&`3k7!T>Dy?G$dwX z`qHNH_Hs}UVtO>XC8n0oBdTn5+4FOE(Fg9#W{2a!h~tH)>Twnr6;=Tq%SXRG!*09z zg{auWamZ=w8`2sz5=MOJUVW`E`kPBxS@{atMMR9GFaEf7Y(b!-gTrhTJ)30O^C!Vy z$0Av%Wx8(mi5Aj#MK6Amo3{3){EX0Ph0I;kI(^)Z_+&1z#sv1i@R&MV?usvc`0(Mi zJ*sw}+Q^QYqE$vQLqn_AuU%W>5-#YyEztT+QbE1Q^*dYVN%N9{l-1utp0GjsZQ|dY zW#WE^w?@VX-QCA^EG@Ck{vfragm)LkCkN++MquFZllq!($Fs9eiU-U`pV9f^tq}I| z{2_GfxpL*Y+LJA4?hkW5V!Ex6rK@8~+3@SM<6EEV;!n9@e0|rXq2I^uR5CVj4~-n? zejtDCgHV0363T0#kM;KI!?1UTS*s3$AN-O$KYT1rk;cRZ{MH;;>Q0Z#nXe^FSv&0a zV<2i{xak9pnxSEj_N`~Q%zL-PsEf*$Qsl2)@IF%&&9E}pRqgb}St=x%yu(PTe@n(C zP@QTV)pPFMH9yP^)Pg5|c47>R6kKGnNfzxX9Qh1g(3(a_eHbda+G8apPyQVAq+#J# z`;^cr`GtjrJZ~SLp_=|FEE9TIGF@M?9Qo5@zz1Djx$*r#1`prjRl!FxrN?`Uz4v?z zZE6tS;8PH9Z_MAk@3mSSL%$Z|z`C}$xTuews^+iEBg1@K=2r5l@okG2d~b1C(Z=Ud z@dZCRE!9)qbq92k3Q7Yzk_v8_J@hl9UK5%+%p>d;<+QlW&9=mC8ukXzBxp`O$f+#v zKJHw{Lk46|1S%=Me@Y#p8t+dMGWeb(4@DibVRRs}IE zB>|~OReg-jc7gZ%hgWPV3g~*2*FI!bo?n!LzC69@ZKsZwOjY(@J>YcjVv#hRdbP^Y zbkuJiTh*YiHkTqG4o!C1XUIR4_!qSJvXFrL$o+4G6(vUkG@_51YM4GMFJBujSRX2x z>PO6;84Ly4ACSeGGC0uGcjZXB!BAzSjX#DX`_hRpMi#NuY}2Re_qZ=#6byUgnz;N} zd^7+PeUv|V*n6tTt}Bo1r~%rQyt_d2vK)?Qy>nVPb5*pL{`3Pn=i7Rz{6}k!O=K!P zjF1a(x)FaIKgXj~({p!^{WFU(>FIc@*cKWldQ-W%p`y|HqM{uU_?|r?wg_k6nG|c2-|szu7_`WFf+J?Z?IZujexzTgiC%GRz14 zHJhH?^iH{{f5dvAUGaVAj);@>hS}=geUerDlVipVS!M44j7=H5ApGh{TPsI4E3Dp ztPBw6FeyU)Oeq{!YyW*z(M_;D&`zY(o`b&*)j0mh<3ZZgb-HPvvdtGcc56-w$pvFr z3>dmHe*XR#iZr9H6(+L5!(ZgKxdo%@FY;%f-xqxZRl30>Jn^oO!Cys@;GPhdWc9@s z^W3lUybzlLa^e*Iw&HZQRiQ1NMAXXMa1RAR-!zu;(%&TB> zkzw%Vh~x+FZihB9>!R9&zT($4cyw-CQ?7~CPafB_G?QGTC*tfd%oP+Y1 z=)#0WZxeA^=e8pMzGQKpDFNQF*&{ESFC5^@Ax>4=NBCp#xPrLt1M0LBTBw~V$nu~MTOUkwo6Xr$g(R0 zhkN!-mWCMK=Rsw2Iwbx&V{J?GsgWzl=ZM=guESHJam%QVsdFjJuf-^b56DkHG;CMv z=5H0?rMBJ9T6lxcxFeEJ13Fj#)^bq!!&!HiUq8<2K>nJFI3=H|S83O$KQlV6y;xZ> zgwx^++s`GXZ*kIUipD!OO zJr9YWBjkG?dU7<%OhvMVaGhf)CG3YL2JO>)KD6GaHaxf@O7C7*c~OY%LwRNehL7vU zQ;2t9>XA>qgFO8W)y&xQd?>zS+AU38|5A~yK!IOo_=#RTKEVBn^H+Jt#;TWjQcaKY zFNBN?ZwQ%r_1%svVc;3wcsiF~tpNDcUcD;2924hxF~*ALd3E*1l4foJYf)P?Cjap_ zv6^tKC`L{vufHVKZf{^@Wb2RjFRyI-8$HZvE4p{u%I56yyK`s#xt$DS9<1i|MH+YO zk3K(g?a}vEvV!x&C0B=&KTRzzENrO`jaGhxnZ+-(ZsQ>OdX zt@7Jow!(u~E~CdD)z@!3PJCkz5>ozjGSdSc-hUJ~H+d6Mm0*dWjJ_?-_aib~JVnlV z$n&>!VVyrYkMQQEy8?l&qc7$lnP2(DI{$mRj&kr}SZ?E0g)8b>#{@2fg7c-+#PpXao)vg$W2d)(hI%lTdGCg^|dkUOKWyq3^Dh$bw4>LAOBTkNtjVu5A-v+4SmX3ei8Gt`}^%;mC0JI ziZ@G9)7KhVW;zn?nc3@ElQpi#@0q~lqP5Xb_ovsG=*r9H+DEtn5{zFtW0F{(;Vehxue- zW{RANjTNsAi}YoVj;t+rf*A|o`fhpkyk(%zj-N$J~2`o*m+s4Ka&;blOa&2 z`blXK_0k!830YK-^!WBe_Sw|6v|D9jA3pLC?n5ZF6uB95j_XN*2V&#Z!zUkLg1k;j zSaf>wf%R}2pN|pe+;LBViCiH!XvI`3a>80n^}zV=wLE6MynfT^r4)~%9@Xv5kKV%J zD()l9iHFD~Ldi@Q%k}rGkNbzUGg0v1Z?L~#^uBOm^sMt5png}xCjC`{ff6=Tn54J+{ zOViG=6+sq(^yf;Q_a3b+roai`t2;FR)>>KJ;p1pOUtLIX&{AzkT#ALt(f}_;#@%P> zR@TH1ZzlBq(DY~H*A(ZYzm#+?PH;*8YB_m19&LBtcs@A@B(lljHHbp-6G1Af#ro^G+q*KB-jO0cBBWj>j9gyxzx+a;oIvG>Vbx%=R9 z+D`-mGJ=0guwb<`I1|B7t!7D&k-5blJgfh@JZD^H5cAT&EWQbP^X$I+o}A6`IrH<| zDNS1hr{+5*!H0@`k$L&k;%AG;{bsge%;)+dA631%HAaVIkS;>M86TT*zB_U3IP*o# zkfUev?y6iDVlvo|c*-=|qnG~S<>^^`YS-mu+=Rs)PX~%$N%aE?^>0NUbV*}mWzokT zymd#ucz+egI)6c$72T4EUS8ggy?ShJ`vBKmf9J-)%Wbx)q8p4;w5adpG{F?DS?rT$ z1GOQV3T(XIy;=7;sF@jsf|0kp&oT(dUYad&7?4-IF>-eN-XP!lt3&%xlT#~Vm|lTM zpMBrO>S7)88fVSKD9Vh!l~Z@DVx~r9u5_pEV>-oP<^Nij219?n>DF`B@AV-TxeT(M z2~G6KnS$$2?Ds#oQ(9)ouE0!*vzxTP;oarp9F)A(&OZFTTf)#;@16(xn?ZGjv#5&^ zh5sNG#!mJV_huJvPAthN>I$^?@VWiyYNtu7m3$3y2Tf6w~=@YK|A1R6j#a z*fJVcssf$}dyCf2a|j8SpaFM&40S_r&{BC%^jO(c`-7MMR2Q}+8TwdJ@xL%;Pas6Ely(UD{9<&_@pqd^+VD^Ctwi2k+~zCDpM zPSGsioEtH&Vlb5!*Ab*!nIL{IB-c21b@WiRGxhPx?*i2Me65c$HNqPkvlx88uWEGw zPUK3RX40_s1NlA2o+le*dEBx8QF{D=io+`oJ9UbEPERwR7_|$B&v30M1fTMI@+E*1 zYG${vw5-Sc#A%O{G09GuWz>2dQ`q8n%BxP&r|k}9A;c)Lo$TLi+8G&r0%Gn8E!ouXvNPdZ3)|~nnM%YL^xlu~3DR9Kys}t=O@?(-e z`0&c()i#IdHuDShN?MZ1{OPCcz?)eQZmOJVbU-TS-t(z$xyB+E78X>aBO@^n!KU}X z$y-!7YV+JL?*fh-mCrbvt9iJOnHT*Pd);b6&MioE@8?W8CY-cXoJr&WhVTp(7S{Wk ztT_USpx)lvusF2dQXQ5NJ2No6{p;14vCZO?aD}?WG@~oW^2xGKU3QB)c1KJ8@O|Ic z(wjdWqE1yxbT8$HU6e8lr;(75C@n4B#BcsyUh2w=^?kkG8AgES$5|aiL}fKUR<+jo z2B4yD<+vhn?Dt2EQUp{yj$mAc$`?X!zAffeKrqZdQX#oezPrjXvj=DrIVkYRs8x(3RVKrJa~3JwuW-<1Wl@_^rKIm zg^`XnFY*l;V-F9>lxyiR;+52V?Bu)ERLcayFbRCuGW>M6pV>;rJ#gK`{Gg38yt&*H zEk$iE>=JCz$gW{&Ir=yzCg#lLo`>9htCLy`3$=c#x2ZB3F4D@M@@IAo`@zY7sw3Y? zEviB#!gSa%W8{Le?(=)|Lu{?JrJ+Z;n)UXpJ#wboikb>(dR2}m)LIg}7K7~wXV4cc zAC=NNg^QedTyy_a-nb%$u!+e=xlRsuD#_ktYW;}2b+PU8hYDAr>Aso(sQkD5r4JQ4 z?bid!k+b7U69mCN4G zGL&VKy2Y8XB&RQ&=z^p09ICO>-gDAY@FtMR<#+C#fo3!rS`fN)nANrQGUuoqdEQrR~ z41&v?n`5uAQIO-ppd6XD&Bj`s{|)-e^ikf~&6sGU$^}#JG3kZAk9m{rRm(U!kkuV7*byrsHOQjr8-_ zjKKPww7b3^YKJ7=T1DqwO61;@OBP)Fs()PRmEFdMEsgPAblRwKL|4jAXn02xhFfpeUi}ODV+AYj!M2Z>!tFe+%zB9?%oXA|~2dI)lHc zZ}aoL^ETzYV7Tksuk_aCzt1B+Vhu4@Ff54Q5u9 zagISTuS&MuxDPhJU!m(>On(=IzajIK&f}Lq7mNR85d+31c#v^pJX+sVU+SDAl-A}< z+Q02&(e;j$S}?ZBO3$aztUre?Yjs7c(&(I}Axm_Rdrh`_JZ71(x2OQ)hWu%dW_Ro72Bg=IOtsXPq~PipY&l#9tR0PV{LVXx-C4&(Qr)#mfz$ zbRvBJzDktNmE)=@$(R`r9Z||Bvi8zCipvG1m&e8l-JcIVy0(oXVKCV|9?|u{Vr)ikj}l$c z*wgRc$fnPTjL#{K83~@|F)p&FgWXY+ol&Ord#@g-y4%v3Y-GJDysWOCIS7U+05i@)=BOGipZ7sS#9?V4WHB9i#fA!q(7^HmT zPE(H)Hr&3e;_WxDR!Fge@=Q5vShKN}U%b~>Uu0e^)puxFDEae)d|&ZT#ZN~^jLXAv zc((WXiCzA7@Z7J{^L-c>S|O@^M~|3E*eHG%Hu2@sq1&k74n30{?!I;>*tCmD^F;RE z{Z$F-rS|8uO*pR@+tJKs?7_siaP zjh=jhw+^UQOg}a#C5(G{hE|sF&mSdUj@G|-@8@jr9Xr&q&#sM)nBoB~c4nJ~!%E+8 zieYL3+czXBiaPc=Q#B!Gjw!4bvoNja2tld(A^Be9HVZ*<=KCCMY9iKI^py=hIkO}m z*Ls^C)luzz{oSBwa|M0mx@8gV9}ccxbFcKD!BV7z}&zG~N#8Qtt(Sa*$D*SD+#{utdt-#dPDRT{i= zdZ*M0R+6E1^`>3VzAXj@G2c+9SdEI9$VV{kfbWSM@1w-r(zVA1VA(Of=&V3g;nNG(&H-rhO0;)0szIrg>rUxGg$X z-ziDM#QeT>SPuoI&NN0}i25h^U0JWTNmpGUoET$qf`zSPY}|L_CY#F^b>o(^Lli0A2AbNsSBOK z@hr$FmRz`YC+^(zp^XU6Z`uNG;z6kkdGwj1Mw0s6+YN@b35J+2lUFv4H4Xa_vB7UO zX&D_|B*R&B;u=b{6RW3wZI4Z)*XfyOd}k0XzlCJzmWZJV+A?-Ty~s6|3BvM7IXu*< zdiUvY)oAn=SH`EzuVuG6uU)M1l3(BzC_76x_078OQ#aeZYv6EFDccjnU2r1_uHz?bg-{j1lw5PvQN8iTWK4+vr2pVTe z^6xafVEsKH&$e^W`bDVTg+=)!|NUbMcJR;2mhYeCOV7`m@WL=X_s6=;CHbbUJ=PE! z)G|@wX~A!~z5iiS7wM+oZ~@E`IqPIWR$IgI=CpLGwJ7uY&%O-{;hp>NhrCqylzns~| zmuW&Ygn2f3hR$Qe`@}Dm&1DUq_!t0nq2s#a(z(5LqC~aA5BtA9FVRByg*^9jncFn! z*b;#k?JD|WAwUssyM z)J={tzBj$Nh+)$I91_4;9%{Xpf%+rOxu28!lAaau^q*l%i@ZO2I^`UaiMRO!qkes9 zTl@pNwi{ zzjzwI<#$+`<1gtfBB?foQU1#AdEWB1L+IKLvJv&J==yhtV&%oNXx4P*xWWPUIyiD`zi)RU$ z;i37`9e+)`(+V?X!P@a=$t1=lnlgU9J%5rXbv@agW#PW%L*D-HLg+dgTf4HSyf`q{ z7=y1*s=c|~cmZ8}k5WE^KdR2i6xht3=10xqd@ZYp6?R zzi6Iedu`o7=WCE(M_;%@q)t_NxKYv`tCmCSKQFD_s;i#Ye1mBZUJ_5|0l(j8G{{16 zMj#K?oyXM}FJJRcJc3Gcpxf6M-kbOA*Pb^RUBOeTqV#p9U(W|qsh@F(yN$g+r|)#& zuKT{dLiya_clB(qxT_fN-jU*F$++VDxq_OCX@H6r)lBR0H4>RyXZBRNbKhbmMFJT( z$0V|B&@@j+L9?Orx$exh5=N6)EYBoOitnT=x{hns*0{XEIvB^x+j_lG7k}$M(iSOj zb!%ybRTvd~J4D65OV0|^g&DAnq2SkEK8YM|W!Umybl3Y||INeBpG-KIY+|&zGK!n{ zOHs-0v~KLI@Lzv8gTKpag8yy{{_Bq&B%?La1~0X!ZLPGr6B;-f?1@c0En7h!>r%nMZP?P9_2 zsOTaT5t4DY-ME>!P!N&pD&Z-(v50V$$aSwR06JPk7zSid3IEmxP8I$834py+vU_)2M$MqyERntbaA`+_@J*;<(#DJGgDZ&Y4ca z5NP{vwFm^>h^dxj*i#UD_!!s6bp~!n)S8Ua4&)NH!*RfuVB3hNC$^PwHy9%ck%WnD z_zJP};51;ya6{~OhVK@>?J1!CpVDuOSZHciZWfibRX1A>veE5`b9Fnkt8^cNw2uDH$ctR2( z{Z8N&HfTqEvYSpIn;^e%Gq4eM7rvc%bE^;=?ynmOg*&%mJmc?5ArQnH9sk^_%y<`a zB)}RR37^3^U7+zW7&$~8yN2QMXI}2UBXR`QvS$(PgV~$_LnPr0@CUYT_g;`F$^x)o z(mUsfO@TW`I4)Q%oC11Vun7~}ETz)Gmx=8NKm?OS?bt2K#A^v>^B)&sOLYloD>N_c ztOIz$+TpWhe97O@fh^MC!tMjscTPV4c;t?Y2!sPc2Q)z-Y?Au%aMK-K$!=&cTB8WM zhaq+1jSir*b-|4~1a4Vg9i3J11n)j?5u0#;6oO3@{mV~0o=Im{?Hq6+f?&?8p$FRt zx7JzJT@?XfGS+@ad{0u3K*Yd*N0*$b5qJP|$x8qPiev<_*;_e2FOgM|MYuW95J!SN z2sCW_u1XMSD@{$(dlCbmG@~?0Ig!DUaF|zy4-S|kY|r!z*e(YGqZEWA zk&7(qt~#zp5R@TlXosAzYqhi{1Y7;bXgC=`9HkQ4nZ-@`Ax0wCE)Rs~;Duudv%uG2 z9!B0XOv!WVfr3W7f*{M_Jl<`_3*qqKrkxL(oyprB1RX_+0Fj1|mkBTOPhJ)5#t_5H2r*4;lUf6ntBwQ%2-ujV(KHoD0rSfh#x`UMPIWU`GPUR9*Zb@2Lj3n*rS z{wUs!kyH`H3@e6JE)Y6_iXs9d9?$ykS-6|PD#(lL0@sP<6jQiUeq-TQpl&#TVnFN) zkwqK?1rR#~HUqn301JeJ)WK0M@c)nJz-V4>lJ`Ud+Q4?q1_xIqcq)QTf!7gWA7;O! z1_;T2Bx;jkX)ZAeOpYl^1?=Ko0v7gS4B5)RUrm^;l7l93oc zs(;+!mBp~y6SH;KA25Eni$I`u6?GCcZPgh`p(B+J-V&$_?k0GoY5&QOA;uD3SP37< z5K`12bz5~(MJH(iYc1m)4e(-w_<%j(|F3XCKnXk|U?o%pq9;SlB_Ii5B^qEX5W5EA zm0{hTIEZRY@OWi70ZAI*S1AEG{`r5hAcBB_M?S>M36b(X0^~KEa$Q4goWvmqE1KSd zy#|>s^LM7hqeD;@_fNttZ4p)BnOTL1N4qg&hM=s!tBlAZD6_b$m~;maI-*}hpCAr+ zyu*30TT~zc*5QA56G%8bD>G3EEQyLh0HMF>Y4YaESfmqs(A}|U4cQ-L|KwYG)CMg=?zWXN^U`0E6Rv~Fy)W328 zUcTe;>HkvF0SX5s#Qa~mzzdYXx$w6)LlO`NF>ZV-xx~@42tg=Y*qFZ+K_IJ%tE=67 zDB_jl-^stf$0!8i59b0LIye_#Z@PvI?(XIStO)cS$OXrp32IjjOW%JlD#ZnvfphS> zl{9WZnGb?+up^GE5tu*erm=MuF94K~d?8()6j-4V9|eDG2NNJWsak>w z3Q%Yha98o@zmu15g?t5g2ma%VI;qch3N$YhFIejkwKxJkcol=kTM6uJMo5Za5BQ;A zh&W7$Ucemy9FhGy{NyWSE5H$BxEuZq#~o_0K-k%Zk@(lt?LvgA8P_10W11v;oo^-L-%bCaxOVHItDM3L-5ENnL|;#G`j7 zcOoB#TPg@g26_k%qbQ);-rgAF2K`R-eV33Ig4lMJX+)oadIv)Kkio!zdJOd9;r@or zgX0Jr#tP=`f1B4vU<|@JfON#{l$q(BTvXq}qYXe^CIycSjMJrUHrySsp{^Q&y8?c~ zCgHiDKNVB=PbcWEvIoFfO23Ur>;PfL~A(;Y)KLFYW8&cu}#2*eiBg7V< z1LytDE<}4LNq}?ABqAco$Di&vJct$oK{5vJN4&DsKM7Yr?7~&Z9d{Y9?No`G|BG`U zf0C`RVQ_fh2{G72|3*Q=LH{HiyyGTLy&zsYi&K%Eh{1kd!lPaOu9&c&!+7|UA|lhq z*on`umqidS6Z~2Lm`H;b^ybdy3qu^W;X6wUdpsKXZ^Dm1U*lasHQS{e9lOzu50Hho z9XpS|2n~o4+^qsb22I?5M-Xm+PsbaO%mZ(U`40*5Lj_>gBay*G5F7Y=|DEoj+8wjG zI7YZ%ce(>47d)i!MR@MN2;q|m2oS=v=)Wg6Hi_L`7P0yb8DMgi|I7x zcyy%A-v(k}(muR0ZuF18FflwlBp{=mH{r5q$Pa-0gr+^X|rk7!Nj3S>Xcq*ZfDmGJxyi`}f%17#kkuG$KX@ zwwXw(2^e?RwZ!h@Wpl*C@gR~CO-1)ZIAW^8ZHWffLeP8IXqa;c7;rFzG+`!My&DS< zYL9=1I)V^1WWWsD{C6a9{aw6dJ0k(6C6eNq@eoW->_`Lx?m{>}c6Wcoi5uj{70iDp z2&BB5AiN;)5Qsj!<{*&}RzNJpgAzu6jD}}KVm$t*{BQt9NBoD;B}O>>#0H$o8EF z1fPMOB7RDWi6lrfLhOH5GVt661|V4T;?Y6>4m9}O8*j<`cU^!9`!2=Ka?yueh zQIIy$Cq`lPA6geYr!;&H4lM%lgfuHk{aq`tI~9&`XqQhNmkmz^nkcmVeem570X2Po`Vuc`e z64)~s$QqHNNsa-bBnLKv?V0b1oh2uUc67|-k^~@39U_s!l-!^^!mn@`VM;iV;I{$x z@C3f=HK>mG2rP+-WZ)TYJon#RFb@W-J8_PGEi9%1jXv7wpW#IQXSIV*XW0oqOiJwM zsv$K004{atM)%();=$4wCI;QIV<5bI!ReV8IS_WugU3D&U&K2)2F5?hO7Ldvn5R@D zO#U}1u8S8`GnjIBJqx}-LKA(*{^Rv!unPXWe8arPGORKr?@4BI;}t=_lNfhC|Ii_T zAZU|{itryxy#(<)nf~|SQI_M|i2}*UbKN((dHZqce@6f|6nt751n(36i2~>*oF;bg z-<<>!6NA^{Cq;l{DT+xNf1?|wCeb1g=~9e4UwQmJ=GhIl7&HHOLR*^7}2wkT7k9KmZKDt#WOJpzExZ@=pb7?<9{- z2gqZF$l>+~gvB24)gJ)-a0TDi4F5USqys7N=a^?d_%iv=@h_m4bll5=K=}VTuMc+N zxBeV=Aa{@Tc@PK?y`6^|=uH-)-g0Nwz?(b&>rtZoAV;7GPx2&p;81zy`!G|}DgmkhssU;MY60p1>H!)6UIV-VXar~icni=B&;rm3&<4;B&;ig1&;`&9 z&;!s5fCK0Q=m!`87z7vs7zTI;@E%|UU=-j303KirU>slq;3L2%fJuNUfN6jkfX@K4 z0AB#U0?Yx-11tb60xSW11NaW`17I28C%_88D!>}RFM!_w>i`=7n*dt?1c2=*moluwaG-3oKY+ z!3GO76)N*2o^lB;DrSrEcjs|01H7_2*E-a7KdRW0t-=Ch`~Y} z780ig%&KdVW9&HU0D2|3hJ@F3IG70@Uxq}Y%JUS3%S;^ZQC~1vhCKgZQHhO z*L}ad&-n$XJSw0fDxor}pem}NI>J!{5vYk;sEsj0T_ru7>pqpieVUz5g3V47>zL) zi*Xo_37CjUh{R+>VG5>V8m40gW?~j*V-DtG9_C{K7Ge<=V+odG8J1%OR$>)aV-40K z8tV{)_1J)o*o4j4g00ww?bv~x*oEELgT2^?{WySwIE2GEf}=Qw<2ZqnIEB+VgR?k? z^SFSExP;5Nf~&ZO>$riNxP{xegS)tg`*?tdc!bAzf~RMwc?k^DiA9KZG3;+NC diff --git a/src/codebook.txt b/src/codebook.txt index 419126f..c7c6996 100644 --- a/src/codebook.txt +++ b/src/codebook.txt @@ -31,9 +31,9 @@ object id: 3 s_light_toggle 4 s_ac_toggle 5 s_pm_toggle -6 s_time (txt) -7 s_date (txt) -8 s_outside_temp (txt) +6 s_time (txt) -> date +7 s_date (txt) -> time +8 s_outside_temp (txt) -> outside_temp 9 idle_timer (timer) // wait one min for inactivity then dim screen 10 s_weather_icon (pic) diff --git a/src/ise_display.cpp b/src/ise_display.cpp index af60c80..95e443f 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -5,7 +5,6 @@ ISEDisplay::ISEDisplay(HardwareSerial *adapter) : ESPMegaDisplay(adapter, 115200 // Work left // TODO : Implement // debug to work -// appdeamon send data / receive data void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCard, ClimateCard *climateCard) { @@ -24,7 +23,7 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar delay(1000); // TODO : Will the light be on or off when the system is started?, You need to jump to its respective page // first jump to main then if no activity jump to standby - this->jumpToPage(2); + this->jumpToPage(1); // change this back later to 2 delay(100); this->updateAirPurifierState(); this->updateACState(); @@ -50,6 +49,7 @@ void ISEDisplay::loop() void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type) { + ESP_LOGD("ISEDisplay", "Touch detected on page %d, component %d, touch type %d", page, component, touch_type); if (page == PAGE_STANDBY) { switch (component) @@ -68,7 +68,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type break; // TODO : So this does nothing? Shouldn't it turn on the lights? // should turn it on now - toggleLightGroupState(); + toggleLightGroupStateStandby(); break; case COMPONENT_STANDBY_AC_TOGGLE: // TODO : What's the expexted behavior of standby? Does it enter standby when the lights are all off and ignore the AC @@ -106,7 +106,30 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type toggleLightGroupState(); break; // TODOlater : can't this be done better with array lookup? - + case COMPONENT_LIGHT_MASTER_LEVEL1_TOUCHPOINT: + if (touch_type != TOUCH_TYPE_RELEASE) + break; + for (uint8_t i = 1; i <= 4; i++) + { + setLightLevel(i, 1); + } + break; + case COMPONENT_LIGHT_MASTER_LEVEL2_TOUCHPOINT: + if (touch_type != TOUCH_TYPE_RELEASE) + break; + for (uint8_t i = 1; i <= 4; i++) + { + setLightLevel(i, 2); + } + break; + case COMPONENT_LIGHT_MASTER_LEVEL3_TOUCHPOINT: + if (touch_type != TOUCH_TYPE_RELEASE) + break; + for (uint8_t i = 1; i <= 4; i++) + { + setLightLevel(i, 3); + } + break; case COMPONENT_LIGHT_ROW1_SLIDER: if (touch_type != TOUCH_TYPE_RELEASE) break; @@ -169,21 +192,24 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type // We have auto, low, mid, high right?, that's 0,1,2,3 a modulo operation of 3 only gives 0,1,2 // mod 4 should fixed it this->climateCard->setFanSpeed((fan_speed + 1) % 4); + updateACState(); break; case COMPONENT_AC_TEMP_DOWN_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() - 1); + updateACState(); break; case COMPONENT_AC_TEMP_UP_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() + 1); + updateACState(); break; case COMPONENT_PM_TOGGLE_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; - this->outputCard->setState(5, !this->outputCard->getState(5)); + togglePM(); break; case COMPONENT_PM_FAN_SPEED_DECREASE: if (touch_type != TOUCH_TYPE_RELEASE) @@ -191,6 +217,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type pm_fan_speed = this->outputCard->getValue(6); if (pm_fan_speed >= 0 && pm_fan_speed <= 20) this->outputCard->setValue(5, (pm_fan_speed - 1)); + updateAirPurifierState(); break; case COMPONENT_PM_FAN_SPEED_INCREASE: if (touch_type != TOUCH_TYPE_RELEASE) @@ -198,6 +225,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type pm_fan_speed = this->outputCard->getValue(6); if (pm_fan_speed >= 0 && pm_fan_speed <= 20) this->outputCard->setValue(5, (pm_fan_speed + 1)); + updateAirPurifierState(); break; default: break; @@ -220,14 +248,13 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) if (pin >= 1 && pin <= 4) { // Light - updateLightGroupStatePageDashboard(); updateLightGroupStatePageStandby(); time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) { // Air Purifier - updateAirPurifierState(); + updateAirPurifierStateStandby(); time_since_last_screen_update = millis(); // update time since last activity } } @@ -236,7 +263,7 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) if (pin >= 1 && pin <= 4) { // Light - updateLightGroupStatePageStandby(); + updateLightGroupStatePageDashboard(); time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) @@ -256,16 +283,10 @@ void ISEDisplay::updateDateTimeText(rtctime_t time) this->takeSerialMutex(); // Send the time to the display - this->displayAdapter->printf("time.txt=%02d:%02d", time.hours, time.minutes); + this->displayAdapter->printf("time.txt=\"%02d:%02d\"", time.hours, time.minutes); this->sendStopBytes(); - this->displayAdapter->printf("date.txt=%02d.%02d.%d", time.day, time.month, time.year); - this->sendStopBytes(); - - this->displayAdapter->printf("s_time.txt=%02d:%02d", time.hours, time.minutes); - this->sendStopBytes(); - - this->displayAdapter->printf("s_date.txt=%02d.%02d.%d", time.day, time.month, time.year); + this->displayAdapter->printf("date.txt=\"%02d.%02d.%d\"", time.day, time.month, time.year); this->sendStopBytes(); this->giveSerialMutex(); @@ -344,17 +365,17 @@ void ISEDisplay::updateTempOutside(float temp_outside) { // TODO : use remotevar to get PM2.5 data from appdaemon and update the display - //change temp_outside to int then display + // change temp_outside to int then display u_int8_t temp_outside_int = (u_int8_t)temp_outside; this->takeSerialMutex(); - this->displayAdapter->printf("temp_outside.txt=%d", temp_outside_int); + this->displayAdapter->printf("temp_outside.txt=\"%d\"", temp_outside_int); this->sendStopBytes(); this->giveSerialMutex(); } void ISEDisplay::updatePMoutside(u_int16_t pm25_outside) { this->takeSerialMutex(); - this->displayAdapter->printf("pm_outside.txt=%d", pm25_outside); + this->displayAdapter->printf("pm_outside.txt=\"%d\"", pm25_outside); this->sendStopBytes(); this->giveSerialMutex(); // TODO : use remotevar to get PM2.5 data from appdaemon and update the display @@ -380,36 +401,73 @@ void ISEDisplay::toggleLightGroupState() { // Get the current group state bool state = calculateLightGroupState(); + ESP_LOGI("ISEDisplay", "Current light group state: %d", state); // Toggle light for (uint8_t i = 1; i <= 4; i++) { setLightLevel(i, state ? 0 : 3); } + updateLightGroupStatePageDashboard(); +} +void ISEDisplay::toggleLightGroupStateStandby() +{ + // Get the current group state + bool state = calculateLightGroupState(); + ESP_LOGI("ISEDisplay", "Current light group state: %d", state); + // Toggle light + for (uint8_t i = 1; i <= 4; i++) + { + setLightLevel(i, state ? 0 : 3); + } + updateLightGroupStatePageStandby(); } void ISEDisplay::togglePM() { // Get the current group state bool state = this->outputCard->getState(5); + ESP_LOGI("ISEDisplay", "Current PM state: %d", state); // Toggle the state state = !state; // Set the state this->outputCard->setState(5, state); + ESP_LOGI("ISEDisplay", "New PM state: %d", state); + updateAirPurifierState(); +} +void ISEDisplay::togglePMStandby() +{ + // Get the current group state + bool state = this->outputCard->getState(5); + ESP_LOGI("ISEDisplay", "Current PM state: %d", state); + // Toggle the state + state = !state; + // Set the state + this->outputCard->setState(5, state); + ESP_LOGI("ISEDisplay", "New PM state: %d", state); + updateAirPurifierStateStandby(); } void ISEDisplay::toggleAC() { // Get the current group state uint8_t mode = this->climateCard->getMode(); + // get fan speed and temperature + uint8_t fan_speed = this->climateCard->getFanSpeed(); + uint8_t temperature = this->climateCard->getTemperature(); + + ESP_LOGI("ISEDisplay", "Current AC mode: %d", mode); // Toggle the state if (mode == 0) { - this->climateCard->setMode(user_mode); + ESP_LOGI("ISEDisplay", " User mode: %d", user_mode); + setACstate(fan_speed, user_mode, temperature); } else { + ESP_LOGI("ISEDisplay", "User mode BEFORE: %d", user_mode); // update user mode to new mode user_mode = mode; // change actual mode to off - this->climateCard->setMode(0); + ESP_LOGI("ISEDisplay", "User mode AFTER: %d", user_mode); + setACstate(fan_speed, 0, temperature); } } void ISEDisplay::changeUserACmode() @@ -438,6 +496,7 @@ void ISEDisplay::setLightLevel(uint8_t row, uint8_t level) if (row == i) this->outputCard->setValue(row, level); } + updateLightGroupStatePageDashboard(); } void ISEDisplay::updateLightGroupStatePageStandby() @@ -540,6 +599,8 @@ void ISEDisplay::toggleLightIndividual(uint8_t row) } // Set the state setLightLevel(row, state); + updateLightGroupStatePageDashboard(); + updateLightGroupStatePageStandby(); } void ISEDisplay::toggleSliderLight(uint8_t row, uint8_t lightLevel) { @@ -569,12 +630,29 @@ void ISEDisplay::toggleSliderLight(uint8_t row, uint8_t lightLevel) // Set the state setLightLevel(row, state); } +void ISEDisplay::updateAirPurifierStateStandby() +{ + // Get the state + bool state = this->outputCard->getState(5); + // Send the state to the display + this->takeSerialMutex(); + + this->displayAdapter->print("s_pm_toggle.pic="); + this->displayAdapter->print(state ? COMPONENT_STANDBY_PM_PIC_ON : COMPONENT_STANDBY_PM_PIC_OFF); + this->sendStopBytes(); + + this->displayAdapter->print("s_pm_toggle.pic2="); + this->displayAdapter->print(state ? COMPONENT_STANDBY_PM_PIC_ON_PRESSED : COMPONENT_STANDBY_PM_PIC_OFF_PRESSED); + this->sendStopBytes(); + + this->giveSerialMutex(); +} void ISEDisplay::updateAirPurifierState() { // Get the state bool state = this->outputCard->getState(5); - uint8_t fan_speed = this->outputCard->getState(5); + uint8_t fan_speed = this->outputCard->getState(6); // Send the state to the display this->takeSerialMutex(); diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 5dbe09f..353efac 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -21,7 +21,7 @@ class ISEDisplay : public ESPMegaDisplay { public: ISEDisplay(HardwareSerial* adapter); void begin(DigitalInputCard* inputCard, DigitalOutputCard* outputCard, ClimateCard* climateCard); - + void updateLightGroupStatePageDashboard(); void updateDateTimeText(rtctime_t time); void updateWeather(char *weather_string); void updateTempOutside(float temp_outside); @@ -29,6 +29,8 @@ class ISEDisplay : public ESPMegaDisplay { void updatePMinside(u_int8_t pm25_inside); void loop(); + + private: void handleTouch(uint8_t page, uint8_t component, uint8_t touch_type); @@ -46,18 +48,22 @@ class ISEDisplay : public ESPMegaDisplay { uint8_t time_since_last_screen_update; - - void updateLightGroupStatePageDashboard(); + void updateuserACmode(); + void updateACfanSpeed(); void updateLightGroupStatePageStandby(); void updateAirPurifierState(); + void updateAirPurifierStateStandby(); void updateACState(); + bool calculateLightGroupState(); void toggleLightGroupState(); + void toggleLightGroupStateStandby(); void toggleLightIndividual(uint8_t row); void toggleSliderLight(uint8_t row,uint8_t lightLevel); void togglePM(); + void togglePMStandby(); void toggleAC(); + void toggleACStandby(); void changeUserACmode(); - void updateuserACmode(); - void updateACfanSpeed(); + }; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index fa296a7..9ce7193 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -104,7 +104,7 @@ void setup() auto bindedGetTime = std::bind(&ESPMegaPRO::getTime, &espmega); iseDisplay.begin(&espmega.inputs, &espmega.outputs, &climateCard); espmega.iot->registerRelativeMqttCallback(&handleMqttMessage); - + iseDisplay.registerPageChangeCallback(&handlePageChange); // placeholder // PM2.5 PPM Remote Variable // 12 bytes remote variable, 11 characters + null terminator @@ -122,10 +122,25 @@ void loop() iseDisplay.loop(); // Update the time every 15 seconds + //static bool run_when_init = false; // No static ? , this shit will reset to 0 every loop static uint32_t last_time_updated = 0; + //rtctime_t time = espmega.getTime(); + //when init update once then update every 15 seconds + // You don't need this, when it go from page 0 to 1 it call handlePageChange + // if(!run_when_init){ + // time = espmega.getTime(); + // iseDisplay.updateDateTimeText(time); + // last_time_updated = millis(); + // run_when_init = true; + // } + + if (millis() - last_time_updated > 15000) { rtctime_t time = espmega.getTime(); + // log time + ESP_LOGI("time", "Time: %d:%d:%d", time.hours, time.minutes, time.seconds); + ESP_LOGI("Date", "Date: %d/%d/%d", time.day, time.month, time.year); iseDisplay.updateDateTimeText(time); last_time_updated = millis(); } @@ -174,4 +189,24 @@ float get_temp_out() // Read temperature from sensor temp_out_value = atof(temp_out.getValue()); return temp_out_value; +} + +void handlePageChange(uint8_t page) { + + // Which already send the time + //printESP_LOGI the page have changed + ESP_LOGI("Page", "Page change to: %d", page); + rtctime_t time = espmega.getTime(); + iseDisplay.updateDateTimeText(time); + iseDisplay.updateLightGroupStatePageDashboard(); + //iseDisplay.updatePMinside(); + /* iseDisplay.updatePMoutside(get_pm25_out()); + iseDisplay.updateWeather(weather.getValue()); + iseDisplay.updateTempOutside(get_temp_out()); */ + /* iseDisplay.updateACState(); + iseDisplay.updateAirPurifierState(); + iseDisplay.updateLightGroupStatePageStandby(); + iseDisplay.updateLightGroupStatePageDashboard(); + iseDisplay.updateuserACmode(); + iseDisplay.updateAirPurifierStateStandby(); */ } \ No newline at end of file diff --git a/src/main.hpp b/src/main.hpp index df1e403..2100941 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -24,6 +24,7 @@ SET_LOOP_TASK_STACK_SIZE(32*1024); void handleMqttMessage(char *topic, char *payload); void subscribeToMqttTopics(); +void handlePageChange(uint8_t page); void sendStopBytes(); void sendExtStopBytes(); From 733ed54f9bee7a91926bf64d142c8811f6b80a53 Mon Sep 17 00:00:00 2001 From: reaw Date: Fri, 9 Feb 2024 10:11:44 +0700 Subject: [PATCH 03/22] fix pm fan speed --- ise-display/ise-display-prod.HMI | Bin 37446253 -> 37446253 bytes src/ise_display.cpp | 67 ++++++++++++++++++++----------- src/ise_display.hpp | 8 ++++ 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/ise-display/ise-display-prod.HMI b/ise-display/ise-display-prod.HMI index ac9122b18c4b822521fe31a0bc3197eaa5f9fe6f..c39453341d45eb75fceb68fe20eb5e4d35e0d026 100644 GIT binary patch delta 1797 zcmd7R=f4+nAII_Y`nFI~)~QZp9Gl2&7(cs^?7bRBD243Zn+{&)vG>jv2N@xhy&^jl ziRf@5dtJZB^|)?be}T{A@w)Z-+<4ykG*4;n++1x!m(sOn@bHm6`wtvY^S_zicT`QM zwly_0^(wWc`-uNrw~QbC-*rvPm^MwrTHB6Zjq}^rwyK#tsIh&Asnj%1>re|#b363t z*m~&9S@RlOx^)>_UpKD4j%uY^t7@&QwW-#2Vtrk^1#|uliW#%VR_ex8s?182S*bEB zRc58itW=qmx^|QQ6$ed~x=KTOr%(E(UpCGr*)*G_lFhS4w#-)9I@@I1^v{57m+iAd z24=?$%1+riyJXkwmff>Q_RL<{JNsnc?3ev>Kn~178Jr;*nqfIOhvd*4mf<-(N94$i z$jBU(Q5l`1b4-rSm>iemb3#tcNjW*EwYhtiaX^GF`e#5|VA^F*G^q&$_U^Gqh^**ur$GbK~=LSD>Ec{#7-)x4J1^G4px zTbY)(^G>Gc-Mp9g^Fcn$NBKB2@<~3;XPKE<`8;1_cD~G=H{ayj%u92=%lB!? z{QQs~vmig^=lqgi^ILw;ANezX$6*7Wi|66_ zC|-aU;zf8dUV@imBVLA=;}v)%UWHfVHFzyvhu7l`cq86~H{&gME8d2;;~h92@5H62_QejxMT;GaixoQ+I~Nx(E>T>vxKwfJVr{WYv1_qgv98#?xJ+@` zVvpi-#pR1D6jvcusRYZlik_AIVlT&LKpxNdR1;`+r6iW?R; RD)uh+DfTUs`jrtw{sT{jj=}%{ delta 1797 zcmd7R=erm3AII_Y{B$amly#~T8OJ7)(J;PtA$#wV5lY!)_o9QRdF;Kj#X&|=l)WN5 zI}r}0?DhLzzsoIufzNe4Z@jPf`^MwWr)5e@r$0rIb%ouf6bg;ZJLMF+LoH8x$Wv&F{-AiUHhr@Y?{`-j+*A#?YnoV zoi}lE>!vwfJCAOtAJb4zwNkBBwc2W}tF;;5P~Ud`tp9>y#>~-``Z1L%vr=VNs?182 zS*bEBRc58W?WF(2L35?P(wN@qlfLPf4YFZ2%EqZ=lWdyJvU#@1mf0%(Gay@Mn{1nb z*)H2>hwPZ0vU7IHuGuZSXOHZey|Q=q$-dby`{#fR%HSNBAvq`q=a3wlp*bvv=ZFl; z@En;D8JVMUbdJffIWEWNgq)a@GAbwMl$@H=a(d3lnHinrtel-OY0Nn}H|NEip9^wf zF3QEZBu%+Am*w(Ykt=gmuFf^NHrM6)+>je{Q*O>Jxiz=t_KeLPxifd=?%b1mb6@Vy zxIB;t)0~I$a30C{JetSyc%I0FJei4kDw8rfPv@CT$<#cX=kk1B$cuR?FXxrKn%DAr zrsa*indx~eZ|9x7oA>g5KFExGn2+*tKFO!~ET3m)zR0Y6nXfWCU+0^Ao0fc+?=vTJ z^F!uketyhP`8mJj*Zh{>^GE*7U-`Qc!Gf)@7F%N*s$atea6w!M+hKcL7(3u1*bzJ7 zqPQ3?j!WQ@Scjdl3wFhN?1oF>(%2oB!DVqdTpk;61zZtV!j*9qToqTt)o~5%fotMg z*b~>rUbqgfi|gU~*c!hvN}A z42R>9I08rFQFt^SgU8}=cs!nfC*nys3QxvU@KihvPscOxOdO5Dv+!&jgN=9&o{Q(9 zcs^c$7ve>DFPB<286KUWeD?4R|Bogg4_Ycq`t9x8qp61MkGU z@NT>Z@5TG@ejJAn;DgwV58=c32#&``@iBZHpTG(DBu>Pqa1u_&r|}t_f>ZHXd=8(- z7w|=V317xn@Kt;bU&m?q2EK{Y@hyBC-@$kBJ$xTOz!~@<62&Epb;ZubF2%0J`eL`@QpKf< z-HXc|N|r>{}-EE5io=4;So<<^TWy diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 95e443f..1006f8d 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -17,18 +17,35 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->outputCallbackHandle = this->outputCard->registerChangeCallback(bindedHandlePWMChange); this->climateCallbackHandle = this->climateCard->registerChangeCallback(bindedHandleACChange); this->user_mode = 1; // initialized to cool by default + this->pm_fan_speed = 10; + this->ac_fan_speed = 0; + this->ac_mode = 0; + this->ac_temperature = 25; + this->lightLevelRow1 = 0; + this->lightLevelRow2 = 0; + this->lightLevelRow3 = 0; + this->lightLevelRow4 = 0; this->time_since_last_screen_update = 0; this->registerTouchCallback(bindedHandleTouch); this->reset(); delay(1000); // TODO : Will the light be on or off when the system is started?, You need to jump to its respective page // first jump to main then if no activity jump to standby - this->jumpToPage(1); // change this back later to 2 + this->jumpToPage(2); // change this back later to 2 delay(100); this->updateAirPurifierState(); this->updateACState(); this->updateLightGroupStatePageDashboard(); this->updateLightGroupStatePageStandby(); + this->outputCard->setValue(6,pm_fan_speed); + this->outputCard->setValue(5,0); + this->outputCard->setValue(1,0); + this->outputCard->setValue(2,0); + this->outputCard->setValue(3,0); + this->outputCard->setValue(4,0); + // this->climateCard->setTemperature(ac_temperature); + // this->climateCard->setFanSpeed(ac_fan_speed); + // this->climateCard->setMode(ac_mode); } void ISEDisplay::loop() { @@ -43,13 +60,18 @@ void ISEDisplay::loop() if (current_time - this->time_since_last_screen_update > 120000) { // jump to standby page if there is no activity for 2 minutes - this->jumpToPage(1); + if(this->currentPage != 1){ + this->jumpToPage(1); + ESP_LOGI("ISEDisplay", "Jumping to standby page"); + } + ESP_LOGI("ISEDisplay", "No activity for 2 minutes & currently at standby page"); } } void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type) { ESP_LOGD("ISEDisplay", "Touch detected on page %d, component %d, touch type %d", page, component, touch_type); + time_since_last_screen_update = millis(); // update time since last activity if (page == PAGE_STANDBY) { switch (component) @@ -81,7 +103,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type case COMPONENT_STANDBY_PM_TOGGLE: if (touch_type != TOUCH_TYPE_RELEASE) break; - togglePM(); + togglePMStandby(); break; default: break; @@ -90,12 +112,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type else if (page == PAGE_DASHBOARD) { - u_int8_t pm_fan_speed = 0; - u_int8_t fan_speed = 0; - u_int8_t lightLevelRow1 = 0; - u_int8_t lightLevelRow2 = 0; - u_int8_t lightLevelRow3 = 0; - u_int8_t lightLevelRow4 = 0; + switch (component) { @@ -188,10 +205,10 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type case COMPONENT_AC_FAN_SPEED: if (touch_type != TOUCH_TYPE_RELEASE) break; - fan_speed = this->climateCard->getFanSpeed(); + ac_fan_speed = this->climateCard->getFanSpeed(); // We have auto, low, mid, high right?, that's 0,1,2,3 a modulo operation of 3 only gives 0,1,2 // mod 4 should fixed it - this->climateCard->setFanSpeed((fan_speed + 1) % 4); + this->climateCard->setFanSpeed((ac_fan_speed + 1) % 4); updateACState(); break; case COMPONENT_AC_TEMP_DOWN_BUTTON: @@ -215,16 +232,20 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type if (touch_type != TOUCH_TYPE_RELEASE) break; pm_fan_speed = this->outputCard->getValue(6); - if (pm_fan_speed >= 0 && pm_fan_speed <= 20) - this->outputCard->setValue(5, (pm_fan_speed - 1)); + ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); + if (pm_fan_speed >=1 && pm_fan_speed <= 20) + this->outputCard->setValue(6, (pm_fan_speed - 1)); + ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); updateAirPurifierState(); break; case COMPONENT_PM_FAN_SPEED_INCREASE: if (touch_type != TOUCH_TYPE_RELEASE) break; pm_fan_speed = this->outputCard->getValue(6); - if (pm_fan_speed >= 0 && pm_fan_speed <= 20) - this->outputCard->setValue(5, (pm_fan_speed + 1)); + ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); + if (pm_fan_speed >= 0 && pm_fan_speed <= 19) + this->outputCard->setValue(6, (pm_fan_speed + 1)); + ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); updateAirPurifierState(); break; default: @@ -368,14 +389,14 @@ void ISEDisplay::updateTempOutside(float temp_outside) // change temp_outside to int then display u_int8_t temp_outside_int = (u_int8_t)temp_outside; this->takeSerialMutex(); - this->displayAdapter->printf("temp_outside.txt=\"%d\"", temp_outside_int); + this->displayAdapter->printf("temp_outside.txt=%d", temp_outside_int); this->sendStopBytes(); this->giveSerialMutex(); } void ISEDisplay::updatePMoutside(u_int16_t pm25_outside) { this->takeSerialMutex(); - this->displayAdapter->printf("pm_outside.txt=\"%d\"", pm25_outside); + this->displayAdapter->printf("pm_outside.txt=%d", pm25_outside); this->sendStopBytes(); this->giveSerialMutex(); // TODO : use remotevar to get PM2.5 data from appdaemon and update the display @@ -652,7 +673,7 @@ void ISEDisplay::updateAirPurifierState() { // Get the state bool state = this->outputCard->getState(5); - uint8_t fan_speed = this->outputCard->getState(6); + pm_fan_speed = this->outputCard->getValue(6); // Send the state to the display this->takeSerialMutex(); @@ -664,9 +685,9 @@ void ISEDisplay::updateAirPurifierState() this->displayAdapter->print(state ? COMPONENT_PM_TOGGLE_PIC_ON_PRESSED : COMPONENT_PM_TOGGLE_PIC_OFF_PRESSED); this->sendStopBytes(); - this->displayAdapter->print("pm_speed.txt=\""); - this->displayAdapter->print(fan_speed); - this->displayAdapter->print("\""); + this->displayAdapter->print("pm_speed.val="); + this->displayAdapter->print(pm_fan_speed); + //this->displayAdapter->print("\""); this->sendStopBytes(); this->displayAdapter->print("pm_speed.pco="); @@ -788,9 +809,9 @@ void ISEDisplay::updateACState() updateACfanSpeed(); - this->displayAdapter->print("ac_temp.txt=\""); + this->displayAdapter->print("ac_temp.val="); this->displayAdapter->print(temperature); - this->displayAdapter->print("\""); + //this->displayAdapter->print("\""); this->sendStopBytes(); this->giveSerialMutex(); diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 353efac..8727675 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -45,7 +45,15 @@ class ISEDisplay : public ESPMegaDisplay { uint8_t outputCallbackHandle; uint8_t climateCallbackHandle; uint8_t user_mode; + uint8_t ac_mode; + uint8_t ac_fan_speed; + uint8_t ac_temperature; + uint8_t pm_fan_speed; uint8_t time_since_last_screen_update; + u_int8_t lightLevelRow1; + u_int8_t lightLevelRow2; + u_int8_t lightLevelRow3; + u_int8_t lightLevelRow4; void updateuserACmode(); From c99348bb72a1e826a866d1051475cf710e2e4a79 Mon Sep 17 00:00:00 2001 From: reaw Date: Fri, 9 Feb 2024 12:56:54 +0700 Subject: [PATCH 04/22] comment our remote var --- src/ise_display.cpp | 22 +++++++---- src/ise_display.hpp | 1 + src/main.cpp | 90 ++++++++++++++++++++++----------------------- 3 files changed, 60 insertions(+), 53 deletions(-) diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 1006f8d..7f6eb9b 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -12,7 +12,7 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->outputCard = outputCard; this->climateCard = climateCard; auto bindedHandlePWMChange = std::bind(&ISEDisplay::handlePWMChange, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); - auto bindedHandleACChange = std::bind(&ISEDisplay::setACstate, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); + auto bindedHandleACChange = std::bind(&ISEDisplay::handleACChange, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); auto bindedHandleTouch = std::bind(&ISEDisplay::handleTouch, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); this->outputCallbackHandle = this->outputCard->registerChangeCallback(bindedHandlePWMChange); this->climateCallbackHandle = this->climateCard->registerChangeCallback(bindedHandleACChange); @@ -43,9 +43,9 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->outputCard->setValue(2,0); this->outputCard->setValue(3,0); this->outputCard->setValue(4,0); - // this->climateCard->setTemperature(ac_temperature); - // this->climateCard->setFanSpeed(ac_fan_speed); - // this->climateCard->setMode(ac_mode); + this->climateCard->setTemperature(ac_temperature); + this->climateCard->setFanSpeed(ac_fan_speed); + this->climateCard->setMode(ac_mode); } void ISEDisplay::loop() { @@ -64,7 +64,6 @@ void ISEDisplay::loop() this->jumpToPage(1); ESP_LOGI("ISEDisplay", "Jumping to standby page"); } - ESP_LOGI("ISEDisplay", "No activity for 2 minutes & currently at standby page"); } } @@ -82,6 +81,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type // TODO : Should you really jump to page 2 here? should't page jumping be handled reactivly? // EX. if atleast one light is on, then jump to active page, else jump to standby page // This will allow page to change correctly when the system is started and when controlled remotely which won't call handleTouch + time_since_last_screen_update = millis(); this->jumpToPage(2); // the function of the button is to open the dashboard from standby break; @@ -130,6 +130,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type { setLightLevel(i, 1); } + updateLightGroupStatePageDashboard(); break; case COMPONENT_LIGHT_MASTER_LEVEL2_TOUCHPOINT: if (touch_type != TOUCH_TYPE_RELEASE) @@ -138,6 +139,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type { setLightLevel(i, 2); } + updateLightGroupStatePageDashboard(); break; case COMPONENT_LIGHT_MASTER_LEVEL3_TOUCHPOINT: if (touch_type != TOUCH_TYPE_RELEASE) @@ -146,6 +148,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type { setLightLevel(i, 3); } + updateLightGroupStatePageDashboard(); break; case COMPONENT_LIGHT_ROW1_SLIDER: if (touch_type != TOUCH_TYPE_RELEASE) @@ -517,7 +520,6 @@ void ISEDisplay::setLightLevel(uint8_t row, uint8_t level) if (row == i) this->outputCard->setValue(row, level); } - updateLightGroupStatePageDashboard(); } void ISEDisplay::updateLightGroupStatePageStandby() @@ -621,7 +623,6 @@ void ISEDisplay::toggleLightIndividual(uint8_t row) // Set the state setLightLevel(row, state); updateLightGroupStatePageDashboard(); - updateLightGroupStatePageStandby(); } void ISEDisplay::toggleSliderLight(uint8_t row, uint8_t lightLevel) { @@ -650,6 +651,7 @@ void ISEDisplay::toggleSliderLight(uint8_t row, uint8_t lightLevel) } // Set the state setLightLevel(row, state); + updateLightGroupStatePageDashboard(); } void ISEDisplay::updateAirPurifierStateStandby() { @@ -696,12 +698,16 @@ void ISEDisplay::updateAirPurifierState() this->giveSerialMutex(); } +void ISEDisplay::handleACChange(uint8_t mode, uint8_t fan_speed, uint8_t temperature) +{ + updateACState(); +} void ISEDisplay::updateuserACmode() { this->takeSerialMutex(); switch (user_mode) { - case 1: + case 1: this->displayAdapter->print("ac_mode.pic="); this->displayAdapter->print(COMPONENT_AC_MODE_COOL_PIC); this->sendStopBytes(); diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 8727675..446b437 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -35,6 +35,7 @@ class ISEDisplay : public ESPMegaDisplay { void handleTouch(uint8_t page, uint8_t component, uint8_t touch_type); void handlePWMChange(uint8_t pin, bool state, uint16_t value); + void handleACChange(uint8_t mode, uint8_t fan_speed, uint8_t temperature); void setPMstate(bool is_pm_on, uint8_t pm_fan_speed); void setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_temperature); void setLightLevel(uint8_t row, uint8_t level); diff --git a/src/main.cpp b/src/main.cpp index 9ce7193..ad4f45d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,8 @@ #include -RemoteVariable pm25_out = RemoteVariable(); -RemoteVariable temp_out = RemoteVariable(); -RemoteVariable weather = RemoteVariable(); +// RemoteVariable pm25_out = RemoteVariable(); +// RemoteVariable temp_out = RemoteVariable(); +// RemoteVariable weather = RemoteVariable(); const char *mode_names[] = {"off", "fan_only", "cool"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; @@ -109,11 +109,11 @@ void setup() // PM2.5 PPM Remote Variable // 12 bytes remote variable, 11 characters + null terminator // Enable value request at /iqair/pm25_request - pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/value_request"); - // Temperature Remote Variable - temp_out.begin(6, "/temp/value", espmega.iot, true, "/weather/temp_request"); - // Weather Remote Variable - weather.begin(45, "/weather", espmega.iot, true, "/weather_request"); + // pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/value_request"); + // // Temperature Remote Variable + // temp_out.begin(6, "/temp/value", espmega.iot, true, "/weather/temp_request"); + // // Weather Remote Variable + // weather.begin(45, "/weather", espmega.iot, true, "/weather_request"); } void loop() @@ -145,29 +145,29 @@ void loop() last_time_updated = millis(); } // Update the PM2.5 PPM value every 5 minutes - static uint32_t last_pm25_out_update = 0; - if (millis() - last_pm25_out_update > 300000) - { - uint16_t pm25_out_value = get_pm25_out(); - iseDisplay.updatePMoutside(pm25_out_value); - last_pm25_out_update = millis(); - } - // Update the temperature value every 5 minutes - static uint32_t last_temp_out_update = 0; - if (millis() - last_temp_out_update > 300000) - { - float temp_out_value = get_temp_out(); - iseDisplay.updateTempOutside(temp_out_value); - last_temp_out_update = millis(); - } - // Update the weather value every 5 minutes - static uint32_t last_weather_update = 0; - if (millis() - last_weather_update > 300000) - { - char *weather_value = weather.getValue(); - iseDisplay.updateWeather(weather_value); - last_weather_update = millis(); - } + // static uint32_t last_pm25_out_update = 0; + // if (millis() - last_pm25_out_update > 300000) + // { + // uint16_t pm25_out_value = get_pm25_out(); + // iseDisplay.updatePMoutside(pm25_out_value); + // last_pm25_out_update = millis(); + // } + // // Update the temperature value every 5 minutes + // static uint32_t last_temp_out_update = 0; + // if (millis() - last_temp_out_update > 300000) + // { + // float temp_out_value = get_temp_out(); + // iseDisplay.updateTempOutside(temp_out_value); + // last_temp_out_update = millis(); + // } + // // Update the weather value every 5 minutes + // static uint32_t last_weather_update = 0; + // if (millis() - last_weather_update > 300000) + // { + // char *weather_value = weather.getValue(); + // iseDisplay.updateWeather(weather_value); + // last_weather_update = millis(); + // } } @@ -176,20 +176,20 @@ void on_pin_change(uint8_t pin, uint8_t value) } -uint16_t get_pm25_out() -{ - uint16_t pm25_out_value = 0; - // Read PM2.5 PPM from sensor - pm25_out_value = atoi(pm25_out.getValue()); - return pm25_out_value; -} -float get_temp_out() -{ - float temp_out_value = 0; - // Read temperature from sensor - temp_out_value = atof(temp_out.getValue()); - return temp_out_value; -} +// uint16_t get_pm25_out() +// { +// uint16_t pm25_out_value = 0; +// // Read PM2.5 PPM from sensor +// pm25_out_value = atoi(pm25_out.getValue()); +// return pm25_out_value; +// } +// float get_temp_out() +// { +// float temp_out_value = 0; +// // Read temperature from sensor +// temp_out_value = atof(temp_out.getValue()); +// return temp_out_value; +// } void handlePageChange(uint8_t page) { From 742027acf06effdc38f19c90e12919c72662b793 Mon Sep 17 00:00:00 2001 From: reaw Date: Fri, 9 Feb 2024 15:52:01 +0700 Subject: [PATCH 05/22] fix aircon and other --- ise-display/ise-display-prod.HMI | Bin 37446253 -> 37446253 bytes src/ise_display.cpp | 89 +++++++++++++++++-------------- src/ise_display.hpp | 10 ++-- src/main.cpp | 68 +++++++++++++---------- 4 files changed, 93 insertions(+), 74 deletions(-) diff --git a/ise-display/ise-display-prod.HMI b/ise-display/ise-display-prod.HMI index c39453341d45eb75fceb68fe20eb5e4d35e0d026..c7b0d8c691b9188fce140c1de61a1087d7918c7c 100644 GIT binary patch delta 6665 zcmeI!Yg80v9LMozmSsUe1VI#66u~>7?1l;wxKvn{3SO|(5D8K70@yAn+AdB$HK=*T z981%*EYrLNI%-}pZ)tfU^Ol-gYMN4bODoO(KU|#6*3RjiUi1Ra`F_rG_L&);ot>T8 ziX9cc6_jv$jS#7EIc#PnQJS_IVSY)5Hc%HoFO)I1)6CcoGuu@;-&HH`(crbwwQNj7 zQv${In%TiU>b#len2zQ`ix+qpn=Yiyg@+D-*OFpv>`+6Rn<@AeYdxu7OFV-Q=9zp5AIgXEEIyo%;3N4c zp3QT3E+5Tb=4Ni;c|4zw;bVCLAIHb@S4yo%&b#J|OE=AvPn@?VrJi-cw}Y{M9*mu^ zkE6U9J7yny)m6vm>M>See?2vjF`IpSqLDi87tGkrsv|PiLrD*?ZLbw*q+_$(k?94& zhHzteBz^5zZu-#7V597tCU#V2R9cTV5SU`P9_PW2qAR~Qg9ab1yt9prX!NypJRZ4V2pbDu8N>YrN z8&ErW`R)RIoug@&W^(*mDXeg{z?hGH)n!`7rrO8d-5Hx!ea`4V9=DH6>!{~`x*uaF z?XQoh&)9zZI7ZLdKKoeLMBVpvh`P;+7FF96(n=T`*M_k%_8qQ9s2|*L17p|iucx+W z%on#v`pfR9jtgVd@r+n?yeN*btM+|oC8*Ns?eIyMba$EhP3tG-g>bJcMZi#ldw?PGeg?Cf~P{Os@ShLtf-`bhA1k8b;3 z_Oa&##`J=GFr>Vb+**+a$d!$3eU&Y4%jXJn`iQMk4D_)uOV+5&wA^&FrEPxt$hb&c zCmA_|GtGl@#$-o0+X9zP)fRcV&gPZVagxo&&&i(h=tELNId_N@AfMSF)l+gdOC27$ zVWJY0D4Cs4ZyPNJD&A@0sz*-uR(vwVe5cb&(`0Fn(;2KUQEAsl%5yrc(DZueGqj+8 zI^=;o(fJ`CoRKhPQh_+!Bf-g8i*!8S58Y_~{`tuXlf`Jo6tjGj=f66bAw1H_!Ne=p zXr;118td|39V~dZ_@5lCX92y<%d%Kn+v%0&>su70NK5e9>t5Nz`oqU1Fftp1viK)Jkmxxah$UE;yv6XdcklD~!p$O#7|KV5d_ z7|U3TEZ(vP2>!Bo-RfW5S??whGPEot|OI%Fj&87?zna;=zGZG(~<` zXES3IJsMcnkXCb>AN>KUhal>jJ zTXcGA9$V^z&G9zs7*zg<4N-pf*yUQk$sF)D~(hRYq;2KBKl%JE)!1E^0URIkkt{OMO9oN$sQdQwOMn zR5|q(b%^?!I!qm*j#9^{LPWC`jNU! zU7;$dpQxXyO6n?gjk-?Vpl(vXP`9Yt)UVWU)bG?C>Mr#Mb#IEhL6}Yf4R8Tk;0koW z4Y-3^zyo*!FHjqJgF3(m_=38?5BP(6AOO?{4L~4h2=t&42m*~k6A%oVf)Ef2nt|q^ z1!xIcf!3f62m|3D0<;C~KqRPo(?*OQ15uzo=m0u`Xb=NBfmrZ3hy(GUGcbV!@C0}g zJOvU#7w|NA26P3_g6BXt&>i#uNgx^Y1ie6S&}g z4!!{=z)5fld<#y4GvF-v4tx*Jf%D)3_yJr5m%xwUGPnXNz)#?3PzkPrYv4M#0d9g{ zz%6ha{0e>pzk@sAF8Bl76X^D*p@9H2zy)Z5E6@Qq;0|g558w&BKyBa+>Hr_$3+e(t z;1BA708k$^0D+(((1S)G2s8#wKrm{J2AYEwpe1MpT7xzq41|LS&=#}teM1l681Lz2%K@8}m*-E!RO{U>bViiAf delta 4637 zcmeIyeR$1vAHebNIeW6%n5V@K%jO|$W>{;Rhn9!b)Q&Mi;V`9C3`xw!$+u3z#Nt#` zQ}iGi4M(0fnP(HpL$+yzN>)=wB=vc7+~;?7cmH$$bzk?@uIv4}K0EvU&iUOBJ01M znzz@ka)Ra5%-n8)%R8vQoH{tcapP3eUoMWP>$KLPN-_(=f_!Uvr&pXjpBrdt=zZ#J z;kp^A7DuYZB$*{I$y@S~d|jy)zx>m=HcRV&?gV#YhRx!z$*r=F&CR?y2w9z4U$hex0m)>j(6M zIz?M`ADycE>V7&+_tyjTLwcYdqzCJV^&@(S9;%0Fn;x!5=yW|&KdK+oqx9qY2|Zdr zsh`qM>oIz)&d}rZcs)TsqbKTT^(6hAo~)PeuTPW33l2E{yUWUSUrK+u ztm*Fguw2%yxxeAElK=B%Rn&7;`DNQpH6p6b)s~*+GeUw^l=qp> z2FJ^P8SdO?wMR~yZBpu}`R0F}?yb}m_Z5`;DRt}02G&$+hx_rc+Dh$m&u8TZ?{?4m zAxdp@&!golX@h%i9_BgsT)5|$Wi4(TGwsGJ4{NQ|B=-qNqCD@EHAblt_v4LYm8#>u z(6(`&xvTs$w;s19dS+W^rS`hdjZE^)m%4lAt-a*+Z+$EhdwV_#>r*^)TwkRE6)JoB!J?%7|Sbm3&B>Y1HOQtb;|g%fj5n4I}t z9P!S=NjaTdMQQe7Ud}#w_84bIS4RWa*v*cH~4L-?v@#LcbQ>#ZHCl${qnPGQh4ZGXZu)6~cyBnV5+1K-i-E|pvH^#8L zD-F9FW!T*~!|o;-b~o9uyJ?2qjWFzPm0@?c79|xX zl}Y8&3F&L8LOLm(lD?5nOJ}6B(znug()ZFi=?Ce&R4M%^{UlXM7o?x1U!;ptwRB0k zEd457k*-R=N!O&`rR&lkv&L>V&6U6mUf>Nr;0u0G1NLKL)xXlMs9&>lKKM~Hcu0Um=medi3v`9MAqnn*ZqOZiKu@?Adcl2gKO{qMcmN)R6tF@cNQJ)857MAN z41kAVAPj=R@Gv|ALtrQj0~-v75s(fe;Zb-DM#1Co1dN6!;VF0;#=uy}fN?M$CcrZ= z5uSxf@ElBrDUbnFc0QKF1!j0 zU?Di+HFzD~fJLwv-h{W{ZODTq@D98SOJNzj2k*lN@F6URk6;CS3@afYR>5lc1PWjc ztc7*pg7xqzY=Dih2{ywPD1;)|3ZKC?D2DB@19rkL*bRGNFYJR7*bkq>0XPU>z#;e& z4#N>R3di6pI1Z&y2IX)9zJ>}o38&y2I1OjuEPM;!!S`?uet`2(2|vP5Pz4v@XZQs! zLN#21%kV2)fvfNvT!Y`?I{aahuRpU4CNP5+c!Ll4f*;fXe+Yn@5C}m~3u;3!)PcHC z59&h$2!Y$6AvA(eus~yI0%34FG=*@8fM(DfT0l#<16o0AXakWD1#KZ3+CdDohYrvY VV&P7RgS#Le63m72^=H1m^iM&<6lVYc diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 7f6eb9b..6aaa8be 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -25,7 +25,7 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->lightLevelRow2 = 0; this->lightLevelRow3 = 0; this->lightLevelRow4 = 0; - this->time_since_last_screen_update = 0; + //this->time_since_last_screen_update = 0; this->registerTouchCallback(bindedHandleTouch); this->reset(); delay(1000); @@ -36,7 +36,6 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->updateAirPurifierState(); this->updateACState(); this->updateLightGroupStatePageDashboard(); - this->updateLightGroupStatePageStandby(); this->outputCard->setValue(6,pm_fan_speed); this->outputCard->setValue(5,0); this->outputCard->setValue(1,0); @@ -55,22 +54,22 @@ void ISEDisplay::loop() // Update the time since the last screen update using millis() - u_int32_t current_time = millis(); + // u_int32_t current_time = millis(); - if (current_time - this->time_since_last_screen_update > 120000) - { - // jump to standby page if there is no activity for 2 minutes - if(this->currentPage != 1){ - this->jumpToPage(1); - ESP_LOGI("ISEDisplay", "Jumping to standby page"); - } - } + // if (current_time - this->time_since_last_screen_update > 120000) + // { + // // jump to standby page if there is no activity for 2 minutes + // if(this->currentPage != 1){ + // this->jumpToPage(1); + // ESP_LOGI("ISEDisplay", "Jumping to standby page"); + // } + // } } void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type) { ESP_LOGD("ISEDisplay", "Touch detected on page %d, component %d, touch type %d", page, component, touch_type); - time_since_last_screen_update = millis(); // update time since last activity + //time_since_last_screen_update = millis(); // update time since last activity if (page == PAGE_STANDBY) { switch (component) @@ -81,7 +80,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type // TODO : Should you really jump to page 2 here? should't page jumping be handled reactivly? // EX. if atleast one light is on, then jump to active page, else jump to standby page // This will allow page to change correctly when the system is started and when controlled remotely which won't call handleTouch - time_since_last_screen_update = millis(); + //time_since_last_screen_update = millis(); this->jumpToPage(2); // the function of the button is to open the dashboard from standby break; @@ -130,7 +129,6 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type { setLightLevel(i, 1); } - updateLightGroupStatePageDashboard(); break; case COMPONENT_LIGHT_MASTER_LEVEL2_TOUCHPOINT: if (touch_type != TOUCH_TYPE_RELEASE) @@ -139,7 +137,6 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type { setLightLevel(i, 2); } - updateLightGroupStatePageDashboard(); break; case COMPONENT_LIGHT_MASTER_LEVEL3_TOUCHPOINT: if (touch_type != TOUCH_TYPE_RELEASE) @@ -148,7 +145,6 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type { setLightLevel(i, 3); } - updateLightGroupStatePageDashboard(); break; case COMPONENT_LIGHT_ROW1_SLIDER: if (touch_type != TOUCH_TYPE_RELEASE) @@ -211,20 +207,23 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type ac_fan_speed = this->climateCard->getFanSpeed(); // We have auto, low, mid, high right?, that's 0,1,2,3 a modulo operation of 3 only gives 0,1,2 // mod 4 should fixed it - this->climateCard->setFanSpeed((ac_fan_speed + 1) % 4); - updateACState(); + ESP_LOGI("ISEDisplay", "Current AC fan speed: %d", ac_fan_speed); + ac_fan_speed = (ac_fan_speed + 1) % 4; + ESP_LOGI("ISEDisplay", "New AC fan speed: %d", ac_fan_speed); + this->climateCard->setFanSpeed(ac_fan_speed); + //updateACState(); break; case COMPONENT_AC_TEMP_DOWN_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() - 1); - updateACState(); + //updateACState(); break; case COMPONENT_AC_TEMP_UP_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() + 1); - updateACState(); + //updateACState(); break; case COMPONENT_PM_TOGGLE_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) @@ -273,13 +272,13 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) { // Light updateLightGroupStatePageStandby(); - time_since_last_screen_update = millis(); // update time since last activity + //time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) { // Air Purifier updateAirPurifierStateStandby(); - time_since_last_screen_update = millis(); // update time since last activity + //time_since_last_screen_update = millis(); // update time since last activity } } else if (current_page == PAGE_DASHBOARD) @@ -288,13 +287,13 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) { // Light updateLightGroupStatePageDashboard(); - time_since_last_screen_update = millis(); // update time since last activity + //time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) { // Air Purifier updateAirPurifierState(); - time_since_last_screen_update = millis(); // update time since last activity + //time_since_last_screen_update = millis(); // update time since last activity } } else @@ -416,10 +415,16 @@ void ISEDisplay::setPMstate(bool is_pm_on, uint8_t pm_fan_speed) void ISEDisplay::setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_temperature) { - this->climateCard->setTemperature(ac_temperature); + ESP_LOGI("ISEDisplay", "Setting AC state: = fan speed: %d, mode: %d, temperature: %d", ac_fan_speed, ac_mode, ac_temperature); + + this->climateCard->setFanSpeed(ac_fan_speed); + ESP_LOGI("ISEDisplay", "AC fan speed set to: %d", ac_fan_speed); this->climateCard->setMode(ac_mode); - updateACState(); + ESP_LOGI("ISEDisplay", "AC mode set to: %d", ac_mode); + this->climateCard->setTemperature(ac_temperature); + ESP_LOGI("ISEDisplay", "AC temperature set to: %d", ac_temperature); + //updateACState(); } void ISEDisplay::toggleLightGroupState() { @@ -431,7 +436,6 @@ void ISEDisplay::toggleLightGroupState() { setLightLevel(i, state ? 0 : 3); } - updateLightGroupStatePageDashboard(); } void ISEDisplay::toggleLightGroupStateStandby() { @@ -443,7 +447,7 @@ void ISEDisplay::toggleLightGroupStateStandby() { setLightLevel(i, state ? 0 : 3); } - updateLightGroupStatePageStandby(); + //updateLightGroupStatePageStandby(); } void ISEDisplay::togglePM() { @@ -498,18 +502,23 @@ void ISEDisplay::changeUserACmode() { // Get the current group state uint8_t mode = this->climateCard->getMode(); + ESP_LOGI("ISEDisplay", "Current actual AC mode: %d", mode); // Toggle the state // user mode alternate between 1 and 2 - user_mode = (user_mode + 1) % 2 + 1; + ESP_LOGI("ISEDisplay", "User mode BEFORE: %d", user_mode); + user_mode = (user_mode) % 2 + 1; + ESP_LOGI("ISEDisplay", "User mode AFTER: %d", user_mode); if (mode != 0) { // update mode to new mode mode = user_mode; + ESP_LOGI("ISEDisplay", "change actual AC mode to user mode: %d", mode); } else { // ie mode is off // do nothing as the state is keep in user_mode // the mode will change to user_mode when turn on by toggleAC() + ESP_LOGI("ISEDisplay", "do nothing; user mode: %d , actual mode: %d", user_mode, mode); } updateuserACmode(); // call to update mode part of the display seperately } @@ -622,7 +631,6 @@ void ISEDisplay::toggleLightIndividual(uint8_t row) } // Set the state setLightLevel(row, state); - updateLightGroupStatePageDashboard(); } void ISEDisplay::toggleSliderLight(uint8_t row, uint8_t lightLevel) { @@ -651,7 +659,6 @@ void ISEDisplay::toggleSliderLight(uint8_t row, uint8_t lightLevel) } // Set the state setLightLevel(row, state); - updateLightGroupStatePageDashboard(); } void ISEDisplay::updateAirPurifierStateStandby() { @@ -700,11 +707,13 @@ void ISEDisplay::updateAirPurifierState() } void ISEDisplay::handleACChange(uint8_t mode, uint8_t fan_speed, uint8_t temperature) { + ESP_LOGI("ISEDisplay", "AC state changed: mode: %d, fan speed: %d, temperature: %d", mode, fan_speed, temperature); updateACState(); } void ISEDisplay::updateuserACmode() { this->takeSerialMutex(); + ESP_LOGI("ISEDisplay", "updating display user AC mode to: %d", user_mode); switch (user_mode) { case 1: @@ -731,38 +740,39 @@ void ISEDisplay::updateuserACmode() void ISEDisplay::updateACfanSpeed() { uint8_t fan_speed = this->climateCard->getFanSpeed(); + ESP_LOGI("ISEDisplay", "updating display AC fan speed to: %d", fan_speed); this->takeSerialMutex(); switch (fan_speed) { case 0: - this->displayAdapter->print("ac_fan.pic="); + this->displayAdapter->print("ac_speed.pic="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_AUTO_PIC); this->sendStopBytes(); - this->displayAdapter->print("ac_fan.pic2="); + this->displayAdapter->print("ac_speed.pic2="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_AUTO_PIC_PRESSED); this->sendStopBytes(); break; case 1: - this->displayAdapter->print("ac_fan.pic="); + this->displayAdapter->print("ac_speed.pic="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_HIGH_PIC); this->sendStopBytes(); - this->displayAdapter->print("ac_fan.pic2="); + this->displayAdapter->print("ac_speed.pic2="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_HIGH_PIC_PRESSED); this->sendStopBytes(); break; case 2: - this->displayAdapter->print("ac_fan.pic="); + this->displayAdapter->print("ac_speed.pic="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_MID_PIC); this->sendStopBytes(); - this->displayAdapter->print("ac_fan.pic2="); + this->displayAdapter->print("ac_speed.pic2="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_MID_PIC_PRESSED); this->sendStopBytes(); break; case 3: - this->displayAdapter->print("ac_fan.pic="); + this->displayAdapter->print("ac_speed.pic="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_LOW_PIC); this->sendStopBytes(); - this->displayAdapter->print("ac_fan.pic2="); + this->displayAdapter->print("ac_speed.pic2="); this->displayAdapter->print(COMPONENT_AC_FAN_MODE_LOW_PIC_PRESSED); this->sendStopBytes(); break; @@ -821,4 +831,5 @@ void ISEDisplay::updateACState() this->sendStopBytes(); this->giveSerialMutex(); + ESP_LOGI("ISEDisplay", "display AC state updated"); } diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 446b437..46e4b7e 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -22,6 +22,9 @@ class ISEDisplay : public ESPMegaDisplay { ISEDisplay(HardwareSerial* adapter); void begin(DigitalInputCard* inputCard, DigitalOutputCard* outputCard, ClimateCard* climateCard); void updateLightGroupStatePageDashboard(); + void updateLightGroupStatePageStandby(); + void updateAirPurifierState(); + void updateAirPurifierStateStandby(); void updateDateTimeText(rtctime_t time); void updateWeather(char *weather_string); void updateTempOutside(float temp_outside); @@ -56,14 +59,9 @@ class ISEDisplay : public ESPMegaDisplay { u_int8_t lightLevelRow3; u_int8_t lightLevelRow4; - + void updateACState(); void updateuserACmode(); void updateACfanSpeed(); - void updateLightGroupStatePageStandby(); - void updateAirPurifierState(); - void updateAirPurifierStateStandby(); - void updateACState(); - bool calculateLightGroupState(); void toggleLightGroupState(); void toggleLightGroupStateStandby(); diff --git a/src/main.cpp b/src/main.cpp index ad4f45d..992f131 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,7 +28,6 @@ ClimateCard climateCard = ClimateCard(AIR_CONDITIONER_IR_PIN, ac, void handleMqttMessage(char *topic, char *payload) { - } void sendStopBytes() @@ -122,19 +121,18 @@ void loop() iseDisplay.loop(); // Update the time every 15 seconds - //static bool run_when_init = false; // No static ? , this shit will reset to 0 every loop + // static bool run_when_init = false; // No static ? , this shit will reset to 0 every loop static uint32_t last_time_updated = 0; - //rtctime_t time = espmega.getTime(); - //when init update once then update every 15 seconds - // You don't need this, when it go from page 0 to 1 it call handlePageChange - // if(!run_when_init){ - // time = espmega.getTime(); - // iseDisplay.updateDateTimeText(time); - // last_time_updated = millis(); - // run_when_init = true; - // } - - + // rtctime_t time = espmega.getTime(); + // when init update once then update every 15 seconds + // You don't need this, when it go from page 0 to 1 it call handlePageChange + // if(!run_when_init){ + // time = espmega.getTime(); + // iseDisplay.updateDateTimeText(time); + // last_time_updated = millis(); + // run_when_init = true; + // } + if (millis() - last_time_updated > 15000) { rtctime_t time = espmega.getTime(); @@ -168,12 +166,10 @@ void loop() // iseDisplay.updateWeather(weather_value); // last_weather_update = millis(); // } - } void on_pin_change(uint8_t pin, uint8_t value) { - } // uint16_t get_pm25_out() @@ -191,22 +187,36 @@ void on_pin_change(uint8_t pin, uint8_t value) // return temp_out_value; // } -void handlePageChange(uint8_t page) { +void handlePageChange(uint8_t page) +{ // Which already send the time - //printESP_LOGI the page have changed + // printESP_LOGI the page have changed ESP_LOGI("Page", "Page change to: %d", page); rtctime_t time = espmega.getTime(); iseDisplay.updateDateTimeText(time); - iseDisplay.updateLightGroupStatePageDashboard(); - //iseDisplay.updatePMinside(); - /* iseDisplay.updatePMoutside(get_pm25_out()); - iseDisplay.updateWeather(weather.getValue()); - iseDisplay.updateTempOutside(get_temp_out()); */ - /* iseDisplay.updateACState(); - iseDisplay.updateAirPurifierState(); - iseDisplay.updateLightGroupStatePageStandby(); - iseDisplay.updateLightGroupStatePageDashboard(); - iseDisplay.updateuserACmode(); - iseDisplay.updateAirPurifierStateStandby(); */ -} \ No newline at end of file + switch (page) + { + case PAGE_STANDBY: + iseDisplay.updateLightGroupStatePageStandby(); + iseDisplay.updateAirPurifierStateStandby(); + break; + case PAGE_DASHBOARD: + iseDisplay.updateLightGroupStatePageDashboard(); + iseDisplay.updateAirPurifierState(); + break; + default: + break; + } + + // iseDisplay.updatePMinside(); + /* iseDisplay.updatePMoutside(get_pm25_out()); + iseDisplay.updateWeather(weather.getValue()); + iseDisplay.updateTempOutside(get_temp_out()); */ + /* iseDisplay.updateACState(); + iseDisplay.updateAirPurifierState(); + iseDisplay.updateLightGroupStatePageStandby(); + iseDisplay.updateLightGroupStatePageDashboard(); + iseDisplay.updateuserACmode(); + iseDisplay.updateAirPurifierStateStandby(); */ + } \ No newline at end of file From fa77085e9a1d735a0f02b8ec7fc8311eb6ec6cef Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Fri, 9 Feb 2024 23:54:32 +0700 Subject: [PATCH 06/22] enable remote var --- platformio.ini | 2 +- src/main.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/platformio.ini b/platformio.ini index 5b1560c..c0e538c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.2.4 +lib_deps = siwats/ESPMegaPROR3@^2.2.5 monitor_speed = 115200 build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 diff --git a/src/main.cpp b/src/main.cpp index ad4f45d..80fc27d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,8 @@ #include -// RemoteVariable pm25_out = RemoteVariable(); -// RemoteVariable temp_out = RemoteVariable(); -// RemoteVariable weather = RemoteVariable(); +RemoteVariable pm25_out = RemoteVariable(); +RemoteVariable temp_out = RemoteVariable(); +RemoteVariable weather = RemoteVariable(); const char *mode_names[] = {"off", "fan_only", "cool"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; @@ -109,11 +109,11 @@ void setup() // PM2.5 PPM Remote Variable // 12 bytes remote variable, 11 characters + null terminator // Enable value request at /iqair/pm25_request - // pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/value_request"); - // // Temperature Remote Variable - // temp_out.begin(6, "/temp/value", espmega.iot, true, "/weather/temp_request"); - // // Weather Remote Variable - // weather.begin(45, "/weather", espmega.iot, true, "/weather_request"); + pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/value_request"); + // Temperature Remote Variable + temp_out.begin(6, "/temp/value", espmega.iot, true, "/weather/temp_request"); + // Weather Remote Variable + weather.begin(45, "/weather", espmega.iot, true, "/weather_request"); } void loop() From 34eeca14e09693cef92d616da17c0bea444b2a29 Mon Sep 17 00:00:00 2001 From: reaw Date: Mon, 12 Feb 2024 03:23:25 +0700 Subject: [PATCH 07/22] remote var now work --- platformio.ini | 2 +- src/codebook.txt | 4 +- src/ise_display.cpp | 105 ++++++++++++++++++++++++-------------- src/ise_display.hpp | 2 +- src/main.cpp | 122 +++++++++++++++++++++++++++----------------- src/main.hpp | 1 + 6 files changed, 145 insertions(+), 91 deletions(-) diff --git a/platformio.ini b/platformio.ini index 5b1560c..c0e538c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.2.4 +lib_deps = siwats/ESPMegaPROR3@^2.2.5 monitor_speed = 115200 build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 diff --git a/src/codebook.txt b/src/codebook.txt index c7c6996..7fa5353 100644 --- a/src/codebook.txt +++ b/src/codebook.txt @@ -33,9 +33,9 @@ object id: 5 s_pm_toggle 6 s_time (txt) -> date 7 s_date (txt) -> time -8 s_outside_temp (txt) -> outside_temp +8 s_outside_temp (txt) -> temp_outside 9 idle_timer (timer) // wait one min for inactivity then dim screen -10 s_weather_icon (pic) +10 weather_icon (pic) picture id: diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 6aaa8be..70aad6e 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -25,7 +25,7 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->lightLevelRow2 = 0; this->lightLevelRow3 = 0; this->lightLevelRow4 = 0; - //this->time_since_last_screen_update = 0; + // this->time_since_last_screen_update = 0; this->registerTouchCallback(bindedHandleTouch); this->reset(); delay(1000); @@ -36,12 +36,12 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->updateAirPurifierState(); this->updateACState(); this->updateLightGroupStatePageDashboard(); - this->outputCard->setValue(6,pm_fan_speed); - this->outputCard->setValue(5,0); - this->outputCard->setValue(1,0); - this->outputCard->setValue(2,0); - this->outputCard->setValue(3,0); - this->outputCard->setValue(4,0); + this->outputCard->setValue(6, pm_fan_speed); + this->outputCard->setValue(5, 0); + this->outputCard->setValue(1, 0); + this->outputCard->setValue(2, 0); + this->outputCard->setValue(3, 0); + this->outputCard->setValue(4, 0); this->climateCard->setTemperature(ac_temperature); this->climateCard->setFanSpeed(ac_fan_speed); this->climateCard->setMode(ac_mode); @@ -69,7 +69,7 @@ void ISEDisplay::loop() void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type) { ESP_LOGD("ISEDisplay", "Touch detected on page %d, component %d, touch type %d", page, component, touch_type); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity if (page == PAGE_STANDBY) { switch (component) @@ -80,7 +80,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type // TODO : Should you really jump to page 2 here? should't page jumping be handled reactivly? // EX. if atleast one light is on, then jump to active page, else jump to standby page // This will allow page to change correctly when the system is started and when controlled remotely which won't call handleTouch - //time_since_last_screen_update = millis(); + // time_since_last_screen_update = millis(); this->jumpToPage(2); // the function of the button is to open the dashboard from standby break; @@ -111,7 +111,6 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type else if (page == PAGE_DASHBOARD) { - switch (component) { @@ -211,19 +210,19 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type ac_fan_speed = (ac_fan_speed + 1) % 4; ESP_LOGI("ISEDisplay", "New AC fan speed: %d", ac_fan_speed); this->climateCard->setFanSpeed(ac_fan_speed); - //updateACState(); + // updateACState(); break; case COMPONENT_AC_TEMP_DOWN_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() - 1); - //updateACState(); + // updateACState(); break; case COMPONENT_AC_TEMP_UP_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) break; this->climateCard->setTemperature(this->climateCard->getTemperature() + 1); - //updateACState(); + // updateACState(); break; case COMPONENT_PM_TOGGLE_BUTTON: if (touch_type != TOUCH_TYPE_RELEASE) @@ -235,9 +234,9 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type break; pm_fan_speed = this->outputCard->getValue(6); ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); - if (pm_fan_speed >=1 && pm_fan_speed <= 20) + if (pm_fan_speed >= 1 && pm_fan_speed <= 20) this->outputCard->setValue(6, (pm_fan_speed - 1)); - ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); + ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); updateAirPurifierState(); break; case COMPONENT_PM_FAN_SPEED_INCREASE: @@ -247,7 +246,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); if (pm_fan_speed >= 0 && pm_fan_speed <= 19) this->outputCard->setValue(6, (pm_fan_speed + 1)); - ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); + ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); updateAirPurifierState(); break; default: @@ -272,13 +271,13 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) { // Light updateLightGroupStatePageStandby(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) { // Air Purifier updateAirPurifierStateStandby(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } } else if (current_page == PAGE_DASHBOARD) @@ -287,13 +286,13 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) { // Light updateLightGroupStatePageDashboard(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } else if (pin == 4 || pin == 5) { // Air Purifier updateAirPurifierState(); - //time_since_last_screen_update = millis(); // update time since last activity + // time_since_last_screen_update = millis(); // update time since last activity } } else @@ -326,6 +325,10 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 63; } + else if (strcmp(weather_string, "sunny") == 0) + { + weather_code = 63; + } else if (strcmp(weather_string, "fair_night") == 0) { weather_code = 64; @@ -334,11 +337,11 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 65; } - else if (strcmp(weather_string, "clearsky_day") == 0) + else if (strcmp(weather_string, "clear-day") == 0) { weather_code = 66; } - else if (strcmp(weather_string, "clearsky_night") == 0) + else if (strcmp(weather_string, "clear-night") == 0) { weather_code = 67; } @@ -346,6 +349,10 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 68; } + else if (strcmp(weather_string, "partlycloudy") == 0) + { + weather_code = 68; + } else if (strcmp(weather_string, "partlycloudy_night") == 0) { weather_code = 69; @@ -366,6 +373,10 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 73; } + else if (strcmp(weather_string, "rainy") == 0) + { + weather_code = 73; + } else if (strcmp(weather_string, "lightrain") == 0) { weather_code = 74; @@ -378,9 +389,11 @@ void ISEDisplay::updateWeather(char *weather_string) { weather_code = 68; } + ESP_LOGI("ISEDisplay", "Updating weather to: %s (%d)", weather_string, weather_code); - this->takeSerialMutex(); - this->displayAdapter->printf("weather_icon.pic=%s", weather_code); + if (!this->takeSerialMutex()) + return; + this->displayAdapter->printf("weather_icon.pic=%d", weather_code); this->sendStopBytes(); this->giveSerialMutex(); } @@ -390,22 +403,37 @@ void ISEDisplay::updateTempOutside(float temp_outside) // change temp_outside to int then display u_int8_t temp_outside_int = (u_int8_t)temp_outside; + ESP_LOGI("ISEDisplay", "Updating temperature outside to: %d", temp_outside_int); this->takeSerialMutex(); - this->displayAdapter->printf("temp_outside.txt=%d", temp_outside_int); + this->displayAdapter->printf("outside_temp.txt=\"%d\"", temp_outside_int); this->sendStopBytes(); this->giveSerialMutex(); } void ISEDisplay::updatePMoutside(u_int16_t pm25_outside) { - this->takeSerialMutex(); - this->displayAdapter->printf("pm_outside.txt=%d", pm25_outside); - this->sendStopBytes(); - this->giveSerialMutex(); + ESP_LOGI("ISEDisplay", "Updating PM2.5 outside to: %d", pm25_outside); + u_int16_t curPage = this->currentPage; + if (curPage == 2) + { + this->takeSerialMutex(); + this->displayAdapter->printf("pm_out.txt=\"%d\"", pm25_outside); + this->sendStopBytes(); + this->giveSerialMutex(); + } // TODO : use remotevar to get PM2.5 data from appdaemon and update the display } -void ISEDisplay::updatePMinside(u_int8_t pm25_inside) +void ISEDisplay::updatePMinside(u_int16_t pm25_inside) { // TODO : get data from HA's Xiaomi air purifier sensor + ESP_LOGI("ISEDisplay", "Updating PM2.5 inside to: %d", pm25_inside); + u_int16_t curPage = this->currentPage; + if (curPage == 2) + { + this->takeSerialMutex(); + this->displayAdapter->printf("pm_in.txt=\"%d\"", pm25_inside); + this->sendStopBytes(); + this->giveSerialMutex(); + } } void ISEDisplay::setPMstate(bool is_pm_on, uint8_t pm_fan_speed) @@ -417,14 +445,13 @@ void ISEDisplay::setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_te { ESP_LOGI("ISEDisplay", "Setting AC state: = fan speed: %d, mode: %d, temperature: %d", ac_fan_speed, ac_mode, ac_temperature); - this->climateCard->setFanSpeed(ac_fan_speed); ESP_LOGI("ISEDisplay", "AC fan speed set to: %d", ac_fan_speed); this->climateCard->setMode(ac_mode); ESP_LOGI("ISEDisplay", "AC mode set to: %d", ac_mode); this->climateCard->setTemperature(ac_temperature); ESP_LOGI("ISEDisplay", "AC temperature set to: %d", ac_temperature); - //updateACState(); + // updateACState(); } void ISEDisplay::toggleLightGroupState() { @@ -447,7 +474,7 @@ void ISEDisplay::toggleLightGroupStateStandby() { setLightLevel(i, state ? 0 : 3); } - //updateLightGroupStatePageStandby(); + // updateLightGroupStatePageStandby(); } void ISEDisplay::togglePM() { @@ -516,9 +543,9 @@ void ISEDisplay::changeUserACmode() } else { // ie mode is off - // do nothing as the state is keep in user_mode - // the mode will change to user_mode when turn on by toggleAC() - ESP_LOGI("ISEDisplay", "do nothing; user mode: %d , actual mode: %d", user_mode, mode); + // do nothing as the state is keep in user_mode + // the mode will change to user_mode when turn on by toggleAC() + ESP_LOGI("ISEDisplay", "do nothing; user mode: %d , actual mode: %d", user_mode, mode); } updateuserACmode(); // call to update mode part of the display seperately } @@ -696,7 +723,7 @@ void ISEDisplay::updateAirPurifierState() this->displayAdapter->print("pm_speed.val="); this->displayAdapter->print(pm_fan_speed); - //this->displayAdapter->print("\""); + // this->displayAdapter->print("\""); this->sendStopBytes(); this->displayAdapter->print("pm_speed.pco="); @@ -716,7 +743,7 @@ void ISEDisplay::updateuserACmode() ESP_LOGI("ISEDisplay", "updating display user AC mode to: %d", user_mode); switch (user_mode) { - case 1: + case 1: this->displayAdapter->print("ac_mode.pic="); this->displayAdapter->print(COMPONENT_AC_MODE_COOL_PIC); this->sendStopBytes(); @@ -827,7 +854,7 @@ void ISEDisplay::updateACState() this->displayAdapter->print("ac_temp.val="); this->displayAdapter->print(temperature); - //this->displayAdapter->print("\""); + // this->displayAdapter->print("\""); this->sendStopBytes(); this->giveSerialMutex(); diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 46e4b7e..c830090 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -29,7 +29,7 @@ class ISEDisplay : public ESPMegaDisplay { void updateWeather(char *weather_string); void updateTempOutside(float temp_outside); void updatePMoutside(u_int16_t pm25_outside); - void updatePMinside(u_int8_t pm25_inside); + void updatePMinside(u_int16_t pm25_inside); void loop(); diff --git a/src/main.cpp b/src/main.cpp index 992f131..545bfe1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,9 @@ #include -// RemoteVariable pm25_out = RemoteVariable(); -// RemoteVariable temp_out = RemoteVariable(); -// RemoteVariable weather = RemoteVariable(); +RemoteVariable pm25_out = RemoteVariable(); +RemoteVariable temp_out = RemoteVariable(); +RemoteVariable weather = RemoteVariable(); +RemoteVariable pm25_in = RemoteVariable(); const char *mode_names[] = {"off", "fan_only", "cool"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; @@ -108,11 +109,13 @@ void setup() // PM2.5 PPM Remote Variable // 12 bytes remote variable, 11 characters + null terminator // Enable value request at /iqair/pm25_request - // pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/value_request"); - // // Temperature Remote Variable - // temp_out.begin(6, "/temp/value", espmega.iot, true, "/weather/temp_request"); - // // Weather Remote Variable - // weather.begin(45, "/weather", espmega.iot, true, "/weather_request"); + pm25_out.begin(6, "/aqi/value", espmega.iot, true, "/aqi/request_value"); + // Temperature Remote Variable + temp_out.begin(6, "/temp/value", espmega.iot, true, "/temp/request_value"); + // Weather Remote Variable + weather.begin(45, "/weather/value", espmega.iot, true, "/weather/request_value"); + // PM2.5 PPM Remote Variable + pm25_in.begin(6, "/pm/value", espmega.iot, true, "/pm/request_value"); } void loop() @@ -142,50 +145,71 @@ void loop() iseDisplay.updateDateTimeText(time); last_time_updated = millis(); } - // Update the PM2.5 PPM value every 5 minutes - // static uint32_t last_pm25_out_update = 0; - // if (millis() - last_pm25_out_update > 300000) - // { - // uint16_t pm25_out_value = get_pm25_out(); - // iseDisplay.updatePMoutside(pm25_out_value); - // last_pm25_out_update = millis(); - // } - // // Update the temperature value every 5 minutes - // static uint32_t last_temp_out_update = 0; - // if (millis() - last_temp_out_update > 300000) - // { - // float temp_out_value = get_temp_out(); - // iseDisplay.updateTempOutside(temp_out_value); - // last_temp_out_update = millis(); - // } - // // Update the weather value every 5 minutes - // static uint32_t last_weather_update = 0; - // if (millis() - last_weather_update > 300000) - // { - // char *weather_value = weather.getValue(); - // iseDisplay.updateWeather(weather_value); - // last_weather_update = millis(); - // } + //Update the PM2.5 PPM value every 15 seconds + static uint32_t last_pm25_out_update = 0; + if (millis() - last_pm25_out_update > 15000) + { + uint16_t pm25_out_value = get_pm25_out(); + //ESP_LOGI("loopPM2.5","updating PM2.5 from MQTT inside loop: %d", pm25_out_value); + iseDisplay.updatePMoutside(pm25_out_value); + last_pm25_out_update = millis(); + } + // Update the PM2.5 PPM value every 15 seconds + static uint32_t last_pm25_in_update = 0; + if (millis() - last_pm25_in_update > 15000) + { + uint8_t pm25_in_value = get_pm25_in(); + iseDisplay.updatePMinside(pm25_in_value); + last_pm25_in_update = millis(); + } + // Update the temperature value every 15 seconds + static uint32_t last_temp_out_update = 0; + if (millis() - last_temp_out_update > 15000) + { + float temp_out_value = get_temp_out(); + iseDisplay.updateTempOutside(temp_out_value); + last_temp_out_update = millis(); + } + // Update the weather value every 15 seconds + static uint32_t last_weather_update = 0; + if (millis() - last_weather_update > 15000) + { + char *weather_value = weather.getValue(); + iseDisplay.updateWeather(weather_value); + last_weather_update = millis(); + } } void on_pin_change(uint8_t pin, uint8_t value) { } -// uint16_t get_pm25_out() -// { -// uint16_t pm25_out_value = 0; -// // Read PM2.5 PPM from sensor -// pm25_out_value = atoi(pm25_out.getValue()); -// return pm25_out_value; -// } -// float get_temp_out() -// { -// float temp_out_value = 0; -// // Read temperature from sensor -// temp_out_value = atof(temp_out.getValue()); -// return temp_out_value; -// } +uint16_t get_pm25_out() +{ + uint16_t pm25_out_value = 0; + // Read PM2.5 PPM from sensor + pm25_out_value = atoi(pm25_out.getValue()); + ESP_LOGI("PM2.5", "getting PM2.5 PPM from MQTT: %d", pm25_out_value); + return pm25_out_value; +} + +uint16_t get_pm25_in() +{ + uint16_t pm25_in_value = 0; + // Read PM2.5 PPM from sensor + pm25_in_value = atoi(pm25_in.getValue()); + ESP_LOGI("PM2.5", "getting PM2.5 PPM from MQTT: %d", pm25_in_value); + return pm25_in_value; +} + +float get_temp_out() +{ + float temp_out_value = 0; + // Read temperature from sensor + temp_out_value = atof(temp_out.getValue()); + ESP_LOGI("Temperature", "getting Temperature from MQTT: %f", temp_out_value); + return temp_out_value; +} void handlePageChange(uint8_t page) { @@ -210,9 +234,11 @@ void handlePageChange(uint8_t page) } // iseDisplay.updatePMinside(); - /* iseDisplay.updatePMoutside(get_pm25_out()); + iseDisplay.updatePMoutside(get_pm25_out()); + iseDisplay.updatePMinside(get_pm25_in()); iseDisplay.updateWeather(weather.getValue()); - iseDisplay.updateTempOutside(get_temp_out()); */ + iseDisplay.updateTempOutside(get_temp_out()); + /* iseDisplay.updateACState(); iseDisplay.updateAirPurifierState(); iseDisplay.updateLightGroupStatePageStandby(); diff --git a/src/main.hpp b/src/main.hpp index 2100941..73b888c 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -35,4 +35,5 @@ void loop(); void on_pin_change(uint8_t pin, uint8_t value); uint16_t get_pm25_out(); +uint16_t get_pm25_in(); float get_temp_out(); From c08a762c0008a1479abf1b7c8f6b515ed90c7506 Mon Sep 17 00:00:00 2001 From: reaw Date: Tue, 13 Feb 2024 07:36:31 +0700 Subject: [PATCH 08/22] only fan speed not working --- ise-display/ise-display-prod.HMI | Bin 37446253 -> 37446253 bytes platformio.ini | 2 +- src/ise_display.cpp | 56 ++++++++++-------- src/ise_display.hpp | 4 +- src/main.cpp | 94 +++++++++++++++++++++++-------- src/main.hpp | 2 + 6 files changed, 106 insertions(+), 52 deletions(-) diff --git a/ise-display/ise-display-prod.HMI b/ise-display/ise-display-prod.HMI index c7b0d8c691b9188fce140c1de61a1087d7918c7c..786086ce406c394e4460d4daebfc746f5bb953ae 100644 GIT binary patch delta 2865 zcmdVa_jgZs9LMqR_nT!T_Wn}TuDyw>Srt3AtN7Ygn^+|wyou2o{gSVkL0h9mG&Gbp zR6MrYh&N_09?|zqI6l#44_G zE@yIL5C4F`ypD2%yE*=G9K90hSWv{_aC)ONw69+2U%Lr8qa1PCb?lCHI8tIAyLG!9 zzGp7Zh1HC51ZvCaa3ns+kk{#~=nV|6RUUdnbmw zW5V4|~yCXe^J$@@OoN#`0(^k2@&-@_*ri zM2|aliq){17HYNZU8`;HSsklu^{l=%u!i=&HL?$^v4vR^YiiA`xwWvC*2==|Lu+kq ztgW@P_SV5V+DF#OKDN%*#k!iux>%Q`6Pw>I*eP%~Z40Z1tt`syS+|id8-}PsOSE zYJpm)7OBN*iHcWC)iSkQeWkuu->4O8rCOy{t8dkJYK>Z})~N)wUVX0;)dsau{h*T6 zCbe1psJ5uB>L>NHN>VP_^4yixXVRc0P zsg9~+>bN?gPO4Mtv^t~Cs&neRx}YwqOX{+^qOPiI>bkn2ZmL`Awn|lZ)LoUP?y39g zfqJMOsmJPxda9nO=jw%ess2*0)a&VCHJvjRxWEtmApim)2+~1%$N(837(yTuWQHt| z6|zBg$N@Pa7vzRKkQefS8}dT|cnbM4;`Q*d<31~W9STBpeuNw8+3;r&=Yz=Z|DP`KwtP2`aypf00UtV z42B^v6ox?r42Kag5=Oyj_zcFtScrru7zg7a8YaL*Fqj0BAqJ+vRG0?S;dA%`X249C z1+(Ex@WLFJ3$fsXc@PKlVF4_JMX(r_Ks+pkWw0E+g0JBlSOF_x6|9DD;X7CZYhfKE zzugdZRYHo<225w^fq_z8Z7WY`AVVF&DlU62C1;TQN7_P}2F4fer)_#F5^NAMV)z*Bez&*25UgumbwymspM=hDInF7N|?2!KEcf^?7`GC)QMh7iaE znIQ{gg=~-=azIYV1-T&)4n?n}URn28c@uO+jKH0U`T2m7nrg0V*&v##3ZNUaHqq;{SQFB(EpgtD}2$bgz!?)zQ5= zx>rZ{dWxjy{TDW5cs&Iv7G;gCi8Zxm*4!Sp7WRm>v{u&I+E`m_XYH+nb+k_QsCBk3 z*43h|o5fgn>tT=C8*O9kMH_1gHqKtM@it*|;>O^B78lkmUy*hse?oM>e80aQuh<~R zIZ`-Bm2{lLg>&h$cjlA9j+0P$Jubv?5)0>J74OWkp^kI8@QLkS)p3H|X)9xVO)}HV zB~C6{v6xmy42w$$jR=bjtJkzBU*iT33~e47*)%O;o3Byk*6ZuW`(>W1p6Dr+*4IBJ zJ#)|8Sqt51XLk7_GZzOY9(E^3H%?R&)yvAKCaEN4YO+pnp&h5t5?(#wNx!r%hd{%u2!m5>Q(icdR?tnZ>TkDty-tvRBx%b z)q1r-ZB(1oJ1RqMR`04UDpS3u-d7)}57k!nk@{F=scq^L^{LvfvQ>`Sp*~Zet1r}- zYNz^2?NVQ>-D;28tM;k=>VV2s2h|~USbd|uRY%l!>Ztl&9aBH3AJtFlXO*Y&)p2z~ zom8jPX>~^Zq6*Ym^{YCk&Z`URqPnCmt1IfNx~8tH-_-Bw4|PM`RJW!_H+Icd;08bN zhX4qKB5)TJg&-&f#i0b0gi=r%%0OAT8}5N%CP!vjzU!r(y&hq_P?A|Mj#Lj!mS8bTw8g4;Kz2~$&O2F>ANXaSEvOK1hH zp$)W!cF-O=Ku72Vk3whY0$m{*xAH1yI~LPg?+Fe4nQs(ghOx`zJYJy2z&=e;d?j+KfsUh z6Z{N$kPpY<1e}CZa2n3QFHity;a4~Z=ivfegiCN4uE15e2G`*?_#OU$8*meDx%B#T zYjA-Z{JOIKL1`!hW#MkP2ZEs-l!pos0{4OkDnccw3{@Z$ zszNoW4mF@A+z0nVEvO9-KphB!2O%8lLOqCpNT?4D;2~%TjUWnc-<&4yEWQ5Rm23YA D2QJFo diff --git a/platformio.ini b/platformio.ini index c0e538c..6740886 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.2.5 +lib_deps = siwats/ESPMegaPROR3@2.2.5 monitor_speed = 115200 build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 70aad6e..6b77596 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -6,11 +6,13 @@ ISEDisplay::ISEDisplay(HardwareSerial *adapter) : ESPMegaDisplay(adapter, 115200 // TODO : Implement // debug to work -void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCard, ClimateCard *climateCard) +void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCard, ClimateCard *climateCard, RemoteVariable* pm_switch, RemoteVariable* pm_fan_speed) { this->inputCard = inputCard; this->outputCard = outputCard; this->climateCard = climateCard; + this->pm_switch = pm_switch; + this->remote_pm_fan_speed = pm_fan_speed; auto bindedHandlePWMChange = std::bind(&ISEDisplay::handlePWMChange, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); auto bindedHandleACChange = std::bind(&ISEDisplay::handleACChange, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); auto bindedHandleTouch = std::bind(&ISEDisplay::handleTouch, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); @@ -18,6 +20,7 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->climateCallbackHandle = this->climateCard->registerChangeCallback(bindedHandleACChange); this->user_mode = 1; // initialized to cool by default this->pm_fan_speed = 10; + //remote_pm_fan_speed->setValue(pm_fan_speed); this->ac_fan_speed = 0; this->ac_mode = 0; this->ac_temperature = 25; @@ -36,8 +39,7 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->updateAirPurifierState(); this->updateACState(); this->updateLightGroupStatePageDashboard(); - this->outputCard->setValue(6, pm_fan_speed); - this->outputCard->setValue(5, 0); + this->outputCard->setValue(1, 0); this->outputCard->setValue(2, 0); this->outputCard->setValue(3, 0); @@ -70,6 +72,7 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type { ESP_LOGD("ISEDisplay", "Touch detected on page %d, component %d, touch type %d", page, component, touch_type); // time_since_last_screen_update = millis(); // update time since last activity + char buffer[4]; if (page == PAGE_STANDBY) { switch (component) @@ -232,22 +235,24 @@ void ISEDisplay::handleTouch(uint8_t page, uint8_t component, uint8_t touch_type case COMPONENT_PM_FAN_SPEED_DECREASE: if (touch_type != TOUCH_TYPE_RELEASE) break; - pm_fan_speed = this->outputCard->getValue(6); + pm_fan_speed = (int) atof(remote_pm_fan_speed->getValue()); ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); if (pm_fan_speed >= 1 && pm_fan_speed <= 20) - this->outputCard->setValue(6, (pm_fan_speed - 1)); + itoa(pm_fan_speed - 1, buffer, DEC); + remote_pm_fan_speed->setValue(buffer); ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); - updateAirPurifierState(); + //updateAirPurifierState(); break; case COMPONENT_PM_FAN_SPEED_INCREASE: if (touch_type != TOUCH_TYPE_RELEASE) break; - pm_fan_speed = this->outputCard->getValue(6); + pm_fan_speed = (int) atof(remote_pm_fan_speed->getValue()); ESP_LOGI("ISEDisplay", "Current PM fan speed: %d", pm_fan_speed); if (pm_fan_speed >= 0 && pm_fan_speed <= 19) - this->outputCard->setValue(6, (pm_fan_speed + 1)); + itoa(pm_fan_speed + 1, buffer, DEC); + remote_pm_fan_speed->setValue(buffer); ESP_LOGI("ISEDisplay", "New PM fan speed: %d", pm_fan_speed); - updateAirPurifierState(); + //updateAirPurifierState(); break; default: break; @@ -273,7 +278,7 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) updateLightGroupStatePageStandby(); // time_since_last_screen_update = millis(); // update time since last activity } - else if (pin == 4 || pin == 5) + else if (pin == 5 || pin == 6) { // Air Purifier updateAirPurifierStateStandby(); @@ -288,7 +293,7 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) updateLightGroupStatePageDashboard(); // time_since_last_screen_update = millis(); // update time since last activity } - else if (pin == 4 || pin == 5) + else if (pin == 5 || pin == 6) { // Air Purifier updateAirPurifierState(); @@ -438,7 +443,11 @@ void ISEDisplay::updatePMinside(u_int16_t pm25_inside) void ISEDisplay::setPMstate(bool is_pm_on, uint8_t pm_fan_speed) { - // TODO : set data to HA's Xiaomi air purifier sensor + ESP_LOGI("ISEDisplay", "Setting PM state: %d, fan speed: %d", is_pm_on, pm_fan_speed); + char buffer[4]; + itoa(pm_fan_speed, buffer, DEC); + remote_pm_fan_speed->setValue(buffer); + pm_switch->setValue(is_pm_on ? "1" : "0"); } void ISEDisplay::setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_temperature) @@ -479,26 +488,22 @@ void ISEDisplay::toggleLightGroupStateStandby() void ISEDisplay::togglePM() { // Get the current group state - bool state = this->outputCard->getState(5); + bool state = strcmp(pm_switch->getValue(), "on") == 0; ESP_LOGI("ISEDisplay", "Current PM state: %d", state); // Toggle the state - state = !state; - // Set the state - this->outputCard->setState(5, state); + pm_switch->setValue(state ? "off" : "on"); ESP_LOGI("ISEDisplay", "New PM state: %d", state); - updateAirPurifierState(); + //updateAirPurifierState(); } void ISEDisplay::togglePMStandby() { // Get the current group state - bool state = this->outputCard->getState(5); + bool state = strcmp(pm_switch->getValue(), "on") == 0; ESP_LOGI("ISEDisplay", "Current PM state: %d", state); // Toggle the state - state = !state; - // Set the state - this->outputCard->setState(5, state); + pm_switch->setValue(state ? "off" : "on"); ESP_LOGI("ISEDisplay", "New PM state: %d", state); - updateAirPurifierStateStandby(); + //updateAirPurifierStateStandby(); } void ISEDisplay::toggleAC() { @@ -690,7 +695,7 @@ void ISEDisplay::toggleSliderLight(uint8_t row, uint8_t lightLevel) void ISEDisplay::updateAirPurifierStateStandby() { // Get the state - bool state = this->outputCard->getState(5); + bool state = strcmp(pm_switch->getValue(), "on") == 0; // Send the state to the display this->takeSerialMutex(); @@ -708,8 +713,9 @@ void ISEDisplay::updateAirPurifierStateStandby() void ISEDisplay::updateAirPurifierState() { // Get the state - bool state = this->outputCard->getState(5); - pm_fan_speed = this->outputCard->getValue(6); + bool state = strcmp(pm_switch->getValue(), "on") == 0; + ESP_LOGI("ISEDisplay", "Updating air purifier state to: %d", state); + pm_fan_speed = (int) atof(remote_pm_fan_speed->getValue()); // Send the state to the display this->takeSerialMutex(); diff --git a/src/ise_display.hpp b/src/ise_display.hpp index c830090..1dc9bfd 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -20,7 +20,7 @@ class ISEDisplay : public ESPMegaDisplay { public: ISEDisplay(HardwareSerial* adapter); - void begin(DigitalInputCard* inputCard, DigitalOutputCard* outputCard, ClimateCard* climateCard); + void begin(DigitalInputCard* inputCard, DigitalOutputCard* outputCard, ClimateCard* climateCard, RemoteVariable* pm_switch, RemoteVariable* pm_fan_speed); void updateLightGroupStatePageDashboard(); void updateLightGroupStatePageStandby(); void updateAirPurifierState(); @@ -46,6 +46,8 @@ class ISEDisplay : public ESPMegaDisplay { DigitalInputCard* inputCard; DigitalOutputCard *outputCard; ClimateCard *climateCard; + RemoteVariable *pm_switch; + RemoteVariable *remote_pm_fan_speed; uint8_t outputCallbackHandle; uint8_t climateCallbackHandle; uint8_t user_mode; diff --git a/src/main.cpp b/src/main.cpp index 545bfe1..6370dac 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,9 +1,11 @@ #include +RemoteVariable pm25_in = RemoteVariable(); RemoteVariable pm25_out = RemoteVariable(); RemoteVariable temp_out = RemoteVariable(); RemoteVariable weather = RemoteVariable(); -RemoteVariable pm25_in = RemoteVariable(); +RemoteVariable pm_switch = RemoteVariable(); +RemoteVariable pm_fan_speed = RemoteVariable(); const char *mode_names[] = {"off", "fan_only", "cool"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; @@ -98,13 +100,6 @@ void setup() climateCard.loadStateFromFRAM(); climateCard.setFRAMAutoSave(true); espmega.display->bindClimateCard(&climateCard); - espmega.iot->registerCard(0); // Register the Input Card - espmega.iot->registerCard(1); // Register the Output Card - espmega.iot->registerCard(2); // Register the Climate Card - auto bindedGetTime = std::bind(&ESPMegaPRO::getTime, &espmega); - iseDisplay.begin(&espmega.inputs, &espmega.outputs, &climateCard); - espmega.iot->registerRelativeMqttCallback(&handleMqttMessage); - iseDisplay.registerPageChangeCallback(&handlePageChange); // placeholder // PM2.5 PPM Remote Variable // 12 bytes remote variable, 11 characters + null terminator @@ -116,6 +111,21 @@ void setup() weather.begin(45, "/weather/value", espmega.iot, true, "/weather/request_value"); // PM2.5 PPM Remote Variable pm25_in.begin(6, "/pm/value", espmega.iot, true, "/pm/request_value"); + // Air Purifier Switch Remote Variable + pm_switch.begin(6, "/pm/switch_state", espmega.iot, true, "/pm/request_switch_state"); + pm_switch.enableSetValue("/pm/set_switch_state"); + // Air Purifier Fan Speed Remote Variable + pm_fan_speed.begin(6, "/pm/fan_speed", espmega.iot, true, "/pm/request_fan_speed"); + pm_fan_speed.enableSetValue("/pm/set_fan_speed"); + espmega.iot->registerCard(0); // Register the Input Card + espmega.iot->registerCard(1); // Register the Output Card + espmega.iot->registerCard(2); // Register the Climate Card + auto bindedGetTime = std::bind(&ESPMegaPRO::getTime, &espmega); + iseDisplay.begin(&espmega.inputs, &espmega.outputs, &climateCard, &pm_switch, &pm_fan_speed); + espmega.iot->registerRelativeMqttCallback(&handleMqttMessage); + iseDisplay.registerPageChangeCallback(&handlePageChange); + + } void loop() @@ -145,12 +155,12 @@ void loop() iseDisplay.updateDateTimeText(time); last_time_updated = millis(); } - //Update the PM2.5 PPM value every 15 seconds + // Update the PM2.5 PPM value every 15 seconds static uint32_t last_pm25_out_update = 0; if (millis() - last_pm25_out_update > 15000) { uint16_t pm25_out_value = get_pm25_out(); - //ESP_LOGI("loopPM2.5","updating PM2.5 from MQTT inside loop: %d", pm25_out_value); + // ESP_LOGI("loopPM2.5","updating PM2.5 from MQTT inside loop: %d", pm25_out_value); iseDisplay.updatePMoutside(pm25_out_value); last_pm25_out_update = millis(); } @@ -178,11 +188,16 @@ void loop() iseDisplay.updateWeather(weather_value); last_weather_update = millis(); } + // Update the PM state every 1 seconds + static uint32_t last_pm_switch_update = 0; + if (millis() - last_pm_switch_update > 5000) + { + iseDisplay.updateAirPurifierState(); + } } void on_pin_change(uint8_t pin, uint8_t value) -{ -} +{} uint16_t get_pm25_out() { @@ -211,6 +226,35 @@ float get_temp_out() return temp_out_value; } +uint8_t get_pm_fanspeed() +{ + uint8_t pm_fan_speed_value = 0; + // Read PM2.5 fan speed from sensor + pm_fan_speed_value = (int) atof(pm_fan_speed.getValue()); + ESP_LOGI("PM fan speed", "getting PM2.5 PPM from MQTT: %d", pm_fan_speed_value); + return pm_fan_speed_value; +} + +bool get_pm_switch() +{ + ESP_LOGI("PM switch", "getting PM switch state from MQTT: %d", pm_switch.getValue()); + bool is_pm_switch_on = strcmp(pm_switch.getValue(),"on")== 0; + return is_pm_switch_on; +} +void toggle_pm_switch() +{ + bool is_pm_switch_on = get_pm_switch(); + ESP_LOGI("PM switch", "toggling PM switch state from: %d to %d", is_pm_switch_on, !is_pm_switch_on); + pm_switch.setValue(is_pm_switch_on ? "0" : "1"); +} +void set_pm_fanspeed(uint8_t speed) +{ + ESP_LOGI("PM fan speed", "setting PM fan speed to: %d", speed); + char buffer[4]; + itoa(speed, buffer, DEC); + pm_fan_speed.setValue(buffer); +} + void handlePageChange(uint8_t page) { @@ -233,16 +277,16 @@ void handlePageChange(uint8_t page) break; } - // iseDisplay.updatePMinside(); - iseDisplay.updatePMoutside(get_pm25_out()); - iseDisplay.updatePMinside(get_pm25_in()); - iseDisplay.updateWeather(weather.getValue()); - iseDisplay.updateTempOutside(get_temp_out()); - - /* iseDisplay.updateACState(); - iseDisplay.updateAirPurifierState(); - iseDisplay.updateLightGroupStatePageStandby(); - iseDisplay.updateLightGroupStatePageDashboard(); - iseDisplay.updateuserACmode(); - iseDisplay.updateAirPurifierStateStandby(); */ - } \ No newline at end of file + // iseDisplay.updatePMinside(); + iseDisplay.updatePMoutside(get_pm25_out()); + iseDisplay.updatePMinside(get_pm25_in()); + iseDisplay.updateWeather(weather.getValue()); + iseDisplay.updateTempOutside(get_temp_out()); + + /* iseDisplay.updateACState(); + iseDisplay.updateAirPurifierState(); + iseDisplay.updateLightGroupStatePageStandby(); + iseDisplay.updateLightGroupStatePageDashboard(); + iseDisplay.updateuserACmode(); + iseDisplay.updateAirPurifierStateStandby(); */ +} \ No newline at end of file diff --git a/src/main.hpp b/src/main.hpp index 73b888c..e98301f 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -37,3 +37,5 @@ void on_pin_change(uint8_t pin, uint8_t value); uint16_t get_pm25_out(); uint16_t get_pm25_in(); float get_temp_out(); +void toggle_pm_switch(); +void set_pm_fanspeed(uint8_t speed); \ No newline at end of file From 786bc9a8dedb03d4efc05243f31d29f36efcd3cb Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Wed, 14 Feb 2024 02:17:07 +0700 Subject: [PATCH 09/22] fix variable loop bug --- .vscode/settings.json | 295 +----------------------------------------- platformio.ini | 2 +- src/main.cpp | 1 + 3 files changed, 9 insertions(+), 289 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index cb0dece..d2e3661 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,10 @@ { - "C_Cpp_Runner.cCompilerPath": "C:/Users/siwat/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/xtensa-esp32-elf-gcc.exe", - "C_Cpp_Runner.cppCompilerPath": "C:/Users/siwat/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/xtensa-esp32-elf-g++.exe", - "C_Cpp_Runner.debuggerPath": "C:/Users/siwat/.platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/xtensa-esp32-elf-gdb.exe", - "C_Cpp_Runner.cStandard": "gnu99", - "C_Cpp_Runner.cppStandard": "gnu++11", "C_Cpp_Runner.msvcBatchPath": "", + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", "C_Cpp_Runner.useMsvc": false, "C_Cpp_Runner.warnings": [ "-Wall", @@ -37,236 +37,7 @@ "C_Cpp_Runner.warningsAsError": false, "C_Cpp_Runner.compilerArgs": [], "C_Cpp_Runner.linkerArgs": [], - "C_Cpp_Runner.includePaths": [ - "D:/Git/cud-iot-v2/include", - "D:/Git/cud-iot-v2/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/newlib/platform_include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include/esp_additions/freertos", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/port/xtensa/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freertos/include/esp_additions", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include/soc", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/include/soc/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/port/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hw_support/port/esp32/private_include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/heap/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/log/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/include/apps", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/include/apps/sntp", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/lwip/src/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/port/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/lwip/port/esp32/include/arch", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/soc/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/hal/platform_port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/include/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rom/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_common/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/port/soc", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_system/port/public_compat", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/xtensa/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/xtensa/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/driver/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/driver/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_pm/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_ringbuf/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/efuse/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/efuse/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/vfs/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_wifi/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_event/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_netif/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_eth/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/tcpip_adapter/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_phy/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_phy/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_ipc/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/app_trace/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_timer/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/mbedtls/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mbedtls/esp_crt_bundle/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/app_update/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/spi_flash/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bootloader_support/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nvs_flash/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/pthread/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/xtensa", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_gdbstub/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espcoredump/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espcoredump/include/port/xtensa", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wpa_supplicant/esp_supplicant/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ieee802154/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/console", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/asio/asio/asio/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/asio/port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/osi/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/include/esp32/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/api/include/api", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/btc/profile/esp/blufi/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/common/btc/profile/esp/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/host/bluedroid/api/include/api", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_common/tinycrypt/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_core/storage", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/btc/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/common/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/client/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/mesh_models/server/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api/core/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api/models/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/bt/esp_ble_mesh/api", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/cbor/port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/unity/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/unity/unity/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/cmock/CMock/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/coap/port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/coap/libcoap/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nghttp/port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/nghttp/nghttp2/lib/includes", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-tls", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-tls/esp-tls-crypto", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_adc_cal/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_hid/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/tcp_transport/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_http_client/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_http_server/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_https_ota/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_https_server/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_lcd/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_lcd/interface", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protobuf-c/protobuf-c", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/common", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/security", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/protocomm/include/transports", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mdns/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_local_ctrl/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/sdmmc/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_serial_slave_link/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_websocket_client/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/expat/expat/expat/lib", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/expat/port/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wear_levelling/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/diskio", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/vfs", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fatfs/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/freemodbus/freemodbus/common/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/idf_test/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/idf_test/include/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/jsmn/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json/cJSON", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/libsodium/libsodium/src/libsodium/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/libsodium/port_include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/mqtt/esp-mqtt/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/openssl/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/perfmon/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/spiffs/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ulp/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/wifi_provisioning/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/rmaker_common/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_diagnostics/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/rtc_store/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_insights/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_parser/upstream/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_parser/upstream", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/json_generator/upstream", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_schedule/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp_secure_cert_mgr/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_rainmaker/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/gpio_button/button/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/qrcode/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/ws2812_led", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp_littlefs/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/tool", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/typedef", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/image", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/math", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/nn", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/layer", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/detect", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-dl/include/model_zoo", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-sr/src/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-sr/esp-tts/esp_tts_chinese/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp-sr/include/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32-camera/driver/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/esp32-camera/conversions/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/dotprod/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/support/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/hann/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman_harris/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/blackman_nuttall/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/nuttall/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/windows/flat_top/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/iir/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/fir/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/add/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/sub/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/mul/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/addc/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/mulc/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/math/sqrt/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/matrix/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/fft/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/dct/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/conv/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/common/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/kalman/ekf/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/espressif__esp-dsp/modules/kalman/ekf_imu13states/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/include/fb_gfx/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/tools/sdk/esp32/qio_qspi/include", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/cores/esp32", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/variants/wt32-eth01", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/Ethernet/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/FS/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdateServer/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/I2S/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/Insights/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/LittleFS/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/RainMaker/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/SD/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/USB/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/Update/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/WiFiProv/src", - "C:/Users/siwat/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src", - "" - ], + "C_Cpp_Runner.includePaths": [], "C_Cpp_Runner.includeSearch": [ "*", "**/*" @@ -284,57 +55,5 @@ "C_Cpp_Runner.useLeakSanitizer": false, "C_Cpp_Runner.showCompilationTime": false, "C_Cpp_Runner.useLinkTimeOptimization": false, - "C_Cpp_Runner.msvcSecureNoWarnings": false, - "files.associations": { - "random": "cpp", - "*.tcc": "cpp", - "array": "cpp", - "atomic": "cpp", - "bitset": "cpp", - "cctype": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdint": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "deque": "cpp", - "unordered_map": "cpp", - "unordered_set": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "map": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "numeric": "cpp", - "optional": "cpp", - "regex": "cpp", - "string": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "utility": "cpp", - "fstream": "cpp", - "initializer_list": "cpp", - "iomanip": "cpp", - "iosfwd": "cpp", - "istream": "cpp", - "limits": "cpp", - "new": "cpp", - "ostream": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "streambuf": "cpp", - "cinttypes": "cpp", - "typeinfo": "cpp" - } + "C_Cpp_Runner.msvcSecureNoWarnings": false } \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 6740886..166c6be 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@2.2.5 +lib_deps = siwats/ESPMegaPROR3@2.3.4 monitor_speed = 115200 build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 diff --git a/src/main.cpp b/src/main.cpp index 6370dac..3b9b207 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -193,6 +193,7 @@ void loop() if (millis() - last_pm_switch_update > 5000) { iseDisplay.updateAirPurifierState(); + last_pm_switch_update = millis(); } } From ee4126f0a0c62c0fa59b28a0c89daed365f60d91 Mon Sep 17 00:00:00 2001 From: reaw Date: Wed, 14 Feb 2024 05:46:34 +0700 Subject: [PATCH 10/22] update library; adjusted update behavior --- platformio.ini | 2 +- src/ise_display.cpp | 8 ++++++++ src/main.cpp | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 6740886..48333bf 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@2.2.5 +lib_deps = siwats/ESPMegaPROR3@^2.3.3 monitor_speed = 115200 build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 6b77596..2756d41 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -712,6 +712,14 @@ void ISEDisplay::updateAirPurifierStateStandby() void ISEDisplay::updateAirPurifierState() { + //check for page + if(currentPage != 2){ + return; + } + else if(currentPage ==1){ + updateAirPurifierStateStandby(); + return; + } // Get the state bool state = strcmp(pm_switch->getValue(), "on") == 0; ESP_LOGI("ISEDisplay", "Updating air purifier state to: %d", state); diff --git a/src/main.cpp b/src/main.cpp index 6370dac..22e0d94 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -190,9 +190,10 @@ void loop() } // Update the PM state every 1 seconds static uint32_t last_pm_switch_update = 0; - if (millis() - last_pm_switch_update > 5000) + if (millis() - last_pm_switch_update > 500) { iseDisplay.updateAirPurifierState(); + last_pm_switch_update = millis(); } } From 128a152968652519c86effc278ed6842bf76f131 Mon Sep 17 00:00:00 2001 From: reaw Date: Wed, 14 Feb 2024 05:51:02 +0700 Subject: [PATCH 11/22] adjust display variable and change standby behavior --- ise-display/ise-display-prod.HMI | Bin 37446253 -> 37446253 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ise-display/ise-display-prod.HMI b/ise-display/ise-display-prod.HMI index c7b0d8c691b9188fce140c1de61a1087d7918c7c..786086ce406c394e4460d4daebfc746f5bb953ae 100644 GIT binary patch delta 2865 zcmdVa_jgZs9LMqR_nT!T_Wn}TuDyw>Srt3AtN7Ygn^+|wyou2o{gSVkL0h9mG&Gbp zR6MrYh&N_09?|zqI6l#44_G zE@yIL5C4F`ypD2%yE*=G9K90hSWv{_aC)ONw69+2U%Lr8qa1PCb?lCHI8tIAyLG!9 zzGp7Zh1HC51ZvCaa3ns+kk{#~=nV|6RUUdnbmw zW5V4|~yCXe^J$@@OoN#`0(^k2@&-@_*ri zM2|aliq){17HYNZU8`;HSsklu^{l=%u!i=&HL?$^v4vR^YiiA`xwWvC*2==|Lu+kq ztgW@P_SV5V+DF#OKDN%*#k!iux>%Q`6Pw>I*eP%~Z40Z1tt`syS+|id8-}PsOSE zYJpm)7OBN*iHcWC)iSkQeWkuu->4O8rCOy{t8dkJYK>Z})~N)wUVX0;)dsau{h*T6 zCbe1psJ5uB>L>NHN>VP_^4yixXVRc0P zsg9~+>bN?gPO4Mtv^t~Cs&neRx}YwqOX{+^qOPiI>bkn2ZmL`Awn|lZ)LoUP?y39g zfqJMOsmJPxda9nO=jw%ess2*0)a&VCHJvjRxWEtmApim)2+~1%$N(837(yTuWQHt| z6|zBg$N@Pa7vzRKkQefS8}dT|cnbM4;`Q*d<31~W9STBpeuNw8+3;r&=Yz=Z|DP`KwtP2`aypf00UtV z42B^v6ox?r42Kag5=Oyj_zcFtScrru7zg7a8YaL*Fqj0BAqJ+vRG0?S;dA%`X249C z1+(Ex@WLFJ3$fsXc@PKlVF4_JMX(r_Ks+pkWw0E+g0JBlSOF_x6|9DD;X7CZYhfKE zzugdZRYHo<225w^fq_z8Z7WY`AVVF&DlU62C1;TQN7_P}2F4fer)_#F5^NAMV)z*Bez&*25UgumbwymspM=hDInF7N|?2!KEcf^?7`GC)QMh7iaE znIQ{gg=~-=azIYV1-T&)4n?n}URn28c@uO+jKH0U`T2m7nrg0V*&v##3ZNUaHqq;{SQFB(EpgtD}2$bgz!?)zQ5= zx>rZ{dWxjy{TDW5cs&Iv7G;gCi8Zxm*4!Sp7WRm>v{u&I+E`m_XYH+nb+k_QsCBk3 z*43h|o5fgn>tT=C8*O9kMH_1gHqKtM@it*|;>O^B78lkmUy*hse?oM>e80aQuh<~R zIZ`-Bm2{lLg>&h$cjlA9j+0P$Jubv?5)0>J74OWkp^kI8@QLkS)p3H|X)9xVO)}HV zB~C6{v6xmy42w$$jR=bjtJkzBU*iT33~e47*)%O;o3Byk*6ZuW`(>W1p6Dr+*4IBJ zJ#)|8Sqt51XLk7_GZzOY9(E^3H%?R&)yvAKCaEN4YO+pnp&h5t5?(#wNx!r%hd{%u2!m5>Q(icdR?tnZ>TkDty-tvRBx%b z)q1r-ZB(1oJ1RqMR`04UDpS3u-d7)}57k!nk@{F=scq^L^{LvfvQ>`Sp*~Zet1r}- zYNz^2?NVQ>-D;28tM;k=>VV2s2h|~USbd|uRY%l!>Ztl&9aBH3AJtFlXO*Y&)p2z~ zom8jPX>~^Zq6*Ym^{YCk&Z`URqPnCmt1IfNx~8tH-_-Bw4|PM`RJW!_H+Icd;08bN zhX4qKB5)TJg&-&f#i0b0gi=r%%0OAT8}5N%CP!vjzU!r(y&hq_P?A|Mj#Lj!mS8bTw8g4;Kz2~$&O2F>ANXaSEvOK1hH zp$)W!cF-O=Ku72Vk3whY0$m{*xAH1yI~LPg?+Fe4nQs(ghOx`zJYJy2z&=e;d?j+KfsUh z6Z{N$kPpY<1e}CZa2n3QFHity;a4~Z=ivfegiCN4uE15e2G`*?_#OU$8*meDx%B#T zYjA-Z{JOIKL1`!hW#MkP2ZEs-l!pos0{4OkDnccw3{@Z$ zszNoW4mF@A+z0nVEvO9-KphB!2O%8lLOqCpNT?4D;2~%TjUWnc-<&4yEWQ5Rm23YA D2QJFo From 974f7ac007a2d096723b9d978f95ab8577bfa917 Mon Sep 17 00:00:00 2001 From: reaw Date: Wed, 14 Feb 2024 05:56:44 +0700 Subject: [PATCH 12/22] update lib to 2.3.4 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 48333bf..c5035e5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.3.3 +lib_deps = siwats/ESPMegaPROR3@^2.3.4 monitor_speed = 115200 build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 From ea4974893ed9849605c7b575457b2c77a98a91bf Mon Sep 17 00:00:00 2001 From: reaw Date: Thu, 15 Feb 2024 00:23:20 +0700 Subject: [PATCH 13/22] change to callback --- .vscode/settings.json | 55 +++++++++++++++- src/ise_display.cpp | 2 +- src/main.cpp | 146 +++++++++++++++++++++++++++++++----------- src/main.hpp | 9 ++- 4 files changed, 170 insertions(+), 42 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d2e3661..9c61a6c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -55,5 +55,58 @@ "C_Cpp_Runner.useLeakSanitizer": false, "C_Cpp_Runner.showCompilationTime": false, "C_Cpp_Runner.useLinkTimeOptimization": false, - "C_Cpp_Runner.msvcSecureNoWarnings": false + "C_Cpp_Runner.msvcSecureNoWarnings": false, + "C_Cpp.errorSquiggles": "disabled", + "files.associations": { + "array": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "map": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "regex": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp" + } } \ No newline at end of file diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 2756d41..bdb03aa 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -717,7 +717,7 @@ void ISEDisplay::updateAirPurifierState() return; } else if(currentPage ==1){ - updateAirPurifierStateStandby(); + updateAirPurifierStateStandby(); return; } // Get the state diff --git a/src/main.cpp b/src/main.cpp index 22e0d94..7ffe910 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -100,6 +100,29 @@ void setup() climateCard.loadStateFromFRAM(); climateCard.setFRAMAutoSave(true); espmega.display->bindClimateCard(&climateCard); + // auto binded_display_update_on_pm25_out = std::bind(&display_update,0,std::placeholders::_1); + // auto binded_display_update_on_pm25_in = std::bind(&display_update,1,std::placeholders::_1); + // auto binded_display_update_on_temp_out = std::bind(&display_update,2,std::placeholders::_1); + // auto binded_display_update_on_weather = std::bind(&display_update,3,std::placeholders::_1); + // auto binded_display_update_on_pm_switch = std::bind(&display_update,4,std::placeholders::_1); + // auto binded_display_update_on_pm_fan_speed = std::bind(&display_update,5,std::placeholders::_1); + + // pm25_out.registerCallback(std::function(binded_display_update_on_pm25_out)); + // pm25_in.registerCallback(std::function(binded_display_update_on_pm25_in)); + // temp_out.registerCallback(std::function(binded_display_update_on_temp_out)); + // weather.registerCallback(std::function(binded_display_update_on_weather)); + // pm_switch.registerCallback(std::function(binded_display_update_on_pm_switch)); + // pm_fan_speed.registerCallback(std::function(binded_display_update_on_pm_fan_speed)); + + pm25_out.registerCallback(&pm25outupdatedisplay); + pm25_in.registerCallback(&pm25inupdatedisplay); + temp_out.registerCallback(&tempoutupdatedisplay); + weather.registerCallback(&weatherupdatedisplay); + pm_switch.registerCallback(&pmswitchupdatedisplay); + pm_fan_speed.registerCallback(&pmfanspeedupdatedisplay); + + + // placeholder // PM2.5 PPM Remote Variable // 12 bytes remote variable, 11 characters + null terminator @@ -128,6 +151,51 @@ void setup() } +// void update_display(uint8_t type, char *value){ +// switch (type) +// { +// case 0: +// iseDisplay.updatePMoutside(get_pm25_out()); +// break; +// case 1: +// iseDisplay.updatePMinside(get_pm25_in()); +// break; +// case 2: +// iseDisplay.updateTempOutside(get_temp_out()); +// break; +// case 3: +// iseDisplay.updateWeather(weather.getValue()); +// break; +// case 4: +// iseDisplay.updateAirPurifierState(); +// break; +// case 5: +// iseDisplay.updateAirPurifierState(); +// break; +// default: +// break; +// } +// } +void pm25outupdatedisplay(char* value){ + iseDisplay.updatePMoutside(get_pm25_out()); +} +void pm25inupdatedisplay(char* value){ + iseDisplay.updatePMinside(get_pm25_in()); +} +void tempoutupdatedisplay(char* value){ + iseDisplay.updateTempOutside(get_temp_out()); +} +void weatherupdatedisplay(char* value){ + iseDisplay.updateWeather(weather.getValue()); +} +void pmfanspeedupdatedisplay(char* value){ + iseDisplay.updateAirPurifierState(); +} +void pmswitchupdatedisplay(char* value){ + iseDisplay.updateAirPurifierState(); +} + + void loop() { espmega.loop(); @@ -155,46 +223,46 @@ void loop() iseDisplay.updateDateTimeText(time); last_time_updated = millis(); } - // Update the PM2.5 PPM value every 15 seconds - static uint32_t last_pm25_out_update = 0; - if (millis() - last_pm25_out_update > 15000) - { - uint16_t pm25_out_value = get_pm25_out(); - // ESP_LOGI("loopPM2.5","updating PM2.5 from MQTT inside loop: %d", pm25_out_value); - iseDisplay.updatePMoutside(pm25_out_value); - last_pm25_out_update = millis(); - } - // Update the PM2.5 PPM value every 15 seconds - static uint32_t last_pm25_in_update = 0; - if (millis() - last_pm25_in_update > 15000) - { - uint8_t pm25_in_value = get_pm25_in(); - iseDisplay.updatePMinside(pm25_in_value); - last_pm25_in_update = millis(); - } + // // Update the PM2.5 PPM value every 15 seconds + // static uint32_t last_pm25_out_update = 0; + // if (millis() - last_pm25_out_update > 15000) + // { + // uint16_t pm25_out_value = get_pm25_out(); + // // ESP_LOGI("loopPM2.5","updating PM2.5 from MQTT inside loop: %d", pm25_out_value); + // iseDisplay.updatePMoutside(pm25_out_value); + // last_pm25_out_update = millis(); + // } + // // Update the PM2.5 PPM value every 15 seconds + // static uint32_t last_pm25_in_update = 0; + // if (millis() - last_pm25_in_update > 15000) + // { + // uint8_t pm25_in_value = get_pm25_in(); + // iseDisplay.updatePMinside(pm25_in_value); + // last_pm25_in_update = millis(); + // } // Update the temperature value every 15 seconds - static uint32_t last_temp_out_update = 0; - if (millis() - last_temp_out_update > 15000) - { - float temp_out_value = get_temp_out(); - iseDisplay.updateTempOutside(temp_out_value); - last_temp_out_update = millis(); - } - // Update the weather value every 15 seconds - static uint32_t last_weather_update = 0; - if (millis() - last_weather_update > 15000) - { - char *weather_value = weather.getValue(); - iseDisplay.updateWeather(weather_value); - last_weather_update = millis(); - } - // Update the PM state every 1 seconds - static uint32_t last_pm_switch_update = 0; - if (millis() - last_pm_switch_update > 500) - { - iseDisplay.updateAirPurifierState(); - last_pm_switch_update = millis(); - } + // static uint32_t last_temp_out_update = 0; + // if (millis() - last_temp_out_update > 15000) + // { + // float temp_out_value = get_temp_out(); + // iseDisplay.updateTempOutside(temp_out_value); + // last_temp_out_update = millis(); + // } + // // Update the weather value every 15 seconds + // static uint32_t last_weather_update = 0; + // if (millis() - last_weather_update > 15000) + // { + // char *weather_value = weather.getValue(); + // iseDisplay.updateWeather(weather_value); + // last_weather_update = millis(); + // } + // // Update the PM state every 1 seconds + // static uint32_t last_pm_switch_update = 0; + // if (millis() - last_pm_switch_update > 500) + // { + // iseDisplay.updateAirPurifierState(); + // last_pm_switch_update = millis(); + // } } void on_pin_change(uint8_t pin, uint8_t value) diff --git a/src/main.hpp b/src/main.hpp index e98301f..61aa049 100644 --- a/src/main.hpp +++ b/src/main.hpp @@ -38,4 +38,11 @@ uint16_t get_pm25_out(); uint16_t get_pm25_in(); float get_temp_out(); void toggle_pm_switch(); -void set_pm_fanspeed(uint8_t speed); \ No newline at end of file +void set_pm_fanspeed(uint8_t speed); +void display_update(); +void pm25outupdatedisplay(char* value); +void pm25inupdatedisplay(char* value); +void tempoutupdatedisplay(char* value); +void weatherupdatedisplay(char* value); +void pmfanspeedupdatedisplay(char* value); +void pmswitchupdatedisplay(char* value); \ No newline at end of file From 269836331787c70cb58f8941698c788ebcbf95ef Mon Sep 17 00:00:00 2001 From: reaw Date: Thu, 15 Feb 2024 15:59:57 +0700 Subject: [PATCH 14/22] adjust light call function --- src/ise_display.cpp | 23 ++++++++++++++++------- src/ise_display.hpp | 1 + src/ise_display_definitions.hpp | 11 +++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/ise_display.cpp b/src/ise_display.cpp index bdb03aa..ffd32a9 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -40,10 +40,10 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar this->updateACState(); this->updateLightGroupStatePageDashboard(); - this->outputCard->setValue(1, 0); - this->outputCard->setValue(2, 0); - this->outputCard->setValue(3, 0); - this->outputCard->setValue(4, 0); + // this->outputCard->setValue(1, 0); + // this->outputCard->setValue(2, 0); + // this->outputCard->setValue(3, 0); + // this->outputCard->setValue(4, 0); this->climateCard->setTemperature(ac_temperature); this->climateCard->setFanSpeed(ac_fan_speed); this->climateCard->setMode(ac_mode); @@ -563,6 +563,14 @@ void ISEDisplay::setLightLevel(uint8_t row, uint8_t level) } } +u_int8_t ISEDisplay::getLightLevel(uint8_t row) +{ + u_int8_t lightLevel = 0; + lightLevel = this->outputCard->getValue(row); + return lightLevel; + +} + void ISEDisplay::updateLightGroupStatePageStandby() { // Calculate the state @@ -597,7 +605,7 @@ void ISEDisplay::updateLightGroupStatePageDashboard() for (uint8_t i = 1; i <= 4; i++) { - u_int8_t state = this->outputCard->getValue(i); + u_int8_t state = getLightLevel(i); switch (state) { case 0: @@ -641,7 +649,7 @@ bool ISEDisplay::calculateLightGroupState() bool lightOn = false; for (uint8_t i = 1; i <= 4; i++) { - if (this->outputCard->getValue(i) != 0) + if (getLightLevel(i) != 0) { lightOn = true; break; @@ -649,10 +657,11 @@ bool ISEDisplay::calculateLightGroupState() } return lightOn; } + void ISEDisplay::toggleLightIndividual(uint8_t row) { // Get the current state - uint8_t state = this->outputCard->getValue(row); + uint8_t state = getLightLevel(row); if (state != 0) { state = 0; diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 1dc9bfd..321bf41 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -42,6 +42,7 @@ class ISEDisplay : public ESPMegaDisplay { void setPMstate(bool is_pm_on, uint8_t pm_fan_speed); void setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_temperature); void setLightLevel(uint8_t row, uint8_t level); + u_int8_t getLightLevel(uint8_t row); DigitalInputCard* inputCard; DigitalOutputCard *outputCard; diff --git a/src/ise_display_definitions.hpp b/src/ise_display_definitions.hpp index 87af10d..6e1aa9b 100644 --- a/src/ise_display_definitions.hpp +++ b/src/ise_display_definitions.hpp @@ -11,6 +11,17 @@ tentetive pin mapping 4: row 4 (value from 0-3) +change light assignment +1: row 1 column 1 +2: row 1 column 2 +3: row 2 column 1 +4: row 2 column 2 +5: row 3 column 1 +6: row 3 column 2 +7: row 4 column 1 +8: row 4 column 2 + + 5: Air Purifier status (on/off) 6: Air Purifier fan speed (0-20) From a590c38dae6649f4bd22e2e0564cbf3a409660d6 Mon Sep 17 00:00:00 2001 From: reaw Date: Fri, 16 Feb 2024 00:21:33 +0700 Subject: [PATCH 15/22] light-not-work-as-expected --- src/ise_display.cpp | 84 ++++++++++++++++++++++++++++++--- src/ise_display.hpp | 12 ++++- src/ise_display_definitions.hpp | 10 ++++ src/main.cpp | 10 +++- 4 files changed, 108 insertions(+), 8 deletions(-) diff --git a/src/ise_display.cpp b/src/ise_display.cpp index ffd32a9..6ee33bb 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -1,6 +1,9 @@ #include -ISEDisplay::ISEDisplay(HardwareSerial *adapter) : ESPMegaDisplay(adapter, 115200, 912600, 4, 17) +ISEDisplay::ISEDisplay(HardwareSerial *adapter, const uint8_t *light_array, uint8_t row, uint8_t column) : ESPMegaDisplay(adapter, 115200, 912600, 4, 17) { + this->light_array = light_array; + this->row = row; + this->column = column; } // Work left // TODO : Implement @@ -556,21 +559,90 @@ void ISEDisplay::changeUserACmode() } void ISEDisplay::setLightLevel(uint8_t row, uint8_t level) { - for (uint8_t i = 1; i <= 4; i++) + // Set the light level + // this->outputCard->setValue(row, level); + uint8_t primary_pin = *(light_array + 2*(row - 1)); + uint8_t secondary_pin = *(light_array + 2*(row - 1) + 1); + + bool primary = false; + bool secondary = false; + + switch (level) { - if (row == i) - this->outputCard->setValue(row, level); + case 0: + primary = false; + secondary = false; + break; + case 1: + primary = false; + secondary = true; + break; + case 2: + primary = true; + secondary = false; + break; + case 3: + primary = true; + secondary = true; + break; + default: + break; } + + this->outputCard->setValue(primary_pin, primary); + this->outputCard->setValue(secondary_pin, secondary); } u_int8_t ISEDisplay::getLightLevel(uint8_t row) { u_int8_t lightLevel = 0; - lightLevel = this->outputCard->getValue(row); + + //lightLevel = this->outputCard->getValue(row); + uint8_t primary_pin = *(light_array + 2*(row - 1)); + uint8_t secondary_pin = *(light_array + 2*(row - 1) + 1); + bool primary = this->outputCard->getValue(primary_pin); + bool secondary = this->outputCard->getValue(secondary_pin); + if (primary && secondary) + { + lightLevel = 3; + } + else if (primary) + { + lightLevel = 2; + } + else if (secondary) + { + lightLevel = 1; + } + else + { + lightLevel = 0; + } + return lightLevel; - } +//change to light with the assignment + +lightPosition ISEDisplay::getRowCol(uint8_t pin){ + lightPosition position; + //uint8_t row = this->row; + //uint8_t column = this->column; + //const uint8_t *light_array = this->light_array; + // should return the row and column of the light from pin in a row by column array pointer pass from main using pointer arithmetic + for (uint8_t i = 0; i < row*column; i++) + { + uint8_t value = *(light_array + i); + if (value == pin) + { + position.row = i / column; + position.column = i % column; + return position; + } + } +} + + void ISEDisplay::updateLightGroupStatePageStandby() { // Calculate the state diff --git a/src/ise_display.hpp b/src/ise_display.hpp index 321bf41..3074d30 100644 --- a/src/ise_display.hpp +++ b/src/ise_display.hpp @@ -16,10 +16,14 @@ +struct lightPosition { + uint8_t row; + uint8_t column; +}; class ISEDisplay : public ESPMegaDisplay { public: - ISEDisplay(HardwareSerial* adapter); + ISEDisplay(HardwareSerial* adapter, const uint8_t *light_array, uint8_t row, uint8_t column); void begin(DigitalInputCard* inputCard, DigitalOutputCard* outputCard, ClimateCard* climateCard, RemoteVariable* pm_switch, RemoteVariable* pm_fan_speed); void updateLightGroupStatePageDashboard(); void updateLightGroupStatePageStandby(); @@ -43,10 +47,16 @@ class ISEDisplay : public ESPMegaDisplay { void setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_temperature); void setLightLevel(uint8_t row, uint8_t level); u_int8_t getLightLevel(uint8_t row); + lightPosition getRowCol(uint8_t pin); DigitalInputCard* inputCard; DigitalOutputCard *outputCard; ClimateCard *climateCard; + + const uint8_t *light_array; + uint8_t row; + uint8_t column; + RemoteVariable *pm_switch; RemoteVariable *remote_pm_fan_speed; uint8_t outputCallbackHandle; diff --git a/src/ise_display_definitions.hpp b/src/ise_display_definitions.hpp index 6e1aa9b..aae6adb 100644 --- a/src/ise_display_definitions.hpp +++ b/src/ise_display_definitions.hpp @@ -20,8 +20,18 @@ change light assignment 6: row 3 column 2 7: row 4 column 1 8: row 4 column 2 +*/ +#define LIGHT_ROW1_COLUMN1 1 +#define LIGHT_ROW1_COLUMN2 2 +#define LIGHT_ROW2_COLUMN1 3 +#define LIGHT_ROW2_COLUMN2 4 +#define LIGHT_ROW3_COLUMN1 5 +#define LIGHT_ROW3_COLUMN2 6 +#define LIGHT_ROW4_COLUMN1 7 +#define LIGHT_ROW4_COLUMN2 8 +/* 5: Air Purifier status (on/off) 6: Air Purifier fan speed (0-20) diff --git a/src/main.cpp b/src/main.cpp index 7ffe910..595a6dd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,14 @@ RemoteVariable pm_fan_speed = RemoteVariable(); const char *mode_names[] = {"off", "fan_only", "cool"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; +uint8_t row = 4; +uint8_t column = 2; +const uint8_t light_array[4][2] = { + {LIGHT_ROW1_COLUMN1, LIGHT_ROW1_COLUMN2}, + {LIGHT_ROW2_COLUMN1, LIGHT_ROW2_COLUMN2}, + {LIGHT_ROW3_COLUMN1, LIGHT_ROW3_COLUMN2}, + {LIGHT_ROW4_COLUMN1, LIGHT_ROW4_COLUMN2}}; + AirConditioner ac = { .max_temperature = 30, @@ -23,7 +31,7 @@ AirConditioner ac = { ***********************************************/ ESPMegaPRO espmega = ESPMegaPRO(); -ISEDisplay iseDisplay = ISEDisplay(&iseDisplayAdapter); +ISEDisplay iseDisplay = ISEDisplay(&iseDisplayAdapter, &light_array[0][0], row, column); ClimateCard climateCard = ClimateCard(AIR_CONDITIONER_IR_PIN, ac, AIR_CONDITIONER_SENSOR_TYPE, AIR_CONDITIONER_SENSOR_PIN, From 2689166f45ba1dd4ffa7f8f9cfb96eb93df345bb Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Fri, 16 Feb 2024 01:31:03 +0700 Subject: [PATCH 16/22] update core library --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index c5035e5..11ffeab 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,8 +12,8 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.3.4 +lib_deps = siwats/ESPMegaPROR3@^2.3.5 monitor_speed = 115200 -build_flags = -DCORE_DEBUG_LEVEL=5 +build_flags = -DCORE_DEBUG_LEVEL=0 upload_port = COM28 monitor_port = COM28 \ No newline at end of file From 59b6a10de874981ee87472c18211302c1cff0aed Mon Sep 17 00:00:00 2001 From: reaw Date: Fri, 16 Feb 2024 02:42:55 +0700 Subject: [PATCH 17/22] Last row no work --- platformio.ini | 2 +- src/ise_display.cpp | 24 ++++++------------------ src/ise_display_definitions.hpp | 16 ++++++++-------- 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/platformio.ini b/platformio.ini index 11ffeab..5c33311 100644 --- a/platformio.ini +++ b/platformio.ini @@ -14,6 +14,6 @@ board = wt32-eth01 framework = arduino lib_deps = siwats/ESPMegaPROR3@^2.3.5 monitor_speed = 115200 -build_flags = -DCORE_DEBUG_LEVEL=0 +build_flags = -DCORE_DEBUG_LEVEL=5 upload_port = COM28 monitor_port = COM28 \ No newline at end of file diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 6ee33bb..646c329 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -275,33 +275,21 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) uint8_t current_page = this->currentPage; if (current_page == PAGE_STANDBY) { - if (pin >= 1 && pin <= 4) + if ((pin >= 0 && pin <= 3) ||(pin >= 8 && pin <= 11)) { // Light updateLightGroupStatePageStandby(); // time_since_last_screen_update = millis(); // update time since last activity } - else if (pin == 5 || pin == 6) - { - // Air Purifier - updateAirPurifierStateStandby(); - // time_since_last_screen_update = millis(); // update time since last activity - } } else if (current_page == PAGE_DASHBOARD) { - if (pin >= 1 && pin <= 4) + if ((pin >= 0 && pin <= 3) ||(pin >= 8 && pin <= 11)) { // Light updateLightGroupStatePageDashboard(); // time_since_last_screen_update = millis(); // update time since last activity } - else if (pin == 5 || pin == 6) - { - // Air Purifier - updateAirPurifierState(); - // time_since_last_screen_update = millis(); // update time since last activity - } } else { @@ -589,8 +577,8 @@ void ISEDisplay::setLightLevel(uint8_t row, uint8_t level) break; } - this->outputCard->setValue(primary_pin, primary); - this->outputCard->setValue(secondary_pin, secondary); + this->outputCard->setState(primary_pin, primary); + this->outputCard->setState(secondary_pin, secondary); } u_int8_t ISEDisplay::getLightLevel(uint8_t row) @@ -600,8 +588,8 @@ u_int8_t ISEDisplay::getLightLevel(uint8_t row) //lightLevel = this->outputCard->getValue(row); uint8_t primary_pin = *(light_array + 2*(row - 1)); uint8_t secondary_pin = *(light_array + 2*(row - 1) + 1); - bool primary = this->outputCard->getValue(primary_pin); - bool secondary = this->outputCard->getValue(secondary_pin); + bool primary = this->outputCard->getState(primary_pin); + bool secondary = this->outputCard->getState(secondary_pin); if (primary && secondary) { lightLevel = 3; diff --git a/src/ise_display_definitions.hpp b/src/ise_display_definitions.hpp index aae6adb..6b45c45 100644 --- a/src/ise_display_definitions.hpp +++ b/src/ise_display_definitions.hpp @@ -22,14 +22,14 @@ change light assignment 8: row 4 column 2 */ -#define LIGHT_ROW1_COLUMN1 1 -#define LIGHT_ROW1_COLUMN2 2 -#define LIGHT_ROW2_COLUMN1 3 -#define LIGHT_ROW2_COLUMN2 4 -#define LIGHT_ROW3_COLUMN1 5 -#define LIGHT_ROW3_COLUMN2 6 -#define LIGHT_ROW4_COLUMN1 7 -#define LIGHT_ROW4_COLUMN2 8 +#define LIGHT_ROW1_COLUMN1 0 +#define LIGHT_ROW1_COLUMN2 1 +#define LIGHT_ROW2_COLUMN1 2 +#define LIGHT_ROW2_COLUMN2 3 +#define LIGHT_ROW3_COLUMN1 8 +#define LIGHT_ROW3_COLUMN2 9 +#define LIGHT_ROW4_COLUMN1 10 +#define LIGHT_ROW4_COLUMN2 11 /* 5: Air Purifier status (on/off) From b537d3921e742a37fc14f573d081bc95b7c8b191 Mon Sep 17 00:00:00 2001 From: reaw Date: Fri, 16 Feb 2024 12:20:38 +0700 Subject: [PATCH 18/22] corrected the AC mode oerder --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 595a6dd..99abf51 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,7 +7,7 @@ RemoteVariable weather = RemoteVariable(); RemoteVariable pm_switch = RemoteVariable(); RemoteVariable pm_fan_speed = RemoteVariable(); -const char *mode_names[] = {"off", "fan_only", "cool"}; +const char *mode_names[] = {"off", "cool", "fan_only"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; uint8_t row = 4; uint8_t column = 2; From 44687da028ac974dcca208457fee239b27327603 Mon Sep 17 00:00:00 2001 From: reaw Date: Fri, 16 Feb 2024 13:46:02 +0700 Subject: [PATCH 19/22] fix standby picture not toggling --- src/ise_display.cpp | 131 +++++++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 57 deletions(-) diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 646c329..fb762fc 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -782,38 +782,39 @@ void ISEDisplay::updateAirPurifierStateStandby() void ISEDisplay::updateAirPurifierState() { //check for page - if(currentPage != 2){ + if(currentPage != 1){ + // Get the state + bool state = strcmp(pm_switch->getValue(), "on") == 0; + ESP_LOGI("ISEDisplay", "Updating air purifier state to: %d", state); + pm_fan_speed = (int) atof(remote_pm_fan_speed->getValue()); + // Send the state to the display + this->takeSerialMutex(); + + this->displayAdapter->print("pm_sw.pic="); + this->displayAdapter->print(state ? COMPONENT_PM_TOGGLE_PIC_ON : COMPONENT_PM_TOGGLE_PIC_OFF); + this->sendStopBytes(); + + this->displayAdapter->print("pm_sw.pic2="); + this->displayAdapter->print(state ? COMPONENT_PM_TOGGLE_PIC_ON_PRESSED : COMPONENT_PM_TOGGLE_PIC_OFF_PRESSED); + this->sendStopBytes(); + + this->displayAdapter->print("pm_speed.val="); + this->displayAdapter->print(pm_fan_speed); + // this->displayAdapter->print("\""); + this->sendStopBytes(); + + this->displayAdapter->print("pm_speed.pco="); + this->displayAdapter->print(state ? 34486 : 33841); + this->sendStopBytes(); + + this->giveSerialMutex(); return; } - else if(currentPage ==1){ + + else if(currentPage == 1){ updateAirPurifierStateStandby(); return; } - // Get the state - bool state = strcmp(pm_switch->getValue(), "on") == 0; - ESP_LOGI("ISEDisplay", "Updating air purifier state to: %d", state); - pm_fan_speed = (int) atof(remote_pm_fan_speed->getValue()); - // Send the state to the display - this->takeSerialMutex(); - - this->displayAdapter->print("pm_sw.pic="); - this->displayAdapter->print(state ? COMPONENT_PM_TOGGLE_PIC_ON : COMPONENT_PM_TOGGLE_PIC_OFF); - this->sendStopBytes(); - - this->displayAdapter->print("pm_sw.pic2="); - this->displayAdapter->print(state ? COMPONENT_PM_TOGGLE_PIC_ON_PRESSED : COMPONENT_PM_TOGGLE_PIC_OFF_PRESSED); - this->sendStopBytes(); - - this->displayAdapter->print("pm_speed.val="); - this->displayAdapter->print(pm_fan_speed); - // this->displayAdapter->print("\""); - this->sendStopBytes(); - - this->displayAdapter->print("pm_speed.pco="); - this->displayAdapter->print(state ? 34486 : 33841); - this->sendStopBytes(); - - this->giveSerialMutex(); } void ISEDisplay::handleACChange(uint8_t mode, uint8_t fan_speed, uint8_t temperature) { @@ -898,48 +899,64 @@ void ISEDisplay::updateACState() // Get the state uint8_t mode = this->climateCard->getMode(); uint8_t temperature = this->climateCard->getTemperature(); + if(currentPage != 1){ + this->takeSerialMutex(); - this->takeSerialMutex(); + // Send the state to the display + if (mode == 0) + { + this->displayAdapter->print("ac_temp.pco="); + this->displayAdapter->print(33841); + this->sendStopBytes(); - // Send the state to the display - if (mode == 0) - { - this->displayAdapter->print("ac_temp.pco="); - this->displayAdapter->print(33841); + this->displayAdapter->print("ac_temp.pic="); + this->displayAdapter->print(COMPONENT_AC_STATUS_OFF); + this->sendStopBytes(); + } + else + { + this->displayAdapter->print("ac_temp.pco="); + this->displayAdapter->print(34486); + this->sendStopBytes(); + + this->displayAdapter->print("ac_temp.pic="); + this->displayAdapter->print(COMPONENT_AC_STATUS_ON); + this->sendStopBytes(); + + user_mode = mode; + } + this->displayAdapter->print("ac_sw.pic="); + this->displayAdapter->print(mode != 0 ? COMPONENT_AC_TOGGLE_PIC_ON : COMPONENT_AC_TOGGLE_PIC_OFF); + this->sendStopBytes(); + this->displayAdapter->print("ac_sw.pic2="); + this->displayAdapter->print(mode != 0 ? COMPONENT_AC_TOGGLE_PIC_ON_PRESSED : COMPONENT_AC_TOGGLE_PIC_OFF_PRESSED); this->sendStopBytes(); - this->displayAdapter->print("ac_temp.pic="); - this->displayAdapter->print(COMPONENT_AC_STATUS_OFF); + updateuserACmode(); + + updateACfanSpeed(); + + this->displayAdapter->print("ac_temp.val="); + this->displayAdapter->print(temperature); + // this->displayAdapter->print("\""); this->sendStopBytes(); + this->giveSerialMutex(); } - else + else if (currentPage == 1) { - this->displayAdapter->print("ac_temp.pco="); - this->displayAdapter->print(34486); + this->takeSerialMutex(); + + this->displayAdapter->print("s_ac_toggle.pic="); + this->displayAdapter->print(mode != 0 ? COMPONENT_STANDBY_AC_PIC_ON : COMPONENT_STANDBY_AC_PIC_OFF); this->sendStopBytes(); - this->displayAdapter->print("ac_temp.pic="); - this->displayAdapter->print(COMPONENT_AC_STATUS_ON); + this->displayAdapter->print("s_ac_toggle.pic2="); + this->displayAdapter->print(mode != 0 ? COMPONENT_STANDBY_AC_PIC_ON_PRESSED : COMPONENT_STANDBY_AC_PIC_OFF_PRESSED); this->sendStopBytes(); - user_mode = mode; + this->giveSerialMutex(); } - this->displayAdapter->print("ac_sw.pic="); - this->displayAdapter->print(mode != 0 ? COMPONENT_AC_TOGGLE_PIC_ON : COMPONENT_AC_TOGGLE_PIC_OFF); - this->sendStopBytes(); - this->displayAdapter->print("ac_sw.pic2="); - this->displayAdapter->print(mode != 0 ? COMPONENT_AC_TOGGLE_PIC_ON_PRESSED : COMPONENT_AC_TOGGLE_PIC_OFF_PRESSED); - this->sendStopBytes(); + - updateuserACmode(); - - updateACfanSpeed(); - - this->displayAdapter->print("ac_temp.val="); - this->displayAdapter->print(temperature); - // this->displayAdapter->print("\""); - this->sendStopBytes(); - - this->giveSerialMutex(); ESP_LOGI("ISEDisplay", "display AC state updated"); } From 68dac6a4d03129a8fc5b81830916e07240cda07b Mon Sep 17 00:00:00 2001 From: reaw Date: Sat, 17 Feb 2024 00:41:19 +0700 Subject: [PATCH 20/22] add IR code --- platformio.ini | 8 +-- src/IRcode.txt | 128 ++++++++++++++++++++++++++++++++++++ src/ir_codes.cpp | 155 +++++++++++++++++++++++--------------------- src/ir_codes.hpp | 6 +- src/ise_display.cpp | 59 ++++++++++------- src/main.cpp | 2 + 6 files changed, 254 insertions(+), 104 deletions(-) create mode 100644 src/IRcode.txt diff --git a/platformio.ini b/platformio.ini index 5c33311..b8ee1dc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,8 +12,8 @@ platform = espressif32 board = wt32-eth01 framework = arduino -lib_deps = siwats/ESPMegaPROR3@^2.3.5 +lib_deps = siwats/ESPMegaPROR3@^2.3.6 monitor_speed = 115200 -build_flags = -DCORE_DEBUG_LEVEL=5 -upload_port = COM28 -monitor_port = COM28 \ No newline at end of file +build_flags = -DCORE_DEBUG_LEVEL=0 +upload_port = COM32 +monitor_port = COM32 \ No newline at end of file diff --git a/src/IRcode.txt b/src/IRcode.txt new file mode 100644 index 0000000..f7aa5aa --- /dev/null +++ b/src/IRcode.txt @@ -0,0 +1,128 @@ +//dry +{5043,2130,381,1770,406,670,406,671,406,669,380,1771,381,695,407,669,406,670,407,669,380,1771,381,695,380,1771,381,1771,406,669,407,1745,380,1772,379,1772,380,1771,381,1771,406,670,380,1772,380,695,380,696,380,696,406,669,381,695,406,670,380,1771,381,695,406,670,380,1772,406,669,381,695,380,696,406,1745,380,696,380,696,405,670,407,670,406,669,380,696,407,669,380,695,381,695,380,695,381,695,381,695,380,696,407,669,380,1771,406,1745,408,1744,380,696,380,696,406,1745,381,695,380,29382,5043,2130,380,1771,407,669,380,695,407,669,381,1771,406,670,406,670,380,695,408,668,406,1745,407,669,380,1772,380,1772,406,669,406,1745,380,1772,405,1746,392,1759,407,1746,406,669,380,1772,379,696,380,696,379,697,380,696,405,670,380,696,405,1746,380,696,406,670,406,1746,379,696,406,670,404,672,405,671,406,669,380,696,379,697,379,696,406,670,379,1773,379,1772,406,670,404,672,379,696,406,1746,406,670,405,670,380,696,379,696,405,672,405,670,380,696,406,670,406,670,378,698,404,1747,405,671,404,672,378,697,405,1747,406,1745,379,1772,380,698,402,672,379,696,379,698,379,696,406,670,379,697,405,670,405,671,406,670,379,697,404,671,405,672,405,670,407,669,405,671,404,671,404,672,405,671,404,671,406,670,404,672,379,696,406,670,379,697,379,1773,378,1773,378,1773,378,1774,379,697,403,673,403,672,377,699,406,669,378,698,378,698,378,697,377,699,405,671,405,671,404,671,378,698,377,699,378,697,379,697,405,671,405,1747,406,669,379,697,405,671,405,671,378,697,405,671,405,671,378,697,405,671,405,671,382,694,379,697,406,669,380,696,378,701,375,698,380,696,406,669,379,696,380,697,404,672,405,671,378,697,405,671,378,698,377,698,379,1772,407,669,380,1772,404,1747,405,671,380,696,379,697,379,696,407} + +//fan_only auto +{5069,2104,406,1746,407,668,408,669,405,670,407,1745,407,668,381,695,381,695,406,670,380,1772,379,696,406,1745,381,1771,380,696,380,1772,379,1772,381,1770,406,1746,407,1745,380,696,406,1745,381,695,380,696,380,696,406,669,407,669,380,696,406,1746,402,673,380,696,406,1746,380,695,407,669,380,696,406,1745,406,670,407,670,379,696,406,670,380,695,407,669,406,669,408,669,406,670,380,695,380,696,407,669,380,695,405,671,407,1745,406,1746,379,1772,380,696,406,670,379,1772,380,696,380,29383,5068,2105,380,1771,407,669,380,696,406,669,380,1772,380,696,380,696,380,695,381,695,380,1771,381,696,380,1771,406,1745,381,695,381,1771,405,1747,379,1772,405,1747,380,1771,395,681,406,1745,381,695,407,669,407,669,380,696,379,696,407,669,380,1771,407,669,406,670,380,1772,406,669,381,695,406,670,380,695,381,695,407,669,407,669,380,696,406,670,380,1771,406,1746,405,670,381,696,405,670,405,1747,380,1771,406,669,408,669,407,668,407,669,380,696,380,696,380,695,380,696,381,695,380,1771,407,669,381,696,406,669,406,670,380,695,381,695,407,669,406,669,381,696,405,670,381,695,380,696,380,696,407,669,405,670,407,669,383,693,407,669,379,696,380,696,406,670,406,669,407,669,381,695,407,669,405,670,380,696,381,696,404,670,381,696,380,695,381,1771,406,1745,381,1770,408,1745,380,695,381,695,380,696,380,696,407,669,406,670,380,695,380,696,380,696,405,671,380,695,407,669,380,695,381,695,381,695,380,696,380,696,406,1745,407,669,380,696,380,696,406,669,381,695,380,696,380,695,406,670,406,670,406,670,380,696,405,670,381,695,380,696,380,696,407,669,380,695,406,670,407,669,407,669,380,695,381,696,406,669,407,669,380,696,380,695,406,1746,406,670,406,1745,406,1745,407,1745,381,695,381,1771,380,1771,407}, //AUTO +{5043,2130,380,1772,380,696,380,696,379,697,379,1771,381,695,381,696,379,696,406,670,380,1771,381,696,379,1771,381,1771,380,696,380,1771,381,1771,380,1772,380,1772,380,1771,380,696,380,1771,381,694,381,696,380,696,380,695,381,695,380,696,380,1772,380,695,380,697,379,1772,380,695,381,695,381,695,380,1772,380,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,695,381,696,380,696,380,696,379,695,381,695,381,1771,380,1771,381,1771,380,697,379,696,380,1771,381,694,381,29382,5044,2130,380,1771,380,697,379,696,380,696,380,1770,381,696,436,640,380,696,380,696,380,1770,381,695,407,1746,379,1771,381,696,380,1771,380,1772,380,1770,381,1772,380,1772,380,696,380,1771,380,696,380,696,380,696,380,697,378,695,381,696,380,1772,379,697,379,696,380,1772,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,695,381,695,380,1771,381,1772,380,695,380,696,380,696,380,1772,379,1772,380,696,380,696,380,696,379,696,380,696,380,696,380,696,379,696,381,695,380,1771,381,695,380,696,380,696,380,695,381,695,381,695,380,696,380,696,380,695,381,695,380,695,381,696,380,696,380,695,381,696,379,697,379,696,380,696,380,695,380,696,380,697,379,696,380,695,380,696,380,697,379,696,380,696,380,695,381,696,379,695,381,696,380,1771,380,1772,380,1772,379,1772,380,1772,380,696,379,1772,380,696,380,696,380,696,379,696,409,667,380,695,381,695,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,406,669,381,695,380,696,380,695,381,696,380,696,379,696,380,696,380,696,379,696,406,671,379,696,405,671,380,696,380,695,380,696,380,697,379,696,380,695,380,696,380,696,380,696,380,696,379,697,407,1743,407,669,380,1772,407,1744,409,668,405,1746,406,670,380,695,380}, //HIGH +{5069,2105,405,1746,381,695,380,695,381,696,407,1745,379,696,380,696,380,696,380,696,380,1771,380,697,379,1771,406,1745,407,669,381,1771,380,1772,405,1746,380,1772,380,1772,379,696,380,1772,379,696,407,669,380,695,381,696,380,696,379,696,380,1771,381,696,380,695,380,1772,380,696,380,695,405,672,379,1771,381,695,380,695,407,670,380,696,404,670,381,696,380,696,380,697,404,670,406,670,380,696,406,669,381,696,380,695,380,1771,381,1772,379,1771,381,695,381,695,407,1744,381,695,381,29381,5069,2104,380,1772,380,696,406,670,380,696,379,1772,380,695,406,670,380,696,380,696,380,1772,406,668,406,1746,381,1771,380,696,380,1772,379,1772,380,1771,381,1771,406,1746,406,670,379,1772,380,695,407,669,380,696,380,696,380,696,405,671,379,1772,380,696,380,696,406,1745,380,696,405,671,404,671,380,696,380,696,405,671,380,695,407,669,380,696,380,1771,380,1772,380,695,381,694,407,670,380,1771,381,1771,380,696,406,669,407,669,406,670,380,696,380,696,380,695,406,671,406,669,380,1771,380,696,380,696,380,696,406,670,405,671,379,697,379,697,379,695,406,670,407,669,380,696,380,696,379,696,380,696,380,695,381,695,407,670,379,696,380,696,406,669,406,670,380,696,380,696,380,696,380,695,406,671,405,670,406,669,381,696,379,697,405,670,405,1747,379,1772,405,1746,406,1746,380,1771,395,1757,380,696,380,697,379,695,407,669,380,696,405,671,380,695,380,696,380,696,406,670,406,670,405,670,380,696,408,668,404,671,381,1771,380,697,394,680,380,696,406,670,380,696,380,696,407,668,407,669,380,696,380,695,380,696,380,696,405,671,380,695,381,696,406,669,380,697,379,696,379,696,380,696,380,697,379,696,406,669,408,668,380,695,381,695,380,1772,380,696,380,1772,379,1772,406,670,405,670,381,695,380,696,380}, //MID +{5039,2131,406,1745,380,696,379,697,378,698,378,1772,380,697,379,697,379,696,379,697,404,1748,378,698,379,1771,380,1772,379,698,378,1772,380,1772,379,1773,379,1772,383,1768,380,697,379,1772,379,697,379,696,380,697,379,696,406,671,378,696,380,1773,378,697,379,698,378,1772,379,698,379,696,379,697,379,1772,380,696,379,697,379,697,406,669,380,696,379,697,379,696,380,696,380,696,379,697,379,697,379,696,379,697,380,696,379,1773,379,1772,379,1772,406,670,405,671,379,1772,380,696,380,29382,5043,2130,379,1773,405,670,380,695,381,696,379,1772,379,697,380,696,379,697,379,697,379,1772,405,671,379,1772,380,1771,380,697,379,1772,380,1772,379,1773,379,1772,379,1773,379,696,405,1746,382,694,380,696,379,696,380,696,380,696,380,695,381,1772,379,696,380,696,379,1773,379,696,380,696,380,696,405,671,379,696,380,696,380,696,406,671,378,697,379,1772,380,1772,379,696,380,696,380,696,405,1746,380,1772,379,697,379,697,379,697,379,696,380,696,379,697,379,697,379,696,380,696,379,1773,379,696,379,698,378,696,406,671,379,696,380,696,379,697,379,697,405,670,380,696,379,697,379,697,379,697,406,670,404,671,379,697,378,697,380,696,379,697,379,697,379,696,380,697,379,696,380,696,379,697,379,695,380,697,405,671,379,696,380,696,379,697,379,1773,379,1772,379,1772,380,1772,379,1773,379,696,380,696,379,697,379,697,379,696,380,696,405,671,379,697,379,696,380,696,379,697,379,697,404,672,379,696,379,698,379,696,379,1772,380,696,380,696,379,698,404,670,380,696,379,696,380,697,379,696,379,697,379,697,380,696,379,696,380,697,405,670,405,671,379,697,379,696,380,696,379,696,380,697,378,698,379,697,378,697,379,697,379,696,405,671,379,1772,380,697,379,1772,379,1772,380,696,380,1771,380,1772,379,1773,379} //LOW + + + +//cool auto + +{5043,2131,404,1747,379,697,379,697,379,695,407,1746,379,698,378,697,379,697,379,696,406,1745,380,697,380,1772,379,1772,379,697,379,1773,379,1772,379,1773,379,1772,406,1746,379,697,379,1772,380,695,381,696,405,670,406,671,379,696,380,697,379,1772,405,671,379,696,380,1771,407,670,379,696,380,696,380,1772,405,670,405,672,379,697,379,695,380,697,379,697,379,696,380,696,379,697,380,696,379,696,380,696,380,696,380,696,380,1772,379,1772,380,1772,379,696,380,697,379,1772,379,697,379,29383,5043,2130,380,1772,380,696,405,671,379,697,405,1746,380,696,380,696,405,670,406,670,380,1772,380,696,405,1746,405,1747,405,671,379,1773,405,1746,379,1773,379,1773,379,1773,379,695,380,1772,407,669,379,697,379,696,407,670,379,696,380,696,379,1773,405,671,379,695,380,1773,379,697,405,670,380,696,380,696,405,671,379,697,379,697,379,696,380,696,379,1772,380,1772,379,696,405,671,380,1772,406,1746,380,1772,379,696,380,696,379,697,379,697,379,696,380,696,380,695,381,695,380,697,405,1746,380,696,379,697,406,670,379,697,378,1773,379,697,405,670,380,696,380,696,380,696,380,696,379,696,380,696,380,696,380,695,380,696,380,696,380,697,379,696,405,670,406,671,382,693,405,671,380,695,408,1748,401,1747,379,1773,379,696,406,670,380,695,381,697,378,1773,405,1746,379,1772,380,1772,380,696,379,696,380,697,379,697,379,696,380,697,405,670,379,696,380,696,380,697,379,696,379,697,405,671,379,696,380,696,381,695,379,697,379,1772,380,696,379,696,380,697,379,696,380,696,380,696,405,670,380,697,379,697,379,696,380,696,380,695,380,696,380,697,404,671,406,671,378,697,379,696,380,696,380,696,380,696,379,697,406,669,407,669,380,696,380,696,404,1748,379,1772,380,697,378,1773,379,1772,380,697,378,696,380,696,380}, //16C +{5043,2130,405,1747,380,696,380,696,406,670,384,1767,380,696,380,695,380,702,374,697,405,1746,407,669,405,1747,406,1745,380,696,379,1773,379,1772,380,1772,379,1772,380,1772,379,697,379,1772,380,696,406,670,405,671,406,670,379,696,406,671,379,1771,406,670,380,697,406,1745,405,671,379,697,379,696,405,1747,380,696,380,696,379,696,406,670,380,696,380,696,379,697,380,695,380,696,380,696,379,697,379,697,379,696,380,696,405,1746,406,1746,380,1772,405,671,379,696,382,1770,380,696,379,29384,5042,2130,380,1772,407,670,406,669,380,696,379,1773,379,697,406,669,380,695,381,695,385,1767,406,670,380,1777,402,1744,407,669,380,1772,379,1772,401,1750,381,1771,380,1772,406,670,380,1771,380,697,379,696,406,670,379,697,379,696,380,696,405,1747,406,670,379,696,406,1746,380,696,379,697,379,696,380,696,380,696,380,695,381,695,407,669,380,696,380,1771,380,1772,380,696,380,696,379,1772,380,1772,380,1772,379,697,379,697,404,672,378,696,380,697,405,670,380,696,380,696,379,697,380,1771,380,697,381,694,380,696,380,695,380,1775,377,696,379,696,380,696,380,696,380,696,380,696,406,669,380,697,379,696,408,668,404,672,379,697,406,669,380,695,381,696,380,695,405,672,379,696,380,696,380,696,406,669,381,696,379,1772,380,696,379,697,405,670,406,1746,380,1771,406,1746,380,1771,380,696,380,697,379,696,380,696,379,697,380,695,380,697,379,696,406,670,379,697,379,696,380,696,406,670,380,696,379,697,379,697,379,697,379,1771,380,696,380,696,380,697,379,696,380,696,379,697,379,696,380,696,405,671,379,696,380,696,407,670,405,670,407,669,379,697,405,670,380,696,380,696,405,670,381,696,379,696,380,696,380,696,405,670,406,670,380,696,380,1771,381,696,379,1771,381,1772,409,1743,379,696,380,696,406,670,379}, //17C +{5069,2104,407,1745,380,696,380,696,380,695,380,1772,380,696,380,696,379,696,380,696,380,1772,380,696,379,1772,380,1771,381,696,405,1746,380,1771,381,1771,380,1772,380,1771,380,696,380,1772,380,695,406,670,408,668,380,696,380,695,380,697,406,1745,380,696,380,696,379,1772,407,669,405,671,380,695,406,1746,380,696,405,671,380,695,380,697,380,695,380,695,381,696,379,696,380,696,380,696,406,670,380,696,388,687,380,696,380,1771,381,1771,380,1772,380,696,379,697,405,1746,380,696,380,29361,5064,2130,406,1746,380,696,379,697,405,670,380,1772,380,695,380,696,380,696,380,696,380,1771,380,696,380,1771,381,1771,380,696,406,1745,381,1771,380,1771,381,1771,380,1772,380,696,406,1745,407,669,381,694,381,696,380,695,406,670,380,696,405,1746,380,696,380,696,407,1745,407,669,405,671,379,696,380,695,381,696,380,695,380,696,380,696,406,670,406,1745,380,1772,405,671,379,696,380,1771,381,1772,380,1771,380,696,406,670,384,691,381,695,380,696,380,696,380,695,381,696,379,696,380,1772,406,669,407,669,380,696,380,696,380,1772,406,669,407,669,407,669,380,696,405,671,405,670,380,696,380,696,380,695,408,668,406,669,381,695,380,697,379,696,380,696,407,669,405,671,380,695,408,668,405,1746,381,695,380,695,381,1772,380,696,406,669,380,696,380,1771,406,1746,380,1771,381,1771,406,670,380,696,406,670,405,671,380,695,381,695,407,669,379,697,405,670,380,696,406,670,380,696,407,668,380,696,407,669,405,671,405,670,381,1771,407,673,376,696,380,695,381,695,406,670,380,696,407,669,405,670,381,695,406,670,405,671,406,670,407,668,407,669,380,696,406,670,405,671,380,695,406,670,380,696,405,670,381,696,406,668,407,670,380,695,381,695,380,1772,380,1771,408,1744,407,1745,380,1771,380,696,380,696,380,695,407}, //18C +{5069,2105,380,1771,380,696,406,670,379,697,404,1747,380,696,407,669,380,696,406,670,379,1772,380,696,406,1745,380,1772,406,670,406,1745,406,1746,406,1746,379,1773,379,1772,380,696,379,1773,404,671,380,696,386,690,405,670,405,672,404,671,379,1773,379,696,407,670,379,1771,406,671,406,669,406,670,380,1773,378,696,380,696,380,696,379,697,380,696,379,696,405,670,406,671,379,697,379,696,380,696,380,696,406,670,379,696,380,1772,380,1772,380,1771,380,696,380,695,380,1773,379,697,379,29360,5065,2130,380,1773,379,697,379,697,379,696,379,1771,381,696,380,696,405,672,378,697,379,1772,379,697,379,1772,380,1772,405,672,378,1772,380,1772,380,1771,380,1772,380,1772,379,696,407,1745,380,696,380,697,404,670,380,696,380,697,379,696,379,1773,378,697,380,697,378,1772,407,670,379,697,379,697,378,697,379,697,404,672,381,694,380,696,405,670,380,1775,377,1771,380,697,379,696,380,1772,405,1746,380,1772,380,696,379,697,404,672,379,697,405,671,379,696,379,697,379,696,380,697,379,1772,379,697,379,696,380,697,406,668,380,1772,380,697,379,696,380,696,379,697,379,696,380,697,378,697,380,696,379,696,380,697,379,696,379,697,380,696,379,698,378,697,378,697,380,695,380,696,380,697,379,696,379,1773,379,697,379,1772,379,697,379,697,379,697,379,1772,379,1773,379,1773,379,1772,379,697,379,697,404,672,405,670,379,697,379,697,379,697,378,697,406,670,379,696,380,696,380,696,380,696,379,696,380,696,406,670,379,697,379,1773,379,697,404,672,378,697,379,697,379,697,379,696,380,695,380,696,380,697,379,697,379,695,380,696,380,696,380,697,380,695,379,696,380,697,379,697,379,696,380,696,379,697,379,697,379,696,380,696,407,669,379,697,379,1772,380,696,379,696,383,693,380,695,381,1772,380,695,406,670,380}, //19C +{5087,2108,380,1772,406,670,379,696,380,696,380,1772,379,697,379,697,379,696,407,669,379,1772,380,697,379,1773,378,1772,380,696,380,1771,380,1772,380,1772,379,1772,407,1745,380,695,380,1773,379,696,380,696,379,697,379,696,406,671,379,696,407,1745,405,671,379,697,379,1772,379,697,379,696,380,697,379,1772,379,697,379,697,379,697,378,697,379,697,379,696,379,696,381,696,379,697,406,669,380,697,379,697,382,693,380,695,380,1773,378,1773,379,1772,380,696,406,671,378,1772,380,697,379,29360,5065,2130,380,1773,379,696,405,670,380,697,379,1772,380,696,380,695,380,697,379,696,406,1747,378,697,379,1773,378,1773,379,697,379,1772,405,1747,379,1772,380,1772,379,1773,379,696,380,1772,379,697,378,697,406,670,379,697,379,696,380,696,380,1771,380,696,380,696,380,1772,380,696,379,697,379,696,380,696,380,696,379,697,379,697,379,697,379,696,379,1773,379,1773,404,671,379,697,379,1772,405,1747,380,1771,380,696,380,697,384,692,378,697,379,697,379,697,379,696,379,697,379,697,379,1772,379,697,379,697,379,696,380,696,380,1772,379,696,380,696,380,697,378,697,379,697,379,697,379,697,378,697,405,671,379,698,378,697,379,696,379,696,380,697,379,697,379,696,379,697,379,697,379,697,379,1772,379,1773,379,697,404,1747,379,697,379,696,379,698,404,1747,379,1773,378,1772,380,1773,379,697,433,643,379,696,379,697,379,696,380,696,379,696,380,697,379,697,379,696,379,697,405,671,379,696,380,697,383,693,404,671,379,697,379,1777,375,697,378,697,405,671,379,697,379,697,403,672,379,696,380,697,379,696,379,697,379,697,379,697,379,697,379,696,406,670,379,697,379,696,380,697,378,698,379,696,379,697,379,697,379,697,378,697,379,697,379,696,380,1772,379,1773,379,697,378,697,379,697,379,1772,380,697,379,696,380}, //20C +{5043,2130,407,1745,407,669,379,696,381,695,405,1747,380,695,406,670,406,670,380,696,406,1745,380,697,405,1745,406,1746,406,670,406,1746,405,1746,406,1745,407,1745,407,1745,390,686,380,1772,405,670,406,670,380,695,380,696,380,697,405,670,406,1745,408,668,405,670,407,1745,393,683,406,670,380,696,406,1745,380,696,406,670,405,670,381,696,379,696,380,696,406,669,408,669,406,670,379,696,380,697,379,696,406,670,405,670,384,1768,406,1746,380,1770,407,670,405,670,406,1746,380,696,405,29336,5064,2130,380,1772,406,670,405,671,395,680,380,1772,406,670,380,696,380,696,379,696,380,1772,405,671,406,1746,379,1772,379,696,380,1771,381,1772,405,1746,380,1771,380,1772,380,697,405,1745,380,696,380,696,380,696,380,696,407,669,379,696,380,1771,381,695,380,696,380,1771,380,696,380,697,379,696,380,696,405,671,379,697,379,696,380,696,406,669,380,1772,406,1746,382,694,405,671,379,1772,380,1771,381,1771,380,697,405,669,381,695,405,672,405,671,379,696,405,671,405,670,380,696,380,1771,381,696,379,695,381,696,380,695,380,1773,405,670,380,696,406,669,407,670,379,696,380,696,380,696,380,696,379,696,380,696,380,697,405,670,406,669,406,671,379,695,381,696,380,696,379,697,379,696,380,696,380,695,380,1771,381,1771,406,671,379,696,380,696,380,1771,380,1772,380,1771,380,1772,380,696,405,670,381,696,405,670,380,697,406,669,380,695,381,695,380,697,379,696,380,696,379,697,379,697,406,669,407,668,381,696,405,670,380,1772,380,696,380,696,379,697,405,670,380,696,379,697,379,696,380,696,380,696,380,696,404,672,379,697,406,669,380,695,407,670,379,696,406,670,380,695,381,696,384,692,404,671,407,669,380,695,406,671,405,670,380,696,380,1771,380,696,407,1745,380,696,379,697,405,1746,380,696,407,669,405}, //21C +{5042,2131,379,1773,378,699,377,697,402,674,379,1773,381,694,379,698,378,697,379,697,379,1772,406,670,379,1772,379,1773,379,697,379,1772,379,1773,378,1774,378,1774,378,1772,380,697,378,1773,379,698,378,697,379,697,379,697,378,698,405,670,379,1772,379,698,378,697,379,1773,378,698,378,697,379,697,379,1773,405,670,379,697,379,697,379,697,379,697,378,697,379,697,379,697,405,670,380,697,378,697,379,696,380,697,378,698,378,1774,378,1772,405,1748,378,697,379,697,378,1773,380,697,378,29362,5090,2103,381,1771,380,696,380,696,384,691,381,1771,380,696,405,671,380,696,379,696,380,1772,384,691,381,1771,406,1745,407,669,406,1746,407,1744,407,1745,406,1746,406,1745,406,669,407,1745,407,670,404,671,407,669,405,670,381,695,406,670,406,1746,405,670,380,696,380,1772,380,695,407,669,406,670,406,670,405,671,406,669,406,670,384,692,380,695,381,1770,406,1746,380,696,380,697,406,1744,407,1745,406,1746,406,670,379,696,398,678,379,698,377,698,378,697,379,697,378,698,378,698,377,1774,377,699,351,726,349,726,350,726,349,1802,349,728,348,731,344,728,348,728,347,729,371,704,372,705,372,702,373,704,373,702,373,703,373,702,374,702,373,703,373,703,374,701,374,703,373,702,373,703,373,1778,374,702,373,1778,373,1779,373,703,372,704,371,706,369,1781,371,1780,347,1805,347,1804,347,730,346,729,347,729,347,731,345,728,348,728,347,729,347,729,347,728,373,703,373,703,373,703,374,701,374,702,374,702,375,701,375,700,376,1776,376,700,376,699,377,699,377,699,377,698,378,698,377,698,384,693,377,698,378,697,405,671,389,692,374,697,404,672,404,671,404,672,404,672,403,673,403,672,378,698,404,672,403,673,403,673,377,698,403,673,403,673,403,1748,403,1749,402,1749,377,699,402,674,377,1775,401,675,376,699,376}, //22C +{5043,2131,379,1772,380,697,379,697,378,697,379,1772,380,697,378,697,379,697,379,697,379,1772,379,697,379,1772,380,1772,379,698,378,1772,406,1746,379,1772,380,1772,379,1772,380,697,379,1772,379,698,378,698,378,697,379,697,379,696,379,697,379,1772,380,696,380,697,382,1768,380,697,379,696,379,697,379,1772,380,696,406,670,380,695,380,697,379,696,380,696,379,696,380,697,379,696,379,696,381,696,379,697,379,697,379,696,379,1772,380,1773,379,1773,404,671,379,697,379,1773,378,696,380,29382,5043,2131,404,1748,379,696,380,697,379,696,405,1746,380,696,379,697,379,697,379,697,379,1772,379,697,379,1772,380,1772,379,697,379,1772,380,1772,379,1773,379,1772,379,1772,380,696,380,1772,379,697,379,696,380,697,379,697,379,695,380,697,379,1771,381,696,406,669,380,1772,379,698,378,697,379,697,379,697,379,696,379,697,379,697,379,696,380,695,380,1773,379,1771,381,695,381,696,379,1772,380,1772,379,1773,378,697,380,697,378,697,379,696,380,697,379,696,379,697,379,697,379,697,379,1772,379,697,379,697,379,697,379,697,378,1773,379,696,379,697,406,671,378,697,379,697,379,696,380,697,378,697,379,697,379,697,379,696,379,697,379,696,380,696,380,697,378,698,378,697,379,696,380,696,380,696,380,1772,379,1773,379,1773,404,671,379,696,380,697,378,1773,379,1772,380,1772,379,1772,380,695,381,696,405,671,379,697,379,696,380,696,380,696,379,697,379,696,379,697,379,698,378,697,378,697,380,697,378,697,379,697,379,697,379,1772,379,698,378,697,379,697,378,698,379,696,379,698,378,697,379,696,406,671,379,697,378,697,379,697,379,697,379,696,379,696,380,697,379,697,378,697,379,696,380,697,379,696,380,696,380,696,379,697,380,696,379,697,379,1771,380,696,380,697,379,1772,379,697,379,1772,407,670,379,696,405}, //23C +{5034,2137,375,1778,398,679,397,677,373,703,373,1780,373,703,371,703,372,706,397,705,345,1779,373,705,369,1807,344,1781,399,678,370,1781,397,1754,371,1781,380,1770,372,1808,344,706,370,1780,371,707,368,733,343,733,371,678,371,703,372,732,370,1781,370,705,346,731,369,1759,368,731,370,706,344,732,344,1808,343,732,344,707,394,707,345,731,370,680,396,705,344,732,343,706,370,733,370,679,370,706,370,733,343,731,345,731,371,1781,344,1808,342,1783,394,709,342,733,343,1808,344,732,344,29393,5032,2140,397,1781,343,709,368,732,342,734,341,1810,343,733,341,735,343,733,367,710,340,1839,311,735,344,1781,369,1810,342,733,370,1783,365,1785,343,1811,341,1809,336,1789,368,735,341,1809,342,734,341,737,367,708,368,708,341,735,342,732,369,1784,341,734,340,736,342,1810,339,737,368,706,343,734,342,732,342,735,343,733,342,734,340,735,342,735,342,1808,343,1808,370,710,341,704,372,1807,342,1810,371,1780,345,704,371,732,343,733,344,731,345,731,342,734,371,677,372,731,343,733,370,1754,398,679,371,703,372,704,372,704,373,1778,372,703,374,703,399,676,373,704,397,678,372,703,403,673,374,702,400,675,399,677,400,676,400,675,399,677,401,675,427,649,374,701,401,675,401,674,402,675,402,1750,401,1750,401,1751,404,1747,403,674,401,673,376,700,402,1750,401,1750,375,1777,375,1777,374,701,375,701,403,673,402,673,402,674,404,672,376,700,403,673,403,672,403,673,405,671,403,672,406,670,377,699,376,699,404,672,377,699,433,1719,404,672,403,673,375,700,404,672,404,672,406,670,402,673,405,671,405,671,403,672,433,643,430,647,402,673,406,669,406,671,404,671,406,670,406,670,404,671,379,698,433,642,403,673,402,674,377,698,378,698,404,672,403,1748,406,1746,403,673,406,1745,377,700,377,1774,406,670,377,698,405}, //24C +{5069,2103,406,1746,406,669,407,669,407,669,380,1772,407,668,381,696,380,695,380,696,380,1771,406,670,381,1771,406,1745,380,696,385,1767,380,1771,381,1771,406,1745,381,1771,407,669,406,1745,380,696,406,670,380,696,406,670,406,670,381,694,407,1745,400,676,405,671,405,1746,380,696,380,695,407,670,379,1772,407,668,381,696,379,696,407,670,406,669,380,696,380,696,406,672,402,671,384,692,407,669,382,694,405,670,406,669,407,1745,406,1746,380,1772,405,670,406,670,380,1772,380,695,380,29383,5043,2130,407,1744,406,671,379,696,407,668,381,1772,380,696,379,697,406,669,380,696,380,1772,405,670,406,1746,405,1747,379,697,404,1746,406,1746,380,1772,380,1771,380,1772,380,696,380,1771,406,671,405,671,379,695,380,697,379,697,405,670,380,1772,379,696,380,697,404,1747,380,695,380,696,406,670,380,696,405,671,407,669,405,670,380,695,380,696,380,1772,405,1747,405,671,406,669,380,1772,406,1750,375,1772,406,670,405,670,380,696,406,670,380,696,380,695,380,697,379,696,380,696,406,1746,405,670,407,670,379,696,406,669,380,1772,380,696,406,671,404,670,380,696,380,696,380,696,386,690,379,696,407,670,405,670,380,695,406,670,380,696,396,680,380,696,380,696,405,671,405,670,380,696,380,696,405,670,380,696,380,696,380,1771,380,696,380,696,405,1747,379,1772,380,1771,407,1745,380,696,380,696,380,696,407,668,407,669,380,696,406,670,405,670,380,696,380,696,380,696,406,673,402,670,380,696,405,671,406,670,380,695,380,1772,406,670,405,671,380,695,380,696,380,696,405,671,379,697,407,668,380,696,393,683,380,695,380,697,379,696,380,696,380,696,379,697,379,696,380,696,380,695,380,697,379,696,380,696,380,696,379,697,379,696,380,696,380,1772,380,695,406,1746,380,1771,380,697,379,1772,380,696,379,697,379}, //2C5C +{5043,2131,380,1772,379,696,380,696,379,698,378,1772,380,696,380,696,379,697,379,696,380,1772,379,697,379,1773,379,1772,380,696,379,1772,388,1763,381,1771,380,1772,379,1773,379,697,379,1772,379,697,405,670,380,696,380,696,405,671,380,696,383,1768,380,696,380,696,379,1772,380,696,379,697,379,697,379,1772,407,669,380,696,379,696,380,696,407,670,378,697,379,697,380,695,379,697,379,697,379,697,405,671,379,697,379,696,379,1773,379,1772,379,1773,379,696,380,697,379,1772,379,697,379,29383,5043,2130,380,1771,380,696,379,697,379,697,379,1772,380,696,379,697,380,696,379,697,379,1772,379,696,380,1772,380,1772,379,697,379,1772,379,1773,380,1771,380,1772,380,1771,381,695,379,1772,406,670,380,696,380,695,380,697,379,697,379,697,403,1748,379,697,380,696,406,1745,378,698,380,696,379,696,380,697,404,670,381,696,379,697,379,696,380,696,379,1772,380,1772,380,696,379,697,379,1772,407,1745,380,1771,380,696,406,669,407,669,381,695,380,695,381,696,405,671,379,696,380,696,406,1746,380,695,406,671,379,695,381,695,381,1771,381,695,380,695,380,697,380,695,380,696,380,696,380,695,381,695,380,696,380,696,406,670,380,695,407,669,381,695,402,674,380,696,406,669,381,696,405,670,380,1771,406,669,382,695,406,670,380,1771,381,695,380,695,407,1745,380,1771,407,1745,406,1746,380,695,381,695,406,670,406,669,381,696,406,669,380,696,407,669,406,669,407,669,406,670,407,669,405,670,381,695,406,670,407,669,406,670,406,1745,406,670,379,697,380,695,381,695,406,670,380,696,393,682,380,696,380,696,380,696,380,696,404,671,380,696,382,694,379,697,379,696,380,696,405,671,379,697,379,696,380,696,379,697,378,698,377,699,378,698,377,699,376,1775,350,1802,350,1801,350,1801,350,726,349,1803,349,727,374,702,372}, //26C +{5039,2132,379,1772,379,697,379,696,379,697,379,1772,379,697,379,697,379,696,380,696,379,1773,379,697,379,1772,379,1772,380,697,379,1772,379,1773,379,1772,379,1773,379,1772,380,696,380,1772,379,696,380,696,380,696,380,696,380,696,379,696,380,1772,379,697,379,697,379,1772,380,696,379,697,379,697,379,1772,380,696,379,696,380,696,379,697,380,695,380,696,380,696,379,696,380,696,380,696,380,695,381,696,379,696,380,696,379,1772,380,1771,380,1772,380,696,379,697,379,1772,379,697,379,29381,5042,2131,379,1773,378,697,433,643,432,644,378,1773,432,644,433,642,434,643,431,644,379,1772,435,641,433,1719,432,1719,433,643,434,1717,433,1719,433,1718,379,1773,433,1718,378,698,378,1773,379,698,432,644,431,644,432,644,433,643,433,642,433,1718,432,644,432,644,432,1719,433,643,433,643,432,644,434,642,433,642,432,644,434,642,431,645,433,643,401,1749,434,1718,432,644,430,646,432,1719,378,1773,432,1720,433,642,432,644,433,643,433,643,432,644,433,643,431,644,378,698,432,644,432,1719,432,643,462,614,379,697,433,643,433,1718,434,642,378,698,433,643,432,643,433,643,433,643,432,644,431,644,433,643,433,643,378,698,431,645,433,642,378,698,432,644,432,643,432,645,432,643,433,642,404,673,432,1719,433,643,432,643,432,1719,434,643,432,644,432,1719,378,1773,379,1773,378,1773,379,697,433,643,434,642,431,644,432,644,433,643,433,642,430,646,379,697,432,644,432,643,434,642,433,643,432,644,432,643,434,642,431,644,433,1719,433,643,378,699,431,644,432,643,433,644,429,645,434,642,432,644,433,643,433,643,431,645,434,641,432,644,431,645,378,698,432,643,433,642,434,642,433,643,379,697,433,642,434,643,432,643,432,644,431,645,431,645,431,1720,432,643,433,643,433,643,431,1720,379,1773,433,643,431,645,430}, //27C +{5043,2130,405,1746,381,695,380,696,380,696,380,1771,380,697,379,696,380,696,380,695,380,1772,380,696,405,1747,379,1772,380,695,381,1771,406,1745,381,1772,379,1772,380,1771,380,697,379,1772,380,695,381,696,379,696,409,668,379,696,380,695,407,1745,405,672,379,696,380,1771,380,696,380,696,380,695,381,1771,380,697,404,671,380,696,380,695,380,696,380,695,381,696,380,696,379,696,380,696,380,695,381,695,380,697,379,696,380,1771,381,1771,380,1772,379,697,379,696,380,1771,381,696,405,29356,5044,2130,380,1771,381,695,380,695,381,696,380,1772,405,670,380,695,381,696,379,696,380,1771,435,642,380,1771,380,1772,380,696,379,1772,380,1771,381,1772,404,1746,381,1772,380,696,379,1772,380,696,380,696,379,696,380,695,381,696,380,695,381,1771,380,696,380,695,406,1745,381,696,380,695,381,696,379,696,380,696,380,696,380,696,379,697,379,695,381,1772,380,1771,380,696,380,696,380,1772,379,1772,380,1771,380,697,379,696,380,695,381,695,406,670,407,669,380,696,380,696,380,695,380,1772,380,695,381,696,379,697,379,696,380,1772,380,696,380,695,380,696,380,697,379,695,380,697,379,696,380,695,408,669,380,696,379,696,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,380,1771,381,1771,380,697,379,696,380,1771,380,696,406,670,380,1771,380,1772,380,1772,380,1771,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,695,380,696,380,696,380,696,380,695,381,696,379,696,380,696,380,696,380,695,380,1771,381,696,406,669,380,697,379,696,380,696,380,695,381,696,379,696,380,696,407,669,380,696,380,695,380,696,405,671,380,696,435,640,380,695,381,696,380,695,380,696,380,696,380,696,406,669,381,695,380,697,379,696,380,1771,380,1772,380,696,432,644,380,1770,381,1771,381,694,381,696,380}, //28C +{5070,2104,407,1745,379,696,379,697,379,697,378,1774,378,698,378,696,407,671,377,697,434,1719,378,697,379,1773,379,1772,378,698,379,1773,378,1773,379,1772,379,1773,379,1772,379,698,378,1773,379,697,379,697,378,698,378,697,379,697,379,697,378,1773,380,696,378,699,378,1772,379,697,379,697,379,697,379,1772,379,697,379,697,378,697,379,698,378,697,378,698,378,697,379,697,379,697,379,697,379,696,380,697,379,697,378,696,380,1772,380,1772,405,1746,406,670,380,696,380,1772,406,669,380,29383,5042,2131,379,1772,380,696,405,671,380,695,381,1771,380,696,380,696,379,696,406,670,380,1772,405,670,381,1771,406,1746,380,695,380,1772,380,1772,405,1746,380,1771,380,1772,380,695,381,1771,380,697,378,697,380,696,379,696,381,696,379,696,380,1771,381,696,379,696,380,1772,379,697,379,696,380,696,406,670,380,696,379,696,380,696,380,696,379,697,406,1745,380,1771,380,697,379,700,376,1772,380,1771,380,1772,406,670,380,696,379,696,380,696,380,696,406,669,381,696,379,696,407,669,380,1771,381,695,380,696,379,697,380,696,379,1772,380,696,380,696,380,696,379,696,380,696,380,696,380,696,380,695,380,696,380,696,380,695,380,697,379,696,380,696,380,696,380,696,379,696,380,696,380,696,380,696,380,696,379,1772,380,695,380,1772,380,696,380,696,379,1772,380,1772,380,1772,379,1772,380,696,405,671,405,670,406,670,380,696,380,696,379,699,404,669,380,695,380,697,380,695,381,695,407,670,379,696,379,696,380,696,380,696,380,1772,379,697,379,696,380,696,380,696,380,695,407,670,379,697,379,696,380,696,380,696,379,696,380,696,380,696,379,696,380,697,379,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,381,695,380,696,380,696,379,1772,380,696,380,1771,380,697,379,1772,380,1771,380,697,379,696,380}, //29C +{5042,2131,384,1768,405,670,380,695,381,696,380,1771,380,696,406,669,380,697,405,670,406,1745,406,671,379,1771,381,1772,380,696,380,1770,407,1745,407,1745,406,1746,380,1771,407,669,380,1772,380,696,405,670,383,693,380,696,405,670,406,670,406,1746,380,696,405,671,379,1771,407,670,407,669,405,670,380,1771,381,696,380,695,380,696,380,695,381,696,406,670,379,696,380,695,381,696,380,696,405,670,405,672,379,696,380,696,405,1746,380,1772,379,1773,379,697,379,696,406,1746,405,671,406,29355,5044,2129,381,1771,406,670,405,671,380,695,380,1771,381,695,381,695,380,697,388,687,380,1771,381,696,379,1771,381,1771,380,696,380,1772,380,1771,380,1772,380,1771,406,1746,407,669,380,1772,380,696,379,697,379,696,380,696,379,696,407,669,380,1772,403,672,380,696,380,1771,380,695,407,670,380,696,380,696,405,670,381,696,379,696,382,694,405,671,406,1745,380,1772,405,670,381,695,407,1745,406,1746,405,1745,381,696,380,696,379,697,380,695,406,670,380,695,406,670,380,696,380,696,380,1772,379,697,379,696,407,669,380,696,379,1772,380,696,380,696,380,695,406,670,380,695,381,695,381,696,379,697,406,669,380,696,407,669,379,696,380,696,380,696,380,695,406,671,379,697,383,691,381,696,380,1771,380,697,379,1772,384,692,406,1744,381,695,408,668,380,1772,405,1746,381,1771,380,1772,379,697,379,697,379,697,379,696,380,696,379,696,380,696,380,696,380,695,407,669,380,697,406,670,379,696,405,671,379,696,380,696,380,697,379,1772,405,671,406,669,380,696,380,695,381,695,380,696,380,696,380,696,380,695,380,696,380,696,380,696,379,696,380,697,379,696,380,696,380,696,379,695,381,696,380,696,380,696,407,669,379,696,380,696,380,696,380,696,407,1744,380,1772,380,1772,379,696,405,1746,380,1772,405,672,379,700,375}, //30C +{5043,2131,379,1772,380,696,379,697,406,670,379,1773,379,696,379,696,380,696,380,696,380,1771,380,697,379,1771,381,1771,380,696,380,1772,405,1746,380,1771,407,1746,381,1770,406,670,379,1772,406,670,380,696,380,696,379,697,379,696,380,697,405,1746,379,697,379,697,404,1747,379,697,379,697,379,696,380,1772,379,697,379,697,405,669,381,696,379,697,379,697,379,696,380,696,380,695,380,697,379,697,405,670,380,696,379,697,379,1772,380,1772,379,1772,380,696,379,698,378,1773,379,697,378,29383,5042,2131,380,1771,380,697,379,696,380,696,380,1772,379,696,380,696,403,674,378,697,379,1772,380,696,380,1772,379,1773,379,696,380,1772,379,1773,379,1772,379,1772,380,1773,378,696,380,1772,380,697,378,696,406,671,379,696,380,696,380,695,380,1772,380,696,380,696,380,1771,405,671,380,696,380,696,405,671,379,696,405,671,380,696,379,697,379,697,379,1773,379,1772,381,695,379,696,406,1746,379,1772,380,1772,379,697,379,696,380,697,378,697,379,696,380,696,380,696,379,696,407,669,405,1747,380,696,380,696,379,696,380,697,379,1772,407,668,404,672,380,696,380,696,380,696,379,697,379,697,379,697,379,696,379,696,380,697,379,697,379,697,378,697,379,697,379,696,405,672,378,697,379,697,406,670,379,1771,380,1773,405,671,379,1772,379,697,379,696,380,1773,378,1773,379,1772,379,1773,379,696,380,696,380,696,379,697,380,695,380,696,395,681,379,697,379,698,378,697,379,696,379,697,380,696,379,696,380,696,406,670,379,697,379,1772,406,670,379,697,379,697,379,696,379,697,380,695,380,697,379,696,380,695,381,696,405,671,379,696,380,696,380,695,380,697,379,696,380,696,380,696,380,696,379,696,380,696,379,697,380,696,379,696,380,696,380,696,380,1772,379,696,380,696,380,1772,379,1773,405,1746,379,696,380,696,380}, //31C +{5043,2131,379,1772,380,696,405,671,405,670,380,1772,380,696,379,697,405,670,380,696,407,1744,380,697,379,1772,406,1746,406,669,405,1747,405,1746,407,1745,380,1771,407,1744,381,696,380,1772,379,697,379,695,408,669,406,669,380,696,380,696,380,1772,380,695,380,696,380,1772,405,670,380,696,380,696,380,1771,406,671,405,670,406,670,380,696,405,670,406,670,407,669,380,696,405,671,379,697,405,670,380,696,380,696,404,672,379,1772,406,1745,406,1746,406,671,404,671,406,1745,407,669,405,29356,5044,2130,380,1771,407,670,405,670,380,696,380,1772,380,696,379,696,407,670,379,695,381,1772,380,695,406,1746,406,1745,380,696,380,1771,407,1745,380,1772,380,1771,406,1746,405,671,380,1771,406,670,409,667,380,695,380,696,380,697,379,696,380,1771,380,697,379,696,380,1772,380,696,379,697,379,697,379,696,380,695,406,670,406,670,380,696,406,669,381,1771,380,1772,379,697,405,670,407,1745,380,1771,406,1746,380,696,379,696,407,670,379,695,381,695,380,697,379,697,379,696,380,696,405,1747,406,669,380,696,380,696,405,670,380,1771,381,696,380,696,405,670,380,697,379,697,379,696,388,688,379,696,380,696,380,695,381,696,379,696,405,672,406,668,407,670,379,696,380,696,408,667,381,696,405,1746,406,1745,406,1747,379,696,380,1772,379,697,405,670,380,1772,405,1746,380,1771,381,1771,406,671,379,696,380,696,379,696,380,696,380,696,405,671,379,697,379,697,379,696,380,696,380,696,379,696,380,696,380,697,379,696,379,697,406,1745,380,696,380,696,380,695,380,697,379,696,380,696,405,670,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,696,379,697,379,696,380,695,381,695,380,697,405,669,381,696,380,696,379,696,380,696,380,696,380,1772,379,1773,379,695,389,1764,405,1746,406,1745,407,670,379,696,380} //32C + + + +//cool low + +{5070,2104,380,1771,380,695,407,670,380,696,380,1772,406,668,381,696,380,696,380,695,380,1772,405,670,381,1772,379,1772,407,669,406,1745,380,1772,380,1771,380,1772,380,1771,406,671,406,1745,380,695,407,670,379,696,380,696,406,670,380,695,407,1745,405,671,380,695,407,1744,381,696,380,696,406,670,380,1771,380,696,405,671,405,671,405,670,380,696,380,696,380,696,406,670,405,670,405,671,405,671,379,696,380,696,380,696,380,1771,407,1745,407,1745,405,670,407,669,380,1771,408,668,381,29359,5066,2130,380,1771,380,697,378,696,381,696,380,1771,380,696,379,696,381,696,379,696,380,1772,405,671,379,1772,406,1746,380,696,407,1744,380,1772,379,1772,380,1772,379,1772,380,696,380,1772,379,697,379,696,379,697,380,696,379,697,405,670,380,1771,380,697,379,696,380,1772,380,696,379,696,380,696,379,697,406,670,379,697,405,670,380,696,380,697,379,1772,379,1773,379,696,379,697,379,1772,406,1746,405,1746,380,695,381,696,406,669,380,696,380,695,384,692,381,696,379,696,405,671,406,1746,379,696,380,696,406,670,380,697,405,1746,379,695,381,696,379,697,379,696,380,696,380,696,379,697,405,670,380,697,379,696,380,696,379,697,379,696,406,670,380,696,380,696,379,696,405,671,405,671,379,1772,406,1746,380,1771,406,670,380,696,406,670,379,696,380,1771,381,1772,406,1745,406,1746,406,1745,380,696,380,697,379,696,379,697,379,697,379,696,380,697,379,695,380,697,406,670,379,696,379,697,379,695,381,696,405,671,379,697,379,1773,379,697,379,696,380,695,407,669,380,697,379,696,380,696,379,696,380,697,379,696,380,695,381,696,379,696,380,696,380,696,380,696,379,696,380,696,380,696,405,671,380,695,380,696,380,696,379,696,380,695,381,696,380,1772,379,1772,380,696,407,1745,379,697,386,1765,380,696,379,696,380}, //16C +{5043,2131,379,1773,379,696,380,695,381,696,379,1771,381,696,380,696,379,696,380,696,380,1772,380,696,379,1772,380,1772,379,697,379,1772,380,1772,379,1772,380,1771,380,1772,405,671,380,1771,406,670,380,697,379,696,380,696,379,697,379,697,379,1773,379,696,379,696,380,1772,379,697,379,697,405,670,379,1773,379,697,378,698,379,696,380,695,380,697,379,696,380,696,380,696,380,696,379,696,380,696,380,696,379,697,379,696,380,1772,379,1772,380,1772,380,696,380,696,379,1772,406,671,378,29383,5043,2130,380,1772,379,697,379,696,380,697,379,1771,380,696,380,697,379,696,379,697,379,1772,380,695,381,1772,379,1773,379,697,378,1772,380,1772,380,1771,380,1772,379,1772,380,696,380,1772,405,671,380,696,379,697,379,696,404,672,380,694,381,1772,380,696,380,695,381,1771,380,696,380,697,378,696,380,697,379,696,380,696,379,696,380,697,379,696,406,1745,380,1772,380,696,380,696,379,1772,380,1772,380,1771,380,695,381,696,380,696,379,697,379,697,379,696,380,695,381,696,379,697,379,1771,380,696,405,671,380,696,380,696,380,1771,406,671,379,695,381,696,379,696,380,696,380,696,380,696,380,696,379,696,380,696,380,696,379,698,378,697,379,696,380,696,380,696,405,670,380,696,380,696,380,696,379,697,379,697,405,1746,380,695,380,697,379,697,379,1771,380,1772,380,1772,379,1773,386,1765,405,671,379,697,379,696,380,696,380,696,379,697,379,696,380,696,380,696,379,697,405,671,379,696,380,696,379,697,379,696,406,670,379,1773,379,697,379,697,379,697,379,696,380,696,379,697,379,696,405,672,378,697,406,670,379,695,381,696,380,696,380,695,380,697,406,669,380,696,380,695,380,697,379,697,378,696,381,695,406,670,380,696,380,696,380,696,380,1771,406,670,405,1746,380,1772,380,696,382,1769,380,696,406,670,380}, //17C +{5043,2131,379,1773,379,697,379,696,405,672,378,1773,405,671,379,696,380,696,379,696,380,1772,380,697,379,1771,380,1773,379,696,379,1772,380,1772,380,1772,379,1772,380,1771,380,697,379,1772,380,696,379,697,379,697,379,696,379,697,379,697,379,1772,379,696,380,696,380,1773,378,697,379,696,380,697,379,1772,380,695,380,697,379,697,379,696,380,696,379,697,379,697,379,697,378,697,379,696,380,697,379,696,380,697,379,696,379,1772,405,1748,380,1771,379,697,378,697,380,1771,380,697,379,29382,5043,2130,380,1773,378,697,379,697,404,670,380,1773,379,696,406,671,378,697,379,697,379,1772,380,696,379,1773,379,1773,379,696,380,1771,380,1773,378,1773,379,1772,405,1746,380,696,379,1774,379,695,380,696,380,696,380,696,379,698,378,696,380,1773,379,697,378,696,406,1746,380,696,380,696,379,697,379,697,379,697,379,696,379,697,379,696,380,696,379,1773,379,1774,378,696,379,697,379,1772,379,1774,378,1773,379,697,379,696,379,697,379,696,380,697,379,696,379,697,379,697,378,697,380,1772,379,697,379,696,380,696,379,698,378,1773,406,670,378,697,379,697,379,697,378,697,380,696,379,697,405,670,380,696,379,697,380,696,379,696,380,697,379,697,378,697,379,697,379,697,379,695,380,698,378,1773,379,696,380,696,379,1773,379,697,379,696,380,697,378,1772,380,1772,379,1772,379,1773,380,1772,378,698,379,696,380,696,379,697,379,696,380,697,379,696,379,697,379,697,379,696,406,670,379,696,380,697,405,671,378,697,379,696,380,1772,379,697,384,692,379,697,379,696,380,697,378,702,374,697,379,697,379,696,379,698,378,696,380,697,379,696,379,697,380,695,379,698,379,697,379,696,380,695,380,697,379,697,378,698,378,697,379,697,379,697,378,697,379,1773,379,1772,379,1773,379,1772,379,697,380,1771,380,697,379,697,378}, //18C +{5068,2105,381,1770,381,695,406,670,410,666,380,1771,407,669,380,696,407,669,404,672,380,1771,380,696,379,1772,406,1745,408,669,380,1771,380,1771,381,1771,406,1746,407,1744,405,672,379,1772,405,670,407,670,379,696,407,669,380,696,380,695,406,1746,406,670,380,695,381,1771,405,670,381,695,407,669,380,1772,380,696,380,696,407,668,406,670,380,696,405,670,380,697,406,669,380,696,406,670,380,695,405,671,407,669,380,696,401,1750,380,1771,407,1745,380,696,380,696,380,1771,380,696,380,29382,5043,2131,405,1745,408,669,380,695,380,696,380,1772,380,695,380,696,406,670,380,695,381,1772,405,670,380,1771,380,1772,380,695,381,1771,407,1745,380,1771,407,1745,380,1771,380,696,381,1771,379,697,380,695,380,696,380,696,380,696,379,696,381,1771,380,696,379,696,406,1746,406,670,379,697,380,696,379,696,407,669,406,670,382,693,405,671,380,696,380,1775,376,1772,407,669,406,669,381,1771,380,1772,405,1746,380,696,406,670,380,696,380,695,380,696,405,671,380,696,406,669,380,696,407,1744,380,696,380,696,380,695,409,668,380,1771,406,670,406,670,380,696,380,695,407,669,380,695,381,695,406,670,406,670,405,671,407,669,405,671,379,696,380,696,380,696,379,697,406,669,380,696,380,696,380,696,406,1744,407,670,380,1771,406,671,379,696,406,670,406,1745,380,1771,406,1746,407,1745,380,1771,381,698,377,696,380,695,380,696,381,696,379,696,380,696,380,696,406,669,380,696,380,696,380,696,380,696,379,696,407,668,381,696,380,1771,380,695,380,697,405,670,380,697,379,696,380,696,380,696,379,697,379,695,381,696,380,695,408,668,380,696,380,696,380,695,406,670,380,696,380,696,380,695,380,696,407,669,407,669,380,695,407,669,380,696,406,670,380,1771,406,670,380,695,407,670,380,1771,406,1745,381,695,381,695,380}, //19C +{5069,2104,380,1772,380,695,405,671,380,696,380,1771,380,696,380,696,406,670,380,695,406,1746,380,696,406,1745,407,1744,406,671,405,1746,406,1745,407,1745,405,1747,405,1747,379,696,407,1744,404,673,379,696,406,670,380,696,405,671,379,696,380,1772,380,695,407,669,398,1754,380,696,379,696,380,696,406,1745,406,670,407,670,379,696,380,695,381,696,379,696,407,669,406,670,405,671,379,696,380,696,380,696,380,695,381,696,406,1745,380,1771,380,1773,379,696,406,669,380,1772,381,695,380,29382,5043,2131,406,1745,405,670,380,696,380,696,407,1744,380,696,406,670,380,696,379,697,379,1772,380,696,380,1771,380,1773,379,695,381,1771,405,1746,406,1746,380,1772,380,1772,379,697,379,1772,380,696,379,697,379,696,380,696,406,671,378,696,380,1772,380,696,380,695,406,1746,379,696,381,696,379,696,380,696,406,670,405,670,407,670,405,670,406,669,407,1744,381,1772,380,696,410,665,380,1772,380,1771,380,1772,380,696,405,670,380,696,380,696,380,696,379,697,406,669,380,696,406,670,405,1746,380,696,407,669,380,696,379,696,380,1772,380,696,405,671,379,696,380,696,380,696,380,696,379,696,406,671,379,696,380,696,380,696,405,670,380,696,380,696,380,695,380,696,380,696,380,696,380,696,379,1773,379,1771,408,668,380,1771,381,696,406,670,379,696,380,1772,379,1772,406,1746,379,1772,406,1746,380,696,380,695,380,697,379,696,405,671,380,696,379,696,380,696,405,671,380,695,380,696,380,696,406,670,380,696,379,696,406,670,380,1771,405,672,379,696,380,696,380,696,380,696,379,697,379,696,406,670,380,696,379,697,379,696,380,697,404,670,380,697,379,696,380,696,379,697,405,670,380,696,380,696,406,670,380,696,379,696,380,696,380,695,406,670,380,1772,380,1772,379,697,379,696,380,1771,380,1772,406,670,406,670,406}, //20C +{5044,2129,380,1772,405,671,380,695,406,669,407,1745,408,669,379,696,406,669,381,695,408,1744,381,695,407,1744,381,1771,380,696,380,1771,381,1771,380,1772,379,1772,406,1745,407,669,381,1771,406,669,381,696,407,668,380,696,407,668,407,670,380,1771,380,696,380,695,407,1745,380,696,380,696,379,697,407,1744,380,696,380,695,381,695,380,696,406,670,380,695,407,669,381,695,407,669,406,670,380,695,381,695,407,669,381,695,380,1771,381,1771,408,1744,379,696,407,669,380,1771,407,669,381,29381,5044,2129,380,1772,380,696,380,696,379,697,379,1772,380,696,404,671,381,695,380,696,380,1771,381,695,405,1747,380,1772,379,696,380,1772,406,1745,380,1772,380,1772,380,1771,380,696,406,1745,406,669,381,696,379,696,380,696,380,696,380,695,381,1771,406,670,380,696,380,1771,407,669,406,670,380,696,380,696,380,695,407,669,380,696,380,696,406,670,407,1744,407,1744,382,694,380,696,405,1746,380,1772,406,1746,380,695,380,696,380,696,380,696,380,695,380,696,404,672,380,696,380,696,406,1745,380,695,381,696,406,670,379,696,380,1771,380,697,379,696,380,696,380,695,381,695,406,671,379,695,381,696,380,695,405,671,380,696,406,670,380,695,380,697,379,696,380,696,406,669,380,696,380,696,406,670,406,669,380,1772,380,1771,381,695,380,697,379,696,379,1772,381,1770,408,1744,381,1771,380,1771,380,696,380,696,380,696,406,670,380,695,380,696,380,696,406,669,380,697,379,696,380,696,380,696,379,697,405,670,380,696,380,696,380,1771,380,696,407,669,406,670,405,671,407,668,380,696,380,696,380,695,380,696,380,696,406,670,380,695,380,696,380,696,405,671,406,669,380,696,380,696,380,696,380,695,380,697,405,670,406,670,379,696,381,695,407,670,379,1771,381,695,381,1771,406,670,380,1772,379,1772,380,695,407,669,380}, //21C +{5092,2104,380,1771,380,696,380,696,380,696,404,1747,380,696,405,671,379,696,381,695,407,1744,381,696,379,1772,407,1744,381,695,406,1746,380,1771,381,1771,380,1771,407,1745,380,696,380,1771,381,695,407,669,406,670,380,696,404,671,380,696,380,1771,381,696,379,696,380,1772,380,695,382,694,380,696,406,1746,380,698,377,696,407,669,406,669,381,696,380,696,379,696,380,696,380,696,379,696,407,670,406,669,380,696,380,695,380,1772,380,1771,381,1771,380,696,380,696,411,1740,380,696,380,29382,5043,2130,380,1771,380,696,380,696,379,696,407,1745,406,669,381,695,381,695,407,669,380,1772,379,697,379,1772,406,1746,379,696,380,1772,380,1771,380,1772,380,1771,381,1771,380,696,405,1746,380,696,380,696,406,670,406,669,406,670,381,695,380,1772,380,696,379,696,380,1772,379,697,406,669,407,669,406,670,406,670,379,697,379,696,406,670,380,696,379,1772,380,1772,406,670,380,695,406,1746,380,1771,406,1745,381,696,379,696,380,696,380,696,380,695,381,695,380,696,405,671,380,696,379,1772,406,670,380,696,380,695,381,695,380,1772,407,669,380,695,380,696,380,696,380,696,406,669,380,696,380,696,380,695,381,695,380,696,406,670,380,695,408,668,380,696,380,696,380,696,380,696,380,696,379,1771,381,696,379,1772,405,1747,380,696,380,695,407,669,380,1771,380,1772,380,1771,385,1767,407,1745,379,696,380,697,404,671,380,695,381,695,380,696,380,696,380,696,380,696,379,696,380,696,380,696,380,695,407,670,379,696,406,670,380,1772,379,696,380,696,380,695,380,696,380,696,395,680,381,696,379,696,380,696,380,696,406,670,379,697,379,696,380,696,380,695,380,697,379,697,379,696,380,696,379,697,379,696,380,696,380,696,380,696,380,695,380,696,380,1772,379,1772,380,1772,407,668,408,1744,380,1772,404,671,380,696,380}, //22C +{5042,2131,379,1772,406,671,379,696,405,671,380,1772,405,670,406,671,379,696,379,697,405,1746,380,696,379,1772,380,1772,379,697,379,1772,380,1772,379,1773,379,1772,379,1772,380,696,380,1772,406,670,379,697,379,696,405,671,379,697,379,697,379,1772,379,696,406,671,379,1772,380,695,380,698,378,697,379,1772,379,697,379,696,379,698,378,697,379,698,378,697,379,696,380,696,379,697,379,696,380,696,380,697,379,695,380,696,380,1772,379,1773,379,1772,379,697,379,697,379,1772,379,697,379,29359,5067,2130,406,1745,380,696,380,697,379,696,379,1773,379,696,380,697,378,697,379,696,380,1772,379,696,380,1772,379,1772,380,696,380,1772,379,1773,379,1772,379,1773,379,1771,381,695,380,1772,380,697,378,697,379,697,379,696,406,670,380,696,379,1773,379,696,380,696,380,1772,405,671,379,696,380,696,379,696,380,697,379,696,380,697,378,697,379,697,378,1773,380,1772,379,696,380,697,378,1772,380,1771,380,1773,379,696,380,697,379,697,378,697,379,696,379,696,381,696,379,697,379,697,379,1772,379,696,381,696,379,696,380,696,379,1772,380,696,380,695,380,697,379,697,405,671,379,696,405,671,379,697,379,696,380,696,379,697,379,697,379,697,379,696,380,696,379,697,379,697,379,696,380,696,379,697,406,1746,378,1772,380,1772,379,697,379,697,379,697,379,1772,379,1772,380,1772,379,1773,405,1747,379,696,379,697,379,697,379,697,379,697,378,696,380,697,379,696,379,697,379,697,406,669,406,671,379,696,379,697,379,697,379,696,380,1772,379,697,379,697,379,697,379,696,379,697,379,697,379,697,379,696,379,697,405,671,379,696,379,697,379,697,379,696,380,696,405,671,380,696,379,697,379,696,380,696,380,696,379,697,379,696,380,696,380,696,380,695,380,1772,380,696,380,696,379,1772,380,1772,379,1772,380,696,380,696,379}, //23C +{5068,2104,381,1771,407,669,380,696,406,670,379,1772,380,696,406,670,380,694,382,696,405,1745,406,671,380,1771,380,1772,405,671,405,1746,380,1771,380,1772,380,1772,380,1771,380,697,379,1770,381,696,380,696,407,669,380,696,379,697,379,696,380,1772,379,696,380,696,380,1772,379,696,380,696,407,669,405,1746,380,696,380,696,380,695,380,696,380,696,382,694,379,696,407,669,406,670,405,671,380,696,379,697,379,697,379,696,406,1746,379,1772,380,1772,406,669,380,696,385,1766,380,696,380,29381,5044,2130,380,1771,380,696,380,696,406,669,380,1771,406,670,381,696,380,695,380,697,406,1745,380,696,379,1772,380,1772,379,696,407,1745,380,1771,380,1773,404,1746,405,1747,380,696,405,1746,407,669,380,696,379,696,380,696,407,669,380,696,380,1771,406,669,381,696,379,1772,380,696,406,670,380,695,380,696,380,696,380,696,380,696,380,695,380,696,406,1744,381,1771,381,696,379,697,379,1772,405,1747,379,1771,381,696,406,670,380,695,380,696,380,696,380,696,379,697,385,690,380,695,406,1746,405,672,379,696,405,671,405,670,380,1772,380,696,379,696,381,695,380,696,380,696,380,695,380,696,380,695,381,696,379,697,379,696,380,696,406,669,381,696,379,697,404,671,405,671,379,697,379,697,379,1771,380,1772,380,1771,380,1772,380,696,380,695,381,696,379,1772,380,1772,379,1772,380,1772,379,1772,380,696,380,696,379,697,379,696,406,670,405,671,404,672,404,671,380,696,380,696,406,670,379,697,379,696,380,695,381,696,379,696,380,1771,380,697,379,697,379,695,381,696,379,697,379,696,407,669,380,696,405,670,380,696,380,696,380,696,379,696,380,696,380,695,407,670,379,696,380,696,380,696,380,695,406,670,380,696,380,696,380,696,380,696,379,696,407,1745,379,1772,380,696,380,1771,407,1745,380,1771,380,695,381,696,406}, //24C +{5043,2130,380,1772,379,697,379,697,379,697,405,1747,379,695,380,697,379,697,379,696,380,1772,379,695,381,1771,406,1745,381,696,380,1771,380,1772,379,1772,405,1747,380,1772,379,696,407,1744,380,697,379,697,379,696,406,670,380,696,379,697,404,1746,381,696,405,671,379,1771,381,697,378,696,407,669,380,1772,379,697,379,697,379,697,379,695,380,698,403,672,379,696,380,696,379,696,380,696,380,696,380,696,380,696,379,697,379,1772,379,1772,405,1747,379,696,380,696,380,1772,405,671,405,29355,5044,2130,380,1772,379,697,379,696,380,695,381,1771,406,671,405,670,380,695,380,696,380,1772,380,696,406,1744,381,1772,379,696,380,1772,380,1771,380,1772,380,1772,379,1772,380,696,380,1771,380,695,381,696,405,671,379,696,380,697,379,697,378,1773,405,670,380,696,380,1772,405,671,379,696,380,696,379,696,406,675,401,670,380,696,405,671,379,696,380,1771,381,1771,384,692,379,697,379,1772,380,1772,380,1771,380,696,379,697,379,697,379,697,379,696,380,696,406,670,379,696,380,696,380,1771,407,670,379,697,404,670,381,696,405,1747,379,696,379,696,380,696,380,696,380,696,379,697,379,696,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,405,671,380,696,379,697,379,696,380,696,380,696,380,696,379,697,379,1772,379,696,380,697,379,1772,379,1772,380,1777,375,1771,380,1772,406,671,404,671,379,696,380,695,407,670,405,671,405,670,380,696,379,697,406,670,379,696,406,670,379,696,380,697,379,697,379,696,406,1745,380,696,380,696,380,696,379,696,380,696,379,696,380,696,380,697,379,696,380,696,379,696,380,696,380,696,380,696,380,696,405,671,379,697,404,671,379,696,380,696,380,696,405,671,379,697,379,697,379,696,406,670,379,1773,405,670,380,1771,406,1746,380,1771,408,1744,406,670,379,696,385}, //25C +{5042,2131,380,1772,406,670,379,696,380,696,380,1771,380,696,379,697,406,670,379,696,380,1772,379,697,379,1772,379,1773,379,697,379,1772,379,1772,380,1772,380,1771,380,1772,382,694,379,1772,380,696,379,700,376,697,404,671,380,696,379,696,380,1772,380,696,379,697,379,1772,406,671,379,696,379,697,379,1772,380,696,379,696,380,697,404,672,379,696,380,696,379,697,379,696,380,696,379,697,379,696,380,696,380,696,380,696,379,1772,380,1772,379,1773,379,696,379,696,380,1772,404,672,379,29382,5043,2130,380,1772,379,697,379,696,380,696,380,1772,379,696,380,696,380,696,406,670,379,1772,380,696,379,1772,380,1772,380,695,406,1747,379,1772,405,1747,379,1771,406,1747,379,696,380,1772,379,697,405,671,379,696,379,697,379,696,406,670,380,1772,406,669,380,696,380,1771,380,696,380,697,379,696,405,671,405,670,380,696,380,695,380,696,380,697,379,1771,407,1745,380,696,380,695,406,1746,380,1771,380,1772,380,697,405,670,379,697,379,696,380,696,380,695,380,697,379,697,379,697,379,1772,406,670,404,671,380,696,379,697,380,1771,405,671,379,697,379,697,381,695,380,695,380,696,379,696,380,696,380,696,380,695,380,697,379,696,380,696,406,671,378,697,405,670,379,697,380,696,379,697,379,1772,380,696,379,697,379,696,380,1772,379,697,379,696,406,1746,405,1746,380,1772,379,1772,380,1771,380,696,380,696,380,696,380,696,379,697,379,696,380,696,380,695,380,697,379,697,379,696,379,696,380,697,379,697,379,697,379,696,379,1772,380,696,380,695,380,696,382,695,379,696,380,696,379,697,379,697,379,696,407,669,379,697,379,696,379,696,380,697,406,669,380,696,406,670,380,696,406,669,380,696,380,696,380,696,379,696,406,671,379,696,405,671,379,1772,406,1746,379,1772,380,1771,380,1772,380,1772,379,697,379,698,378}, //26C +{5043,2130,380,1771,380,696,406,670,380,696,407,1744,380,695,407,670,380,695,381,695,381,1771,406,669,406,1746,380,1772,380,695,406,1746,380,1772,405,1746,407,1744,381,1771,380,696,380,1771,380,696,380,696,407,669,380,695,407,669,380,696,380,1771,380,696,380,696,380,1771,406,670,380,696,380,695,381,1771,405,671,380,696,405,670,406,670,407,669,406,670,407,668,406,670,380,696,380,695,406,671,404,671,380,696,380,695,407,1750,375,1772,406,1745,380,696,380,696,407,1744,406,670,380,29382,5042,2130,380,1772,380,695,381,696,380,696,379,1772,406,670,380,695,380,696,380,696,380,1771,380,696,380,1772,405,1747,404,670,407,1746,379,1772,380,1771,381,1771,406,1746,379,696,380,1771,381,696,381,694,380,696,380,696,380,696,406,669,380,1772,380,696,379,697,379,1772,380,695,380,697,379,696,380,696,380,696,379,696,380,696,381,694,381,696,406,1745,380,1771,381,695,407,669,380,1772,380,1771,406,1745,380,696,406,670,380,696,405,670,381,696,379,696,406,670,380,695,381,696,379,1772,380,696,399,676,381,695,380,695,406,1747,406,669,380,696,380,696,405,671,380,695,406,670,380,696,406,670,406,669,380,696,407,669,405,671,407,668,406,670,380,696,406,669,380,697,405,670,380,696,405,671,393,1758,381,695,380,696,380,1771,404,672,406,669,408,1744,380,1771,380,1772,406,1745,380,1772,380,696,406,670,379,697,379,696,380,695,381,696,405,670,380,696,380,696,380,695,381,695,380,695,381,696,406,670,379,697,405,670,380,1771,380,696,380,696,406,670,380,695,380,696,380,696,380,696,380,695,380,696,406,670,406,669,381,696,380,695,406,670,406,670,380,696,379,696,380,696,380,696,380,695,381,695,380,696,380,695,381,696,379,696,380,696,380,1771,381,695,380,696,380,696,380,695,380,696,380,1772,406,669,380}, //27C +{5042,2130,407,1745,380,696,380,695,408,668,380,1771,407,669,380,696,380,696,380,696,380,1771,380,696,380,1772,379,1772,380,696,400,1751,407,1745,406,1745,380,1772,406,1745,380,696,380,1771,406,671,405,670,406,670,380,696,406,669,406,670,380,1772,379,696,380,696,380,1771,381,695,380,697,405,670,380,1771,380,696,380,696,405,671,406,670,406,669,380,696,380,695,381,696,379,696,406,670,406,670,406,669,380,696,380,696,380,1771,381,1771,380,1771,381,695,405,671,380,1771,408,668,380,29382,5043,2130,380,1771,380,696,380,696,379,697,379,1773,379,696,406,670,379,696,380,696,380,1772,379,697,379,1772,380,1772,379,696,380,1773,378,1773,379,1772,379,1772,380,1772,379,697,379,1772,406,670,379,698,405,669,380,696,380,696,379,697,379,1772,380,696,379,697,379,1772,380,696,379,697,379,697,379,696,379,697,380,696,379,697,379,696,379,697,406,1745,380,1772,380,696,379,697,379,1771,380,1773,379,1772,380,696,379,696,380,696,380,697,405,670,379,696,380,697,378,697,380,696,379,1772,406,670,380,696,379,697,379,696,380,1772,379,697,379,697,379,696,379,697,379,696,380,697,379,696,380,696,379,696,380,696,380,696,379,696,380,697,405,669,381,696,380,695,380,697,404,671,405,671,380,1771,380,1771,407,670,379,696,380,1773,405,670,379,697,379,1772,402,1749,380,1772,380,1771,380,1772,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,380,696,380,696,406,1745,380,696,380,696,379,697,379,697,379,696,380,696,379,697,379,697,406,670,405,670,379,697,379,695,381,696,406,670,380,696,379,697,379,696,406,670,379,696,380,696,380,697,379,696,380,696,379,697,379,696,380,696,380,1771,380,1772,380,696,379,697,379,696,380,696,380,1772,379,697,379}, //28C +{5043,2130,407,1744,381,695,380,696,407,669,406,1745,407,669,406,670,380,696,380,696,406,1745,406,669,406,1747,384,1766,407,669,381,1771,407,1744,384,1768,407,1744,407,1745,407,669,401,1751,380,695,407,669,380,695,407,669,381,695,380,696,380,1771,380,696,405,671,406,1745,406,670,380,696,380,696,380,1771,380,696,406,669,407,669,408,668,380,696,407,669,405,670,407,670,406,668,406,671,406,669,406,670,406,670,406,670,380,1771,407,1745,407,1744,380,695,381,696,380,1772,406,669,406,29355,5070,2104,406,1745,380,696,380,696,380,696,379,1772,406,670,380,696,379,696,380,696,380,1772,385,690,407,1744,408,1744,380,696,405,1747,406,1745,406,1746,380,1771,405,1746,381,695,380,1772,406,670,380,695,407,669,405,671,380,696,406,670,405,1746,407,669,380,695,380,1772,380,695,407,669,380,697,405,670,380,696,407,668,406,670,405,671,406,670,406,1745,380,1772,406,669,407,669,380,1771,380,1772,380,1772,380,696,379,696,380,696,406,670,380,696,380,695,380,696,380,696,380,695,380,1772,389,687,380,696,405,670,380,696,406,1745,381,695,380,696,380,696,406,669,381,695,407,669,405,671,379,696,381,695,405,671,406,670,380,696,406,669,380,695,381,696,406,669,380,696,406,670,405,670,381,695,406,671,379,1771,380,697,379,1771,381,696,406,669,380,1771,407,1746,380,1771,380,1771,380,1772,406,670,380,695,406,670,406,670,406,669,381,695,407,669,407,668,406,669,382,695,380,696,380,696,403,673,380,696,380,695,406,670,405,1746,406,670,380,696,380,695,406,670,380,697,379,696,380,696,380,695,380,696,406,670,380,696,380,695,380,696,380,696,380,695,381,695,407,669,406,670,380,695,380,696,380,696,407,669,406,669,380,697,379,696,380,696,406,1745,381,695,380,1772,380,695,384,692,380,695,407,1745,381,696,379}, //29C +{5043,2130,380,1772,404,671,406,670,406,670,380,1771,380,696,380,696,406,670,379,696,387,1765,380,696,380,1771,380,1772,405,670,381,1771,380,1772,405,1746,380,1771,381,1771,405,671,380,1771,380,696,380,695,407,670,380,695,406,670,380,696,406,1745,381,695,406,670,407,1744,406,670,406,670,380,695,381,1771,380,696,406,670,406,669,407,669,406,670,380,695,381,696,405,670,380,696,380,695,381,695,407,669,380,696,405,670,381,1771,406,1745,381,1771,380,696,406,669,381,1771,380,696,380,29381,5044,2129,406,1746,406,670,379,696,381,695,380,1772,380,695,381,696,379,696,380,696,380,1770,381,696,407,1744,380,1772,407,669,380,1772,405,1745,407,1745,406,1746,407,1744,380,696,380,1771,381,695,380,696,406,670,380,695,381,695,380,696,380,1771,381,695,380,696,410,1741,381,695,406,670,380,695,381,695,381,695,407,669,406,669,380,696,407,669,380,1771,381,1771,380,696,380,696,406,1745,380,1772,406,1745,380,696,380,695,381,696,405,670,407,669,380,696,380,696,380,695,380,696,407,1745,380,695,407,669,406,669,381,695,407,1745,408,668,406,669,381,695,406,670,380,697,379,695,381,696,380,695,406,669,408,669,380,695,405,671,380,696,380,695,406,670,380,696,380,696,380,695,381,695,380,1772,380,695,381,1771,380,696,380,1771,380,696,380,696,380,1771,381,1771,380,1771,380,1771,381,1771,407,669,407,669,381,694,407,669,407,669,380,696,380,696,406,669,381,695,380,696,380,696,405,670,381,695,380,695,381,696,379,696,381,1771,380,695,407,669,391,685,406,670,380,695,381,695,407,669,381,695,406,670,405,670,380,696,380,696,380,695,380,698,405,669,406,670,380,695,408,668,405,671,407,669,406,670,380,695,380,696,380,696,406,669,381,695,406,1746,380,1772,380,1771,406,670,406,669,380,696,380,1772,406,669,380}, //30C +{5043,2129,380,1773,379,696,379,697,380,696,380,1772,404,672,379,697,378,697,379,697,379,1771,380,697,379,1772,406,1746,379,696,380,1772,405,1747,379,1772,380,1771,380,1773,378,697,379,1772,380,697,379,696,379,697,380,695,380,696,379,697,380,1771,380,696,380,696,379,1772,380,696,380,696,380,696,379,1772,379,698,379,695,380,697,379,697,405,670,379,697,405,670,380,696,380,696,407,669,379,696,380,697,379,696,379,696,380,1772,380,1772,379,1772,379,698,378,697,379,1772,407,669,380,29382,5068,2105,379,1772,379,697,379,696,380,697,379,1772,379,698,378,696,406,671,379,696,380,1771,380,697,379,1772,379,1772,380,696,379,1772,380,1772,406,1746,379,1773,378,1773,405,671,379,1772,379,697,406,668,381,696,379,697,379,697,379,697,379,1771,380,696,380,695,381,1772,380,695,380,697,379,697,379,696,380,696,380,696,405,670,380,696,379,696,407,1746,379,1772,379,696,380,697,379,1771,380,1772,380,1771,380,697,379,696,380,696,406,670,405,670,380,697,378,696,380,697,379,696,380,1772,379,697,379,697,379,696,380,696,379,1772,380,697,379,696,379,697,379,697,378,698,379,696,380,696,379,697,379,696,380,695,381,696,379,696,380,697,378,698,379,697,378,697,406,670,379,696,379,696,380,697,379,1772,380,1771,380,697,405,1746,405,671,379,696,380,1772,380,1772,379,1772,379,1772,380,1772,379,697,379,697,379,696,379,697,379,696,380,696,380,696,380,696,379,696,380,697,379,695,380,697,379,697,379,697,379,696,380,696,379,1773,379,696,380,695,380,696,380,697,379,696,379,697,379,697,379,697,378,698,378,698,378,696,380,696,380,696,380,696,379,696,380,696,391,685,380,696,380,696,379,697,405,670,380,696,380,696,379,696,406,670,407,669,379,1772,380,696,380,696,405,1747,405,670,380,696,380,1771,380,696,380}, //31C +{5043,2130,407,1744,380,696,380,696,405,670,406,1746,406,670,405,670,380,697,379,696,380,1772,405,670,381,1771,380,1771,380,695,381,1772,379,1772,380,1772,380,1771,380,1772,380,695,407,1745,380,696,379,697,379,696,407,669,380,696,406,669,380,1772,380,696,379,697,405,1746,380,696,379,696,380,697,379,1772,385,690,380,696,380,696,380,696,380,696,380,695,380,696,380,696,380,695,407,669,380,696,405,671,380,696,379,696,380,1771,406,1746,407,1745,380,696,379,696,435,1716,406,671,379,29382,5069,2104,380,1772,405,670,380,696,380,697,379,1771,380,696,382,694,379,696,406,670,405,1747,380,696,379,1772,406,1745,381,695,380,1771,381,1771,380,1772,406,1745,380,1772,406,670,379,1772,380,696,380,696,379,696,380,697,379,696,407,669,380,1771,380,696,380,696,406,1745,380,696,380,696,380,696,379,697,379,696,394,682,380,695,407,670,404,672,379,1771,380,1772,380,696,405,670,380,1772,380,1771,380,1772,380,696,379,697,405,670,380,696,380,696,406,670,379,697,379,696,380,695,381,1771,380,696,380,696,380,696,406,669,380,1772,380,695,406,670,380,696,379,697,405,671,405,670,406,670,380,696,379,696,406,671,379,696,380,695,380,696,380,696,380,696,380,696,405,670,380,696,406,669,381,1772,380,1771,380,1771,380,696,405,1747,380,695,380,696,380,1772,379,1772,406,1747,379,1771,380,1772,379,697,379,696,380,695,381,696,379,696,380,696,380,696,405,671,407,669,379,696,380,696,406,670,379,696,380,697,379,696,405,670,380,1772,380,696,380,696,379,696,380,696,406,669,381,696,405,671,379,697,379,696,380,695,380,696,380,696,380,696,380,696,379,697,379,697,379,696,380,696,379,696,407,669,380,696,380,696,379,696,380,696,406,670,380,696,405,1746,380,1772,405,671,379,1772,380,696,380,695,380,1772,380,696,379} //32C + +//cool mid + +{5066,2130,406,1745,407,669,407,669,405,670,381,1771,380,696,380,696,404,671,380,696,406,1745,406,670,379,1772,380,1772,380,696,379,1772,380,1771,380,1772,405,1746,380,1771,380,697,405,1746,379,696,380,696,380,696,405,670,380,696,407,669,380,1772,379,695,406,671,406,1745,381,695,380,695,407,669,380,1772,380,696,379,696,380,696,407,669,380,695,380,696,380,696,380,696,405,669,381,696,380,695,406,670,380,696,380,696,380,1771,380,1771,381,1771,380,696,405,670,407,1745,379,697,379,29381,5042,2130,380,1772,380,696,379,697,406,669,380,1770,407,670,380,696,380,696,379,696,380,1772,379,697,379,1772,380,1771,380,696,380,1771,380,1772,406,1744,381,1772,405,1746,380,696,380,1772,405,670,406,670,379,696,380,697,379,696,394,681,380,1772,380,695,380,696,380,1772,405,671,379,697,405,670,405,670,380,696,380,696,380,696,380,696,379,697,379,1771,380,1772,380,696,379,696,380,1772,406,1745,380,1771,407,670,379,696,380,696,407,668,380,696,407,668,381,696,380,695,380,696,380,1772,379,696,380,696,380,695,380,697,379,1772,379,696,406,670,380,696,380,695,380,696,380,696,380,696,379,697,379,696,380,696,379,697,380,696,379,696,379,697,379,697,379,695,407,670,380,696,406,669,382,1769,380,1772,406,1745,407,669,379,697,379,696,380,697,405,1746,379,1772,380,1772,405,1746,406,1745,380,1772,380,696,379,696,380,696,380,696,406,669,405,671,405,671,379,696,380,695,381,696,380,696,379,696,380,696,405,671,380,695,380,1772,379,696,380,697,379,696,380,696,406,669,380,696,380,695,380,697,379,696,380,696,379,697,379,696,380,696,379,697,379,697,379,695,406,671,389,687,379,696,380,696,380,696,406,669,380,696,380,695,407,669,408,668,380,1771,380,1772,380,696,379,1772,380,695,380,697,379,1772,379,696,381}, //16 +{5041,2131,379,1773,379,696,380,696,379,697,379,1772,379,697,379,697,379,696,379,697,379,1772,380,696,379,1773,379,1772,379,697,379,1772,383,1768,380,1771,380,1773,379,1772,385,691,379,1772,379,697,379,696,380,696,379,697,379,697,379,696,379,1773,379,696,380,696,379,1772,380,696,379,697,379,696,406,1746,379,697,379,696,380,696,405,671,379,697,379,696,380,695,380,697,379,696,380,696,380,696,379,697,379,696,380,696,379,1772,379,1773,379,1772,380,696,380,696,379,1772,380,697,378,29381,5043,2130,379,1772,380,696,380,695,380,696,380,1772,379,697,379,696,406,670,379,696,381,1771,380,696,379,1772,379,1773,379,696,380,1772,380,1771,380,1771,380,1772,380,1771,380,696,380,1772,379,697,379,696,379,697,379,697,379,695,381,696,380,1771,379,697,380,695,380,1772,379,697,380,696,379,697,402,673,380,696,379,696,380,697,379,696,380,695,380,1771,381,1771,406,670,380,696,380,1770,381,1772,379,1772,380,696,379,697,379,696,380,696,391,685,379,696,380,697,379,695,380,697,380,1770,380,697,379,697,379,696,380,696,380,1771,380,696,379,696,381,697,378,696,380,696,379,696,380,696,405,670,407,670,379,696,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,696,379,697,379,696,406,670,380,696,379,1772,406,670,379,697,379,696,406,1746,379,1772,406,1745,380,1772,379,1773,379,1772,379,697,379,697,379,696,380,696,405,670,406,671,378,697,379,697,406,669,380,695,381,696,379,696,380,696,379,696,380,697,379,1771,381,696,406,670,379,696,379,697,379,696,379,697,380,696,379,697,383,691,381,696,406,670,379,697,379,701,374,697,405,671,379,696,406,670,380,696,379,696,380,696,380,695,407,669,406,670,380,696,379,697,379,696,380,1771,380,696,380,1772,405,1746,380,696,406,669,380,1772,405,671,379}, //17C +{5041,2132,379,1772,379,696,379,698,378,697,379,1773,378,698,379,697,378,697,378,698,378,1773,378,697,380,1772,379,1772,379,698,378,1774,377,1773,379,1772,379,1773,379,1772,379,697,379,1773,378,697,379,697,378,698,378,697,379,697,378,697,379,1773,379,697,379,696,380,1772,378,698,379,697,378,698,378,1773,378,698,379,696,379,697,378,697,379,697,379,697,378,698,378,698,378,698,378,697,379,697,405,670,379,697,379,696,379,1773,379,1772,379,1772,380,697,378,697,379,1773,378,698,378,29382,5041,2131,379,1773,378,698,378,698,378,697,378,1774,378,698,378,697,379,697,378,697,379,1773,378,698,378,1773,379,1772,379,697,379,1773,379,1771,380,1772,379,1773,378,1775,377,696,380,1772,379,698,378,697,378,697,379,698,378,697,379,697,379,1772,379,697,379,697,378,1772,380,696,380,697,378,697,378,698,378,697,379,697,379,697,379,698,378,696,379,1772,380,1773,378,697,378,698,378,1773,379,1773,378,1773,379,697,378,697,379,697,379,696,379,698,378,697,379,696,380,697,378,698,378,1773,379,697,379,696,379,697,379,697,378,1772,379,698,378,697,379,697,379,697,378,697,379,697,379,697,379,697,383,692,379,698,378,697,378,697,379,702,374,697,379,696,379,697,379,697,378,697,379,697,379,1773,379,697,378,697,378,1774,379,696,379,697,378,697,379,1773,379,1773,378,1773,379,1773,378,1773,379,1773,405,671,378,697,379,696,379,698,378,697,379,697,379,697,379,696,379,696,380,696,380,696,379,697,379,696,380,697,378,697,379,1772,380,696,405,670,381,696,379,696,379,696,393,683,406,670,380,696,379,697,379,696,380,696,380,695,380,696,380,696,380,695,381,695,380,696,405,671,379,697,380,695,380,696,380,696,379,696,407,668,381,696,406,670,405,1745,381,1771,407,1744,381,1771,380,695,381,696,403,1748,380,696,380}, //18C +{5044,2129,381,1770,381,695,381,695,381,696,379,1772,379,696,380,696,380,696,380,696,379,1772,380,696,380,1771,380,1771,380,696,380,1771,381,1771,380,1771,381,1771,380,1772,380,696,379,1771,381,696,379,697,379,696,380,695,381,696,379,696,380,1772,380,696,379,696,380,1772,379,696,380,695,381,696,379,1771,381,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,1771,380,1772,380,1771,380,696,380,696,380,1771,380,696,380,29358,5065,2129,381,1771,381,695,380,696,380,696,380,1771,379,697,380,696,380,695,380,697,379,1771,381,696,379,1772,380,1771,380,695,381,1772,379,1772,380,1772,379,1771,381,1771,380,697,379,1770,381,697,379,696,380,695,381,696,379,695,381,696,380,1771,380,695,381,696,380,1771,380,695,381,695,380,696,380,695,381,695,381,696,379,696,380,696,379,696,380,1772,380,1772,379,696,380,696,380,1770,381,1772,380,1770,381,696,380,696,380,696,379,696,380,696,380,696,379,696,380,696,380,696,379,1772,380,695,381,695,380,697,379,696,380,1772,379,697,379,696,380,695,381,695,380,696,380,696,380,695,380,696,380,695,381,695,380,696,380,697,379,697,378,697,379,696,407,669,380,696,380,695,380,695,381,696,379,1772,380,696,380,1770,381,696,380,696,379,696,380,1772,407,1744,380,1772,380,1770,381,1771,380,1772,380,696,380,696,380,695,380,696,380,695,381,695,380,697,379,695,381,696,380,695,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,380,696,379,696,380,696,380,695,380,696,380,697,379,696,379,696,406,669,381,696,379,697,379,697,379,695,381,696,379,696,380,695,381,696,379,697,379,696,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,695,381,696,379,1771,381,696,379,1771,381,695,381}, //19C +{5044,2129,379,1772,380,696,379,696,380,696,380,1772,379,697,379,696,380,696,380,695,406,1746,380,695,380,1772,380,1771,380,696,380,1772,380,1771,380,1772,380,1771,380,1772,405,671,379,1772,379,697,379,697,379,696,380,697,378,696,380,697,379,1771,406,671,379,696,380,1771,380,696,405,671,379,697,380,1772,405,670,380,696,379,697,379,696,380,696,380,696,379,697,379,696,380,696,405,671,379,697,379,696,383,693,379,697,404,1746,380,1772,380,1771,380,695,381,696,380,1771,380,696,380,29380,5043,2131,379,1772,380,696,380,696,379,697,379,1771,380,698,405,669,380,696,380,695,380,1773,379,696,380,1772,379,1772,380,695,380,1772,380,1771,380,1772,380,1772,379,1771,380,697,379,1772,380,695,381,695,380,697,404,670,381,695,380,696,380,1772,380,696,379,696,407,1747,377,697,379,696,380,696,405,670,381,695,380,695,381,696,379,696,380,697,379,1770,381,1772,380,696,380,696,379,1772,380,1772,379,1772,380,696,379,696,380,696,380,696,405,671,379,697,379,696,380,696,379,696,380,1771,381,695,380,697,405,670,380,696,379,1772,380,696,380,696,380,696,379,696,380,696,379,697,379,697,405,670,380,695,407,670,379,697,379,696,380,696,379,697,379,695,381,696,380,695,380,697,379,695,381,1771,380,1771,384,693,379,1772,405,670,381,700,375,696,380,1772,379,1772,380,1772,405,1746,380,1771,380,1771,381,695,407,670,379,696,380,695,380,696,380,696,380,696,404,671,380,697,379,696,380,695,380,696,406,670,380,696,380,695,407,1745,380,696,406,670,379,696,380,696,380,696,380,695,406,670,380,695,381,695,380,696,380,696,380,696,380,695,380,696,380,696,380,695,381,695,380,697,379,695,407,669,380,696,380,696,406,669,380,696,405,671,380,696,379,1772,380,1771,380,696,380,695,381,1771,380,697,379,1772,379,696,380}, //20C +{5042,2131,378,1773,379,698,378,697,378,698,378,1773,379,697,379,696,379,697,379,697,379,1772,379,697,379,1772,379,1773,379,696,379,1773,379,1772,380,1772,379,1772,380,1771,380,696,380,1772,379,696,380,697,379,697,378,696,406,671,378,696,380,1773,379,697,379,697,378,1772,405,671,379,698,378,697,379,1771,380,697,379,697,379,696,379,698,378,697,379,697,405,671,378,698,378,696,379,697,379,698,378,697,379,697,379,696,379,1771,381,1772,379,1773,379,697,378,697,405,1747,379,696,380,29359,5063,2132,379,1773,378,697,379,696,380,696,382,1769,380,696,379,697,379,697,379,697,379,1772,379,698,378,1772,379,1773,379,696,380,1772,380,1771,380,1772,379,1772,380,1772,379,697,378,1773,379,697,379,696,380,697,378,697,379,697,379,697,379,1772,379,697,379,696,380,1772,379,696,406,670,379,697,404,671,406,670,380,696,380,695,380,697,404,672,378,1772,380,1771,380,696,380,696,406,1745,380,1772,380,1771,380,696,406,670,380,696,379,696,380,697,379,696,380,696,379,696,406,670,380,1772,379,697,379,695,381,696,405,671,397,1754,379,696,380,696,406,670,380,696,379,697,379,696,380,695,380,697,379,696,380,696,406,670,405,670,407,669,406,670,405,670,407,669,380,696,405,670,381,695,406,670,405,670,407,1745,406,1746,379,696,406,670,407,669,405,1745,408,1744,406,1746,380,1771,406,1745,407,1745,406,670,380,695,408,668,380,695,407,670,379,696,380,696,407,669,405,669,406,671,407,669,406,669,380,696,379,697,407,668,407,1745,379,697,405,670,379,697,407,669,379,697,378,698,378,697,378,697,379,698,377,699,377,698,377,698,377,699,377,699,350,726,350,725,350,726,350,726,349,726,349,727,349,728,347,728,372,703,373,703,373,703,347,729,372,1778,374,702,373,1779,373,703,373,1778,374,701,374,1778,373,703,373}, //21C +{5043,2130,380,1773,378,697,379,697,379,696,379,1772,380,696,379,697,379,697,378,698,379,1773,378,697,379,1772,380,1771,380,697,379,1772,379,1773,379,1772,379,1773,379,1771,380,697,378,1774,378,697,379,697,379,697,379,696,379,697,378,698,378,1773,379,697,379,696,380,1772,378,698,379,695,380,698,378,1772,405,672,378,697,379,697,378,698,379,696,379,696,380,696,379,697,379,696,380,696,380,696,379,697,379,697,378,697,379,1773,379,1772,380,1772,379,696,379,698,378,1772,380,696,379,29382,5042,2131,379,1772,380,696,380,696,379,696,380,1771,380,696,380,696,380,696,379,697,379,1773,379,696,379,1772,380,1772,380,696,379,1772,406,1745,405,1747,380,1771,380,1772,379,696,380,1772,379,697,406,669,380,696,379,697,379,696,380,696,380,1771,380,696,380,696,380,1771,406,671,405,670,380,696,379,696,380,696,405,671,406,669,406,670,406,670,407,1744,407,1744,406,671,379,696,380,1771,380,1771,406,1746,380,696,399,677,380,696,406,669,406,670,380,696,405,670,380,696,406,669,407,1745,406,669,381,695,380,696,380,695,406,1746,406,669,407,670,406,669,406,670,380,696,406,669,407,669,407,669,380,696,405,670,380,696,380,696,406,669,406,670,406,670,379,696,406,671,405,670,380,696,379,1772,406,670,404,1748,378,1773,378,698,377,698,378,698,377,1773,377,1775,351,1801,350,1801,349,1803,348,1803,348,728,373,703,373,703,373,703,373,702,373,703,373,703,373,702,373,703,373,702,374,702,374,702,373,703,373,703,373,702,373,1779,372,703,374,703,372,703,372,704,372,703,371,705,371,706,370,704,371,705,370,706,346,729,347,729,346,730,346,729,347,729,347,729,346,730,346,729,347,729,347,729,347,729,347,729,347,728,348,728,347,728,373,703,373,1778,375,1776,376,1777,374,700,377,1775,376,700,377,1773,378,698,378}, //22C +{5043,2130,405,1746,380,696,380,695,381,696,406,1744,381,696,406,670,379,697,379,696,380,1772,379,695,406,1746,380,1772,380,696,380,1771,405,1746,383,1769,380,1771,380,1772,380,696,405,1746,406,670,380,696,379,696,380,696,393,682,381,696,406,1745,380,695,407,669,407,1745,380,696,406,669,406,670,406,1745,405,671,380,696,380,696,407,668,407,669,406,670,380,696,406,670,405,670,380,696,380,695,380,696,380,696,380,696,405,1746,380,1772,379,1772,407,669,405,671,379,1772,380,696,380,29380,5043,2130,380,1771,380,696,380,696,405,671,406,1745,380,695,381,696,406,670,379,697,405,1746,405,670,405,1747,380,1771,406,670,380,1772,379,1772,406,1745,407,1745,380,1771,380,696,380,1771,407,669,407,668,381,695,407,670,379,696,380,696,379,1772,407,669,380,696,407,1744,405,671,380,696,379,695,381,696,380,696,404,671,407,669,380,695,407,670,379,1772,407,1744,407,669,407,669,380,1771,406,1745,407,1746,406,669,405,671,379,697,381,694,386,690,405,671,405,671,405,670,380,696,406,1744,381,695,408,668,406,670,380,696,380,1771,406,670,407,669,406,670,379,697,405,670,406,670,380,695,380,697,379,696,380,695,408,669,379,697,405,670,380,696,379,696,380,696,379,696,381,696,406,669,380,696,407,1744,380,1772,380,1771,406,670,380,696,406,670,379,1772,380,1771,406,1746,380,1771,407,1745,405,1746,380,696,380,696,380,696,405,670,406,669,381,696,379,696,405,671,407,669,379,696,380,696,407,668,381,696,379,697,405,670,406,1744,381,696,380,696,380,696,380,696,405,670,380,696,405,670,407,669,405,671,380,696,405,671,405,671,404,671,406,670,379,696,380,696,406,670,405,671,405,670,405,671,380,696,379,697,404,671,380,696,380,696,379,696,380,1771,381,695,380,696,381,1770,380,1772,380,696,379,1772,406,670,379}, //23C +{5042,2130,380,1772,379,697,379,697,379,697,378,1772,380,697,379,696,379,697,379,696,382,1770,379,697,379,1775,376,1773,379,696,380,1772,379,1773,379,1771,380,1772,380,1771,380,697,379,1772,379,697,379,696,380,697,378,696,380,697,379,696,380,1772,379,696,380,697,378,1772,380,697,378,697,379,697,405,1747,378,697,379,697,379,697,379,696,379,698,378,696,380,696,379,697,379,698,378,697,378,698,378,698,378,697,379,697,379,1772,379,1773,378,1772,380,697,379,697,379,1772,378,697,379,29382,5042,2131,379,1773,379,697,378,697,379,696,380,1771,380,697,379,696,380,695,407,670,379,1772,379,697,379,1773,379,1772,379,697,379,1772,379,1773,379,1772,380,1772,379,1772,379,697,379,1773,378,698,378,696,405,672,378,698,378,697,379,697,379,1772,379,697,379,696,380,1771,380,696,380,697,378,697,379,697,379,696,379,697,379,698,378,696,380,697,379,1773,378,1772,379,697,380,696,379,1772,380,1771,380,1771,380,698,378,697,379,697,379,695,380,697,379,697,379,697,378,697,379,697,379,1772,380,696,379,697,379,696,379,697,379,1773,379,696,379,698,378,697,379,697,379,697,378,697,379,696,380,697,378,697,379,698,378,697,379,696,379,697,379,696,380,697,379,696,379,697,379,698,378,697,378,1773,379,1772,406,1746,379,1772,379,697,379,697,379,697,378,1773,379,1772,379,1772,380,1772,379,1772,381,1771,379,697,379,697,378,698,378,698,378,697,405,671,379,697,401,674,404,671,380,696,380,696,379,697,379,697,379,697,378,697,379,1772,380,696,379,697,379,696,380,697,378,697,405,671,379,696,380,697,378,697,405,670,380,697,378,697,379,697,379,696,379,698,378,697,379,696,380,696,380,696,379,697,380,695,380,697,378,697,379,697,379,697,406,670,378,1772,380,1772,379,697,406,1746,379,1772,379,696,406,1746,380,696,379}, //24C +{5069,2104,406,1745,380,696,406,670,380,696,405,1746,406,670,380,696,380,696,379,696,406,1745,381,696,405,1746,405,1746,380,696,380,1770,381,1772,380,1771,380,1771,380,1772,380,697,379,1772,406,669,407,669,380,695,381,696,406,669,380,695,381,1772,379,697,379,696,406,1745,406,670,406,670,406,670,405,1746,406,669,382,693,407,670,380,696,405,671,406,672,404,669,379,696,380,696,380,696,380,696,380,695,386,690,406,670,405,1746,406,1746,380,1771,405,671,406,670,380,1771,406,670,380,29358,5066,2129,381,1771,380,696,406,670,379,696,380,1771,380,696,407,669,380,696,380,696,379,1772,380,696,380,1771,380,1771,381,696,379,1772,380,1771,407,1746,379,1771,380,1772,405,670,380,1772,380,696,380,695,406,670,380,696,405,671,379,696,406,1746,380,696,379,696,380,1771,381,695,380,697,379,696,380,696,405,670,380,696,380,696,380,696,380,695,380,1772,406,1746,379,696,380,696,405,1745,381,1772,379,1772,380,696,405,671,379,696,407,670,404,671,405,670,407,669,380,696,406,670,379,1772,380,696,380,696,379,696,380,696,380,1771,380,696,406,670,405,671,379,696,380,696,380,696,380,695,380,696,380,695,381,696,405,670,380,697,379,696,380,696,379,697,399,676,380,696,406,670,379,696,407,669,400,676,379,696,407,668,380,1772,406,670,380,696,380,1771,380,1772,380,1771,406,1747,378,1773,379,1772,405,671,407,668,406,671,403,672,406,670,406,669,406,670,379,697,379,696,406,670,379,697,406,669,406,671,379,696,380,696,379,1771,407,670,406,670,405,671,379,696,407,669,379,696,380,696,380,696,380,696,379,697,406,669,380,696,380,696,379,696,380,696,379,696,381,696,406,669,379,697,380,695,406,670,380,696,380,696,379,697,404,671,406,670,380,1771,406,670,406,1745,380,1771,381,1772,405,670,380,1771,380,696,405}, //25C +{5041,2131,379,1773,379,697,378,697,379,697,379,1772,406,670,379,698,378,696,380,697,378,1772,380,697,379,1772,379,1773,404,672,378,1772,380,1773,378,1773,379,1772,379,1772,380,696,379,1773,379,697,379,696,380,696,379,697,379,696,380,696,380,1772,378,698,378,697,379,1773,379,696,380,697,378,697,379,1772,405,671,379,697,379,697,379,697,379,696,379,697,379,697,379,696,379,697,379,696,380,696,379,698,379,696,379,696,380,1771,383,1770,379,1772,379,697,379,697,379,1771,380,696,380,29380,5070,2103,407,1745,380,697,379,696,380,696,379,1772,380,696,405,670,380,696,406,670,380,1771,380,696,380,1772,380,1771,380,696,380,1771,406,1746,379,1772,380,1771,407,1745,380,696,406,1745,380,696,380,696,380,696,379,696,380,696,380,695,408,1744,380,696,405,671,379,1772,380,696,380,695,380,696,407,668,407,669,380,696,380,696,406,669,407,670,384,1766,407,1744,407,668,407,670,407,1745,407,1745,380,1770,381,695,407,669,380,696,380,696,407,668,380,696,406,670,406,669,407,669,406,1746,380,695,407,669,405,670,380,696,380,1772,407,669,406,669,407,669,407,669,379,696,406,670,406,670,405,671,405,671,405,670,404,672,379,697,379,696,379,697,377,699,377,699,377,698,376,700,376,700,350,1801,350,726,349,727,349,726,349,1802,349,728,348,728,347,1803,373,1778,374,1778,373,1779,373,1778,374,1778,373,703,373,702,373,703,372,704,373,703,372,702,374,703,372,704,371,704,373,703,371,706,371,704,371,704,347,729,370,706,351,1800,347,729,346,729,347,729,346,731,346,729,347,730,345,729,347,729,347,728,348,728,347,729,348,728,347,728,373,703,374,702,372,703,375,702,374,701,375,700,376,700,376,700,376,699,377,699,377,698,378,698,377,699,403,1748,378,1773,378,1774,378,1773,404,1748,378,697,404,1747,405,671,404}, //26C +{5042,2131,379,1773,379,696,378,697,379,697,380,1772,379,696,380,697,378,697,379,697,379,1772,379,697,379,1773,378,1773,379,697,378,1773,379,1773,379,1772,379,1772,380,1772,406,669,380,1772,379,697,379,697,378,697,379,697,379,698,378,697,379,1771,406,670,379,698,378,1773,379,697,378,697,379,697,379,1773,405,670,379,697,379,697,379,697,379,696,379,697,379,697,379,696,379,697,379,697,378,697,380,696,379,697,379,696,380,1772,379,1773,379,1772,405,672,378,696,380,1772,379,697,378,29361,5063,2131,379,1773,379,696,380,696,379,697,379,1773,379,696,379,697,379,697,379,696,379,1773,379,696,379,1773,379,1772,380,697,378,1773,378,1773,379,1773,378,1773,379,1772,379,697,379,1773,379,697,378,698,379,696,379,697,379,697,378,697,379,1772,380,696,379,697,379,1773,378,698,378,697,379,697,378,697,380,696,379,696,379,698,378,697,379,697,379,1773,378,1773,406,670,379,697,379,1772,379,1772,379,1773,379,697,379,697,378,697,379,697,378,698,379,697,379,696,379,696,380,697,379,1773,378,697,379,696,379,697,379,697,378,1773,379,698,378,697,379,696,379,697,379,697,379,696,379,698,378,697,379,697,379,697,378,697,379,697,379,696,380,697,379,696,379,697,379,697,379,696,379,697,379,696,380,1772,404,671,380,696,380,1772,379,696,381,695,380,1771,380,1773,379,1772,379,1772,379,1773,379,1772,380,695,380,696,380,696,381,695,406,670,379,697,379,696,380,695,381,695,406,670,380,696,406,670,379,696,407,669,406,670,382,1769,407,669,406,669,381,699,402,670,380,696,380,695,381,696,379,696,406,670,406,669,380,696,380,696,407,669,406,669,406,670,380,695,381,695,407,669,380,696,405,670,381,695,407,668,407,670,380,695,381,695,405,671,407,1743,408,669,388,688,405,670,380,696,406,1745,406,1746,380,696,380}, //27C +{5044,2130,380,1771,380,696,380,696,380,696,379,1772,380,696,406,670,379,696,380,696,380,1771,380,696,380,1771,380,1772,380,696,380,1770,381,1772,379,1772,380,1771,380,1771,381,696,380,1771,380,696,380,696,384,691,380,696,380,695,381,696,380,1772,379,696,406,669,380,1772,380,695,380,696,380,695,381,1771,380,696,380,695,381,695,381,695,381,695,380,695,381,695,381,695,380,696,380,695,381,696,380,695,380,696,380,696,380,1771,380,1771,381,1771,380,696,380,696,380,1771,380,695,381,29380,5043,2130,380,1771,381,695,381,696,379,696,380,1771,380,696,380,695,381,696,380,695,380,1771,381,696,379,1771,381,1771,380,696,380,1772,379,1772,407,1744,381,1771,380,1772,379,696,380,1771,381,695,381,695,380,696,380,695,381,696,379,695,381,1772,379,696,380,696,380,1771,381,695,380,696,380,695,381,695,380,695,381,695,381,696,380,695,380,696,380,1771,380,1771,381,695,381,695,380,1772,380,1771,380,1771,380,697,380,695,380,696,380,696,380,696,379,696,380,697,379,696,379,697,380,1769,382,695,381,695,406,670,406,670,380,1770,381,696,380,696,380,696,379,696,380,695,380,697,379,697,379,695,381,696,380,696,379,695,381,696,380,696,379,696,380,695,381,696,380,695,380,696,380,696,380,1771,380,1771,381,696,379,696,380,1771,380,697,380,695,380,1772,380,1771,380,1772,379,1772,380,1771,380,1772,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,695,381,695,380,695,381,696,380,696,380,695,380,696,380,695,381,1771,380,696,380,696,380,696,379,696,380,696,380,696,379,696,380,695,381,696,380,695,380,697,404,670,407,670,380,695,406,670,380,696,380,696,379,696,380,696,434,641,381,695,380,696,380,696,380,698,377,696,380,696,380,1771,380,1771,381,695,380,696,380,696,407,1745,379,1772,380,695,381}, //28C +{5071,2102,381,1771,406,670,380,696,407,669,406,1745,380,695,380,697,406,669,380,696,407,1744,380,696,406,1745,380,1772,406,670,406,1745,407,1744,405,1747,380,1771,407,1745,406,670,405,1746,405,671,380,696,406,669,407,669,406,670,380,696,380,1771,380,696,406,670,379,1771,381,695,381,696,381,695,379,1771,407,669,407,669,380,696,406,670,380,695,380,696,380,696,383,693,380,695,380,696,380,696,405,675,375,697,379,696,380,1771,380,1772,380,1771,406,670,407,669,405,1746,380,696,406,29355,5043,2130,407,1744,381,695,407,668,381,696,379,1772,380,696,380,695,380,696,380,695,381,1772,379,697,379,1772,380,1771,380,695,381,1771,380,1770,382,1771,406,1746,380,1771,380,696,380,1772,405,670,404,672,380,695,380,696,380,695,381,696,380,1771,380,696,380,695,406,1746,380,696,406,670,379,696,381,695,380,695,381,696,379,696,380,696,380,695,381,1771,380,1772,379,697,379,696,380,1772,379,1772,400,1752,379,696,380,696,380,696,379,697,379,696,380,696,405,671,405,670,406,670,380,1771,407,669,380,696,380,696,379,697,379,1771,381,696,379,696,380,696,380,695,381,695,406,670,406,670,380,696,379,696,380,697,379,696,380,696,407,668,407,669,380,696,405,670,380,696,380,697,379,695,407,669,380,696,380,1772,379,697,379,1772,380,695,380,696,406,1745,380,1772,404,1748,379,1772,380,1771,380,1771,381,696,380,696,405,670,380,696,398,678,405,670,380,696,380,696,380,696,406,669,380,696,407,669,380,695,380,696,380,696,380,1772,379,696,380,696,408,668,380,695,382,694,406,669,380,696,406,670,406,669,381,696,379,696,406,670,405,671,407,669,379,696,405,671,380,696,406,669,380,697,406,669,406,669,381,695,380,696,407,668,381,696,379,696,380,1771,380,696,407,1745,380,696,380,696,379,1772,406,1745,380,696,380}, //29C +{5043,2131,379,1771,381,695,406,670,380,695,406,1747,406,670,379,696,380,696,406,670,404,1746,381,696,380,1771,380,1772,380,695,380,1771,381,1772,380,1771,380,1771,380,1772,380,696,406,1745,380,696,406,670,380,696,406,670,379,696,380,696,380,1772,405,670,407,669,380,1771,380,696,407,670,381,694,380,1771,380,696,380,696,380,695,380,697,379,696,380,695,407,670,379,696,407,670,379,696,380,696,380,696,405,670,380,696,380,1771,380,1772,380,1771,380,697,379,696,380,1772,379,697,379,29382,5043,2130,380,1772,380,696,379,696,380,696,380,1772,380,695,380,696,380,696,380,696,379,1772,380,696,380,1771,380,1772,406,669,380,1772,380,1772,380,1771,385,1766,381,1771,380,696,380,1772,380,695,380,696,380,696,380,696,380,696,379,695,381,1772,379,697,379,696,380,1771,381,695,380,697,406,669,384,692,380,696,379,696,380,696,380,695,381,696,406,1744,381,1771,380,697,379,696,380,1771,380,1772,380,1771,380,697,379,695,381,696,380,696,380,695,380,696,380,696,380,695,380,696,380,1772,380,696,379,696,380,696,380,696,380,1770,381,696,380,695,381,696,379,696,380,696,380,696,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,695,381,696,379,697,380,695,380,696,380,696,380,1771,380,696,380,1771,380,696,380,1772,380,695,381,695,380,1771,385,1768,379,1772,380,1771,380,1771,381,1772,379,696,380,696,380,696,380,696,379,697,379,696,380,695,381,695,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,380,695,380,696,405,671,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,697,379,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,696,380,1771,380,1772,380,1771,380,696,380,696,380,1771,380,1771,381,696,384}, //30C +{5043,2130,382,1769,380,696,380,695,380,696,380,1772,380,696,406,669,380,697,379,697,379,1771,405,672,379,1771,380,1772,380,696,384,1767,380,1771,380,1773,405,1745,380,1772,380,695,381,1771,380,696,406,670,379,696,380,696,380,696,403,673,379,1772,380,697,379,696,379,1773,379,696,379,697,379,696,406,1746,379,696,380,696,380,696,379,696,380,697,379,697,379,695,381,696,379,697,379,696,380,696,405,671,379,696,380,695,406,1746,380,1772,379,1772,380,697,379,695,380,1773,379,696,380,29380,5044,2129,380,1772,406,670,380,696,379,697,379,1772,380,696,405,670,380,696,405,671,406,1745,380,696,380,1772,379,1772,380,696,379,1773,379,1772,406,1746,379,1771,406,1746,380,695,380,1772,380,696,380,696,379,696,407,669,380,696,380,696,404,1747,380,695,406,670,380,1772,380,696,379,697,379,696,406,670,380,696,379,696,380,697,379,695,381,696,379,1771,381,1771,380,697,405,670,406,1745,406,1746,379,1773,379,697,379,696,379,697,405,670,380,696,380,696,379,697,406,670,379,696,380,1772,379,696,380,696,406,669,380,697,379,1772,406,670,379,696,380,696,380,699,376,697,379,696,406,670,405,670,380,696,380,696,380,696,379,696,380,696,380,695,380,697,379,696,380,696,380,697,379,696,379,696,380,1771,380,1772,380,696,380,1772,379,696,380,696,379,1772,406,1745,381,1771,380,1772,379,1773,379,1772,380,695,403,673,380,696,405,670,380,696,380,697,379,696,379,696,380,697,404,671,379,696,381,696,379,697,379,696,380,696,379,1772,380,696,380,696,379,696,380,696,380,696,379,696,380,696,384,692,406,670,379,697,379,696,380,701,374,696,380,696,380,696,380,695,380,696,380,696,380,695,406,671,379,696,380,696,406,669,380,697,379,697,379,697,404,1747,379,696,380,695,407,1744,381,696,406,1745,380,1772,380,695,380}, //31C +{5043,2130,381,1771,380,696,379,696,380,696,380,1771,380,696,380,696,380,696,380,695,381,1770,406,671,379,1772,380,1771,380,695,381,1772,380,1771,380,1772,380,1771,407,1745,380,696,379,1772,380,695,405,672,379,696,380,696,380,696,379,697,379,1772,380,696,380,695,380,1771,407,669,380,695,381,696,380,1772,379,696,380,696,380,695,380,697,379,696,380,696,380,695,380,697,379,696,406,670,380,696,379,696,380,696,380,695,380,1773,379,1771,381,1771,380,696,406,670,379,1772,380,696,405,29355,5070,2103,380,1772,406,670,380,695,380,697,379,1771,380,697,379,696,380,696,380,696,380,1771,380,696,380,1771,380,1772,380,695,380,1771,381,1771,380,1772,380,1771,380,1772,380,696,379,1772,380,695,381,696,379,696,380,696,380,696,380,695,380,1771,381,696,379,696,380,1771,381,696,379,697,404,671,380,695,380,697,379,696,380,696,380,696,380,694,381,1771,381,1772,406,669,406,670,379,1771,381,1771,381,1771,380,696,406,669,380,696,380,696,380,695,380,697,379,696,406,670,380,694,382,1770,381,696,405,671,379,696,380,696,380,1771,380,697,405,670,380,695,406,671,380,695,406,670,380,695,381,695,380,696,380,696,380,695,380,696,407,669,380,696,380,695,380,696,380,696,380,695,381,695,380,1772,405,1746,380,1771,381,695,380,1771,381,696,379,696,380,1771,381,1771,380,1771,381,1771,380,1772,380,1772,379,695,381,696,379,696,380,696,380,695,381,695,380,696,380,696,380,696,379,696,380,695,381,696,380,695,380,696,380,696,381,1770,380,696,380,696,380,698,377,696,380,697,379,696,380,696,379,696,380,696,380,695,380,696,381,695,380,696,380,696,379,697,379,696,380,696,380,695,380,695,381,696,380,695,380,696,380,697,379,696,380,696,379,696,380,1772,379,1772,380,696,380,1771,380,696,380,1771,380,1772,380,695,380} //32C + +//cool high +{5043,2130,380,1772,380,696,404,671,406,670,380,1771,380,696,406,670,379,696,406,670,380,1771,407,670,379,1772,405,1746,406,670,406,1746,386,1765,406,1745,380,1772,380,1771,380,697,406,1745,379,697,380,694,407,670,406,670,405,670,405,672,379,1771,381,696,379,696,379,1773,379,696,380,695,381,695,380,1771,407,670,380,695,380,696,380,696,380,695,381,695,380,696,380,696,380,696,379,696,407,669,380,696,380,695,406,670,380,1772,380,1771,380,1772,380,695,380,696,380,1771,381,695,380,29381,5043,2130,380,1772,380,695,381,695,380,696,406,1745,380,697,379,696,406,670,379,696,380,1772,380,696,379,1771,381,1771,381,694,407,1746,405,1746,384,1768,379,1772,407,1744,381,695,380,1771,381,696,380,696,379,696,380,696,406,669,380,696,380,1772,406,669,380,696,380,1772,380,696,379,696,406,670,379,697,405,671,379,696,406,670,407,669,383,693,379,1772,380,1770,408,669,380,696,379,1772,380,1772,405,1746,405,671,379,697,379,696,380,695,381,696,380,695,406,670,407,669,406,670,380,1771,380,696,382,693,380,697,379,696,380,1770,381,696,380,696,380,696,406,670,379,696,380,696,405,671,379,697,379,696,380,696,380,695,406,671,379,696,406,669,406,671,379,696,380,696,407,669,380,696,405,1746,380,1772,405,1745,381,695,406,670,380,696,380,696,379,1772,380,1772,405,1746,380,1771,381,1771,406,669,406,1746,380,696,380,695,381,696,379,696,380,696,380,695,406,671,405,670,380,696,409,667,379,697,379,696,406,670,379,696,406,1745,381,696,380,696,379,696,406,670,405,671,405,670,380,696,406,670,380,695,407,670,404,671,407,669,380,696,379,696,406,670,380,695,380,696,380,696,380,696,380,695,407,669,407,669,380,696,380,696,406,670,405,670,406,1745,380,1772,380,696,379,1772,380,695,381,1770,408,1746,379,696,379}, //16C +{5043,2130,405,1746,380,697,379,696,380,696,405,1746,405,671,379,696,407,669,406,670,406,1745,380,696,380,1771,381,1771,380,696,380,1771,380,1772,380,1771,380,1772,405,1746,380,696,380,1772,380,696,379,697,379,696,405,671,379,696,380,696,379,1773,379,697,379,696,380,1772,406,669,406,669,381,696,379,1772,380,696,380,696,405,670,380,696,380,696,380,696,379,696,380,696,380,696,379,697,379,696,380,695,380,697,379,696,407,1743,409,1744,380,1771,380,696,380,696,405,1747,406,669,380,29357,5067,2130,380,1771,380,697,379,696,380,696,379,1772,380,696,380,695,405,672,379,696,380,1771,406,670,407,1744,380,1772,380,696,380,1771,380,1772,380,1772,406,1744,407,1745,380,696,380,1772,379,697,405,670,380,696,379,696,380,696,380,696,380,1771,380,696,406,671,378,1771,407,671,379,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,1772,379,1771,381,695,380,697,379,1771,381,1771,380,1771,380,696,380,696,380,696,379,697,379,696,380,696,380,696,379,696,380,696,380,1771,381,695,382,694,380,695,381,695,381,1771,380,696,380,696,379,696,380,696,380,695,381,696,433,642,406,670,380,695,407,669,380,696,380,696,380,695,380,695,381,696,380,696,405,671,406,669,406,670,380,695,380,696,380,696,380,1771,380,696,380,696,380,695,406,1746,380,1773,405,1745,380,1771,380,1773,379,697,405,1746,379,696,380,696,379,696,406,670,380,695,381,696,406,670,379,696,380,696,380,695,406,670,380,695,381,696,380,696,379,1772,380,695,380,696,380,696,380,696,379,696,406,670,380,697,379,696,379,697,379,697,379,696,380,696,379,696,380,696,381,695,379,697,379,697,379,696,380,696,380,696,379,697,379,696,380,695,381,695,380,697,379,696,380,1771,380,695,381,1771,380,1771,381,695,407,1745,405,1747,379,696,380}, //17C +{5044,2129,381,1772,379,696,406,670,405,671,380,1771,380,696,406,668,382,696,379,696,380,1771,380,696,380,1771,381,1771,380,695,381,1771,380,1772,380,1771,381,1772,379,1771,381,695,380,1772,406,670,379,696,380,696,379,697,380,695,381,695,380,1772,380,695,380,696,380,1771,380,696,380,696,380,696,380,1771,380,696,380,695,381,695,380,696,380,695,381,695,380,696,380,696,380,696,379,696,381,695,380,696,380,695,381,696,379,1772,380,1771,380,1772,380,696,379,696,380,1772,380,695,380,29381,5043,2130,380,1771,381,695,380,696,380,696,380,1771,380,695,381,696,380,696,379,696,380,1771,406,671,379,1771,381,1770,381,696,380,1771,380,1772,380,1771,406,1745,381,1771,380,696,380,1771,407,669,380,697,379,696,380,696,379,697,379,696,380,1771,380,696,380,696,380,1771,406,670,380,696,380,695,380,697,379,696,380,695,381,696,380,695,380,696,380,1770,381,1772,380,696,404,672,379,1772,380,1771,380,1772,380,695,380,697,379,697,379,696,380,696,379,696,380,696,380,695,380,696,380,1771,381,696,379,696,405,671,380,696,380,1771,380,696,380,696,380,696,379,696,380,696,380,695,381,696,379,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,695,406,670,380,696,380,1771,381,695,380,696,380,1771,380,696,380,696,380,696,380,1771,380,1772,379,1772,380,1772,379,1772,379,697,405,1746,380,695,381,696,379,696,380,696,405,671,379,696,407,669,380,696,379,696,405,672,379,696,379,696,407,669,380,696,380,1772,379,696,405,671,380,696,379,696,406,670,380,695,381,696,405,670,406,670,406,669,380,696,380,696,405,671,379,696,406,670,405,672,405,669,381,695,407,669,380,696,405,671,379,696,380,695,407,670,379,696,407,669,406,1745,407,1744,408,1744,407,1745,405,671,406,1745,406,1745,406,670,406}, //18C +{5044,2130,380,1771,379,697,380,696,380,696,379,1772,380,696,380,696,380,695,380,695,381,1772,379,697,379,1772,380,1771,380,695,381,1772,379,1771,381,1772,379,1773,379,1771,380,695,381,1771,381,696,379,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,380,1771,380,696,380,696,379,697,379,1773,379,695,381,695,380,697,379,695,381,696,380,696,379,696,380,695,381,696,380,695,380,696,380,696,379,696,380,696,380,1771,381,1770,381,1771,381,695,380,696,380,1772,379,696,380,29380,5044,2130,380,1771,380,695,381,696,380,696,379,1772,405,671,380,696,379,696,380,695,381,1772,379,695,381,1771,380,1772,380,696,380,1771,380,1771,381,1771,406,1745,381,1770,381,696,380,1771,405,672,379,696,380,696,380,695,380,696,380,695,381,1772,405,670,405,670,381,1771,380,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,1771,380,1772,405,671,380,695,380,1772,380,1771,380,1771,380,698,378,696,380,695,381,695,381,694,381,696,380,696,380,696,379,696,380,1772,380,694,381,696,380,696,380,694,381,1772,380,695,381,695,380,696,380,695,381,695,380,696,380,696,380,696,380,696,379,696,380,695,381,695,381,695,380,697,379,695,381,696,380,695,380,696,380,696,380,695,381,1771,380,696,380,1770,381,696,380,695,381,696,387,1763,381,1772,379,1771,381,1771,380,1771,381,696,379,1771,381,695,380,695,381,696,380,695,383,693,380,696,380,696,380,695,380,700,376,696,380,696,379,696,380,697,379,696,380,1771,407,670,379,696,379,696,380,696,380,696,380,696,380,695,380,697,379,695,380,696,380,697,379,696,379,697,379,695,407,670,380,696,379,697,379,696,380,696,380,696,406,669,380,696,406,670,379,696,380,696,380,696,380,1771,380,696,380,696,379,697,406,1745,406,1745,406,1745,407,669,406}, //19C +{5069,2104,406,1745,380,696,380,700,376,696,380,1771,380,696,380,696,379,696,380,697,379,1772,406,669,407,1744,407,1745,380,697,379,1771,381,1770,407,1745,406,1746,380,1772,406,669,405,1746,381,695,380,696,406,670,406,670,379,697,379,696,406,1746,379,696,380,696,380,1772,379,696,406,670,405,670,381,1770,381,696,380,695,380,696,406,670,380,696,380,696,406,669,380,696,380,696,380,696,379,696,382,694,380,696,380,696,379,1772,384,1767,380,1772,406,675,374,696,380,1771,381,695,407,29354,5043,2130,380,1771,407,670,405,671,379,696,380,1772,380,695,380,696,380,696,380,695,381,1770,381,696,406,1745,406,1745,381,696,379,1771,381,1772,405,1745,407,1745,380,1772,379,697,379,1772,380,696,406,670,379,696,380,696,379,697,379,695,381,1771,381,696,379,696,380,1772,380,695,380,697,379,696,380,696,379,697,379,696,380,696,380,695,381,695,380,1771,381,1771,380,695,381,695,380,1772,380,1772,406,1745,380,695,381,695,380,697,379,696,407,669,405,671,379,696,380,696,380,696,380,1771,380,696,380,696,379,696,380,696,380,1772,379,696,380,696,407,669,379,696,380,696,380,696,405,670,406,671,379,696,380,695,381,696,379,696,380,696,380,696,379,696,380,696,380,696,380,694,381,696,380,1771,380,1771,381,696,379,1772,380,697,379,695,406,671,379,1772,380,1771,380,1772,380,1771,380,1772,380,695,380,1772,380,695,381,696,379,696,380,696,380,695,381,696,379,696,380,696,380,695,381,695,380,695,381,696,380,696,379,696,380,1771,381,696,379,696,380,696,405,670,405,671,407,669,380,695,380,697,406,670,379,695,381,695,381,695,380,696,380,696,380,696,380,696,379,696,380,695,381,696,379,696,380,696,380,695,380,697,405,670,380,696,405,671,379,1772,406,1746,379,696,406,670,380,1770,381,1771,381,1771,380,696,406}, //20C +{5065,2131,379,1773,379,696,379,696,380,697,379,1771,407,669,380,696,380,696,380,695,380,1772,380,696,380,1771,380,1772,380,696,379,1772,406,1746,410,1740,381,1771,380,1772,380,695,380,1772,380,696,405,671,381,694,380,696,380,696,380,696,379,1772,380,696,380,695,380,1771,381,695,381,696,405,671,379,1771,381,696,404,671,380,696,380,695,380,696,380,696,380,695,381,695,380,696,380,696,380,696,406,670,404,671,380,696,381,1770,380,1772,396,1754,381,695,381,696,405,1746,380,696,380,29380,5070,2103,407,1745,380,696,406,669,407,670,405,1746,380,695,380,696,405,671,380,696,380,1770,381,696,380,1770,381,1772,381,694,381,1770,407,1745,380,1772,380,1771,407,1744,381,695,380,1772,380,695,407,670,379,697,404,671,380,695,406,670,406,1745,381,695,380,697,379,1771,407,669,381,696,379,696,380,695,407,670,379,696,380,696,380,696,404,671,380,1772,380,1771,407,669,380,696,379,1772,380,1771,381,1771,380,696,406,670,380,695,406,670,407,668,407,669,381,695,380,696,380,696,379,1772,380,696,380,696,379,696,380,696,380,1771,381,695,380,696,380,696,405,671,379,696,380,696,380,696,406,669,380,697,379,696,380,696,405,670,380,696,380,695,407,669,380,696,380,695,381,696,406,670,379,696,380,696,380,1771,380,1771,407,669,380,696,407,669,380,1771,380,1772,380,1770,381,1771,381,1771,381,695,380,1772,380,695,380,697,406,669,379,696,380,697,379,696,406,669,381,695,380,696,380,696,380,695,381,695,380,696,380,695,380,1772,406,670,380,696,380,695,380,696,406,670,380,695,407,669,405,671,380,696,387,688,380,696,380,696,380,696,380,696,405,670,380,696,406,669,380,697,405,669,381,695,407,669,406,671,379,696,380,695,397,678,381,696,380,1771,381,696,379,1772,379,696,380,1771,406,1746,381,1770,407,670,404}, //21C +{5069,2103,381,1771,380,696,405,670,380,696,406,1745,381,695,381,696,405,670,380,696,380,1770,381,696,380,1771,406,1745,407,670,379,1772,380,1771,380,1772,380,1772,379,1772,405,671,405,1746,380,696,405,671,380,696,389,687,379,696,380,695,407,1745,380,696,407,667,408,1745,406,670,380,696,406,669,380,1772,405,671,379,696,406,670,380,696,379,696,405,671,380,696,406,670,406,670,379,696,405,670,407,670,379,696,380,696,380,1771,380,1772,380,1771,406,670,380,696,380,1771,380,696,406,29355,5043,2130,380,1771,380,696,380,695,406,671,379,1772,380,696,380,695,380,697,379,696,380,1771,380,696,380,1771,381,1771,380,695,381,1771,380,1772,380,1770,381,1772,380,1771,380,696,404,1747,381,694,381,696,380,696,379,696,380,697,379,696,380,1772,379,696,380,696,380,1772,379,697,379,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,1771,380,1772,380,695,380,696,380,1772,380,1771,380,1771,380,696,380,696,405,671,380,696,379,696,380,696,380,696,379,697,379,696,380,1771,406,670,380,695,381,696,379,697,406,1745,380,696,380,695,380,695,406,671,380,695,381,695,380,696,380,696,380,695,380,696,380,696,380,695,381,696,380,695,380,696,380,696,379,696,380,696,380,695,381,1771,380,696,380,1771,380,1772,380,696,405,671,379,696,380,1771,380,1772,380,1771,380,1771,381,1772,380,695,380,1771,381,696,380,695,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,696,406,669,406,671,380,695,380,696,380,1771,380,696,380,695,380,697,379,696,380,696,380,696,379,696,380,696,380,695,381,696,380,695,380,696,380,695,380,697,379,696,380,696,406,670,380,695,380,696,405,671,380,696,380,696,379,697,379,695,381,695,380,696,380,1771,381,1770,381,1771,381,695,380,1772,380,1771,407,1744,381,695,380}, //22C +{5042,2131,379,1772,380,696,406,670,379,696,380,1772,379,697,404,671,380,696,379,697,379,1773,379,696,379,1772,380,1772,379,697,379,1772,380,1771,380,1772,380,1771,380,1772,379,696,381,1771,380,696,379,696,380,696,380,696,379,697,379,697,379,1772,380,696,379,696,380,1772,379,696,380,696,379,697,379,1773,379,695,381,696,379,696,380,697,379,696,380,696,379,697,379,696,380,697,379,696,382,693,380,697,379,696,405,671,379,1772,380,1772,379,1772,405,671,379,696,380,1772,380,695,380,29382,5042,2130,380,1771,381,696,379,697,406,669,380,1771,380,696,380,696,380,696,380,696,379,1772,380,696,380,1771,380,1772,380,696,379,1772,380,1772,379,1772,379,1773,379,1772,380,695,380,1773,379,696,380,695,380,696,380,696,380,696,380,696,405,1746,380,695,408,669,379,1772,380,696,379,697,379,696,380,696,380,696,379,696,380,696,379,697,380,695,380,1772,379,1773,379,696,380,696,380,1771,380,1772,379,1771,407,670,406,670,380,696,379,696,379,698,379,696,380,695,380,696,380,696,379,1772,380,696,379,697,379,697,379,696,380,1772,379,697,405,670,380,696,380,696,405,671,379,696,380,696,380,695,380,696,406,670,380,696,406,669,407,669,380,695,408,669,380,698,377,697,378,697,380,696,380,695,380,1772,379,1772,406,1746,405,671,405,670,380,696,379,1772,380,1772,380,1771,380,1772,406,1745,380,696,380,1771,380,696,380,695,381,696,379,696,380,696,380,696,379,696,407,670,379,696,379,697,379,697,379,696,407,668,381,696,379,1772,380,696,379,697,405,670,380,696,380,696,379,697,379,696,380,696,379,697,379,697,404,671,380,696,380,695,380,696,380,697,379,695,406,670,381,695,380,696,406,670,379,697,379,696,380,696,405,675,376,695,407,669,406,1745,380,695,381,696,406,1746,379,1771,407,1745,406,1745,408,668,380}, //23C +{5043,2130,381,1771,380,696,380,696,380,695,381,1770,381,696,380,695,380,696,380,696,379,1772,380,697,379,1771,380,1772,380,696,380,1771,380,1772,380,1771,380,1772,379,1772,380,696,380,1771,406,671,379,696,405,670,380,695,408,669,380,695,407,1745,380,696,380,696,380,1771,380,696,380,695,381,696,379,1772,380,696,379,696,380,696,380,695,405,672,379,696,380,695,380,696,381,695,380,697,379,696,405,670,380,697,379,695,381,1772,404,1746,381,1772,379,696,380,696,380,1771,407,668,381,29380,5044,2130,380,1770,381,696,380,695,381,696,379,1772,380,696,405,671,379,697,379,696,379,1773,384,691,407,1744,381,1771,405,672,406,1745,404,1746,380,1772,380,1772,405,1745,381,696,380,1772,379,697,379,695,381,695,380,697,379,695,381,696,380,1772,379,696,380,695,380,1773,379,696,380,696,379,696,433,643,380,696,379,697,379,696,380,696,380,696,380,1771,380,1771,380,697,379,696,380,1772,379,1772,406,1745,406,670,380,695,381,695,380,696,380,697,379,696,380,696,379,696,380,695,381,1772,380,695,380,696,380,696,380,695,380,1772,380,696,380,695,380,697,379,696,380,695,380,697,405,670,405,671,380,696,379,696,380,696,380,696,379,697,379,696,380,697,403,672,380,695,380,696,380,696,380,1771,380,1771,407,1745,406,1745,381,696,379,696,380,697,379,1771,380,1772,380,1771,406,1746,406,1745,380,697,379,1772,379,697,379,696,380,696,379,697,379,697,379,695,381,696,406,669,380,697,379,696,380,696,379,697,379,695,381,696,379,1771,407,670,380,696,380,695,380,696,380,696,380,696,379,696,405,671,380,696,380,695,406,670,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,380,696,405,671,379,697,405,670,380,696,379,697,379,696,380,1772,379,1771,381,696,380,1770,381,1771,380,1773,379,1772,379,696,406}, //24C +{5043,2130,381,1772,379,696,380,695,380,696,380,1772,380,695,380,697,404,670,381,696,379,1772,406,670,380,1771,380,1772,406,669,406,1746,380,1772,379,1772,380,1771,380,1772,380,696,379,1772,380,696,380,696,379,697,379,697,379,696,379,697,384,1766,381,696,380,696,379,1772,380,697,404,670,380,696,380,1772,380,696,379,696,380,696,380,695,405,671,380,696,380,695,381,696,379,696,380,697,379,696,380,696,379,696,380,696,380,1772,379,1771,381,1772,379,696,406,670,380,1771,380,696,380,29381,5043,2130,380,1770,381,697,379,696,380,695,380,1771,381,696,379,696,380,697,379,696,380,1772,405,670,405,1747,379,1772,380,696,379,1772,380,1772,380,1771,380,1772,380,1772,379,696,380,1771,404,672,380,696,380,695,380,696,406,669,381,695,380,1772,380,696,379,696,380,1772,380,696,380,696,379,696,380,696,405,670,381,696,379,696,380,696,380,696,379,1772,380,1772,379,697,379,696,380,1771,380,1772,380,1771,380,696,380,696,380,696,379,697,379,697,379,696,379,696,407,670,379,696,380,1772,379,696,407,668,381,697,378,697,405,1746,380,695,380,697,379,695,381,696,380,695,380,696,380,696,380,696,407,669,379,696,380,696,380,696,379,697,379,695,381,697,379,696,380,696,379,696,380,697,379,696,379,697,379,696,393,684,378,1772,380,697,379,696,380,1770,381,1771,382,1770,406,1746,379,1773,379,696,380,1771,380,696,409,667,380,695,381,696,379,696,380,695,381,695,435,641,380,696,380,695,406,671,379,696,380,695,380,696,380,1772,380,695,380,697,379,696,380,696,406,670,379,697,379,696,380,696,380,695,406,670,406,670,380,695,380,696,380,696,380,696,379,697,379,695,381,696,380,696,379,696,380,696,380,696,380,696,380,695,380,696,380,696,380,1771,406,670,406,1745,380,1772,380,1772,379,1772,386,1765,380,696,380}, //25C +{5044,2129,408,1743,407,670,406,670,379,696,380,1772,406,669,407,669,407,669,383,692,408,1744,380,697,379,1771,406,1746,405,671,380,1771,380,1772,380,1771,380,1771,381,1772,405,669,407,1745,406,670,380,696,405,670,406,671,379,696,406,670,406,1746,405,670,406,670,405,1746,380,696,406,670,380,695,381,1771,406,670,380,695,406,670,380,696,405,671,406,669,380,696,380,696,380,695,380,696,380,696,380,695,406,670,407,669,380,1771,381,1771,380,1771,408,669,379,696,380,1771,380,696,406,29355,5043,2130,380,1772,380,696,406,669,407,670,379,1771,407,669,406,670,406,669,406,670,380,1772,380,695,380,1772,380,1772,380,696,406,1745,405,1746,407,1745,406,1745,380,1772,380,696,380,1771,380,695,381,695,380,696,380,696,380,696,380,694,381,1772,379,696,407,669,380,1772,379,696,406,670,407,669,380,695,381,695,380,696,380,696,380,696,379,697,379,1772,379,1772,406,670,380,695,380,1772,380,1771,381,1771,380,695,381,696,380,696,379,696,380,696,380,696,379,697,380,696,406,669,405,1746,380,696,406,670,379,697,379,695,381,1772,379,696,407,670,379,696,379,696,380,696,407,669,405,670,380,696,380,696,406,670,380,696,379,696,406,669,408,669,405,670,407,670,379,696,380,696,405,671,379,1772,379,696,406,671,379,696,380,1772,379,696,380,696,380,1772,406,1745,380,1771,380,1772,405,1746,406,670,380,1771,406,670,407,669,380,695,380,696,407,669,406,670,405,670,381,695,380,696,380,696,380,696,379,696,380,696,406,670,405,1746,404,672,405,670,380,697,405,669,381,695,381,696,379,697,404,671,380,696,405,670,380,696,380,697,378,697,380,695,380,696,380,695,380,697,404,672,379,696,380,696,380,696,406,669,380,696,380,696,379,697,379,695,407,1745,407,1745,380,1771,380,1772,406,1745,380,1771,381,1771,380,696,407}, //26C +{5043,2130,406,1746,379,696,380,697,405,670,380,1772,379,696,380,696,380,695,408,668,380,1772,405,671,405,1746,406,1745,381,696,405,1746,379,1772,380,1770,381,1772,407,1745,379,696,380,1772,380,695,386,691,404,670,381,696,380,696,379,697,379,1772,379,697,379,696,380,1772,380,695,406,670,407,669,380,1771,405,671,380,696,406,670,379,696,380,696,380,696,405,671,379,697,383,693,378,697,380,695,380,697,404,670,381,696,379,1771,381,1771,380,1772,406,670,379,696,406,1746,380,696,379,29381,5043,2130,406,1746,380,696,379,697,379,695,381,1772,379,695,381,697,379,696,379,697,379,1771,381,696,379,1773,379,1772,407,669,405,1746,379,1773,379,1772,380,1771,380,1772,379,697,405,1745,381,696,379,696,380,696,380,695,381,696,379,696,380,1772,405,671,379,697,379,1772,379,696,407,670,404,671,380,696,380,696,379,696,380,696,380,696,379,697,379,1771,380,1772,380,697,379,695,380,1771,381,1771,381,1772,379,696,405,671,405,670,380,697,379,696,379,697,379,697,405,671,379,696,379,1772,380,695,406,671,379,697,379,695,381,1771,380,696,380,696,380,696,379,696,406,671,405,669,380,697,379,697,405,670,380,696,379,697,379,696,380,696,406,670,379,697,379,696,405,671,379,697,379,697,383,693,379,1771,380,696,380,695,381,1772,379,696,380,696,380,1772,379,1772,379,1772,380,1771,406,1746,380,696,379,1772,380,697,381,694,379,697,379,696,380,697,405,670,379,696,380,697,379,696,406,670,379,697,379,696,380,695,406,670,406,1747,405,670,405,671,379,696,380,696,380,696,379,697,379,697,378,697,380,696,379,696,380,696,380,696,379,697,379,697,379,696,379,697,379,696,380,696,380,696,406,670,379,696,380,696,380,696,379,696,380,697,379,696,380,1771,407,668,381,696,380,696,379,697,379,697,379,696,379,1772,380}, //27C +{5044,2130,379,1773,379,696,380,695,381,696,405,1746,380,696,380,695,380,696,380,696,380,1771,380,697,379,1772,379,1771,407,670,380,1771,380,1772,380,1771,380,1772,380,1771,380,695,407,1745,380,696,380,696,380,696,379,697,379,696,380,696,380,1771,380,696,391,685,406,1745,380,696,405,670,405,672,379,1772,380,696,380,699,376,696,380,695,380,697,379,696,380,697,379,695,380,697,405,670,380,696,405,670,380,697,379,696,380,1771,380,1771,381,1771,380,696,380,696,380,1771,380,695,381,29380,5044,2129,381,1770,381,696,380,695,381,696,379,1772,406,670,380,696,379,696,380,696,380,1772,379,696,380,1772,379,1772,405,671,380,1772,379,1772,379,1772,406,1746,379,1771,381,696,380,1771,380,697,379,695,407,670,380,695,380,696,380,695,381,1771,380,695,407,670,405,1746,380,696,406,670,379,696,380,696,380,695,381,695,380,696,405,671,380,695,380,1772,380,1772,379,697,379,696,380,1771,408,1744,380,1771,380,696,380,695,391,686,380,695,407,669,380,695,381,696,380,696,379,696,380,1771,380,696,380,696,405,670,380,696,407,1744,381,696,407,669,379,696,380,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,696,405,671,379,696,380,696,404,672,379,696,380,697,379,696,380,1770,382,1771,379,697,379,697,379,1771,380,697,379,696,380,1772,379,1772,380,1771,380,1772,380,1771,380,696,380,1772,379,696,380,696,380,696,380,695,381,695,380,696,405,671,407,669,379,696,380,696,380,696,379,696,380,697,379,697,379,1771,380,696,380,696,406,669,380,697,379,695,381,696,379,696,406,671,379,696,380,695,380,697,379,697,405,670,380,695,380,697,379,696,407,669,380,696,404,671,380,696,380,696,379,696,380,696,380,696,379,697,433,642,380,1771,406,1746,380,696,380,696,379,696,380,696,380,697,378,1772,380}, //28C +{5043,2129,381,1772,380,696,380,696,379,697,382,1769,406,671,378,695,407,674,375,696,380,1773,406,669,379,1772,380,1772,379,697,379,1772,380,1771,380,1772,380,1772,379,1772,380,696,380,1772,379,696,380,696,379,697,379,696,380,696,379,697,379,1772,407,669,379,697,380,1771,407,669,379,697,380,696,379,1772,379,697,379,697,379,696,379,696,406,671,379,696,406,669,381,695,380,697,406,669,380,696,379,697,379,696,380,696,379,1772,406,1745,381,1772,379,696,380,697,383,1766,406,671,380,29381,5068,2105,379,1772,380,697,379,696,380,696,380,1770,381,696,379,696,380,697,379,696,380,1771,380,697,379,1772,379,1772,380,696,380,1771,380,1772,379,1773,379,1772,380,1771,380,696,380,1771,380,696,380,696,380,696,379,697,379,697,379,695,381,1771,380,696,380,696,379,1772,406,670,380,696,379,697,379,696,405,671,380,696,379,696,406,671,379,696,379,1772,407,1745,380,695,380,697,405,1745,407,1745,380,1771,406,670,380,696,406,670,379,697,379,697,379,696,380,695,407,669,380,696,380,1771,380,696,380,697,379,696,379,697,379,1772,380,696,379,696,406,671,379,696,405,671,380,696,406,669,405,671,379,697,379,697,379,696,406,670,406,670,379,696,406,670,380,695,401,676,405,671,379,696,380,697,378,696,380,1771,381,695,380,1771,381,696,379,696,380,1771,381,1772,405,1746,380,1771,380,1772,379,696,380,1772,380,695,408,669,405,671,379,695,380,697,405,670,405,671,380,696,406,670,379,696,380,695,381,696,379,697,405,671,379,1771,380,696,380,697,379,695,381,695,406,671,379,696,380,696,380,696,379,696,379,697,379,696,380,696,380,696,380,696,380,696,405,670,380,696,380,696,406,669,406,670,380,696,380,695,381,696,379,695,381,695,381,696,404,1747,380,696,380,1772,379,696,380,696,380,695,380,696,406,1745,406}, //29C +{5043,2130,380,1771,407,669,406,670,380,695,406,1746,434,642,380,695,407,669,380,696,406,1746,379,696,380,1772,379,1773,405,670,380,1772,379,1773,405,1745,380,1772,380,1771,380,696,380,1772,379,697,405,670,379,697,379,696,407,669,380,696,380,1772,379,695,407,670,380,1771,380,697,379,696,405,671,379,1771,381,696,405,670,380,696,380,696,379,696,380,697,379,697,379,695,406,670,407,669,407,669,380,695,380,696,407,669,405,1747,379,1772,405,1747,406,669,406,669,407,1745,406,670,380,29381,5043,2130,380,1771,406,670,380,696,380,695,381,1771,380,696,379,697,379,696,380,696,380,1771,380,696,406,1746,379,1772,405,671,406,1745,380,1772,406,1746,379,1771,381,1771,380,696,405,1746,380,696,379,697,406,670,380,695,380,696,380,696,406,1745,380,695,381,695,380,1772,380,696,405,670,381,695,406,671,379,697,378,696,380,696,380,697,379,695,381,1771,380,1771,405,671,380,696,406,1745,382,1769,381,1771,380,696,380,696,380,696,379,695,381,696,380,697,379,696,379,696,404,672,380,1770,381,696,380,696,380,696,405,670,380,1772,405,671,379,696,380,697,379,696,405,671,379,695,381,697,379,696,379,696,406,670,405,671,380,696,405,670,380,696,380,696,380,695,381,695,380,695,381,695,380,1771,408,669,406,1745,380,696,380,1772,405,671,406,668,381,1771,380,1771,381,1772,379,1771,381,1771,380,696,380,1772,379,696,380,696,380,696,405,671,379,696,380,696,380,695,407,668,407,671,379,696,380,695,380,697,379,696,406,669,381,1771,380,697,379,696,405,670,380,696,380,696,380,695,406,670,407,668,407,669,407,670,380,695,406,670,380,696,380,696,379,697,379,696,380,695,399,677,380,696,380,695,406,669,381,696,380,695,381,696,379,696,380,696,380,1771,405,1747,380,1771,405,672,379,696,380,695,381,696,379,1771,407}, //30C +{5043,2129,383,1769,380,700,375,696,380,696,405,1746,380,696,406,670,380,696,380,696,379,1772,380,696,380,1772,379,1772,406,669,380,1772,380,1772,379,1772,380,1771,407,1745,404,672,379,1771,381,696,379,696,380,696,380,697,379,696,380,696,379,1773,379,696,405,671,379,1772,405,671,407,669,379,696,380,1771,381,695,380,696,380,696,405,670,380,696,380,696,406,670,379,696,406,670,380,696,380,696,405,671,379,697,379,696,406,1745,380,1771,380,1772,406,670,380,696,405,1746,380,696,380,29380,5043,2130,380,1772,406,669,380,697,379,696,380,1772,379,697,407,668,380,696,406,670,379,1772,399,677,379,1772,380,1772,379,697,379,1772,379,1772,380,1772,405,1746,380,1772,380,696,405,1746,380,695,407,670,379,697,379,696,379,697,379,696,380,1772,379,697,379,696,380,1772,379,697,379,696,380,696,379,697,405,671,379,697,379,696,380,696,379,697,379,1771,381,1771,380,696,380,696,379,1772,380,1772,405,1746,380,696,380,695,380,697,379,696,380,696,379,697,379,696,380,697,379,696,379,1772,380,695,406,671,379,697,379,695,381,1772,380,696,379,696,379,697,405,670,380,696,380,696,380,695,380,696,380,697,404,671,406,670,405,671,379,696,380,695,380,697,379,696,380,696,379,696,405,671,380,697,379,1771,380,1772,405,671,379,1772,380,696,380,695,407,1745,406,1745,380,1772,380,1772,379,1772,380,696,380,1771,405,671,379,696,380,696,380,696,405,671,379,697,379,696,406,670,380,696,379,697,379,696,380,696,406,670,379,697,379,1772,379,697,379,696,380,696,380,696,379,696,380,696,407,670,406,668,406,670,380,696,380,696,379,697,379,696,380,696,379,697,406,669,380,696,380,696,379,696,380,697,379,697,378,697,379,697,405,670,380,695,380,697,379,1773,379,696,407,668,381,1771,380,696,379,696,406,671,379,1772,379}, //31C +{5070,2104,379,1772,380,696,407,669,379,697,379,1772,379,696,380,696,380,696,380,695,380,1771,381,696,380,1771,380,1771,380,696,405,1747,391,1760,380,1771,381,1771,407,1745,380,695,380,1772,380,696,405,671,379,696,380,696,379,697,379,696,380,1772,380,696,379,696,380,1772,379,697,379,696,380,695,406,1746,380,696,380,696,380,696,379,697,379,696,380,696,391,685,379,696,383,693,380,696,380,696,379,696,382,694,380,696,379,1772,380,1771,380,1772,380,696,380,695,380,1771,381,696,380,29380,5043,2131,379,1772,380,696,380,696,398,677,380,1772,405,671,379,696,380,696,380,696,405,1746,406,669,380,1772,380,1772,379,696,380,1772,379,1772,380,1772,379,1772,380,1772,406,670,405,1746,380,695,380,696,405,671,380,696,380,696,379,696,380,1771,380,697,379,696,406,1746,380,695,380,696,380,696,380,695,406,670,380,697,379,695,406,671,405,671,379,1772,406,1745,380,695,380,697,379,1773,379,1771,381,1771,380,696,380,696,379,696,380,697,379,696,380,696,379,697,379,696,405,670,381,1771,380,696,379,696,406,670,380,696,405,1746,406,671,379,696,380,696,379,697,379,696,380,696,380,695,380,696,406,670,380,695,381,696,404,671,381,695,380,695,381,696,379,696,380,696,379,696,380,697,379,1771,381,1771,380,1772,379,696,380,1771,381,695,381,695,380,1772,380,1771,380,1772,380,1772,379,1772,379,697,379,1771,381,696,379,696,380,696,380,696,379,696,406,671,379,696,406,670,380,695,380,696,380,696,380,696,404,671,380,695,381,1771,380,696,380,696,379,697,380,696,379,696,380,696,397,678,380,697,379,696,380,696,379,697,403,673,379,695,380,697,379,697,406,669,380,696,380,696,379,697,379,696,380,696,405,671,379,697,379,697,379,696,379,697,379,1772,380,1771,380,696,380,1772,379,696,380,696,407,668,380,1771,381} //32C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ir_codes.cpp b/src/ir_codes.cpp index f843ba4..f934419 100644 --- a/src/ir_codes.cpp +++ b/src/ir_codes.cpp @@ -1,103 +1,108 @@ #include -const uint16_t ir_code_cool[4][16][91] = { +const uint16_t ir_code_cool[4][17][407] = { // Fan Speed Auto { - {8976, 4498, 562, 546, 589, 547, 588, 1649, 588, 548, 587, 1649, 588, 547, 589, 548, 587, 564, 589, 547, 588, 1649, 588, 548, 587, 547, 588, 548, 588, 548, 588, 547, 587, 566, 587, 548, 587, 548, 588, 548, 587, 548, 588, 548, 587, 549, 586, 548, 587, 565, 588, 549, 586, 548, 588, 548, 588, 548, 560, 577, 584, 549, 586, 551, 585, 565, 588, 549, 587, 548, 560, 576, 560, 574, 587, 549, 587, 550, 586, 548, 588, 570, 560, 576, 586, 549, 560, 575, 560, 1665, 560}, // 15C - {8976, 4498, 560, 548, 587, 549, 587, 1650, 587, 549, 587, 1649, 586, 550, 587, 548, 587, 565, 587, 549, 586, 1652, 586, 549, 586, 549, 587, 548, 587, 549, 586, 549, 587, 1667, 587, 548, 587, 548, 587, 549, 588, 547, 587, 549, 587, 549, 587, 548, 587, 565, 587, 549, 586, 549, 587, 549, 586, 548, 587, 549, 587, 549, 587, 547, 589, 564, 587, 548, 588, 548, 587, 548, 587, 549, 587, 550, 585, 549, 587, 549, 586, 570, 587, 548, 587, 550, 586, 549, 587, 536, 587}, // 16C - {8976, 4499, 531, 577, 558, 577, 559, 1678, 559, 577, 558, 1679, 559, 577, 558, 577, 558, 595, 558, 577, 558, 1679, 558, 577, 559, 576, 559, 578, 558, 576, 559, 1679, 558, 594, 558, 578, 558, 577, 559, 576, 558, 578, 558, 577, 558, 577, 558, 578, 558, 594, 559, 577, 558, 577, 558, 578, 557, 578, 558, 577, 559, 577, 557, 578, 559, 593, 559, 577, 558, 577, 559, 576, 559, 577, 558, 578, 557, 578, 559, 576, 559, 599, 558, 1678, 559, 1679, 559, 1678, 558, 1666, 560}, // 17C - {8977, 4498, 561, 549, 587, 547, 588, 1649, 588, 547, 589, 1648, 589, 547, 588, 548, 587, 565, 589, 547, 587, 1650, 587, 547, 589, 548, 588, 546, 589, 547, 588, 1649, 588, 1667, 587, 548, 588, 547, 588, 548, 588, 547, 588, 548, 588, 548, 587, 548, 587, 565, 587, 548, 588, 547, 588, 549, 587, 548, 587, 548, 588, 548, 587, 548, 588, 564, 588, 547, 588, 549, 586, 550, 587, 547, 588, 548, 587, 548, 588, 548, 587, 570, 587, 1649, 588, 1650, 588, 1649, 588, 536, 587}, // 18C - {8998, 4502, 534, 574, 587, 549, 585, 1652, 586, 550, 560, 1677, 560, 575, 586, 550, 561, 591, 587, 548, 586, 1651, 587, 549, 586, 549, 585, 550, 561, 1676, 563, 573, 560, 592, 587, 549, 561, 574, 586, 550, 586, 550, 559, 575, 561, 575, 561, 575, 560, 592, 560, 576, 560, 575, 560, 576, 560, 574, 561, 575, 560, 576, 560, 575, 560, 593, 559, 576, 560, 575, 560, 577, 558, 576, 560, 575, 562, 574, 560, 576, 560, 597, 560, 1676, 562, 1676, 559, 576, 561, 1665, 560}, // 19C - {8978, 4503, 562, 548, 586, 549, 588, 1649, 587, 547, 589, 1649, 588, 547, 588, 548, 587, 565, 590, 546, 587, 1649, 588, 548, 588, 548, 587, 548, 587, 1649, 588, 548, 588, 1666, 588, 547, 588, 547, 588, 549, 587, 548, 588, 547, 588, 547, 589, 547, 587, 565, 588, 547, 588, 549, 587, 548, 587, 549, 587, 547, 588, 548, 588, 547, 588, 564, 589, 547, 587, 549, 587, 548, 588, 548, 588, 547, 588, 547, 588, 547, 588, 570, 588, 1649, 588, 1649, 587, 548, 588, 535, 589}, // 20C - {8977, 4503, 560, 549, 587, 548, 560, 1677, 587, 548, 587, 1650, 587, 549, 586, 549, 586, 567, 587, 548, 587, 1650, 588, 547, 587, 549, 587, 548, 587, 1650, 587, 1650, 588, 565, 588, 547, 587, 549, 587, 548, 587, 548, 587, 548, 588, 548, 587, 549, 587, 565, 586, 549, 587, 548, 588, 548, 587, 549, 586, 549, 587, 548, 587, 548, 588, 565, 588, 547, 588, 548, 587, 548, 588, 548, 587, 548, 587, 548, 588, 548, 587, 570, 588, 1649, 588, 547, 588, 1650, 588, 1635, 589}, // 21C - {8996, 4503, 506, 603, 533, 603, 533, 1703, 534, 602, 532, 1705, 533, 602, 533, 602, 533, 619, 533, 603, 533, 1704, 533, 602, 533, 603, 533, 603, 531, 1705, 533, 1704, 532, 1722, 533, 602, 533, 603, 533, 602, 534, 602, 533, 602, 533, 602, 533, 603, 533, 619, 533, 602, 533, 603, 533, 603, 532, 603, 533, 602, 533, 602, 534, 602, 533, 620, 532, 603, 533, 602, 533, 603, 533, 602, 533, 602, 533, 603, 533, 602, 533, 624, 533, 1705, 533, 602, 533, 1704, 533, 590, 533}, // 22C - {8976, 4504, 560, 549, 587, 548, 587, 1650, 587, 548, 587, 1650, 587, 549, 587, 548, 587, 566, 587, 548, 587, 1649, 589, 548, 587, 548, 587, 1650, 587, 549, 587, 548, 588, 564, 588, 548, 587, 548, 587, 549, 587, 548, 587, 548, 587, 548, 588, 548, 588, 565, 587, 548, 588, 548, 587, 547, 588, 548, 587, 549, 586, 549, 587, 548, 588, 565, 587, 548, 587, 548, 588, 548, 586, 549, 587, 549, 587, 548, 588, 548, 587, 570, 587, 1650, 588, 547, 587, 549, 587, 1637, 588}, // 23C - {8976, 4504, 560, 549, 587, 549, 586, 1651, 586, 549, 586, 1651, 587, 548, 587, 548, 588, 565, 587, 548, 587, 1650, 587, 549, 586, 549, 587, 1650, 587, 549, 586, 549, 587, 1667, 587, 548, 587, 549, 587, 549, 586, 549, 586, 549, 587, 548, 588, 548, 587, 565, 587, 548, 587, 549, 587, 548, 587, 549, 587, 548, 587, 549, 587, 548, 586, 567, 586, 549, 586, 549, 586, 549, 587, 548, 588, 549, 586, 549, 586, 550, 587, 570, 586, 1650, 587, 549, 587, 548, 587, 537, 586}, // 24C - {8977, 4503, 531, 578, 534, 602, 556, 1680, 534, 602, 533, 1704, 556, 579, 557, 579, 533, 619, 533, 603, 532, 1704, 558, 578, 533, 603, 532, 1705, 555, 580, 532, 1705, 557, 595, 557, 579, 556, 579, 557, 579, 557, 578, 557, 579, 557, 578, 557, 578, 557, 596, 557, 578, 557, 579, 557, 577, 559, 577, 559, 576, 558, 578, 557, 578, 558, 594, 559, 577, 558, 578, 558, 577, 558, 577, 559, 577, 559, 576, 560, 575, 560, 598, 558, 578, 558, 1678, 559, 1679, 559, 1666, 558}, // 25C - {8976, 4498, 507, 602, 534, 602, 533, 1703, 534, 602, 533, 1704, 533, 602, 557, 579, 533, 619, 533, 602, 557, 1680, 534, 602, 533, 602, 534, 1703, 534, 602, 556, 1680, 534, 1720, 533, 602, 534, 602, 534, 602, 533, 602, 556, 580, 533, 601, 535, 601, 534, 619, 533, 602, 534, 602, 534, 601, 534, 602, 533, 602, 558, 577, 534, 602, 533, 619, 534, 602, 557, 578, 557, 578, 534, 602, 533, 603, 532, 603, 556, 579, 533, 624, 557, 579, 533, 1704, 533, 1704, 533, 590, 533}, // 26C - {8977, 4503, 533, 576, 560, 575, 559, 1679, 559, 577, 559, 1677, 559, 576, 559, 580, 556, 593, 559, 577, 559, 1677, 561, 575, 559, 576, 560, 1678, 559, 1678, 560, 575, 559, 593, 559, 577, 559, 576, 560, 575, 560, 576, 559, 576, 560, 576, 560, 576, 559, 592, 560, 576, 560, 575, 560, 576, 559, 576, 560, 576, 559, 577, 558, 576, 560, 593, 559, 576, 560, 575, 561, 575, 560, 575, 559, 577, 559, 576, 560, 576, 559, 598, 560, 576, 560, 1677, 558, 577, 559, 1667, 559}, // 27C - {8996, 4504, 483, 626, 533, 602, 510, 1727, 533, 602, 533, 1704, 533, 602, 534, 602, 510, 642, 533, 603, 533, 1704, 532, 602, 534, 602, 533, 1704, 533, 1704, 533, 603, 512, 1742, 531, 604, 532, 603, 533, 603, 531, 604, 532, 603, 532, 603, 533, 603, 532, 620, 532, 604, 531, 604, 531, 604, 533, 602, 511, 626, 532, 603, 509, 626, 510, 643, 531, 604, 532, 603, 533, 603, 532, 603, 531, 605, 532, 602, 533, 602, 533, 625, 531, 605, 532, 1704, 533, 603, 533, 590, 534}, // 28C - {8977, 4497, 508, 601, 534, 601, 535, 1702, 535, 601, 534, 1703, 534, 601, 535, 601, 534, 618, 534, 601, 535, 1702, 534, 602, 535, 600, 534, 1703, 534, 1703, 534, 1704, 534, 618, 534, 601, 534, 602, 534, 601, 534, 601, 535, 600, 535, 601, 535, 601, 534, 618, 534, 602, 534, 600, 535, 601, 535, 600, 535, 601, 534, 602, 533, 602, 534, 619, 534, 600, 535, 601, 534, 602, 533, 602, 535, 600, 535, 601, 534, 601, 535, 623, 533, 602, 534, 601, 534, 1703, 535, 1690, 534}, // 29C - {8978, 4503, 533, 575, 561, 575, 559, 1678, 559, 577, 559, 1678, 559, 577, 558, 576, 560, 593, 559, 576, 560, 1677, 560, 575, 559, 577, 560, 1677, 560, 1677, 559, 1679, 558, 1696, 559, 576, 559, 576, 560, 576, 559, 576, 559, 576, 560, 576, 560, 575, 559, 594, 559, 576, 560, 575, 560, 576, 560, 575, 560, 576, 559, 576, 560, 575, 560, 594, 558, 576, 560, 575, 559, 577, 560, 575, 560, 576, 559, 577, 561, 574, 559, 599, 559, 576, 559, 579, 557, 1677, 560, 564, 559} // 30C + +{5043,2131,404,1747,379,697,379,697,379,695,407,1746,379,698,378,697,379,697,379,696,406,1745,380,697,380,1772,379,1772,379,697,379,1773,379,1772,379,1773,379,1772,406,1746,379,697,379,1772,380,695,381,696,405,670,406,671,379,696,380,697,379,1772,405,671,379,696,380,1771,407,670,379,696,380,696,380,1772,405,670,405,672,379,697,379,695,380,697,379,697,379,696,380,696,379,697,380,696,379,696,380,696,380,696,380,696,380,1772,379,1772,380,1772,379,696,380,697,379,1772,379,697,379,29383,5043,2130,380,1772,380,696,405,671,379,697,405,1746,380,696,380,696,405,670,406,670,380,1772,380,696,405,1746,405,1747,405,671,379,1773,405,1746,379,1773,379,1773,379,1773,379,695,380,1772,407,669,379,697,379,696,407,670,379,696,380,696,379,1773,405,671,379,695,380,1773,379,697,405,670,380,696,380,696,405,671,379,697,379,697,379,696,380,696,379,1772,380,1772,379,696,405,671,380,1772,406,1746,380,1772,379,696,380,696,379,697,379,697,379,696,380,696,380,695,381,695,380,697,405,1746,380,696,379,697,406,670,379,697,378,1773,379,697,405,670,380,696,380,696,380,696,380,696,379,696,380,696,380,696,380,695,380,696,380,696,380,697,379,696,405,670,406,671,382,693,405,671,380,695,408,1748,401,1747,379,1773,379,696,406,670,380,695,381,697,378,1773,405,1746,379,1772,380,1772,380,696,379,696,380,697,379,697,379,696,380,697,405,670,379,696,380,696,380,697,379,696,379,697,405,671,379,696,380,696,381,695,379,697,379,1772,380,696,379,696,380,697,379,696,380,696,380,696,405,670,380,697,379,697,379,696,380,696,380,695,380,696,380,697,404,671,406,671,378,697,379,696,380,696,380,696,380,696,379,697,406,669,407,669,380,696,380,696,404,1748,379,1772,380,697,378,1773,379,1772,380,697,378,696,380,696,380}, //16C +{5043,2130,405,1747,380,696,380,696,406,670,384,1767,380,696,380,695,380,702,374,697,405,1746,407,669,405,1747,406,1745,380,696,379,1773,379,1772,380,1772,379,1772,380,1772,379,697,379,1772,380,696,406,670,405,671,406,670,379,696,406,671,379,1771,406,670,380,697,406,1745,405,671,379,697,379,696,405,1747,380,696,380,696,379,696,406,670,380,696,380,696,379,697,380,695,380,696,380,696,379,697,379,697,379,696,380,696,405,1746,406,1746,380,1772,405,671,379,696,382,1770,380,696,379,29384,5042,2130,380,1772,407,670,406,669,380,696,379,1773,379,697,406,669,380,695,381,695,385,1767,406,670,380,1777,402,1744,407,669,380,1772,379,1772,401,1750,381,1771,380,1772,406,670,380,1771,380,697,379,696,406,670,379,697,379,696,380,696,405,1747,406,670,379,696,406,1746,380,696,379,697,379,696,380,696,380,696,380,695,381,695,407,669,380,696,380,1771,380,1772,380,696,380,696,379,1772,380,1772,380,1772,379,697,379,697,404,672,378,696,380,697,405,670,380,696,380,696,379,697,380,1771,380,697,381,694,380,696,380,695,380,1775,377,696,379,696,380,696,380,696,380,696,380,696,406,669,380,697,379,696,408,668,404,672,379,697,406,669,380,695,381,696,380,695,405,672,379,696,380,696,380,696,406,669,381,696,379,1772,380,696,379,697,405,670,406,1746,380,1771,406,1746,380,1771,380,696,380,697,379,696,380,696,379,697,380,695,380,697,379,696,406,670,379,697,379,696,380,696,406,670,380,696,379,697,379,697,379,697,379,1771,380,696,380,696,380,697,379,696,380,696,379,697,379,696,380,696,405,671,379,696,380,696,407,670,405,670,407,669,379,697,405,670,380,696,380,696,405,670,381,696,379,696,380,696,380,696,405,670,406,670,380,696,380,1771,381,696,379,1771,381,1772,409,1743,379,696,380,696,406,670,379}, //17C +{5069,2104,407,1745,380,696,380,696,380,695,380,1772,380,696,380,696,379,696,380,696,380,1772,380,696,379,1772,380,1771,381,696,405,1746,380,1771,381,1771,380,1772,380,1771,380,696,380,1772,380,695,406,670,408,668,380,696,380,695,380,697,406,1745,380,696,380,696,379,1772,407,669,405,671,380,695,406,1746,380,696,405,671,380,695,380,697,380,695,380,695,381,696,379,696,380,696,380,696,406,670,380,696,388,687,380,696,380,1771,381,1771,380,1772,380,696,379,697,405,1746,380,696,380,29361,5064,2130,406,1746,380,696,379,697,405,670,380,1772,380,695,380,696,380,696,380,696,380,1771,380,696,380,1771,381,1771,380,696,406,1745,381,1771,380,1771,381,1771,380,1772,380,696,406,1745,407,669,381,694,381,696,380,695,406,670,380,696,405,1746,380,696,380,696,407,1745,407,669,405,671,379,696,380,695,381,696,380,695,380,696,380,696,406,670,406,1745,380,1772,405,671,379,696,380,1771,381,1772,380,1771,380,696,406,670,384,691,381,695,380,696,380,696,380,695,381,696,379,696,380,1772,406,669,407,669,380,696,380,696,380,1772,406,669,407,669,407,669,380,696,405,671,405,670,380,696,380,696,380,695,408,668,406,669,381,695,380,697,379,696,380,696,407,669,405,671,380,695,408,668,405,1746,381,695,380,695,381,1772,380,696,406,669,380,696,380,1771,406,1746,380,1771,381,1771,406,670,380,696,406,670,405,671,380,695,381,695,407,669,379,697,405,670,380,696,406,670,380,696,407,668,380,696,407,669,405,671,405,670,381,1771,407,673,376,696,380,695,381,695,406,670,380,696,407,669,405,670,381,695,406,670,405,671,406,670,407,668,407,669,380,696,406,670,405,671,380,695,406,670,380,696,405,670,381,696,406,668,407,670,380,695,381,695,380,1772,380,1771,408,1744,407,1745,380,1771,380,696,380,696,380,695,407}, //18C +{5069,2105,380,1771,380,696,406,670,379,697,404,1747,380,696,407,669,380,696,406,670,379,1772,380,696,406,1745,380,1772,406,670,406,1745,406,1746,406,1746,379,1773,379,1772,380,696,379,1773,404,671,380,696,386,690,405,670,405,672,404,671,379,1773,379,696,407,670,379,1771,406,671,406,669,406,670,380,1773,378,696,380,696,380,696,379,697,380,696,379,696,405,670,406,671,379,697,379,696,380,696,380,696,406,670,379,696,380,1772,380,1772,380,1771,380,696,380,695,380,1773,379,697,379,29360,5065,2130,380,1773,379,697,379,697,379,696,379,1771,381,696,380,696,405,672,378,697,379,1772,379,697,379,1772,380,1772,405,672,378,1772,380,1772,380,1771,380,1772,380,1772,379,696,407,1745,380,696,380,697,404,670,380,696,380,697,379,696,379,1773,378,697,380,697,378,1772,407,670,379,697,379,697,378,697,379,697,404,672,381,694,380,696,405,670,380,1775,377,1771,380,697,379,696,380,1772,405,1746,380,1772,380,696,379,697,404,672,379,697,405,671,379,696,379,697,379,696,380,697,379,1772,379,697,379,696,380,697,406,668,380,1772,380,697,379,696,380,696,379,697,379,696,380,697,378,697,380,696,379,696,380,697,379,696,379,697,380,696,379,698,378,697,378,697,380,695,380,696,380,697,379,696,379,1773,379,697,379,1772,379,697,379,697,379,697,379,1772,379,1773,379,1773,379,1772,379,697,379,697,404,672,405,670,379,697,379,697,379,697,378,697,406,670,379,696,380,696,380,696,380,696,379,696,380,696,406,670,379,697,379,1773,379,697,404,672,378,697,379,697,379,697,379,696,380,695,380,696,380,697,379,697,379,695,380,696,380,696,380,697,380,695,379,696,380,697,379,697,379,696,380,696,379,697,379,697,379,696,380,696,407,669,379,697,379,1772,380,696,379,696,383,693,380,695,381,1772,380,695,406,670,380}, //19C +{5087,2108,380,1772,406,670,379,696,380,696,380,1772,379,697,379,697,379,696,407,669,379,1772,380,697,379,1773,378,1772,380,696,380,1771,380,1772,380,1772,379,1772,407,1745,380,695,380,1773,379,696,380,696,379,697,379,696,406,671,379,696,407,1745,405,671,379,697,379,1772,379,697,379,696,380,697,379,1772,379,697,379,697,379,697,378,697,379,697,379,696,379,696,381,696,379,697,406,669,380,697,379,697,382,693,380,695,380,1773,378,1773,379,1772,380,696,406,671,378,1772,380,697,379,29360,5065,2130,380,1773,379,696,405,670,380,697,379,1772,380,696,380,695,380,697,379,696,406,1747,378,697,379,1773,378,1773,379,697,379,1772,405,1747,379,1772,380,1772,379,1773,379,696,380,1772,379,697,378,697,406,670,379,697,379,696,380,696,380,1771,380,696,380,696,380,1772,380,696,379,697,379,696,380,696,380,696,379,697,379,697,379,697,379,696,379,1773,379,1773,404,671,379,697,379,1772,405,1747,380,1771,380,696,380,697,384,692,378,697,379,697,379,697,379,696,379,697,379,697,379,1772,379,697,379,697,379,696,380,696,380,1772,379,696,380,696,380,697,378,697,379,697,379,697,379,697,378,697,405,671,379,698,378,697,379,696,379,696,380,697,379,697,379,696,379,697,379,697,379,697,379,1772,379,1773,379,697,404,1747,379,697,379,696,379,698,404,1747,379,1773,378,1772,380,1773,379,697,433,643,379,696,379,697,379,696,380,696,379,696,380,697,379,697,379,696,379,697,405,671,379,696,380,697,383,693,404,671,379,697,379,1777,375,697,378,697,405,671,379,697,379,697,403,672,379,696,380,697,379,696,379,697,379,697,379,697,379,697,379,696,406,670,379,697,379,696,380,697,378,698,379,696,379,697,379,697,379,697,378,697,379,697,379,696,380,1772,379,1773,379,697,378,697,379,697,379,1772,380,697,379,696,380}, //20C +{5043,2130,407,1745,407,669,379,696,381,695,405,1747,380,695,406,670,406,670,380,696,406,1745,380,697,405,1745,406,1746,406,670,406,1746,405,1746,406,1745,407,1745,407,1745,390,686,380,1772,405,670,406,670,380,695,380,696,380,697,405,670,406,1745,408,668,405,670,407,1745,393,683,406,670,380,696,406,1745,380,696,406,670,405,670,381,696,379,696,380,696,406,669,408,669,406,670,379,696,380,697,379,696,406,670,405,670,384,1768,406,1746,380,1770,407,670,405,670,406,1746,380,696,405,29336,5064,2130,380,1772,406,670,405,671,395,680,380,1772,406,670,380,696,380,696,379,696,380,1772,405,671,406,1746,379,1772,379,696,380,1771,381,1772,405,1746,380,1771,380,1772,380,697,405,1745,380,696,380,696,380,696,380,696,407,669,379,696,380,1771,381,695,380,696,380,1771,380,696,380,697,379,696,380,696,405,671,379,697,379,696,380,696,406,669,380,1772,406,1746,382,694,405,671,379,1772,380,1771,381,1771,380,697,405,669,381,695,405,672,405,671,379,696,405,671,405,670,380,696,380,1771,381,696,379,695,381,696,380,695,380,1773,405,670,380,696,406,669,407,670,379,696,380,696,380,696,380,696,379,696,380,696,380,697,405,670,406,669,406,671,379,695,381,696,380,696,379,697,379,696,380,696,380,695,380,1771,381,1771,406,671,379,696,380,696,380,1771,380,1772,380,1771,380,1772,380,696,405,670,381,696,405,670,380,697,406,669,380,695,381,695,380,697,379,696,380,696,379,697,379,697,406,669,407,668,381,696,405,670,380,1772,380,696,380,696,379,697,405,670,380,696,379,697,379,696,380,696,380,696,380,696,404,672,379,697,406,669,380,695,407,670,379,696,406,670,380,695,381,696,384,692,404,671,407,669,380,695,406,671,405,670,380,696,380,1771,380,696,407,1745,380,696,379,697,405,1746,380,696,407,669,405}, //21C +{5042,2131,379,1773,378,699,377,697,402,674,379,1773,381,694,379,698,378,697,379,697,379,1772,406,670,379,1772,379,1773,379,697,379,1772,379,1773,378,1774,378,1774,378,1772,380,697,378,1773,379,698,378,697,379,697,379,697,378,698,405,670,379,1772,379,698,378,697,379,1773,378,698,378,697,379,697,379,1773,405,670,379,697,379,697,379,697,379,697,378,697,379,697,379,697,405,670,380,697,378,697,379,696,380,697,378,698,378,1774,378,1772,405,1748,378,697,379,697,378,1773,380,697,378,29362,5090,2103,381,1771,380,696,380,696,384,691,381,1771,380,696,405,671,380,696,379,696,380,1772,384,691,381,1771,406,1745,407,669,406,1746,407,1744,407,1745,406,1746,406,1745,406,669,407,1745,407,670,404,671,407,669,405,670,381,695,406,670,406,1746,405,670,380,696,380,1772,380,695,407,669,406,670,406,670,405,671,406,669,406,670,384,692,380,695,381,1770,406,1746,380,696,380,697,406,1744,407,1745,406,1746,406,670,379,696,398,678,379,698,377,698,378,697,379,697,378,698,378,698,377,1774,377,699,351,726,349,726,350,726,349,1802,349,728,348,731,344,728,348,728,347,729,371,704,372,705,372,702,373,704,373,702,373,703,373,702,374,702,373,703,373,703,374,701,374,703,373,702,373,703,373,1778,374,702,373,1778,373,1779,373,703,372,704,371,706,369,1781,371,1780,347,1805,347,1804,347,730,346,729,347,729,347,731,345,728,348,728,347,729,347,729,347,728,373,703,373,703,373,703,374,701,374,702,374,702,375,701,375,700,376,1776,376,700,376,699,377,699,377,699,377,698,378,698,377,698,384,693,377,698,378,697,405,671,389,692,374,697,404,672,404,671,404,672,404,672,403,673,403,672,378,698,404,672,403,673,403,673,377,698,403,673,403,673,403,1748,403,1749,402,1749,377,699,402,674,377,1775,401,675,376,699,376}, //22C +{5043,2131,379,1772,380,697,379,697,378,697,379,1772,380,697,378,697,379,697,379,697,379,1772,379,697,379,1772,380,1772,379,698,378,1772,406,1746,379,1772,380,1772,379,1772,380,697,379,1772,379,698,378,698,378,697,379,697,379,696,379,697,379,1772,380,696,380,697,382,1768,380,697,379,696,379,697,379,1772,380,696,406,670,380,695,380,697,379,696,380,696,379,696,380,697,379,696,379,696,381,696,379,697,379,697,379,696,379,1772,380,1773,379,1773,404,671,379,697,379,1773,378,696,380,29382,5043,2131,404,1748,379,696,380,697,379,696,405,1746,380,696,379,697,379,697,379,697,379,1772,379,697,379,1772,380,1772,379,697,379,1772,380,1772,379,1773,379,1772,379,1772,380,696,380,1772,379,697,379,696,380,697,379,697,379,695,380,697,379,1771,381,696,406,669,380,1772,379,698,378,697,379,697,379,697,379,696,379,697,379,697,379,696,380,695,380,1773,379,1771,381,695,381,696,379,1772,380,1772,379,1773,378,697,380,697,378,697,379,696,380,697,379,696,379,697,379,697,379,697,379,1772,379,697,379,697,379,697,379,697,378,1773,379,696,379,697,406,671,378,697,379,697,379,696,380,697,378,697,379,697,379,697,379,696,379,697,379,696,380,696,380,697,378,698,378,697,379,696,380,696,380,696,380,1772,379,1773,379,1773,404,671,379,696,380,697,378,1773,379,1772,380,1772,379,1772,380,695,381,696,405,671,379,697,379,696,380,696,380,696,379,697,379,696,379,697,379,698,378,697,378,697,380,697,378,697,379,697,379,697,379,1772,379,698,378,697,379,697,378,698,379,696,379,698,378,697,379,696,406,671,379,697,378,697,379,697,379,697,379,696,379,696,380,697,379,697,378,697,379,696,380,697,379,696,380,696,380,696,379,697,380,696,379,697,379,1771,380,696,380,697,379,1772,379,697,379,1772,407,670,379,696,405}, //23C +{5034,2137,375,1778,398,679,397,677,373,703,373,1780,373,703,371,703,372,706,397,705,345,1779,373,705,369,1807,344,1781,399,678,370,1781,397,1754,371,1781,380,1770,372,1808,344,706,370,1780,371,707,368,733,343,733,371,678,371,703,372,732,370,1781,370,705,346,731,369,1759,368,731,370,706,344,732,344,1808,343,732,344,707,394,707,345,731,370,680,396,705,344,732,343,706,370,733,370,679,370,706,370,733,343,731,345,731,371,1781,344,1808,342,1783,394,709,342,733,343,1808,344,732,344,29393,5032,2140,397,1781,343,709,368,732,342,734,341,1810,343,733,341,735,343,733,367,710,340,1839,311,735,344,1781,369,1810,342,733,370,1783,365,1785,343,1811,341,1809,336,1789,368,735,341,1809,342,734,341,737,367,708,368,708,341,735,342,732,369,1784,341,734,340,736,342,1810,339,737,368,706,343,734,342,732,342,735,343,733,342,734,340,735,342,735,342,1808,343,1808,370,710,341,704,372,1807,342,1810,371,1780,345,704,371,732,343,733,344,731,345,731,342,734,371,677,372,731,343,733,370,1754,398,679,371,703,372,704,372,704,373,1778,372,703,374,703,399,676,373,704,397,678,372,703,403,673,374,702,400,675,399,677,400,676,400,675,399,677,401,675,427,649,374,701,401,675,401,674,402,675,402,1750,401,1750,401,1751,404,1747,403,674,401,673,376,700,402,1750,401,1750,375,1777,375,1777,374,701,375,701,403,673,402,673,402,674,404,672,376,700,403,673,403,672,403,673,405,671,403,672,406,670,377,699,376,699,404,672,377,699,433,1719,404,672,403,673,375,700,404,672,404,672,406,670,402,673,405,671,405,671,403,672,433,643,430,647,402,673,406,669,406,671,404,671,406,670,406,670,404,671,379,698,433,642,403,673,402,674,377,698,378,698,404,672,403,1748,406,1746,403,673,406,1745,377,700,377,1774,406,670,377,698,405}, //24C +{5069,2103,406,1746,406,669,407,669,407,669,380,1772,407,668,381,696,380,695,380,696,380,1771,406,670,381,1771,406,1745,380,696,385,1767,380,1771,381,1771,406,1745,381,1771,407,669,406,1745,380,696,406,670,380,696,406,670,406,670,381,694,407,1745,400,676,405,671,405,1746,380,696,380,695,407,670,379,1772,407,668,381,696,379,696,407,670,406,669,380,696,380,696,406,672,402,671,384,692,407,669,382,694,405,670,406,669,407,1745,406,1746,380,1772,405,670,406,670,380,1772,380,695,380,29383,5043,2130,407,1744,406,671,379,696,407,668,381,1772,380,696,379,697,406,669,380,696,380,1772,405,670,406,1746,405,1747,379,697,404,1746,406,1746,380,1772,380,1771,380,1772,380,696,380,1771,406,671,405,671,379,695,380,697,379,697,405,670,380,1772,379,696,380,697,404,1747,380,695,380,696,406,670,380,696,405,671,407,669,405,670,380,695,380,696,380,1772,405,1747,405,671,406,669,380,1772,406,1750,375,1772,406,670,405,670,380,696,406,670,380,696,380,695,380,697,379,696,380,696,406,1746,405,670,407,670,379,696,406,669,380,1772,380,696,406,671,404,670,380,696,380,696,380,696,386,690,379,696,407,670,405,670,380,695,406,670,380,696,396,680,380,696,380,696,405,671,405,670,380,696,380,696,405,670,380,696,380,696,380,1771,380,696,380,696,405,1747,379,1772,380,1771,407,1745,380,696,380,696,380,696,407,668,407,669,380,696,406,670,405,670,380,696,380,696,380,696,406,673,402,670,380,696,405,671,406,670,380,695,380,1772,406,670,405,671,380,695,380,696,380,696,405,671,379,697,407,668,380,696,393,683,380,695,380,697,379,696,380,696,380,696,379,697,379,696,380,696,380,695,380,697,379,696,380,696,380,696,379,697,379,696,380,696,380,1772,380,695,406,1746,380,1771,380,697,379,1772,380,696,379,697,379}, //2C5C +{5043,2131,380,1772,379,696,380,696,379,698,378,1772,380,696,380,696,379,697,379,696,380,1772,379,697,379,1773,379,1772,380,696,379,1772,388,1763,381,1771,380,1772,379,1773,379,697,379,1772,379,697,405,670,380,696,380,696,405,671,380,696,383,1768,380,696,380,696,379,1772,380,696,379,697,379,697,379,1772,407,669,380,696,379,696,380,696,407,670,378,697,379,697,380,695,379,697,379,697,379,697,405,671,379,697,379,696,379,1773,379,1772,379,1773,379,696,380,697,379,1772,379,697,379,29383,5043,2130,380,1771,380,696,379,697,379,697,379,1772,380,696,379,697,380,696,379,697,379,1772,379,696,380,1772,380,1772,379,697,379,1772,379,1773,380,1771,380,1772,380,1771,381,695,379,1772,406,670,380,696,380,695,380,697,379,697,379,697,403,1748,379,697,380,696,406,1745,378,698,380,696,379,696,380,697,404,670,381,696,379,697,379,696,380,696,379,1772,380,1772,380,696,379,697,379,1772,407,1745,380,1771,380,696,406,669,407,669,381,695,380,695,381,696,405,671,379,696,380,696,406,1746,380,695,406,671,379,695,381,695,381,1771,381,695,380,695,380,697,380,695,380,696,380,696,380,695,381,695,380,696,380,696,406,670,380,695,407,669,381,695,402,674,380,696,406,669,381,696,405,670,380,1771,406,669,382,695,406,670,380,1771,381,695,380,695,407,1745,380,1771,407,1745,406,1746,380,695,381,695,406,670,406,669,381,696,406,669,380,696,407,669,406,669,407,669,406,670,407,669,405,670,381,695,406,670,407,669,406,670,406,1745,406,670,379,697,380,695,381,695,406,670,380,696,393,682,380,696,380,696,380,696,380,696,404,671,380,696,382,694,379,697,379,696,380,696,405,671,379,697,379,696,380,696,379,697,378,698,377,699,378,698,377,699,376,1775,350,1802,350,1801,350,1801,350,726,349,1803,349,727,374,702,372}, //26C +{5039,2132,379,1772,379,697,379,696,379,697,379,1772,379,697,379,697,379,696,380,696,379,1773,379,697,379,1772,379,1772,380,697,379,1772,379,1773,379,1772,379,1773,379,1772,380,696,380,1772,379,696,380,696,380,696,380,696,380,696,379,696,380,1772,379,697,379,697,379,1772,380,696,379,697,379,697,379,1772,380,696,379,696,380,696,379,697,380,695,380,696,380,696,379,696,380,696,380,696,380,695,381,696,379,696,380,696,379,1772,380,1771,380,1772,380,696,379,697,379,1772,379,697,379,29381,5042,2131,379,1773,378,697,433,643,432,644,378,1773,432,644,433,642,434,643,431,644,379,1772,435,641,433,1719,432,1719,433,643,434,1717,433,1719,433,1718,379,1773,433,1718,378,698,378,1773,379,698,432,644,431,644,432,644,433,643,433,642,433,1718,432,644,432,644,432,1719,433,643,433,643,432,644,434,642,433,642,432,644,434,642,431,645,433,643,401,1749,434,1718,432,644,430,646,432,1719,378,1773,432,1720,433,642,432,644,433,643,433,643,432,644,433,643,431,644,378,698,432,644,432,1719,432,643,462,614,379,697,433,643,433,1718,434,642,378,698,433,643,432,643,433,643,433,643,432,644,431,644,433,643,433,643,378,698,431,645,433,642,378,698,432,644,432,643,432,645,432,643,433,642,404,673,432,1719,433,643,432,643,432,1719,434,643,432,644,432,1719,378,1773,379,1773,378,1773,379,697,433,643,434,642,431,644,432,644,433,643,433,642,430,646,379,697,432,644,432,643,434,642,433,643,432,644,432,643,434,642,431,644,433,1719,433,643,378,699,431,644,432,643,433,644,429,645,434,642,432,644,433,643,433,643,431,645,434,641,432,644,431,645,378,698,432,643,433,642,434,642,433,643,379,697,433,642,434,643,432,643,432,644,431,645,431,645,431,1720,432,643,433,643,433,643,431,1720,379,1773,433,643,431,645,430}, //27C +{5043,2130,405,1746,381,695,380,696,380,696,380,1771,380,697,379,696,380,696,380,695,380,1772,380,696,405,1747,379,1772,380,695,381,1771,406,1745,381,1772,379,1772,380,1771,380,697,379,1772,380,695,381,696,379,696,409,668,379,696,380,695,407,1745,405,672,379,696,380,1771,380,696,380,696,380,695,381,1771,380,697,404,671,380,696,380,695,380,696,380,695,381,696,380,696,379,696,380,696,380,695,381,695,380,697,379,696,380,1771,381,1771,380,1772,379,697,379,696,380,1771,381,696,405,29356,5044,2130,380,1771,381,695,380,695,381,696,380,1772,405,670,380,695,381,696,379,696,380,1771,435,642,380,1771,380,1772,380,696,379,1772,380,1771,381,1772,404,1746,381,1772,380,696,379,1772,380,696,380,696,379,696,380,695,381,696,380,695,381,1771,380,696,380,695,406,1745,381,696,380,695,381,696,379,696,380,696,380,696,380,696,379,697,379,695,381,1772,380,1771,380,696,380,696,380,1772,379,1772,380,1771,380,697,379,696,380,695,381,695,406,670,407,669,380,696,380,696,380,695,380,1772,380,695,381,696,379,697,379,696,380,1772,380,696,380,695,380,696,380,697,379,695,380,697,379,696,380,695,408,669,380,696,379,696,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,380,1771,381,1771,380,697,379,696,380,1771,380,696,406,670,380,1771,380,1772,380,1772,380,1771,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,695,380,696,380,696,380,696,380,695,381,696,379,696,380,696,380,696,380,695,380,1771,381,696,406,669,380,697,379,696,380,696,380,695,381,696,379,696,380,696,407,669,380,696,380,695,380,696,405,671,380,696,435,640,380,695,381,696,380,695,380,696,380,696,380,696,406,669,381,695,380,697,379,696,380,1771,380,1772,380,696,432,644,380,1770,381,1771,381,694,381,696,380}, //28C +{5070,2104,407,1745,379,696,379,697,379,697,378,1774,378,698,378,696,407,671,377,697,434,1719,378,697,379,1773,379,1772,378,698,379,1773,378,1773,379,1772,379,1773,379,1772,379,698,378,1773,379,697,379,697,378,698,378,697,379,697,379,697,378,1773,380,696,378,699,378,1772,379,697,379,697,379,697,379,1772,379,697,379,697,378,697,379,698,378,697,378,698,378,697,379,697,379,697,379,697,379,696,380,697,379,697,378,696,380,1772,380,1772,405,1746,406,670,380,696,380,1772,406,669,380,29383,5042,2131,379,1772,380,696,405,671,380,695,381,1771,380,696,380,696,379,696,406,670,380,1772,405,670,381,1771,406,1746,380,695,380,1772,380,1772,405,1746,380,1771,380,1772,380,695,381,1771,380,697,378,697,380,696,379,696,381,696,379,696,380,1771,381,696,379,696,380,1772,379,697,379,696,380,696,406,670,380,696,379,696,380,696,380,696,379,697,406,1745,380,1771,380,697,379,700,376,1772,380,1771,380,1772,406,670,380,696,379,696,380,696,380,696,406,669,381,696,379,696,407,669,380,1771,381,695,380,696,379,697,380,696,379,1772,380,696,380,696,380,696,379,696,380,696,380,696,380,696,380,695,380,696,380,696,380,695,380,697,379,696,380,696,380,696,380,696,379,696,380,696,380,696,380,696,380,696,379,1772,380,695,380,1772,380,696,380,696,379,1772,380,1772,380,1772,379,1772,380,696,405,671,405,670,406,670,380,696,380,696,379,699,404,669,380,695,380,697,380,695,381,695,407,670,379,696,379,696,380,696,380,696,380,1772,379,697,379,696,380,696,380,696,380,695,407,670,379,697,379,696,380,696,380,696,379,696,380,696,380,696,379,696,380,697,379,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,381,695,380,696,380,696,379,1772,380,696,380,1771,380,697,379,1772,380,1771,380,697,379,696,380}, //29C +{5042,2131,384,1768,405,670,380,695,381,696,380,1771,380,696,406,669,380,697,405,670,406,1745,406,671,379,1771,381,1772,380,696,380,1770,407,1745,407,1745,406,1746,380,1771,407,669,380,1772,380,696,405,670,383,693,380,696,405,670,406,670,406,1746,380,696,405,671,379,1771,407,670,407,669,405,670,380,1771,381,696,380,695,380,696,380,695,381,696,406,670,379,696,380,695,381,696,380,696,405,670,405,672,379,696,380,696,405,1746,380,1772,379,1773,379,697,379,696,406,1746,405,671,406,29355,5044,2129,381,1771,406,670,405,671,380,695,380,1771,381,695,381,695,380,697,388,687,380,1771,381,696,379,1771,381,1771,380,696,380,1772,380,1771,380,1772,380,1771,406,1746,407,669,380,1772,380,696,379,697,379,696,380,696,379,696,407,669,380,1772,403,672,380,696,380,1771,380,695,407,670,380,696,380,696,405,670,381,696,379,696,382,694,405,671,406,1745,380,1772,405,670,381,695,407,1745,406,1746,405,1745,381,696,380,696,379,697,380,695,406,670,380,695,406,670,380,696,380,696,380,1772,379,697,379,696,407,669,380,696,379,1772,380,696,380,696,380,695,406,670,380,695,381,695,381,696,379,697,406,669,380,696,407,669,379,696,380,696,380,696,380,695,406,671,379,697,383,691,381,696,380,1771,380,697,379,1772,384,692,406,1744,381,695,408,668,380,1772,405,1746,381,1771,380,1772,379,697,379,697,379,697,379,696,380,696,379,696,380,696,380,696,380,695,407,669,380,697,406,670,379,696,405,671,379,696,380,696,380,697,379,1772,405,671,406,669,380,696,380,695,381,695,380,696,380,696,380,696,380,695,380,696,380,696,380,696,379,696,380,697,379,696,380,696,380,696,379,695,381,696,380,696,380,696,407,669,379,696,380,696,380,696,380,696,407,1744,380,1772,380,1772,379,696,405,1746,380,1772,405,672,379,700,375}, //30C +{5043,2131,379,1772,380,696,379,697,406,670,379,1773,379,696,379,696,380,696,380,696,380,1771,380,697,379,1771,381,1771,380,696,380,1772,405,1746,380,1771,407,1746,381,1770,406,670,379,1772,406,670,380,696,380,696,379,697,379,696,380,697,405,1746,379,697,379,697,404,1747,379,697,379,697,379,696,380,1772,379,697,379,697,405,669,381,696,379,697,379,697,379,696,380,696,380,695,380,697,379,697,405,670,380,696,379,697,379,1772,380,1772,379,1772,380,696,379,698,378,1773,379,697,378,29383,5042,2131,380,1771,380,697,379,696,380,696,380,1772,379,696,380,696,403,674,378,697,379,1772,380,696,380,1772,379,1773,379,696,380,1772,379,1773,379,1772,379,1772,380,1773,378,696,380,1772,380,697,378,696,406,671,379,696,380,696,380,695,380,1772,380,696,380,696,380,1771,405,671,380,696,380,696,405,671,379,696,405,671,380,696,379,697,379,697,379,1773,379,1772,381,695,379,696,406,1746,379,1772,380,1772,379,697,379,696,380,697,378,697,379,696,380,696,380,696,379,696,407,669,405,1747,380,696,380,696,379,696,380,697,379,1772,407,668,404,672,380,696,380,696,380,696,379,697,379,697,379,697,379,696,379,696,380,697,379,697,379,697,378,697,379,697,379,696,405,672,378,697,379,697,406,670,379,1771,380,1773,405,671,379,1772,379,697,379,696,380,1773,378,1773,379,1772,379,1773,379,696,380,696,380,696,379,697,380,695,380,696,395,681,379,697,379,698,378,697,379,696,379,697,380,696,379,696,380,696,406,670,379,697,379,1772,406,670,379,697,379,697,379,696,379,697,380,695,380,697,379,696,380,695,381,696,405,671,379,696,380,696,380,695,380,697,379,696,380,696,380,696,380,696,379,696,380,696,379,697,380,696,379,696,380,696,380,696,380,1772,379,696,380,696,380,1772,379,1773,405,1746,379,696,380,696,380}, //31C +{5043,2131,379,1772,380,696,405,671,405,670,380,1772,380,696,379,697,405,670,380,696,407,1744,380,697,379,1772,406,1746,406,669,405,1747,405,1746,407,1745,380,1771,407,1744,381,696,380,1772,379,697,379,695,408,669,406,669,380,696,380,696,380,1772,380,695,380,696,380,1772,405,670,380,696,380,696,380,1771,406,671,405,670,406,670,380,696,405,670,406,670,407,669,380,696,405,671,379,697,405,670,380,696,380,696,404,672,379,1772,406,1745,406,1746,406,671,404,671,406,1745,407,669,405,29356,5044,2130,380,1771,407,670,405,670,380,696,380,1772,380,696,379,696,407,670,379,695,381,1772,380,695,406,1746,406,1745,380,696,380,1771,407,1745,380,1772,380,1771,406,1746,405,671,380,1771,406,670,409,667,380,695,380,696,380,697,379,696,380,1771,380,697,379,696,380,1772,380,696,379,697,379,697,379,696,380,695,406,670,406,670,380,696,406,669,381,1771,380,1772,379,697,405,670,407,1745,380,1771,406,1746,380,696,379,696,407,670,379,695,381,695,380,697,379,697,379,696,380,696,405,1747,406,669,380,696,380,696,405,670,380,1771,381,696,380,696,405,670,380,697,379,697,379,696,388,688,379,696,380,696,380,695,381,696,379,696,405,672,406,668,407,670,379,696,380,696,408,667,381,696,405,1746,406,1745,406,1747,379,696,380,1772,379,697,405,670,380,1772,405,1746,380,1771,381,1771,406,671,379,696,380,696,379,696,380,696,380,696,405,671,379,697,379,697,379,696,380,696,380,696,379,696,380,696,380,697,379,696,379,697,406,1745,380,696,380,696,380,695,380,697,379,696,380,696,405,670,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,696,379,697,379,696,380,695,381,695,380,697,405,669,381,696,380,696,379,696,380,696,380,696,380,1772,379,1773,379,695,389,1764,405,1746,406,1745,407,670,379,696,380} //32C }, // Fan Speed High { - {8978, 4504, 561, 548, 587, 549, 586, 1650, 587, 549, 586, 1650, 586, 550, 586, 549, 586, 566, 586, 550, 586, 1649, 587, 549, 585, 1651, 586, 550, 585, 550, 586, 550, 584, 568, 585, 550, 585, 550, 584, 552, 583, 552, 584, 550, 585, 551, 584, 551, 585, 568, 584, 550, 559, 576, 585, 551, 560, 576, 583, 551, 559, 577, 558, 577, 584, 568, 584, 551, 584, 552, 584, 551, 558, 577, 558, 577, 559, 577, 558, 577, 558, 599, 558, 577, 558, 577, 584, 552, 558, 564, 559}, // 15C - {8978, 4503, 563, 546, 588, 546, 590, 1647, 589, 546, 590, 1647, 589, 546, 590, 545, 590, 563, 589, 546, 589, 1647, 590, 545, 590, 1647, 589, 546, 589, 547, 589, 545, 589, 1665, 589, 546, 589, 546, 589, 547, 589, 546, 589, 546, 589, 547, 588, 547, 589, 563, 589, 545, 589, 547, 589, 546, 589, 547, 588, 546, 589, 547, 589, 546, 589, 563, 589, 546, 589, 547, 589, 545, 589, 547, 588, 547, 588, 548, 588, 546, 589, 568, 589, 1648, 589, 1647, 589, 1648, 589, 1635, 589}, // 16C - {8978, 4447, 561, 549, 587, 548, 588, 1648, 588, 547, 588, 1648, 589, 546, 589, 547, 588, 564, 588, 548, 588, 1648, 588, 548, 588, 1648, 588, 547, 588, 547, 589, 1648, 588, 564, 587, 548, 588, 548, 587, 548, 587, 548, 587, 549, 587, 547, 587, 549, 587, 564, 588, 547, 588, 548, 588, 548, 587, 547, 588, 548, 588, 547, 587, 552, 584, 565, 587, 548, 587, 547, 589, 547, 587, 548, 588, 547, 588, 547, 588, 548, 587, 569, 589, 1647, 589, 1649, 587, 1648, 589, 535, 589}, // 17C - {8978, 4523, 507, 602, 533, 602, 533, 1703, 534, 601, 534, 1704, 533, 601, 534, 601, 534, 618, 534, 601, 534, 1703, 534, 601, 534, 1703, 534, 601, 534, 601, 534, 1703, 534, 1719, 534, 601, 534, 602, 534, 601, 533, 602, 534, 602, 533, 602, 533, 602, 534, 618, 533, 602, 534, 602, 533, 601, 534, 602, 533, 602, 534, 601, 534, 601, 534, 618, 534, 601, 534, 602, 534, 601, 534, 601, 534, 601, 534, 602, 533, 601, 535, 623, 534, 1703, 533, 1703, 534, 601, 534, 1691, 533}, // 18C - {8978, 4502, 559, 550, 585, 551, 585, 1650, 587, 549, 586, 1649, 587, 549, 587, 549, 585, 567, 586, 549, 586, 1650, 586, 550, 585, 1652, 585, 550, 586, 1650, 586, 549, 586, 567, 586, 549, 586, 549, 587, 547, 587, 549, 587, 548, 587, 549, 586, 549, 586, 566, 586, 549, 586, 549, 586, 550, 585, 550, 586, 549, 586, 549, 586, 549, 586, 567, 585, 549, 586, 550, 585, 550, 586, 549, 586, 550, 587, 548, 586, 549, 586, 571, 586, 1650, 586, 1651, 586, 549, 586, 537, 586}, // 19C - {8978, 4502, 562, 547, 635, 500, 589, 1647, 589, 546, 589, 1648, 589, 546, 590, 545, 589, 563, 589, 547, 588, 1648, 589, 547, 588, 1648, 589, 547, 588, 1648, 589, 546, 589, 1664, 589, 547, 589, 546, 588, 547, 588, 547, 589, 546, 589, 547, 588, 547, 588, 564, 589, 547, 588, 546, 589, 546, 589, 547, 588, 548, 588, 546, 589, 546, 589, 564, 588, 547, 588, 547, 588, 547, 588, 547, 589, 546, 589, 546, 589, 547, 588, 568, 589, 1648, 589, 547, 588, 1648, 589, 1635, 589}, // 20C - {8978, 4502, 532, 577, 533, 602, 560, 1676, 560, 576, 559, 1677, 534, 602, 533, 601, 561, 592, 559, 576, 560, 1677, 558, 577, 560, 1676, 558, 578, 559, 1677, 560, 1677, 559, 594, 558, 577, 558, 577, 533, 602, 559, 576, 559, 576, 558, 577, 559, 577, 558, 594, 558, 577, 535, 600, 558, 577, 558, 577, 559, 576, 559, 577, 558, 577, 559, 593, 559, 576, 559, 576, 534, 601, 559, 577, 533, 601, 558, 578, 559, 577, 558, 598, 534, 1702, 534, 602, 558, 1679, 533, 590, 558}, // 21C - {8978, 4497, 562, 547, 588, 546, 589, 1648, 589, 546, 590, 1647, 589, 546, 589, 547, 589, 563, 588, 546, 590, 1648, 588, 547, 588, 1648, 589, 547, 588, 1647, 589, 1649, 589, 1664, 589, 546, 589, 547, 588, 547, 588, 546, 590, 546, 590, 546, 587, 547, 590, 562, 589, 546, 589, 547, 589, 546, 588, 547, 589, 547, 588, 546, 590, 546, 589, 563, 588, 547, 589, 546, 589, 547, 588, 548, 588, 546, 588, 547, 589, 547, 588, 569, 588, 1648, 589, 546, 589, 547, 588, 1636, 589}, // 22C - {8978, 4495, 564, 546, 589, 546, 589, 1648, 589, 546, 589, 1648, 588, 547, 589, 546, 589, 563, 589, 546, 590, 1646, 590, 546, 589, 1647, 590, 1646, 590, 546, 589, 546, 590, 563, 588, 547, 589, 546, 589, 546, 589, 546, 589, 546, 590, 545, 590, 546, 589, 563, 589, 546, 589, 547, 589, 545, 590, 545, 590, 546, 589, 546, 589, 546, 589, 564, 589, 545, 590, 545, 590, 546, 589, 546, 589, 546, 589, 546, 590, 546, 589, 568, 589, 1647, 590, 546, 589, 545, 590, 534, 589}, // 23C - {8978, 4501, 562, 547, 589, 546, 588, 1648, 589, 547, 588, 1649, 587, 548, 587, 547, 589, 564, 589, 546, 588, 1649, 588, 547, 588, 1649, 588, 1648, 589, 546, 588, 547, 588, 1665, 589, 547, 588, 548, 587, 548, 588, 547, 588, 547, 588, 547, 588, 548, 588, 564, 587, 547, 589, 547, 588, 547, 588, 547, 588, 548, 587, 548, 588, 547, 588, 564, 588, 547, 589, 546, 589, 547, 587, 547, 589, 547, 587, 548, 588, 548, 588, 569, 587, 548, 587, 1649, 588, 1649, 588, 1636, 588}, // 24C - {8978, 4502, 559, 548, 562, 574, 561, 1676, 560, 575, 561, 1676, 561, 574, 561, 574, 562, 590, 561, 575, 561, 1675, 586, 550, 560, 1676, 561, 1675, 560, 575, 561, 1676, 561, 592, 560, 575, 586, 548, 588, 548, 561, 574, 560, 575, 562, 573, 561, 574, 561, 591, 561, 575, 560, 576, 586, 548, 586, 550, 586, 548, 562, 574, 561, 574, 561, 592, 586, 548, 587, 548, 585, 551, 561, 574, 561, 574, 562, 574, 560, 575, 587, 569, 588, 548, 585, 1652, 585, 1651, 588, 535, 561}, // 25C - {8978, 4496, 507, 601, 534, 601, 534, 1703, 534, 602, 533, 1702, 534, 602, 534, 601, 533, 620, 533, 602, 533, 1703, 534, 601, 534, 1703, 533, 1704, 533, 602, 533, 1703, 533, 1720, 534, 602, 533, 602, 533, 602, 534, 601, 534, 602, 533, 601, 535, 600, 534, 619, 534, 601, 534, 601, 534, 601, 534, 601, 534, 602, 533, 602, 534, 601, 534, 618, 534, 601, 534, 602, 533, 602, 534, 602, 533, 601, 534, 602, 534, 601, 534, 623, 533, 603, 533, 1702, 535, 601, 533, 1691, 534}, // 26C - {8978, 4501, 533, 576, 560, 575, 560, 1677, 560, 575, 559, 1677, 560, 575, 560, 576, 559, 592, 560, 576, 560, 1676, 561, 575, 559, 1677, 560, 1676, 561, 1676, 560, 576, 559, 593, 559, 576, 559, 576, 560, 575, 560, 575, 560, 576, 559, 575, 560, 576, 559, 593, 560, 575, 560, 576, 559, 575, 560, 576, 560, 575, 560, 576, 559, 576, 559, 593, 560, 575, 559, 575, 560, 576, 559, 576, 560, 575, 560, 576, 559, 576, 560, 597, 560, 575, 559, 1678, 559, 576, 559, 564, 560}, // 27C - {8978, 4496, 562, 547, 589, 547, 588, 1648, 589, 546, 589, 1647, 589, 547, 589, 546, 588, 565, 588, 546, 588, 1648, 590, 546, 588, 1649, 588, 1649, 588, 1648, 588, 547, 589, 1664, 588, 548, 588, 547, 592, 543, 588, 547, 589, 547, 588, 547, 588, 547, 588, 564, 588, 548, 588, 547, 588, 547, 588, 546, 589, 547, 588, 547, 589, 546, 589, 564, 588, 547, 588, 547, 588, 547, 588, 548, 588, 546, 589, 547, 588, 547, 588, 569, 588, 547, 588, 548, 588, 1648, 589, 1636, 588}, // 28C - {8978, 4503, 507, 601, 534, 601, 534, 1702, 534, 602, 534, 1703, 533, 602, 533, 602, 533, 619, 534, 601, 558, 1679, 534, 601, 557, 1680, 533, 1704, 533, 1703, 534, 1702, 534, 618, 534, 601, 534, 602, 534, 601, 534, 602, 533, 601, 534, 602, 533, 602, 533, 619, 534, 601, 534, 602, 533, 602, 534, 601, 533, 602, 534, 602, 533, 601, 535, 617, 534, 602, 534, 601, 534, 601, 534, 602, 533, 601, 534, 602, 557, 578, 534, 624, 533, 601, 559, 577, 533, 1703, 534, 590, 533}, // 29C - {8978, 4502, 534, 575, 562, 573, 561, 1675, 561, 575, 560, 1676, 561, 575, 560, 574, 562, 591, 560, 575, 560, 1676, 562, 574, 560, 1676, 561, 1675, 562, 1675, 561, 1676, 560, 1693, 561, 575, 561, 574, 560, 575, 561, 575, 560, 574, 561, 575, 560, 575, 561, 591, 561, 574, 561, 575, 560, 574, 561, 575, 563, 572, 560, 576, 560, 574, 561, 592, 560, 574, 561, 575, 561, 574, 561, 573, 562, 575, 561, 574, 560, 575, 560, 597, 560, 575, 561, 574, 561, 575, 560, 1664, 561} // 30C - + {5043,2130,380,1772,380,696,404,671,406,670,380,1771,380,696,406,670,379,696,406,670,380,1771,407,670,379,1772,405,1746,406,670,406,1746,386,1765,406,1745,380,1772,380,1771,380,697,406,1745,379,697,380,694,407,670,406,670,405,670,405,672,379,1771,381,696,379,696,379,1773,379,696,380,695,381,695,380,1771,407,670,380,695,380,696,380,696,380,695,381,695,380,696,380,696,380,696,379,696,407,669,380,696,380,695,406,670,380,1772,380,1771,380,1772,380,695,380,696,380,1771,381,695,380,29381,5043,2130,380,1772,380,695,381,695,380,696,406,1745,380,697,379,696,406,670,379,696,380,1772,380,696,379,1771,381,1771,381,694,407,1746,405,1746,384,1768,379,1772,407,1744,381,695,380,1771,381,696,380,696,379,696,380,696,406,669,380,696,380,1772,406,669,380,696,380,1772,380,696,379,696,406,670,379,697,405,671,379,696,406,670,407,669,383,693,379,1772,380,1770,408,669,380,696,379,1772,380,1772,405,1746,405,671,379,697,379,696,380,695,381,696,380,695,406,670,407,669,406,670,380,1771,380,696,382,693,380,697,379,696,380,1770,381,696,380,696,380,696,406,670,379,696,380,696,405,671,379,697,379,696,380,696,380,695,406,671,379,696,406,669,406,671,379,696,380,696,407,669,380,696,405,1746,380,1772,405,1745,381,695,406,670,380,696,380,696,379,1772,380,1772,405,1746,380,1771,381,1771,406,669,406,1746,380,696,380,695,381,696,379,696,380,696,380,695,406,671,405,670,380,696,409,667,379,697,379,696,406,670,379,696,406,1745,381,696,380,696,379,696,406,670,405,671,405,670,380,696,406,670,380,695,407,670,404,671,407,669,380,696,379,696,406,670,380,695,380,696,380,696,380,696,380,695,407,669,407,669,380,696,380,696,406,670,405,670,406,1745,380,1772,380,696,379,1772,380,695,381,1770,408,1746,379,696,379}, //16C + {5043,2130,405,1746,380,697,379,696,380,696,405,1746,405,671,379,696,407,669,406,670,406,1745,380,696,380,1771,381,1771,380,696,380,1771,380,1772,380,1771,380,1772,405,1746,380,696,380,1772,380,696,379,697,379,696,405,671,379,696,380,696,379,1773,379,697,379,696,380,1772,406,669,406,669,381,696,379,1772,380,696,380,696,405,670,380,696,380,696,380,696,379,696,380,696,380,696,379,697,379,696,380,695,380,697,379,696,407,1743,409,1744,380,1771,380,696,380,696,405,1747,406,669,380,29357,5067,2130,380,1771,380,697,379,696,380,696,379,1772,380,696,380,695,405,672,379,696,380,1771,406,670,407,1744,380,1772,380,696,380,1771,380,1772,380,1772,406,1744,407,1745,380,696,380,1772,379,697,405,670,380,696,379,696,380,696,380,696,380,1771,380,696,406,671,378,1771,407,671,379,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,1772,379,1771,381,695,380,697,379,1771,381,1771,380,1771,380,696,380,696,380,696,379,697,379,696,380,696,380,696,379,696,380,696,380,1771,381,695,382,694,380,695,381,695,381,1771,380,696,380,696,379,696,380,696,380,695,381,696,433,642,406,670,380,695,407,669,380,696,380,696,380,695,380,695,381,696,380,696,405,671,406,669,406,670,380,695,380,696,380,696,380,1771,380,696,380,696,380,695,406,1746,380,1773,405,1745,380,1771,380,1773,379,697,405,1746,379,696,380,696,379,696,406,670,380,695,381,696,406,670,379,696,380,696,380,695,406,670,380,695,381,696,380,696,379,1772,380,695,380,696,380,696,380,696,379,696,406,670,380,697,379,696,379,697,379,697,379,696,380,696,379,696,380,696,381,695,379,697,379,697,379,696,380,696,380,696,379,697,379,696,380,695,381,695,380,697,379,696,380,1771,380,695,381,1771,380,1771,381,695,407,1745,405,1747,379,696,380}, //17C + {5044,2129,381,1772,379,696,406,670,405,671,380,1771,380,696,406,668,382,696,379,696,380,1771,380,696,380,1771,381,1771,380,695,381,1771,380,1772,380,1771,381,1772,379,1771,381,695,380,1772,406,670,379,696,380,696,379,697,380,695,381,695,380,1772,380,695,380,696,380,1771,380,696,380,696,380,696,380,1771,380,696,380,695,381,695,380,696,380,695,381,695,380,696,380,696,380,696,379,696,381,695,380,696,380,695,381,696,379,1772,380,1771,380,1772,380,696,379,696,380,1772,380,695,380,29381,5043,2130,380,1771,381,695,380,696,380,696,380,1771,380,695,381,696,380,696,379,696,380,1771,406,671,379,1771,381,1770,381,696,380,1771,380,1772,380,1771,406,1745,381,1771,380,696,380,1771,407,669,380,697,379,696,380,696,379,697,379,696,380,1771,380,696,380,696,380,1771,406,670,380,696,380,695,380,697,379,696,380,695,381,696,380,695,380,696,380,1770,381,1772,380,696,404,672,379,1772,380,1771,380,1772,380,695,380,697,379,697,379,696,380,696,379,696,380,696,380,695,380,696,380,1771,381,696,379,696,405,671,380,696,380,1771,380,696,380,696,380,696,379,696,380,696,380,695,381,696,379,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,695,406,670,380,696,380,1771,381,695,380,696,380,1771,380,696,380,696,380,696,380,1771,380,1772,379,1772,380,1772,379,1772,379,697,405,1746,380,695,381,696,379,696,380,696,405,671,379,696,407,669,380,696,379,696,405,672,379,696,379,696,407,669,380,696,380,1772,379,696,405,671,380,696,379,696,406,670,380,695,381,696,405,670,406,670,406,669,380,696,380,696,405,671,379,696,406,670,405,672,405,669,381,695,407,669,380,696,405,671,379,696,380,695,407,670,379,696,407,669,406,1745,407,1744,408,1744,407,1745,405,671,406,1745,406,1745,406,670,406}, //18C + {5044,2130,380,1771,379,697,380,696,380,696,379,1772,380,696,380,696,380,695,380,695,381,1772,379,697,379,1772,380,1771,380,695,381,1772,379,1771,381,1772,379,1773,379,1771,380,695,381,1771,381,696,379,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,380,1771,380,696,380,696,379,697,379,1773,379,695,381,695,380,697,379,695,381,696,380,696,379,696,380,695,381,696,380,695,380,696,380,696,379,696,380,696,380,1771,381,1770,381,1771,381,695,380,696,380,1772,379,696,380,29380,5044,2130,380,1771,380,695,381,696,380,696,379,1772,405,671,380,696,379,696,380,695,381,1772,379,695,381,1771,380,1772,380,696,380,1771,380,1771,381,1771,406,1745,381,1770,381,696,380,1771,405,672,379,696,380,696,380,695,380,696,380,695,381,1772,405,670,405,670,381,1771,380,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,1771,380,1772,405,671,380,695,380,1772,380,1771,380,1771,380,698,378,696,380,695,381,695,381,694,381,696,380,696,380,696,379,696,380,1772,380,694,381,696,380,696,380,694,381,1772,380,695,381,695,380,696,380,695,381,695,380,696,380,696,380,696,380,696,379,696,380,695,381,695,381,695,380,697,379,695,381,696,380,695,380,696,380,696,380,695,381,1771,380,696,380,1770,381,696,380,695,381,696,387,1763,381,1772,379,1771,381,1771,380,1771,381,696,379,1771,381,695,380,695,381,696,380,695,383,693,380,696,380,696,380,695,380,700,376,696,380,696,379,696,380,697,379,696,380,1771,407,670,379,696,379,696,380,696,380,696,380,696,380,695,380,697,379,695,380,696,380,697,379,696,379,697,379,695,407,670,380,696,379,697,379,696,380,696,380,696,406,669,380,696,406,670,379,696,380,696,380,696,380,1771,380,696,380,696,379,697,406,1745,406,1745,406,1745,407,669,406}, //19C + {5069,2104,406,1745,380,696,380,700,376,696,380,1771,380,696,380,696,379,696,380,697,379,1772,406,669,407,1744,407,1745,380,697,379,1771,381,1770,407,1745,406,1746,380,1772,406,669,405,1746,381,695,380,696,406,670,406,670,379,697,379,696,406,1746,379,696,380,696,380,1772,379,696,406,670,405,670,381,1770,381,696,380,695,380,696,406,670,380,696,380,696,406,669,380,696,380,696,380,696,379,696,382,694,380,696,380,696,379,1772,384,1767,380,1772,406,675,374,696,380,1771,381,695,407,29354,5043,2130,380,1771,407,670,405,671,379,696,380,1772,380,695,380,696,380,696,380,695,381,1770,381,696,406,1745,406,1745,381,696,379,1771,381,1772,405,1745,407,1745,380,1772,379,697,379,1772,380,696,406,670,379,696,380,696,379,697,379,695,381,1771,381,696,379,696,380,1772,380,695,380,697,379,696,380,696,379,697,379,696,380,696,380,695,381,695,380,1771,381,1771,380,695,381,695,380,1772,380,1772,406,1745,380,695,381,695,380,697,379,696,407,669,405,671,379,696,380,696,380,696,380,1771,380,696,380,696,379,696,380,696,380,1772,379,696,380,696,407,669,379,696,380,696,380,696,405,670,406,671,379,696,380,695,381,696,379,696,380,696,380,696,379,696,380,696,380,696,380,694,381,696,380,1771,380,1771,381,696,379,1772,380,697,379,695,406,671,379,1772,380,1771,380,1772,380,1771,380,1772,380,695,380,1772,380,695,381,696,379,696,380,696,380,695,381,696,379,696,380,696,380,695,381,695,380,695,381,696,380,696,379,696,380,1771,381,696,379,696,380,696,405,670,405,671,407,669,380,695,380,697,406,670,379,695,381,695,381,695,380,696,380,696,380,696,380,696,379,696,380,695,381,696,379,696,380,696,380,695,380,697,405,670,380,696,405,671,379,1772,406,1746,379,696,406,670,380,1770,381,1771,381,1771,380,696,406}, //20C + {5065,2131,379,1773,379,696,379,696,380,697,379,1771,407,669,380,696,380,696,380,695,380,1772,380,696,380,1771,380,1772,380,696,379,1772,406,1746,410,1740,381,1771,380,1772,380,695,380,1772,380,696,405,671,381,694,380,696,380,696,380,696,379,1772,380,696,380,695,380,1771,381,695,381,696,405,671,379,1771,381,696,404,671,380,696,380,695,380,696,380,696,380,695,381,695,380,696,380,696,380,696,406,670,404,671,380,696,381,1770,380,1772,396,1754,381,695,381,696,405,1746,380,696,380,29380,5070,2103,407,1745,380,696,406,669,407,670,405,1746,380,695,380,696,405,671,380,696,380,1770,381,696,380,1770,381,1772,381,694,381,1770,407,1745,380,1772,380,1771,407,1744,381,695,380,1772,380,695,407,670,379,697,404,671,380,695,406,670,406,1745,381,695,380,697,379,1771,407,669,381,696,379,696,380,695,407,670,379,696,380,696,380,696,404,671,380,1772,380,1771,407,669,380,696,379,1772,380,1771,381,1771,380,696,406,670,380,695,406,670,407,668,407,669,381,695,380,696,380,696,379,1772,380,696,380,696,379,696,380,696,380,1771,381,695,380,696,380,696,405,671,379,696,380,696,380,696,406,669,380,697,379,696,380,696,405,670,380,696,380,695,407,669,380,696,380,695,381,696,406,670,379,696,380,696,380,1771,380,1771,407,669,380,696,407,669,380,1771,380,1772,380,1770,381,1771,381,1771,381,695,380,1772,380,695,380,697,406,669,379,696,380,697,379,696,406,669,381,695,380,696,380,696,380,695,381,695,380,696,380,695,380,1772,406,670,380,696,380,695,380,696,406,670,380,695,407,669,405,671,380,696,387,688,380,696,380,696,380,696,380,696,405,670,380,696,406,669,380,697,405,669,381,695,407,669,406,671,379,696,380,695,397,678,381,696,380,1771,381,696,379,1772,379,696,380,1771,406,1746,381,1770,407,670,404}, //21C + {5069,2103,381,1771,380,696,405,670,380,696,406,1745,381,695,381,696,405,670,380,696,380,1770,381,696,380,1771,406,1745,407,670,379,1772,380,1771,380,1772,380,1772,379,1772,405,671,405,1746,380,696,405,671,380,696,389,687,379,696,380,695,407,1745,380,696,407,667,408,1745,406,670,380,696,406,669,380,1772,405,671,379,696,406,670,380,696,379,696,405,671,380,696,406,670,406,670,379,696,405,670,407,670,379,696,380,696,380,1771,380,1772,380,1771,406,670,380,696,380,1771,380,696,406,29355,5043,2130,380,1771,380,696,380,695,406,671,379,1772,380,696,380,695,380,697,379,696,380,1771,380,696,380,1771,381,1771,380,695,381,1771,380,1772,380,1770,381,1772,380,1771,380,696,404,1747,381,694,381,696,380,696,379,696,380,697,379,696,380,1772,379,696,380,696,380,1772,379,697,379,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,1771,380,1772,380,695,380,696,380,1772,380,1771,380,1771,380,696,380,696,405,671,380,696,379,696,380,696,380,696,379,697,379,696,380,1771,406,670,380,695,381,696,379,697,406,1745,380,696,380,695,380,695,406,671,380,695,381,695,380,696,380,696,380,695,380,696,380,696,380,695,381,696,380,695,380,696,380,696,379,696,380,696,380,695,381,1771,380,696,380,1771,380,1772,380,696,405,671,379,696,380,1771,380,1772,380,1771,380,1771,381,1772,380,695,380,1771,381,696,380,695,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,696,406,669,406,671,380,695,380,696,380,1771,380,696,380,695,380,697,379,696,380,696,380,696,379,696,380,696,380,695,381,696,380,695,380,696,380,695,380,697,379,696,380,696,406,670,380,695,380,696,405,671,380,696,380,696,379,697,379,695,381,695,380,696,380,1771,381,1770,381,1771,381,695,380,1772,380,1771,407,1744,381,695,380}, //22C + {5042,2131,379,1772,380,696,406,670,379,696,380,1772,379,697,404,671,380,696,379,697,379,1773,379,696,379,1772,380,1772,379,697,379,1772,380,1771,380,1772,380,1771,380,1772,379,696,381,1771,380,696,379,696,380,696,380,696,379,697,379,697,379,1772,380,696,379,696,380,1772,379,696,380,696,379,697,379,1773,379,695,381,696,379,696,380,697,379,696,380,696,379,697,379,696,380,697,379,696,382,693,380,697,379,696,405,671,379,1772,380,1772,379,1772,405,671,379,696,380,1772,380,695,380,29382,5042,2130,380,1771,381,696,379,697,406,669,380,1771,380,696,380,696,380,696,380,696,379,1772,380,696,380,1771,380,1772,380,696,379,1772,380,1772,379,1772,379,1773,379,1772,380,695,380,1773,379,696,380,695,380,696,380,696,380,696,380,696,405,1746,380,695,408,669,379,1772,380,696,379,697,379,696,380,696,380,696,379,696,380,696,379,697,380,695,380,1772,379,1773,379,696,380,696,380,1771,380,1772,379,1771,407,670,406,670,380,696,379,696,379,698,379,696,380,695,380,696,380,696,379,1772,380,696,379,697,379,697,379,696,380,1772,379,697,405,670,380,696,380,696,405,671,379,696,380,696,380,695,380,696,406,670,380,696,406,669,407,669,380,695,408,669,380,698,377,697,378,697,380,696,380,695,380,1772,379,1772,406,1746,405,671,405,670,380,696,379,1772,380,1772,380,1771,380,1772,406,1745,380,696,380,1771,380,696,380,695,381,696,379,696,380,696,380,696,379,696,407,670,379,696,379,697,379,697,379,696,407,668,381,696,379,1772,380,696,379,697,405,670,380,696,380,696,379,697,379,696,380,696,379,697,379,697,404,671,380,696,380,695,380,696,380,697,379,695,406,670,381,695,380,696,406,670,379,697,379,696,380,696,405,675,376,695,407,669,406,1745,380,695,381,696,406,1746,379,1771,407,1745,406,1745,408,668,380}, //23C + {5043,2130,381,1771,380,696,380,696,380,695,381,1770,381,696,380,695,380,696,380,696,379,1772,380,697,379,1771,380,1772,380,696,380,1771,380,1772,380,1771,380,1772,379,1772,380,696,380,1771,406,671,379,696,405,670,380,695,408,669,380,695,407,1745,380,696,380,696,380,1771,380,696,380,695,381,696,379,1772,380,696,379,696,380,696,380,695,405,672,379,696,380,695,380,696,381,695,380,697,379,696,405,670,380,697,379,695,381,1772,404,1746,381,1772,379,696,380,696,380,1771,407,668,381,29380,5044,2130,380,1770,381,696,380,695,381,696,379,1772,380,696,405,671,379,697,379,696,379,1773,384,691,407,1744,381,1771,405,672,406,1745,404,1746,380,1772,380,1772,405,1745,381,696,380,1772,379,697,379,695,381,695,380,697,379,695,381,696,380,1772,379,696,380,695,380,1773,379,696,380,696,379,696,433,643,380,696,379,697,379,696,380,696,380,696,380,1771,380,1771,380,697,379,696,380,1772,379,1772,406,1745,406,670,380,695,381,695,380,696,380,697,379,696,380,696,379,696,380,695,381,1772,380,695,380,696,380,696,380,695,380,1772,380,696,380,695,380,697,379,696,380,695,380,697,405,670,405,671,380,696,379,696,380,696,380,696,379,697,379,696,380,697,403,672,380,695,380,696,380,696,380,1771,380,1771,407,1745,406,1745,381,696,379,696,380,697,379,1771,380,1772,380,1771,406,1746,406,1745,380,697,379,1772,379,697,379,696,380,696,379,697,379,697,379,695,381,696,406,669,380,697,379,696,380,696,379,697,379,695,381,696,379,1771,407,670,380,696,380,695,380,696,380,696,380,696,379,696,405,671,380,696,380,695,406,670,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,380,696,405,671,379,697,405,670,380,696,379,697,379,696,380,1772,379,1771,381,696,380,1770,381,1771,380,1773,379,1772,379,696,406}, //24C + {5043,2130,381,1772,379,696,380,695,380,696,380,1772,380,695,380,697,404,670,381,696,379,1772,406,670,380,1771,380,1772,406,669,406,1746,380,1772,379,1772,380,1771,380,1772,380,696,379,1772,380,696,380,696,379,697,379,697,379,696,379,697,384,1766,381,696,380,696,379,1772,380,697,404,670,380,696,380,1772,380,696,379,696,380,696,380,695,405,671,380,696,380,695,381,696,379,696,380,697,379,696,380,696,379,696,380,696,380,1772,379,1771,381,1772,379,696,406,670,380,1771,380,696,380,29381,5043,2130,380,1770,381,697,379,696,380,695,380,1771,381,696,379,696,380,697,379,696,380,1772,405,670,405,1747,379,1772,380,696,379,1772,380,1772,380,1771,380,1772,380,1772,379,696,380,1771,404,672,380,696,380,695,380,696,406,669,381,695,380,1772,380,696,379,696,380,1772,380,696,380,696,379,696,380,696,405,670,381,696,379,696,380,696,380,696,379,1772,380,1772,379,697,379,696,380,1771,380,1772,380,1771,380,696,380,696,380,696,379,697,379,697,379,696,379,696,407,670,379,696,380,1772,379,696,407,668,381,697,378,697,405,1746,380,695,380,697,379,695,381,696,380,695,380,696,380,696,380,696,407,669,379,696,380,696,380,696,379,697,379,695,381,697,379,696,380,696,379,696,380,697,379,696,379,697,379,696,393,684,378,1772,380,697,379,696,380,1770,381,1771,382,1770,406,1746,379,1773,379,696,380,1771,380,696,409,667,380,695,381,696,379,696,380,695,381,695,435,641,380,696,380,695,406,671,379,696,380,695,380,696,380,1772,380,695,380,697,379,696,380,696,406,670,379,697,379,696,380,696,380,695,406,670,406,670,380,695,380,696,380,696,380,696,379,697,379,695,381,696,380,696,379,696,380,696,380,696,380,696,380,695,380,696,380,696,380,1771,406,670,406,1745,380,1772,380,1772,379,1772,386,1765,380,696,380}, //25C + {5044,2129,408,1743,407,670,406,670,379,696,380,1772,406,669,407,669,407,669,383,692,408,1744,380,697,379,1771,406,1746,405,671,380,1771,380,1772,380,1771,380,1771,381,1772,405,669,407,1745,406,670,380,696,405,670,406,671,379,696,406,670,406,1746,405,670,406,670,405,1746,380,696,406,670,380,695,381,1771,406,670,380,695,406,670,380,696,405,671,406,669,380,696,380,696,380,695,380,696,380,696,380,695,406,670,407,669,380,1771,381,1771,380,1771,408,669,379,696,380,1771,380,696,406,29355,5043,2130,380,1772,380,696,406,669,407,670,379,1771,407,669,406,670,406,669,406,670,380,1772,380,695,380,1772,380,1772,380,696,406,1745,405,1746,407,1745,406,1745,380,1772,380,696,380,1771,380,695,381,695,380,696,380,696,380,696,380,694,381,1772,379,696,407,669,380,1772,379,696,406,670,407,669,380,695,381,695,380,696,380,696,380,696,379,697,379,1772,379,1772,406,670,380,695,380,1772,380,1771,381,1771,380,695,381,696,380,696,379,696,380,696,380,696,379,697,380,696,406,669,405,1746,380,696,406,670,379,697,379,695,381,1772,379,696,407,670,379,696,379,696,380,696,407,669,405,670,380,696,380,696,406,670,380,696,379,696,406,669,408,669,405,670,407,670,379,696,380,696,405,671,379,1772,379,696,406,671,379,696,380,1772,379,696,380,696,380,1772,406,1745,380,1771,380,1772,405,1746,406,670,380,1771,406,670,407,669,380,695,380,696,407,669,406,670,405,670,381,695,380,696,380,696,380,696,379,696,380,696,406,670,405,1746,404,672,405,670,380,697,405,669,381,695,381,696,379,697,404,671,380,696,405,670,380,696,380,697,378,697,380,695,380,696,380,695,380,697,404,672,379,696,380,696,380,696,406,669,380,696,380,696,379,697,379,695,407,1745,407,1745,380,1771,380,1772,406,1745,380,1771,381,1771,380,696,407}, //26C + {5043,2130,406,1746,379,696,380,697,405,670,380,1772,379,696,380,696,380,695,408,668,380,1772,405,671,405,1746,406,1745,381,696,405,1746,379,1772,380,1770,381,1772,407,1745,379,696,380,1772,380,695,386,691,404,670,381,696,380,696,379,697,379,1772,379,697,379,696,380,1772,380,695,406,670,407,669,380,1771,405,671,380,696,406,670,379,696,380,696,380,696,405,671,379,697,383,693,378,697,380,695,380,697,404,670,381,696,379,1771,381,1771,380,1772,406,670,379,696,406,1746,380,696,379,29381,5043,2130,406,1746,380,696,379,697,379,695,381,1772,379,695,381,697,379,696,379,697,379,1771,381,696,379,1773,379,1772,407,669,405,1746,379,1773,379,1772,380,1771,380,1772,379,697,405,1745,381,696,379,696,380,696,380,695,381,696,379,696,380,1772,405,671,379,697,379,1772,379,696,407,670,404,671,380,696,380,696,379,696,380,696,380,696,379,697,379,1771,380,1772,380,697,379,695,380,1771,381,1771,381,1772,379,696,405,671,405,670,380,697,379,696,379,697,379,697,405,671,379,696,379,1772,380,695,406,671,379,697,379,695,381,1771,380,696,380,696,380,696,379,696,406,671,405,669,380,697,379,697,405,670,380,696,379,697,379,696,380,696,406,670,379,697,379,696,405,671,379,697,379,697,383,693,379,1771,380,696,380,695,381,1772,379,696,380,696,380,1772,379,1772,379,1772,380,1771,406,1746,380,696,379,1772,380,697,381,694,379,697,379,696,380,697,405,670,379,696,380,697,379,696,406,670,379,697,379,696,380,695,406,670,406,1747,405,670,405,671,379,696,380,696,380,696,379,697,379,697,378,697,380,696,379,696,380,696,380,696,379,697,379,697,379,696,379,697,379,696,380,696,380,696,406,670,379,696,380,696,380,696,379,696,380,697,379,696,380,1771,407,668,381,696,380,696,379,697,379,697,379,696,379,1772,380}, //27C + {5044,2130,379,1773,379,696,380,695,381,696,405,1746,380,696,380,695,380,696,380,696,380,1771,380,697,379,1772,379,1771,407,670,380,1771,380,1772,380,1771,380,1772,380,1771,380,695,407,1745,380,696,380,696,380,696,379,697,379,696,380,696,380,1771,380,696,391,685,406,1745,380,696,405,670,405,672,379,1772,380,696,380,699,376,696,380,695,380,697,379,696,380,697,379,695,380,697,405,670,380,696,405,670,380,697,379,696,380,1771,380,1771,381,1771,380,696,380,696,380,1771,380,695,381,29380,5044,2129,381,1770,381,696,380,695,381,696,379,1772,406,670,380,696,379,696,380,696,380,1772,379,696,380,1772,379,1772,405,671,380,1772,379,1772,379,1772,406,1746,379,1771,381,696,380,1771,380,697,379,695,407,670,380,695,380,696,380,695,381,1771,380,695,407,670,405,1746,380,696,406,670,379,696,380,696,380,695,381,695,380,696,405,671,380,695,380,1772,380,1772,379,697,379,696,380,1771,408,1744,380,1771,380,696,380,695,391,686,380,695,407,669,380,695,381,696,380,696,379,696,380,1771,380,696,380,696,405,670,380,696,407,1744,381,696,407,669,379,696,380,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,696,405,671,379,696,380,696,404,672,379,696,380,697,379,696,380,1770,382,1771,379,697,379,697,379,1771,380,697,379,696,380,1772,379,1772,380,1771,380,1772,380,1771,380,696,380,1772,379,696,380,696,380,696,380,695,381,695,380,696,405,671,407,669,379,696,380,696,380,696,379,696,380,697,379,697,379,1771,380,696,380,696,406,669,380,697,379,695,381,696,379,696,406,671,379,696,380,695,380,697,379,697,405,670,380,695,380,697,379,696,407,669,380,696,404,671,380,696,380,696,379,696,380,696,380,696,379,697,433,642,380,1771,406,1746,380,696,380,696,379,696,380,696,380,697,378,1772,380}, //28C + {5043,2129,381,1772,380,696,380,696,379,697,382,1769,406,671,378,695,407,674,375,696,380,1773,406,669,379,1772,380,1772,379,697,379,1772,380,1771,380,1772,380,1772,379,1772,380,696,380,1772,379,696,380,696,379,697,379,696,380,696,379,697,379,1772,407,669,379,697,380,1771,407,669,379,697,380,696,379,1772,379,697,379,697,379,696,379,696,406,671,379,696,406,669,381,695,380,697,406,669,380,696,379,697,379,696,380,696,379,1772,406,1745,381,1772,379,696,380,697,383,1766,406,671,380,29381,5068,2105,379,1772,380,697,379,696,380,696,380,1770,381,696,379,696,380,697,379,696,380,1771,380,697,379,1772,379,1772,380,696,380,1771,380,1772,379,1773,379,1772,380,1771,380,696,380,1771,380,696,380,696,380,696,379,697,379,697,379,695,381,1771,380,696,380,696,379,1772,406,670,380,696,379,697,379,696,405,671,380,696,379,696,406,671,379,696,379,1772,407,1745,380,695,380,697,405,1745,407,1745,380,1771,406,670,380,696,406,670,379,697,379,697,379,696,380,695,407,669,380,696,380,1771,380,696,380,697,379,696,379,697,379,1772,380,696,379,696,406,671,379,696,405,671,380,696,406,669,405,671,379,697,379,697,379,696,406,670,406,670,379,696,406,670,380,695,401,676,405,671,379,696,380,697,378,696,380,1771,381,695,380,1771,381,696,379,696,380,1771,381,1772,405,1746,380,1771,380,1772,379,696,380,1772,380,695,408,669,405,671,379,695,380,697,405,670,405,671,380,696,406,670,379,696,380,695,381,696,379,697,405,671,379,1771,380,696,380,697,379,695,381,695,406,671,379,696,380,696,380,696,379,696,379,697,379,696,380,696,380,696,380,696,380,696,405,670,380,696,380,696,406,669,406,670,380,696,380,695,381,696,379,695,381,695,381,696,404,1747,380,696,380,1772,379,696,380,696,380,695,380,696,406,1745,406}, //29C + {5043,2130,380,1771,407,669,406,670,380,695,406,1746,434,642,380,695,407,669,380,696,406,1746,379,696,380,1772,379,1773,405,670,380,1772,379,1773,405,1745,380,1772,380,1771,380,696,380,1772,379,697,405,670,379,697,379,696,407,669,380,696,380,1772,379,695,407,670,380,1771,380,697,379,696,405,671,379,1771,381,696,405,670,380,696,380,696,379,696,380,697,379,697,379,695,406,670,407,669,407,669,380,695,380,696,407,669,405,1747,379,1772,405,1747,406,669,406,669,407,1745,406,670,380,29381,5043,2130,380,1771,406,670,380,696,380,695,381,1771,380,696,379,697,379,696,380,696,380,1771,380,696,406,1746,379,1772,405,671,406,1745,380,1772,406,1746,379,1771,381,1771,380,696,405,1746,380,696,379,697,406,670,380,695,380,696,380,696,406,1745,380,695,381,695,380,1772,380,696,405,670,381,695,406,671,379,697,378,696,380,696,380,697,379,695,381,1771,380,1771,405,671,380,696,406,1745,382,1769,381,1771,380,696,380,696,380,696,379,695,381,696,380,697,379,696,379,696,404,672,380,1770,381,696,380,696,380,696,405,670,380,1772,405,671,379,696,380,697,379,696,405,671,379,695,381,697,379,696,379,696,406,670,405,671,380,696,405,670,380,696,380,696,380,695,381,695,380,695,381,695,380,1771,408,669,406,1745,380,696,380,1772,405,671,406,668,381,1771,380,1771,381,1772,379,1771,381,1771,380,696,380,1772,379,696,380,696,380,696,405,671,379,696,380,696,380,695,407,668,407,671,379,696,380,695,380,697,379,696,406,669,381,1771,380,697,379,696,405,670,380,696,380,696,380,695,406,670,407,668,407,669,407,670,380,695,406,670,380,696,380,696,379,697,379,696,380,695,399,677,380,696,380,695,406,669,381,696,380,695,381,696,379,696,380,696,380,1771,405,1747,380,1771,405,672,379,696,380,695,381,696,379,1771,407}, //30C + {5043,2129,383,1769,380,700,375,696,380,696,405,1746,380,696,406,670,380,696,380,696,379,1772,380,696,380,1772,379,1772,406,669,380,1772,380,1772,379,1772,380,1771,407,1745,404,672,379,1771,381,696,379,696,380,696,380,697,379,696,380,696,379,1773,379,696,405,671,379,1772,405,671,407,669,379,696,380,1771,381,695,380,696,380,696,405,670,380,696,380,696,406,670,379,696,406,670,380,696,380,696,405,671,379,697,379,696,406,1745,380,1771,380,1772,406,670,380,696,405,1746,380,696,380,29380,5043,2130,380,1772,406,669,380,697,379,696,380,1772,379,697,407,668,380,696,406,670,379,1772,399,677,379,1772,380,1772,379,697,379,1772,379,1772,380,1772,405,1746,380,1772,380,696,405,1746,380,695,407,670,379,697,379,696,379,697,379,696,380,1772,379,697,379,696,380,1772,379,697,379,696,380,696,379,697,405,671,379,697,379,696,380,696,379,697,379,1771,381,1771,380,696,380,696,379,1772,380,1772,405,1746,380,696,380,695,380,697,379,696,380,696,379,697,379,696,380,697,379,696,379,1772,380,695,406,671,379,697,379,695,381,1772,380,696,379,696,379,697,405,670,380,696,380,696,380,695,380,696,380,697,404,671,406,670,405,671,379,696,380,695,380,697,379,696,380,696,379,696,405,671,380,697,379,1771,380,1772,405,671,379,1772,380,696,380,695,407,1745,406,1745,380,1772,380,1772,379,1772,380,696,380,1771,405,671,379,696,380,696,380,696,405,671,379,697,379,696,406,670,380,696,379,697,379,696,380,696,406,670,379,697,379,1772,379,697,379,696,380,696,380,696,379,696,380,696,407,670,406,668,406,670,380,696,380,696,379,697,379,696,380,696,379,697,406,669,380,696,380,696,379,696,380,697,379,697,378,697,379,697,405,670,380,695,380,697,379,1773,379,696,407,668,381,1771,380,696,379,696,406,671,379,1772,379}, //31C + {5070,2104,379,1772,380,696,407,669,379,697,379,1772,379,696,380,696,380,696,380,695,380,1771,381,696,380,1771,380,1771,380,696,405,1747,391,1760,380,1771,381,1771,407,1745,380,695,380,1772,380,696,405,671,379,696,380,696,379,697,379,696,380,1772,380,696,379,696,380,1772,379,697,379,696,380,695,406,1746,380,696,380,696,380,696,379,697,379,696,380,696,391,685,379,696,383,693,380,696,380,696,379,696,382,694,380,696,379,1772,380,1771,380,1772,380,696,380,695,380,1771,381,696,380,29380,5043,2131,379,1772,380,696,380,696,398,677,380,1772,405,671,379,696,380,696,380,696,405,1746,406,669,380,1772,380,1772,379,696,380,1772,379,1772,380,1772,379,1772,380,1772,406,670,405,1746,380,695,380,696,405,671,380,696,380,696,379,696,380,1771,380,697,379,696,406,1746,380,695,380,696,380,696,380,695,406,670,380,697,379,695,406,671,405,671,379,1772,406,1745,380,695,380,697,379,1773,379,1771,381,1771,380,696,380,696,379,696,380,697,379,696,380,696,379,697,379,696,405,670,381,1771,380,696,379,696,406,670,380,696,405,1746,406,671,379,696,380,696,379,697,379,696,380,696,380,695,380,696,406,670,380,695,381,696,404,671,381,695,380,695,381,696,379,696,380,696,379,696,380,697,379,1771,381,1771,380,1772,379,696,380,1771,381,695,381,695,380,1772,380,1771,380,1772,380,1772,379,1772,379,697,379,1771,381,696,379,696,380,696,380,696,379,696,406,671,379,696,406,670,380,695,380,696,380,696,380,696,404,671,380,695,381,1771,380,696,380,696,379,697,380,696,379,696,380,696,397,678,380,697,379,696,380,696,379,697,403,673,379,695,380,697,379,697,406,669,380,696,380,696,379,697,379,696,380,696,405,671,379,697,379,697,379,696,379,697,379,1772,380,1771,380,696,380,1772,379,696,380,696,407,668,380,1771,381} //32C }, // Fan Speed Med { - {8978, 4497, 506, 602, 534, 602, 557, 1679, 534, 602, 533, 1703, 556, 579, 534, 602, 533, 618, 534, 601, 534, 1703, 534, 1703, 533, 602, 534, 601, 534, 601, 534, 601, 534, 618, 534, 602, 533, 603, 533, 601, 534, 602, 533, 602, 533, 602, 533, 603, 533, 618, 534, 602, 557, 577, 534, 601, 534, 602, 533, 602, 534, 601, 534, 602, 533, 619, 534, 601, 533, 602, 534, 602, 533, 601, 534, 602, 533, 602, 534, 602, 533, 623, 534, 1703, 534, 1702, 534, 1703, 534, 1691, 533}, // 15C - {8978, 4503, 560, 550, 585, 549, 587, 1650, 586, 549, 586, 1651, 585, 550, 585, 550, 586, 566, 586, 549, 587, 1650, 586, 1651, 585, 550, 585, 550, 586, 550, 585, 550, 585, 1668, 585, 550, 587, 548, 586, 549, 586, 549, 586, 549, 586, 550, 586, 549, 586, 566, 586, 549, 586, 549, 586, 549, 586, 550, 586, 549, 585, 550, 586, 549, 586, 567, 585, 550, 585, 550, 585, 550, 586, 549, 585, 551, 585, 550, 585, 550, 585, 572, 586, 1650, 586, 1651, 585, 1651, 586, 538, 586}, // 16C - {8978, 4529, 507, 601, 534, 601, 534, 1703, 534, 601, 534, 1703, 533, 602, 534, 602, 533, 618, 534, 602, 533, 1704, 533, 1703, 533, 601, 534, 602, 534, 601, 534, 1703, 534, 618, 533, 603, 533, 601, 534, 601, 534, 601, 534, 601, 534, 602, 533, 602, 533, 619, 534, 601, 534, 601, 534, 602, 533, 602, 534, 601, 534, 601, 534, 601, 534, 618, 534, 602, 533, 602, 534, 602, 533, 602, 533, 602, 533, 602, 534, 601, 534, 623, 534, 1703, 533, 1703, 534, 602, 533, 1691, 534}, // 17C - {8978, 4496, 508, 600, 535, 601, 534, 1702, 535, 600, 535, 1701, 536, 600, 535, 601, 534, 618, 534, 601, 534, 1702, 535, 1702, 534, 601, 535, 600, 535, 601, 534, 1702, 534, 1719, 535, 601, 534, 601, 534, 602, 534, 601, 533, 601, 535, 601, 534, 601, 534, 618, 534, 601, 534, 602, 533, 602, 534, 601, 534, 601, 534, 602, 533, 601, 535, 617, 535, 601, 534, 601, 534, 601, 535, 600, 534, 601, 535, 600, 535, 601, 534, 623, 534, 1703, 533, 1703, 534, 601, 534, 589, 535}, // 18C - {8978, 4522, 508, 601, 534, 602, 533, 1703, 534, 602, 533, 1703, 533, 602, 534, 601, 534, 619, 533, 602, 533, 1703, 534, 1702, 534, 602, 535, 600, 534, 1702, 535, 601, 534, 618, 533, 602, 533, 603, 533, 602, 534, 601, 533, 602, 534, 601, 533, 602, 534, 619, 533, 602, 533, 602, 533, 602, 534, 602, 533, 602, 533, 601, 534, 601, 534, 619, 533, 601, 535, 601, 534, 601, 534, 602, 533, 602, 533, 602, 533, 602, 534, 624, 533, 1702, 535, 601, 534, 1702, 534, 1691, 533}, // 19C - {8978, 4523, 507, 602, 534, 601, 533, 1704, 533, 601, 534, 1703, 534, 601, 534, 601, 534, 619, 533, 601, 534, 1703, 534, 1703, 534, 601, 534, 601, 534, 1702, 535, 600, 535, 1719, 534, 601, 534, 602, 533, 602, 534, 601, 534, 602, 533, 602, 533, 602, 533, 619, 533, 602, 534, 601, 534, 601, 534, 601, 534, 602, 533, 603, 533, 601, 534, 618, 534, 602, 533, 601, 535, 601, 534, 601, 534, 601, 534, 602, 533, 602, 533, 624, 534, 1703, 533, 601, 534, 1702, 535, 589, 534}, // 20C - {8978, 4503, 562, 547, 588, 547, 589, 1647, 589, 546, 589, 1648, 588, 547, 589, 546, 589, 564, 588, 547, 589, 1648, 588, 1648, 588, 546, 590, 546, 589, 1648, 588, 1648, 589, 564, 588, 547, 589, 546, 588, 548, 588, 546, 589, 546, 589, 547, 588, 547, 589, 563, 589, 547, 587, 547, 589, 547, 588, 547, 588, 547, 588, 547, 589, 545, 590, 564, 588, 546, 589, 546, 589, 547, 589, 546, 589, 546, 589, 547, 588, 547, 589, 569, 587, 1648, 589, 547, 588, 546, 589, 1637, 588}, // 21C - {8978, 4497, 508, 601, 534, 601, 534, 1702, 535, 601, 534, 1702, 534, 602, 534, 601, 534, 617, 534, 602, 534, 1703, 533, 1703, 534, 602, 533, 602, 533, 1703, 534, 1703, 533, 1720, 534, 601, 534, 602, 533, 602, 534, 601, 534, 602, 533, 601, 534, 602, 533, 619, 533, 602, 534, 601, 534, 601, 534, 602, 533, 601, 535, 602, 532, 602, 534, 618, 534, 602, 533, 601, 535, 601, 533, 602, 534, 602, 533, 601, 534, 601, 534, 624, 533, 1703, 534, 602, 533, 602, 533, 590, 534}, // 22C - {8978, 4503, 507, 602, 534, 602, 533, 1703, 534, 601, 534, 1702, 534, 602, 533, 602, 533, 619, 533, 602, 534, 1703, 533, 1704, 533, 602, 533, 1703, 534, 600, 535, 601, 534, 619, 533, 601, 534, 602, 533, 602, 534, 601, 534, 601, 534, 602, 533, 602, 533, 619, 533, 602, 533, 603, 533, 602, 533, 602, 533, 602, 533, 603, 533, 601, 534, 619, 533, 602, 533, 602, 534, 601, 534, 602, 533, 601, 534, 602, 534, 601, 533, 624, 534, 601, 534, 1703, 533, 1703, 534, 1691, 533}, // 23C - {8978, 4495, 507, 602, 557, 581, 531, 1703, 533, 601, 559, 1679, 557, 578, 558, 577, 558, 594, 558, 578, 557, 1679, 533, 1704, 533, 601, 558, 1679, 557, 578, 534, 601, 534, 1720, 558, 577, 558, 577, 534, 601, 559, 577, 558, 577, 558, 577, 534, 602, 533, 619, 557, 578, 557, 577, 558, 578, 534, 601, 557, 578, 559, 576, 559, 577, 558, 593, 558, 578, 559, 577, 533, 601, 557, 579, 558, 577, 557, 578, 534, 601, 559, 598, 558, 577, 534, 1703, 559, 1678, 538, 585, 558}, // 24C - {8978, 4501, 507, 601, 558, 578, 534, 1702, 534, 601, 534, 1703, 558, 577, 534, 602, 533, 619, 558, 577, 534, 1702, 534, 1703, 534, 602, 557, 1679, 533, 602, 534, 1703, 533, 619, 533, 602, 534, 601, 534, 601, 534, 601, 534, 602, 533, 602, 533, 602, 534, 619, 532, 602, 534, 601, 534, 602, 533, 602, 533, 602, 534, 602, 533, 601, 534, 619, 533, 602, 534, 601, 533, 602, 557, 578, 534, 601, 534, 602, 533, 602, 534, 623, 533, 602, 534, 1703, 534, 601, 534, 1691, 533}, // 25C - {8978, 4529, 531, 577, 533, 603, 558, 1678, 559, 576, 559, 1678, 558, 576, 561, 575, 558, 594, 559, 576, 559, 1677, 561, 1676, 559, 576, 560, 1677, 559, 577, 558, 1678, 533, 1721, 558, 576, 550, 586, 559, 576, 560, 575, 558, 577, 558, 577, 559, 577, 533, 619, 559, 576, 559, 577, 557, 577, 560, 575, 559, 577, 558, 577, 559, 576, 558, 594, 558, 578, 559, 575, 558, 578, 559, 576, 559, 576, 558, 577, 558, 578, 558, 599, 558, 576, 559, 1678, 558, 578, 559, 565, 556}, // 26C - {8978, 4495, 562, 547, 588, 547, 588, 1648, 589, 547, 588, 1648, 588, 547, 589, 547, 589, 563, 590, 544, 591, 1647, 588, 1648, 589, 545, 590, 1647, 590, 1647, 589, 546, 589, 564, 589, 546, 589, 546, 588, 547, 589, 546, 589, 547, 589, 545, 589, 546, 590, 563, 589, 546, 590, 545, 590, 546, 588, 547, 589, 546, 589, 546, 588, 547, 588, 564, 590, 546, 588, 547, 588, 547, 588, 548, 588, 547, 589, 546, 588, 547, 588, 570, 587, 547, 588, 548, 588, 1648, 589, 1634, 589}, // 27C - {8978, 4502, 562, 547, 587, 549, 587, 1649, 586, 549, 588, 1648, 588, 548, 588, 547, 561, 591, 587, 548, 562, 1675, 564, 1673, 587, 548, 587, 1649, 588, 1648, 588, 548, 562, 1691, 588, 548, 587, 548, 587, 548, 561, 575, 586, 548, 588, 547, 588, 548, 587, 564, 588, 548, 562, 573, 587, 549, 588, 546, 563, 572, 588, 548, 588, 548, 587, 564, 562, 573, 563, 572, 588, 548, 588, 548, 561, 574, 587, 547, 562, 574, 587, 570, 587, 547, 563, 573, 588, 1648, 588, 536, 561}, // 28C - {8978, 4495, 534, 575, 562, 573, 561, 1676, 561, 574, 561, 1675, 560, 576, 560, 574, 561, 592, 561, 574, 561, 1676, 561, 1676, 560, 574, 561, 1677, 559, 1676, 562, 1675, 560, 593, 560, 575, 560, 575, 560, 575, 560, 575, 561, 574, 561, 574, 560, 575, 561, 592, 561, 574, 560, 575, 561, 575, 559, 576, 559, 576, 560, 575, 561, 574, 561, 592, 560, 575, 560, 575, 560, 575, 560, 575, 561, 574, 560, 576, 560, 574, 561, 597, 559, 576, 560, 575, 560, 575, 561, 1664, 560}, // 29C - {8978, 4503, 534, 575, 559, 577, 560, 1676, 558, 577, 559, 1677, 560, 575, 560, 576, 560, 592, 559, 576, 561, 1675, 561, 1676, 560, 575, 559, 1678, 560, 1676, 559, 1677, 561, 1693, 560, 576, 558, 577, 560, 575, 558, 577, 560, 575, 559, 576, 560, 575, 559, 594, 559, 576, 560, 575, 559, 577, 559, 579, 556, 576, 559, 576, 560, 575, 560, 592, 559, 576, 559, 577, 559, 576, 559, 576, 560, 575, 560, 575, 559, 577, 559, 598, 560, 576, 557, 578, 559, 576, 559, 564, 559} // 30C + {5066,2130,406,1745,407,669,407,669,405,670,381,1771,380,696,380,696,404,671,380,696,406,1745,406,670,379,1772,380,1772,380,696,379,1772,380,1771,380,1772,405,1746,380,1771,380,697,405,1746,379,696,380,696,380,696,405,670,380,696,407,669,380,1772,379,695,406,671,406,1745,381,695,380,695,407,669,380,1772,380,696,379,696,380,696,407,669,380,695,380,696,380,696,380,696,405,669,381,696,380,695,406,670,380,696,380,696,380,1771,380,1771,381,1771,380,696,405,670,407,1745,379,697,379,29381,5042,2130,380,1772,380,696,379,697,406,669,380,1770,407,670,380,696,380,696,379,696,380,1772,379,697,379,1772,380,1771,380,696,380,1771,380,1772,406,1744,381,1772,405,1746,380,696,380,1772,405,670,406,670,379,696,380,697,379,696,394,681,380,1772,380,695,380,696,380,1772,405,671,379,697,405,670,405,670,380,696,380,696,380,696,380,696,379,697,379,1771,380,1772,380,696,379,696,380,1772,406,1745,380,1771,407,670,379,696,380,696,407,668,380,696,407,668,381,696,380,695,380,696,380,1772,379,696,380,696,380,695,380,697,379,1772,379,696,406,670,380,696,380,695,380,696,380,696,380,696,379,697,379,696,380,696,379,697,380,696,379,696,379,697,379,697,379,695,407,670,380,696,406,669,382,1769,380,1772,406,1745,407,669,379,697,379,696,380,697,405,1746,379,1772,380,1772,405,1746,406,1745,380,1772,380,696,379,696,380,696,380,696,406,669,405,671,405,671,379,696,380,695,381,696,380,696,379,696,380,696,405,671,380,695,380,1772,379,696,380,697,379,696,380,696,406,669,380,696,380,695,380,697,379,696,380,696,379,697,379,696,380,696,379,697,379,697,379,695,406,671,389,687,379,696,380,696,380,696,406,669,380,696,380,695,407,669,408,668,380,1771,380,1772,380,696,379,1772,380,695,380,697,379,1772,379,696,381}, //16 + {5041,2131,379,1773,379,696,380,696,379,697,379,1772,379,697,379,697,379,696,379,697,379,1772,380,696,379,1773,379,1772,379,697,379,1772,383,1768,380,1771,380,1773,379,1772,385,691,379,1772,379,697,379,696,380,696,379,697,379,697,379,696,379,1773,379,696,380,696,379,1772,380,696,379,697,379,696,406,1746,379,697,379,696,380,696,405,671,379,697,379,696,380,695,380,697,379,696,380,696,380,696,379,697,379,696,380,696,379,1772,379,1773,379,1772,380,696,380,696,379,1772,380,697,378,29381,5043,2130,379,1772,380,696,380,695,380,696,380,1772,379,697,379,696,406,670,379,696,381,1771,380,696,379,1772,379,1773,379,696,380,1772,380,1771,380,1771,380,1772,380,1771,380,696,380,1772,379,697,379,696,379,697,379,697,379,695,381,696,380,1771,379,697,380,695,380,1772,379,697,380,696,379,697,402,673,380,696,379,696,380,697,379,696,380,695,380,1771,381,1771,406,670,380,696,380,1770,381,1772,379,1772,380,696,379,697,379,696,380,696,391,685,379,696,380,697,379,695,380,697,380,1770,380,697,379,697,379,696,380,696,380,1771,380,696,379,696,381,697,378,696,380,696,379,696,380,696,405,670,407,670,379,696,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,696,379,697,379,696,406,670,380,696,379,1772,406,670,379,697,379,696,406,1746,379,1772,406,1745,380,1772,379,1773,379,1772,379,697,379,697,379,696,380,696,405,670,406,671,378,697,379,697,406,669,380,695,381,696,379,696,380,696,379,696,380,697,379,1771,381,696,406,670,379,696,379,697,379,696,379,697,380,696,379,697,383,691,381,696,406,670,379,697,379,701,374,697,405,671,379,696,406,670,380,696,379,696,380,696,380,695,407,669,406,670,380,696,379,697,379,696,380,1771,380,696,380,1772,405,1746,380,696,406,669,380,1772,405,671,379}, //17C + {5041,2132,379,1772,379,696,379,698,378,697,379,1773,378,698,379,697,378,697,378,698,378,1773,378,697,380,1772,379,1772,379,698,378,1774,377,1773,379,1772,379,1773,379,1772,379,697,379,1773,378,697,379,697,378,698,378,697,379,697,378,697,379,1773,379,697,379,696,380,1772,378,698,379,697,378,698,378,1773,378,698,379,696,379,697,378,697,379,697,379,697,378,698,378,698,378,698,378,697,379,697,405,670,379,697,379,696,379,1773,379,1772,379,1772,380,697,378,697,379,1773,378,698,378,29382,5041,2131,379,1773,378,698,378,698,378,697,378,1774,378,698,378,697,379,697,378,697,379,1773,378,698,378,1773,379,1772,379,697,379,1773,379,1771,380,1772,379,1773,378,1775,377,696,380,1772,379,698,378,697,378,697,379,698,378,697,379,697,379,1772,379,697,379,697,378,1772,380,696,380,697,378,697,378,698,378,697,379,697,379,697,379,698,378,696,379,1772,380,1773,378,697,378,698,378,1773,379,1773,378,1773,379,697,378,697,379,697,379,696,379,698,378,697,379,696,380,697,378,698,378,1773,379,697,379,696,379,697,379,697,378,1772,379,698,378,697,379,697,379,697,378,697,379,697,379,697,379,697,383,692,379,698,378,697,378,697,379,702,374,697,379,696,379,697,379,697,378,697,379,697,379,1773,379,697,378,697,378,1774,379,696,379,697,378,697,379,1773,379,1773,378,1773,379,1773,378,1773,379,1773,405,671,378,697,379,696,379,698,378,697,379,697,379,697,379,696,379,696,380,696,380,696,379,697,379,696,380,697,378,697,379,1772,380,696,405,670,381,696,379,696,379,696,393,683,406,670,380,696,379,697,379,696,380,696,380,695,380,696,380,696,380,695,381,695,380,696,405,671,379,697,380,695,380,696,380,696,379,696,407,668,381,696,406,670,405,1745,381,1771,407,1744,381,1771,380,695,381,696,403,1748,380,696,380}, //18C + {5044,2129,381,1770,381,695,381,695,381,696,379,1772,379,696,380,696,380,696,380,696,379,1772,380,696,380,1771,380,1771,380,696,380,1771,381,1771,380,1771,381,1771,380,1772,380,696,379,1771,381,696,379,697,379,696,380,695,381,696,379,696,380,1772,380,696,379,696,380,1772,379,696,380,695,381,696,379,1771,381,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,1771,380,1772,380,1771,380,696,380,696,380,1771,380,696,380,29358,5065,2129,381,1771,381,695,380,696,380,696,380,1771,379,697,380,696,380,695,380,697,379,1771,381,696,379,1772,380,1771,380,695,381,1772,379,1772,380,1772,379,1771,381,1771,380,697,379,1770,381,697,379,696,380,695,381,696,379,695,381,696,380,1771,380,695,381,696,380,1771,380,695,381,695,380,696,380,695,381,695,381,696,379,696,380,696,379,696,380,1772,380,1772,379,696,380,696,380,1770,381,1772,380,1770,381,696,380,696,380,696,379,696,380,696,380,696,379,696,380,696,380,696,379,1772,380,695,381,695,380,697,379,696,380,1772,379,697,379,696,380,695,381,695,380,696,380,696,380,695,380,696,380,695,381,695,380,696,380,697,379,697,378,697,379,696,407,669,380,696,380,695,380,695,381,696,379,1772,380,696,380,1770,381,696,380,696,379,696,380,1772,407,1744,380,1772,380,1770,381,1771,380,1772,380,696,380,696,380,695,380,696,380,695,381,695,380,697,379,695,381,696,380,695,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,380,696,379,696,380,696,380,695,380,696,380,697,379,696,379,696,406,669,381,696,379,697,379,697,379,695,381,696,379,696,380,695,381,696,379,697,379,696,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,695,381,696,379,1771,381,696,379,1771,381,695,381}, //19C + {5044,2129,379,1772,380,696,379,696,380,696,380,1772,379,697,379,696,380,696,380,695,406,1746,380,695,380,1772,380,1771,380,696,380,1772,380,1771,380,1772,380,1771,380,1772,405,671,379,1772,379,697,379,697,379,696,380,697,378,696,380,697,379,1771,406,671,379,696,380,1771,380,696,405,671,379,697,380,1772,405,670,380,696,379,697,379,696,380,696,380,696,379,697,379,696,380,696,405,671,379,697,379,696,383,693,379,697,404,1746,380,1772,380,1771,380,695,381,696,380,1771,380,696,380,29380,5043,2131,379,1772,380,696,380,696,379,697,379,1771,380,698,405,669,380,696,380,695,380,1773,379,696,380,1772,379,1772,380,695,380,1772,380,1771,380,1772,380,1772,379,1771,380,697,379,1772,380,695,381,695,380,697,404,670,381,695,380,696,380,1772,380,696,379,696,407,1747,377,697,379,696,380,696,405,670,381,695,380,695,381,696,379,696,380,697,379,1770,381,1772,380,696,380,696,379,1772,380,1772,379,1772,380,696,379,696,380,696,380,696,405,671,379,697,379,696,380,696,379,696,380,1771,381,695,380,697,405,670,380,696,379,1772,380,696,380,696,380,696,379,696,380,696,379,697,379,697,405,670,380,695,407,670,379,697,379,696,380,696,379,697,379,695,381,696,380,695,380,697,379,695,381,1771,380,1771,384,693,379,1772,405,670,381,700,375,696,380,1772,379,1772,380,1772,405,1746,380,1771,380,1771,381,695,407,670,379,696,380,695,380,696,380,696,380,696,404,671,380,697,379,696,380,695,380,696,406,670,380,696,380,695,407,1745,380,696,406,670,379,696,380,696,380,696,380,695,406,670,380,695,381,695,380,696,380,696,380,696,380,695,380,696,380,696,380,695,381,695,380,697,379,695,407,669,380,696,380,696,406,669,380,696,405,671,380,696,379,1772,380,1771,380,696,380,695,381,1771,380,697,379,1772,379,696,380}, //20C + {5042,2131,378,1773,379,698,378,697,378,698,378,1773,379,697,379,696,379,697,379,697,379,1772,379,697,379,1772,379,1773,379,696,379,1773,379,1772,380,1772,379,1772,380,1771,380,696,380,1772,379,696,380,697,379,697,378,696,406,671,378,696,380,1773,379,697,379,697,378,1772,405,671,379,698,378,697,379,1771,380,697,379,697,379,696,379,698,378,697,379,697,405,671,378,698,378,696,379,697,379,698,378,697,379,697,379,696,379,1771,381,1772,379,1773,379,697,378,697,405,1747,379,696,380,29359,5063,2132,379,1773,378,697,379,696,380,696,382,1769,380,696,379,697,379,697,379,697,379,1772,379,698,378,1772,379,1773,379,696,380,1772,380,1771,380,1772,379,1772,380,1772,379,697,378,1773,379,697,379,696,380,697,378,697,379,697,379,697,379,1772,379,697,379,696,380,1772,379,696,406,670,379,697,404,671,406,670,380,696,380,695,380,697,404,672,378,1772,380,1771,380,696,380,696,406,1745,380,1772,380,1771,380,696,406,670,380,696,379,696,380,697,379,696,380,696,379,696,406,670,380,1772,379,697,379,695,381,696,405,671,397,1754,379,696,380,696,406,670,380,696,379,697,379,696,380,695,380,697,379,696,380,696,406,670,405,670,407,669,406,670,405,670,407,669,380,696,405,670,381,695,406,670,405,670,407,1745,406,1746,379,696,406,670,407,669,405,1745,408,1744,406,1746,380,1771,406,1745,407,1745,406,670,380,695,408,668,380,695,407,670,379,696,380,696,407,669,405,669,406,671,407,669,406,669,380,696,379,697,407,668,407,1745,379,697,405,670,379,697,407,669,379,697,378,698,378,697,378,697,379,698,377,699,377,698,377,698,377,699,377,699,350,726,350,725,350,726,350,726,349,726,349,727,349,728,347,728,372,703,373,703,373,703,347,729,372,1778,374,702,373,1779,373,703,373,1778,374,701,374,1778,373,703,373}, //21C + {5043,2130,380,1773,378,697,379,697,379,696,379,1772,380,696,379,697,379,697,378,698,379,1773,378,697,379,1772,380,1771,380,697,379,1772,379,1773,379,1772,379,1773,379,1771,380,697,378,1774,378,697,379,697,379,697,379,696,379,697,378,698,378,1773,379,697,379,696,380,1772,378,698,379,695,380,698,378,1772,405,672,378,697,379,697,378,698,379,696,379,696,380,696,379,697,379,696,380,696,380,696,379,697,379,697,378,697,379,1773,379,1772,380,1772,379,696,379,698,378,1772,380,696,379,29382,5042,2131,379,1772,380,696,380,696,379,696,380,1771,380,696,380,696,380,696,379,697,379,1773,379,696,379,1772,380,1772,380,696,379,1772,406,1745,405,1747,380,1771,380,1772,379,696,380,1772,379,697,406,669,380,696,379,697,379,696,380,696,380,1771,380,696,380,696,380,1771,406,671,405,670,380,696,379,696,380,696,405,671,406,669,406,670,406,670,407,1744,407,1744,406,671,379,696,380,1771,380,1771,406,1746,380,696,399,677,380,696,406,669,406,670,380,696,405,670,380,696,406,669,407,1745,406,669,381,695,380,696,380,695,406,1746,406,669,407,670,406,669,406,670,380,696,406,669,407,669,407,669,380,696,405,670,380,696,380,696,406,669,406,670,406,670,379,696,406,671,405,670,380,696,379,1772,406,670,404,1748,378,1773,378,698,377,698,378,698,377,1773,377,1775,351,1801,350,1801,349,1803,348,1803,348,728,373,703,373,703,373,703,373,702,373,703,373,703,373,702,373,703,373,702,374,702,374,702,373,703,373,703,373,702,373,1779,372,703,374,703,372,703,372,704,372,703,371,705,371,706,370,704,371,705,370,706,346,729,347,729,346,730,346,729,347,729,347,729,346,730,346,729,347,729,347,729,347,729,347,729,347,728,348,728,347,728,373,703,373,1778,375,1776,376,1777,374,700,377,1775,376,700,377,1773,378,698,378}, //22C + {5043,2130,405,1746,380,696,380,695,381,696,406,1744,381,696,406,670,379,697,379,696,380,1772,379,695,406,1746,380,1772,380,696,380,1771,405,1746,383,1769,380,1771,380,1772,380,696,405,1746,406,670,380,696,379,696,380,696,393,682,381,696,406,1745,380,695,407,669,407,1745,380,696,406,669,406,670,406,1745,405,671,380,696,380,696,407,668,407,669,406,670,380,696,406,670,405,670,380,696,380,695,380,696,380,696,380,696,405,1746,380,1772,379,1772,407,669,405,671,379,1772,380,696,380,29380,5043,2130,380,1771,380,696,380,696,405,671,406,1745,380,695,381,696,406,670,379,697,405,1746,405,670,405,1747,380,1771,406,670,380,1772,379,1772,406,1745,407,1745,380,1771,380,696,380,1771,407,669,407,668,381,695,407,670,379,696,380,696,379,1772,407,669,380,696,407,1744,405,671,380,696,379,695,381,696,380,696,404,671,407,669,380,695,407,670,379,1772,407,1744,407,669,407,669,380,1771,406,1745,407,1746,406,669,405,671,379,697,381,694,386,690,405,671,405,671,405,670,380,696,406,1744,381,695,408,668,406,670,380,696,380,1771,406,670,407,669,406,670,379,697,405,670,406,670,380,695,380,697,379,696,380,695,408,669,379,697,405,670,380,696,379,696,380,696,379,696,381,696,406,669,380,696,407,1744,380,1772,380,1771,406,670,380,696,406,670,379,1772,380,1771,406,1746,380,1771,407,1745,405,1746,380,696,380,696,380,696,405,670,406,669,381,696,379,696,405,671,407,669,379,696,380,696,407,668,381,696,379,697,405,670,406,1744,381,696,380,696,380,696,380,696,405,670,380,696,405,670,407,669,405,671,380,696,405,671,405,671,404,671,406,670,379,696,380,696,406,670,405,671,405,670,405,671,380,696,379,697,404,671,380,696,380,696,379,696,380,1771,381,695,380,696,381,1770,380,1772,380,696,379,1772,406,670,379}, //23C + {5042,2130,380,1772,379,697,379,697,379,697,378,1772,380,697,379,696,379,697,379,696,382,1770,379,697,379,1775,376,1773,379,696,380,1772,379,1773,379,1771,380,1772,380,1771,380,697,379,1772,379,697,379,696,380,697,378,696,380,697,379,696,380,1772,379,696,380,697,378,1772,380,697,378,697,379,697,405,1747,378,697,379,697,379,697,379,696,379,698,378,696,380,696,379,697,379,698,378,697,378,698,378,698,378,697,379,697,379,1772,379,1773,378,1772,380,697,379,697,379,1772,378,697,379,29382,5042,2131,379,1773,379,697,378,697,379,696,380,1771,380,697,379,696,380,695,407,670,379,1772,379,697,379,1773,379,1772,379,697,379,1772,379,1773,379,1772,380,1772,379,1772,379,697,379,1773,378,698,378,696,405,672,378,698,378,697,379,697,379,1772,379,697,379,696,380,1771,380,696,380,697,378,697,379,697,379,696,379,697,379,698,378,696,380,697,379,1773,378,1772,379,697,380,696,379,1772,380,1771,380,1771,380,698,378,697,379,697,379,695,380,697,379,697,379,697,378,697,379,697,379,1772,380,696,379,697,379,696,379,697,379,1773,379,696,379,698,378,697,379,697,379,697,378,697,379,696,380,697,378,697,379,698,378,697,379,696,379,697,379,696,380,697,379,696,379,697,379,698,378,697,378,1773,379,1772,406,1746,379,1772,379,697,379,697,379,697,378,1773,379,1772,379,1772,380,1772,379,1772,381,1771,379,697,379,697,378,698,378,698,378,697,405,671,379,697,401,674,404,671,380,696,380,696,379,697,379,697,379,697,378,697,379,1772,380,696,379,697,379,696,380,697,378,697,405,671,379,696,380,697,378,697,405,670,380,697,378,697,379,697,379,696,379,698,378,697,379,696,380,696,380,696,379,697,380,695,380,697,378,697,379,697,379,697,406,670,378,1772,380,1772,379,697,406,1746,379,1772,379,696,406,1746,380,696,379}, //24C + {5069,2104,406,1745,380,696,406,670,380,696,405,1746,406,670,380,696,380,696,379,696,406,1745,381,696,405,1746,405,1746,380,696,380,1770,381,1772,380,1771,380,1771,380,1772,380,697,379,1772,406,669,407,669,380,695,381,696,406,669,380,695,381,1772,379,697,379,696,406,1745,406,670,406,670,406,670,405,1746,406,669,382,693,407,670,380,696,405,671,406,672,404,669,379,696,380,696,380,696,380,696,380,695,386,690,406,670,405,1746,406,1746,380,1771,405,671,406,670,380,1771,406,670,380,29358,5066,2129,381,1771,380,696,406,670,379,696,380,1771,380,696,407,669,380,696,380,696,379,1772,380,696,380,1771,380,1771,381,696,379,1772,380,1771,407,1746,379,1771,380,1772,405,670,380,1772,380,696,380,695,406,670,380,696,405,671,379,696,406,1746,380,696,379,696,380,1771,381,695,380,697,379,696,380,696,405,670,380,696,380,696,380,696,380,695,380,1772,406,1746,379,696,380,696,405,1745,381,1772,379,1772,380,696,405,671,379,696,407,670,404,671,405,670,407,669,380,696,406,670,379,1772,380,696,380,696,379,696,380,696,380,1771,380,696,406,670,405,671,379,696,380,696,380,696,380,695,380,696,380,695,381,696,405,670,380,697,379,696,380,696,379,697,399,676,380,696,406,670,379,696,407,669,400,676,379,696,407,668,380,1772,406,670,380,696,380,1771,380,1772,380,1771,406,1747,378,1773,379,1772,405,671,407,668,406,671,403,672,406,670,406,669,406,670,379,697,379,696,406,670,379,697,406,669,406,671,379,696,380,696,379,1771,407,670,406,670,405,671,379,696,407,669,379,696,380,696,380,696,380,696,379,697,406,669,380,696,380,696,379,696,380,696,379,696,381,696,406,669,379,697,380,695,406,670,380,696,380,696,379,697,404,671,406,670,380,1771,406,670,406,1745,380,1771,381,1772,405,670,380,1771,380,696,405}, //25C + {5041,2131,379,1773,379,697,378,697,379,697,379,1772,406,670,379,698,378,696,380,697,378,1772,380,697,379,1772,379,1773,404,672,378,1772,380,1773,378,1773,379,1772,379,1772,380,696,379,1773,379,697,379,696,380,696,379,697,379,696,380,696,380,1772,378,698,378,697,379,1773,379,696,380,697,378,697,379,1772,405,671,379,697,379,697,379,697,379,696,379,697,379,697,379,696,379,697,379,696,380,696,379,698,379,696,379,696,380,1771,383,1770,379,1772,379,697,379,697,379,1771,380,696,380,29380,5070,2103,407,1745,380,697,379,696,380,696,379,1772,380,696,405,670,380,696,406,670,380,1771,380,696,380,1772,380,1771,380,696,380,1771,406,1746,379,1772,380,1771,407,1745,380,696,406,1745,380,696,380,696,380,696,379,696,380,696,380,695,408,1744,380,696,405,671,379,1772,380,696,380,695,380,696,407,668,407,669,380,696,380,696,406,669,407,670,384,1766,407,1744,407,668,407,670,407,1745,407,1745,380,1770,381,695,407,669,380,696,380,696,407,668,380,696,406,670,406,669,407,669,406,1746,380,695,407,669,405,670,380,696,380,1772,407,669,406,669,407,669,407,669,379,696,406,670,406,670,405,671,405,671,405,670,404,672,379,697,379,696,379,697,377,699,377,699,377,698,376,700,376,700,350,1801,350,726,349,727,349,726,349,1802,349,728,348,728,347,1803,373,1778,374,1778,373,1779,373,1778,374,1778,373,703,373,702,373,703,372,704,373,703,372,702,374,703,372,704,371,704,373,703,371,706,371,704,371,704,347,729,370,706,351,1800,347,729,346,729,347,729,346,731,346,729,347,730,345,729,347,729,347,728,348,728,347,729,348,728,347,728,373,703,374,702,372,703,375,702,374,701,375,700,376,700,376,700,376,699,377,699,377,698,378,698,377,699,403,1748,378,1773,378,1774,378,1773,404,1748,378,697,404,1747,405,671,404}, //26C + {5042,2131,379,1773,379,696,378,697,379,697,380,1772,379,696,380,697,378,697,379,697,379,1772,379,697,379,1773,378,1773,379,697,378,1773,379,1773,379,1772,379,1772,380,1772,406,669,380,1772,379,697,379,697,378,697,379,697,379,698,378,697,379,1771,406,670,379,698,378,1773,379,697,378,697,379,697,379,1773,405,670,379,697,379,697,379,697,379,696,379,697,379,697,379,696,379,697,379,697,378,697,380,696,379,697,379,696,380,1772,379,1773,379,1772,405,672,378,696,380,1772,379,697,378,29361,5063,2131,379,1773,379,696,380,696,379,697,379,1773,379,696,379,697,379,697,379,696,379,1773,379,696,379,1773,379,1772,380,697,378,1773,378,1773,379,1773,378,1773,379,1772,379,697,379,1773,379,697,378,698,379,696,379,697,379,697,378,697,379,1772,380,696,379,697,379,1773,378,698,378,697,379,697,378,697,380,696,379,696,379,698,378,697,379,697,379,1773,378,1773,406,670,379,697,379,1772,379,1772,379,1773,379,697,379,697,378,697,379,697,378,698,379,697,379,696,379,696,380,697,379,1773,378,697,379,696,379,697,379,697,378,1773,379,698,378,697,379,696,379,697,379,697,379,696,379,698,378,697,379,697,379,697,378,697,379,697,379,696,380,697,379,696,379,697,379,697,379,696,379,697,379,696,380,1772,404,671,380,696,380,1772,379,696,381,695,380,1771,380,1773,379,1772,379,1772,379,1773,379,1772,380,695,380,696,380,696,381,695,406,670,379,697,379,696,380,695,381,695,406,670,380,696,406,670,379,696,407,669,406,670,382,1769,407,669,406,669,381,699,402,670,380,696,380,695,381,696,379,696,406,670,406,669,380,696,380,696,407,669,406,669,406,670,380,695,381,695,407,669,380,696,405,670,381,695,407,668,407,670,380,695,381,695,405,671,407,1743,408,669,388,688,405,670,380,696,406,1745,406,1746,380,696,380}, //27C + {5044,2130,380,1771,380,696,380,696,380,696,379,1772,380,696,406,670,379,696,380,696,380,1771,380,696,380,1771,380,1772,380,696,380,1770,381,1772,379,1772,380,1771,380,1771,381,696,380,1771,380,696,380,696,384,691,380,696,380,695,381,696,380,1772,379,696,406,669,380,1772,380,695,380,696,380,695,381,1771,380,696,380,695,381,695,381,695,381,695,380,695,381,695,381,695,380,696,380,695,381,696,380,695,380,696,380,696,380,1771,380,1771,381,1771,380,696,380,696,380,1771,380,695,381,29380,5043,2130,380,1771,381,695,381,696,379,696,380,1771,380,696,380,695,381,696,380,695,380,1771,381,696,379,1771,381,1771,380,696,380,1772,379,1772,407,1744,381,1771,380,1772,379,696,380,1771,381,695,381,695,380,696,380,695,381,696,379,695,381,1772,379,696,380,696,380,1771,381,695,380,696,380,695,381,695,380,695,381,695,381,696,380,695,380,696,380,1771,380,1771,381,695,381,695,380,1772,380,1771,380,1771,380,697,380,695,380,696,380,696,380,696,379,696,380,697,379,696,379,697,380,1769,382,695,381,695,406,670,406,670,380,1770,381,696,380,696,380,696,379,696,380,695,380,697,379,697,379,695,381,696,380,696,379,695,381,696,380,696,379,696,380,695,381,696,380,695,380,696,380,696,380,1771,380,1771,381,696,379,696,380,1771,380,697,380,695,380,1772,380,1771,380,1772,379,1772,380,1771,380,1772,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,695,381,695,380,695,381,696,380,696,380,695,380,696,380,695,381,1771,380,696,380,696,380,696,379,696,380,696,380,696,379,696,380,695,381,696,380,695,380,697,404,670,407,670,380,695,406,670,380,696,380,696,379,696,380,696,434,641,381,695,380,696,380,696,380,698,377,696,380,696,380,1771,380,1771,381,695,380,696,380,696,407,1745,379,1772,380,695,381}, //28C + {5071,2102,381,1771,406,670,380,696,407,669,406,1745,380,695,380,697,406,669,380,696,407,1744,380,696,406,1745,380,1772,406,670,406,1745,407,1744,405,1747,380,1771,407,1745,406,670,405,1746,405,671,380,696,406,669,407,669,406,670,380,696,380,1771,380,696,406,670,379,1771,381,695,381,696,381,695,379,1771,407,669,407,669,380,696,406,670,380,695,380,696,380,696,383,693,380,695,380,696,380,696,405,675,375,697,379,696,380,1771,380,1772,380,1771,406,670,407,669,405,1746,380,696,406,29355,5043,2130,407,1744,381,695,407,668,381,696,379,1772,380,696,380,695,380,696,380,695,381,1772,379,697,379,1772,380,1771,380,695,381,1771,380,1770,382,1771,406,1746,380,1771,380,696,380,1772,405,670,404,672,380,695,380,696,380,695,381,696,380,1771,380,696,380,695,406,1746,380,696,406,670,379,696,381,695,380,695,381,696,379,696,380,696,380,695,381,1771,380,1772,379,697,379,696,380,1772,379,1772,400,1752,379,696,380,696,380,696,379,697,379,696,380,696,405,671,405,670,406,670,380,1771,407,669,380,696,380,696,379,697,379,1771,381,696,379,696,380,696,380,695,381,695,406,670,406,670,380,696,379,696,380,697,379,696,380,696,407,668,407,669,380,696,405,670,380,696,380,697,379,695,407,669,380,696,380,1772,379,697,379,1772,380,695,380,696,406,1745,380,1772,404,1748,379,1772,380,1771,380,1771,381,696,380,696,405,670,380,696,398,678,405,670,380,696,380,696,380,696,406,669,380,696,407,669,380,695,380,696,380,696,380,1772,379,696,380,696,408,668,380,695,382,694,406,669,380,696,406,670,406,669,381,696,379,696,406,670,405,671,407,669,379,696,405,671,380,696,406,669,380,697,406,669,406,669,381,695,380,696,407,668,381,696,379,696,380,1771,380,696,407,1745,380,696,380,696,379,1772,406,1745,380,696,380}, //29C + {5043,2131,379,1771,381,695,406,670,380,695,406,1747,406,670,379,696,380,696,406,670,404,1746,381,696,380,1771,380,1772,380,695,380,1771,381,1772,380,1771,380,1771,380,1772,380,696,406,1745,380,696,406,670,380,696,406,670,379,696,380,696,380,1772,405,670,407,669,380,1771,380,696,407,670,381,694,380,1771,380,696,380,696,380,695,380,697,379,696,380,695,407,670,379,696,407,670,379,696,380,696,380,696,405,670,380,696,380,1771,380,1772,380,1771,380,697,379,696,380,1772,379,697,379,29382,5043,2130,380,1772,380,696,379,696,380,696,380,1772,380,695,380,696,380,696,380,696,379,1772,380,696,380,1771,380,1772,406,669,380,1772,380,1772,380,1771,385,1766,381,1771,380,696,380,1772,380,695,380,696,380,696,380,696,380,696,379,695,381,1772,379,697,379,696,380,1771,381,695,380,697,406,669,384,692,380,696,379,696,380,696,380,695,381,696,406,1744,381,1771,380,697,379,696,380,1771,380,1772,380,1771,380,697,379,695,381,696,380,696,380,695,380,696,380,696,380,695,380,696,380,1772,380,696,379,696,380,696,380,696,380,1770,381,696,380,695,381,696,379,696,380,696,380,696,380,696,379,697,379,696,380,696,380,696,380,695,380,696,380,695,381,696,379,697,380,695,380,696,380,696,380,1771,380,696,380,1771,380,696,380,1772,380,695,381,695,380,1771,385,1768,379,1772,380,1771,380,1771,381,1772,379,696,380,696,380,696,380,696,379,697,379,696,380,695,381,695,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,380,695,380,696,405,671,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,697,379,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,380,696,380,1771,380,1772,380,1771,380,696,380,696,380,1771,380,1771,381,696,384}, //30C + {5043,2130,382,1769,380,696,380,695,380,696,380,1772,380,696,406,669,380,697,379,697,379,1771,405,672,379,1771,380,1772,380,696,384,1767,380,1771,380,1773,405,1745,380,1772,380,695,381,1771,380,696,406,670,379,696,380,696,380,696,403,673,379,1772,380,697,379,696,379,1773,379,696,379,697,379,696,406,1746,379,696,380,696,380,696,379,696,380,697,379,697,379,695,381,696,379,697,379,696,380,696,405,671,379,696,380,695,406,1746,380,1772,379,1772,380,697,379,695,380,1773,379,696,380,29380,5044,2129,380,1772,406,670,380,696,379,697,379,1772,380,696,405,670,380,696,405,671,406,1745,380,696,380,1772,379,1772,380,696,379,1773,379,1772,406,1746,379,1771,406,1746,380,695,380,1772,380,696,380,696,379,696,407,669,380,696,380,696,404,1747,380,695,406,670,380,1772,380,696,379,697,379,696,406,670,380,696,379,696,380,697,379,695,381,696,379,1771,381,1771,380,697,405,670,406,1745,406,1746,379,1773,379,697,379,696,379,697,405,670,380,696,380,696,379,697,406,670,379,696,380,1772,379,696,380,696,406,669,380,697,379,1772,406,670,379,696,380,696,380,699,376,697,379,696,406,670,405,670,380,696,380,696,380,696,379,696,380,696,380,695,380,697,379,696,380,696,380,697,379,696,379,696,380,1771,380,1772,380,696,380,1772,379,696,380,696,379,1772,406,1745,381,1771,380,1772,379,1773,379,1772,380,695,403,673,380,696,405,670,380,696,380,697,379,696,379,696,380,697,404,671,379,696,381,696,379,697,379,696,380,696,379,1772,380,696,380,696,379,696,380,696,380,696,379,696,380,696,384,692,406,670,379,697,379,696,380,701,374,696,380,696,380,696,380,695,380,696,380,696,380,695,406,671,379,696,380,696,406,669,380,697,379,697,379,697,404,1747,379,696,380,695,407,1744,381,696,406,1745,380,1772,380,695,380}, //31C + {5043,2130,381,1771,380,696,379,696,380,696,380,1771,380,696,380,696,380,696,380,695,381,1770,406,671,379,1772,380,1771,380,695,381,1772,380,1771,380,1772,380,1771,407,1745,380,696,379,1772,380,695,405,672,379,696,380,696,380,696,379,697,379,1772,380,696,380,695,380,1771,407,669,380,695,381,696,380,1772,379,696,380,696,380,695,380,697,379,696,380,696,380,695,380,697,379,696,406,670,380,696,379,696,380,696,380,695,380,1773,379,1771,381,1771,380,696,406,670,379,1772,380,696,405,29355,5070,2103,380,1772,406,670,380,695,380,697,379,1771,380,697,379,696,380,696,380,696,380,1771,380,696,380,1771,380,1772,380,695,380,1771,381,1771,380,1772,380,1771,380,1772,380,696,379,1772,380,695,381,696,379,696,380,696,380,696,380,695,380,1771,381,696,379,696,380,1771,381,696,379,697,404,671,380,695,380,697,379,696,380,696,380,696,380,694,381,1771,381,1772,406,669,406,670,379,1771,381,1771,381,1771,380,696,406,669,380,696,380,696,380,695,380,697,379,696,406,670,380,694,382,1770,381,696,405,671,379,696,380,696,380,1771,380,697,405,670,380,695,406,671,380,695,406,670,380,695,381,695,380,696,380,696,380,695,380,696,407,669,380,696,380,695,380,696,380,696,380,695,381,695,380,1772,405,1746,380,1771,381,695,380,1771,381,696,379,696,380,1771,381,1771,380,1771,381,1771,380,1772,380,1772,379,695,381,696,379,696,380,696,380,695,381,695,380,696,380,696,380,696,379,696,380,695,381,696,380,695,380,696,380,696,381,1770,380,696,380,696,380,698,377,696,380,697,379,696,380,696,379,696,380,696,380,695,380,696,381,695,380,696,380,696,379,697,379,696,380,696,380,695,380,695,381,696,380,695,380,696,380,697,379,696,380,696,379,696,380,1772,379,1772,380,696,380,1771,380,696,380,1771,380,1772,380,695,380} //32C }, // Fan Speed Low { - {8978, 4502, 508, 600, 536, 600, 535, 1702, 534, 601, 534, 1703, 534, 601, 535, 599, 535, 618, 535, 600, 534, 1703, 534, 1702, 535, 1702, 534, 601, 534, 601, 535, 601, 534, 618, 533, 601, 535, 601, 534, 601, 534, 601, 535, 601, 534, 601, 534, 601, 534, 617, 536, 600, 535, 600, 535, 600, 535, 600, 535, 601, 535, 600, 536, 599, 534, 618, 535, 601, 534, 601, 535, 600, 534, 601, 535, 600, 535, 600, 535, 601, 534, 622, 535, 1702, 535, 1701, 535, 1703, 534, 589, 534}, // 15C - {8978, 4497, 508, 601, 533, 602, 535, 1701, 535, 601, 534, 1703, 534, 601, 536, 598, 535, 618, 534, 601, 534, 1703, 534, 1702, 535, 1702, 533, 602, 534, 602, 533, 601, 535, 1719, 534, 601, 534, 601, 535, 600, 535, 601, 534, 601, 535, 600, 534, 601, 535, 617, 535, 601, 533, 602, 534, 601, 534, 601, 534, 602, 534, 601, 535, 601, 533, 618, 535, 600, 535, 601, 533, 602, 534, 602, 532, 602, 534, 601, 535, 601, 534, 623, 535, 1701, 535, 1701, 536, 600, 534, 1690, 535}, // 16C - {8978, 4525, 507, 601, 534, 602, 533, 1704, 533, 602, 534, 1702, 534, 601, 534, 602, 533, 618, 535, 600, 535, 1702, 534, 1702, 535, 1702, 534, 601, 534, 602, 533, 1703, 534, 618, 534, 603, 532, 602, 533, 602, 534, 601, 533, 602, 534, 601, 535, 600, 534, 618, 535, 601, 534, 601, 534, 601, 534, 601, 535, 601, 534, 600, 535, 601, 534, 618, 534, 600, 536, 600, 535, 601, 533, 602, 534, 601, 534, 601, 535, 601, 534, 622, 535, 1702, 534, 1703, 534, 601, 534, 589, 534}, // 17C - {8978, 4504, 505, 603, 533, 603, 533, 1703, 533, 602, 533, 1704, 534, 601, 533, 602, 533, 620, 533, 601, 533, 1704, 533, 1703, 534, 1703, 533, 602, 533, 603, 532, 1704, 533, 1720, 534, 602, 533, 602, 532, 604, 534, 600, 534, 601, 534, 601, 533, 603, 533, 618, 534, 602, 533, 602, 534, 602, 533, 602, 533, 602, 533, 602, 533, 602, 533, 619, 533, 602, 534, 602, 533, 602, 533, 602, 533, 602, 533, 602, 534, 602, 533, 624, 532, 1704, 534, 601, 534, 1703, 533, 1692, 533}, // 18C - {8978, 4496, 508, 601, 534, 601, 534, 1703, 533, 602, 534, 1702, 534, 602, 534, 601, 533, 619, 534, 601, 534, 1703, 534, 1702, 534, 1703, 534, 601, 534, 1702, 535, 600, 534, 618, 535, 601, 533, 602, 534, 602, 533, 602, 533, 601, 534, 601, 534, 602, 534, 619, 533, 601, 534, 602, 534, 601, 534, 601, 534, 601, 534, 601, 534, 601, 534, 618, 535, 600, 535, 601, 534, 601, 534, 601, 534, 601, 534, 602, 533, 602, 534, 623, 534, 1702, 535, 601, 534, 1702, 535, 589, 534}, // 19C - {8978, 4522, 508, 602, 533, 602, 533, 1703, 534, 602, 533, 1703, 533, 603, 533, 602, 533, 618, 534, 602, 533, 1704, 533, 1703, 533, 1703, 534, 602, 533, 1703, 533, 603, 533, 1719, 534, 602, 533, 602, 534, 601, 533, 602, 534, 601, 534, 602, 533, 602, 533, 619, 534, 601, 533, 603, 533, 602, 533, 602, 533, 602, 534, 602, 556, 578, 534, 618, 534, 602, 533, 602, 533, 602, 534, 601, 534, 602, 533, 601, 534, 602, 533, 624, 533, 1704, 533, 602, 533, 602, 533, 1691, 534}, // 20C - {8978, 4503, 506, 603, 533, 602, 533, 1703, 534, 602, 533, 1703, 533, 602, 533, 603, 532, 620, 533, 602, 533, 1703, 534, 1703, 533, 1703, 534, 601, 560, 1677, 533, 1704, 533, 619, 533, 602, 533, 602, 534, 601, 534, 601, 534, 602, 533, 602, 533, 602, 533, 619, 533, 603, 532, 603, 533, 602, 533, 602, 533, 602, 533, 602, 534, 601, 534, 618, 534, 602, 533, 602, 533, 602, 533, 602, 534, 602, 533, 602, 533, 602, 533, 625, 532, 1703, 534, 602, 533, 604, 531, 590, 533}, // 21C - {8978, 4523, 508, 601, 534, 601, 535, 1702, 534, 600, 535, 1702, 535, 600, 535, 600, 535, 618, 534, 603, 532, 1703, 534, 1702, 534, 1702, 535, 601, 534, 1702, 535, 1702, 535, 1719, 534, 601, 534, 601, 534, 601, 534, 601, 535, 600, 535, 600, 535, 601, 534, 618, 534, 601, 534, 601, 534, 601, 535, 601, 534, 600, 535, 601, 534, 602, 533, 618, 535, 601, 534, 601, 534, 601, 534, 601, 534, 601, 535, 600, 535, 600, 534, 623, 534, 602, 534, 1703, 534, 1702, 534, 1690, 535}, // 22C - {8978, 4504, 507, 601, 534, 601, 534, 1702, 534, 602, 534, 1702, 534, 602, 534, 600, 535, 618, 534, 601, 534, 1702, 535, 1702, 534, 1702, 534, 1703, 534, 601, 535, 600, 535, 618, 533, 601, 535, 601, 534, 601, 535, 600, 535, 600, 534, 602, 534, 600, 535, 618, 534, 601, 534, 602, 533, 601, 535, 601, 535, 600, 534, 601, 535, 600, 534, 618, 534, 601, 535, 601, 535, 600, 534, 601, 534, 601, 535, 600, 534, 601, 535, 622, 535, 601, 535, 1702, 534, 1703, 533, 590, 534}, // 23C - {8978, 4529, 507, 602, 534, 600, 535, 1702, 535, 600, 535, 1703, 533, 602, 533, 601, 535, 617, 535, 601, 534, 1702, 535, 1702, 534, 1702, 534, 1703, 534, 601, 535, 600, 534, 1720, 534, 601, 534, 601, 534, 602, 533, 601, 535, 601, 534, 601, 534, 601, 535, 617, 534, 602, 534, 601, 534, 601, 534, 601, 534, 601, 534, 602, 533, 602, 534, 618, 534, 601, 534, 601, 534, 601, 534, 602, 534, 600, 534, 601, 535, 601, 534, 623, 533, 602, 534, 1702, 534, 602, 534, 1691, 534}, // 24C - {8978, 4529, 506, 603, 533, 602, 533, 1703, 533, 602, 534, 1703, 533, 602, 533, 602, 533, 619, 533, 603, 533, 1703, 533, 1703, 534, 1703, 534, 1702, 534, 602, 533, 1703, 534, 619, 533, 601, 534, 602, 533, 602, 533, 602, 533, 602, 534, 602, 533, 601, 534, 619, 533, 602, 533, 601, 535, 601, 534, 601, 534, 602, 533, 602, 533, 603, 533, 620, 532, 602, 533, 602, 533, 602, 533, 602, 534, 601, 534, 601, 534, 601, 534, 623, 534, 602, 533, 1703, 534, 602, 533, 590, 533}, // 25C - {8978, 4504, 506, 603, 533, 602, 533, 1703, 534, 601, 534, 1703, 533, 602, 534, 602, 533, 619, 533, 602, 533, 1704, 532, 1704, 534, 1702, 533, 1704, 533, 602, 533, 1704, 533, 1720, 534, 602, 533, 601, 534, 602, 533, 602, 533, 602, 533, 603, 532, 602, 535, 617, 534, 602, 534, 601, 533, 602, 533, 602, 534, 601, 533, 603, 533, 602, 533, 620, 532, 602, 533, 603, 532, 603, 533, 602, 533, 601, 534, 602, 533, 602, 533, 624, 533, 602, 534, 601, 534, 1703, 534, 1691, 533}, // 26C - {8978, 4497, 507, 600, 534, 602, 533, 1704, 533, 602, 533, 1704, 533, 602, 533, 602, 533, 619, 533, 602, 533, 1704, 532, 1705, 533, 1703, 533, 1704, 533, 1703, 533, 602, 533, 620, 532, 603, 533, 602, 533, 602, 534, 601, 533, 602, 533, 603, 532, 603, 533, 619, 533, 602, 533, 602, 533, 602, 534, 601, 533, 603, 533, 601, 534, 602, 534, 618, 533, 602, 533, 603, 533, 602, 533, 602, 533, 602, 533, 603, 532, 603, 533, 623, 534, 601, 534, 602, 533, 1704, 532, 591, 533}, // 27C - {8978, 4503, 506, 602, 534, 603, 532, 1704, 532, 603, 532, 1704, 533, 602, 533, 603, 532, 620, 532, 603, 533, 1704, 531, 1705, 532, 1705, 532, 1704, 532, 1704, 533, 603, 532, 1721, 533, 602, 533, 603, 532, 602, 533, 603, 532, 603, 533, 602, 533, 602, 533, 619, 533, 603, 533, 601, 534, 602, 532, 603, 533, 602, 534, 601, 533, 603, 532, 620, 533, 602, 533, 602, 533, 603, 532, 603, 533, 602, 533, 602, 533, 602, 534, 623, 532, 603, 533, 603, 533, 602, 532, 1692, 534}, // 28C - {8978, 4497, 507, 602, 532, 603, 533, 1703, 534, 601, 533, 1704, 533, 603, 532, 602, 534, 619, 532, 603, 533, 1704, 532, 1704, 533, 1704, 532, 1704, 534, 1702, 533, 1704, 533, 619, 533, 602, 534, 602, 533, 602, 532, 602, 534, 603, 533, 601, 533, 602, 533, 619, 533, 602, 533, 603, 533, 602, 533, 602, 533, 602, 533, 603, 533, 602, 533, 619, 533, 602, 533, 602, 533, 603, 533, 602, 532, 603, 532, 603, 533, 602, 533, 624, 533, 602, 533, 603, 532, 603, 533, 589, 534}, // 29C - {8978, 4504, 507, 601, 533, 603, 533, 1703, 533, 602, 534, 1703, 533, 602, 533, 602, 534, 618, 533, 602, 534, 1703, 533, 1704, 533, 1703, 534, 1703, 533, 1704, 532, 1704, 533, 1720, 534, 602, 533, 602, 533, 602, 533, 602, 533, 602, 533, 602, 534, 601, 534, 619, 533, 602, 533, 602, 533, 602, 534, 601, 534, 602, 533, 601, 534, 602, 534, 619, 532, 602, 534, 602, 532, 603, 533, 602, 533, 602, 533, 602, 534, 601, 533, 624, 533, 1704, 533, 1703, 534, 1703, 533, 1691, 534} // 30C + {5070,2104,380,1771,380,695,407,670,380,696,380,1772,406,668,381,696,380,696,380,695,380,1772,405,670,381,1772,379,1772,407,669,406,1745,380,1772,380,1771,380,1772,380,1771,406,671,406,1745,380,695,407,670,379,696,380,696,406,670,380,695,407,1745,405,671,380,695,407,1744,381,696,380,696,406,670,380,1771,380,696,405,671,405,671,405,670,380,696,380,696,380,696,406,670,405,670,405,671,405,671,379,696,380,696,380,696,380,1771,407,1745,407,1745,405,670,407,669,380,1771,408,668,381,29359,5066,2130,380,1771,380,697,378,696,381,696,380,1771,380,696,379,696,381,696,379,696,380,1772,405,671,379,1772,406,1746,380,696,407,1744,380,1772,379,1772,380,1772,379,1772,380,696,380,1772,379,697,379,696,379,697,380,696,379,697,405,670,380,1771,380,697,379,696,380,1772,380,696,379,696,380,696,379,697,406,670,379,697,405,670,380,696,380,697,379,1772,379,1773,379,696,379,697,379,1772,406,1746,405,1746,380,695,381,696,406,669,380,696,380,695,384,692,381,696,379,696,405,671,406,1746,379,696,380,696,406,670,380,697,405,1746,379,695,381,696,379,697,379,696,380,696,380,696,379,697,405,670,380,697,379,696,380,696,379,697,379,696,406,670,380,696,380,696,379,696,405,671,405,671,379,1772,406,1746,380,1771,406,670,380,696,406,670,379,696,380,1771,381,1772,406,1745,406,1746,406,1745,380,696,380,697,379,696,379,697,379,697,379,696,380,697,379,695,380,697,406,670,379,696,379,697,379,695,381,696,405,671,379,697,379,1773,379,697,379,696,380,695,407,669,380,697,379,696,380,696,379,696,380,697,379,696,380,695,381,696,379,696,380,696,380,696,380,696,379,696,380,696,380,696,405,671,380,695,380,696,380,696,379,696,380,695,381,696,380,1772,379,1772,380,696,407,1745,379,697,386,1765,380,696,379,696,380}, //16C + {5043,2131,379,1773,379,696,380,695,381,696,379,1771,381,696,380,696,379,696,380,696,380,1772,380,696,379,1772,380,1772,379,697,379,1772,380,1772,379,1772,380,1771,380,1772,405,671,380,1771,406,670,380,697,379,696,380,696,379,697,379,697,379,1773,379,696,379,696,380,1772,379,697,379,697,405,670,379,1773,379,697,378,698,379,696,380,695,380,697,379,696,380,696,380,696,380,696,379,696,380,696,380,696,379,697,379,696,380,1772,379,1772,380,1772,380,696,380,696,379,1772,406,671,378,29383,5043,2130,380,1772,379,697,379,696,380,697,379,1771,380,696,380,697,379,696,379,697,379,1772,380,695,381,1772,379,1773,379,697,378,1772,380,1772,380,1771,380,1772,379,1772,380,696,380,1772,405,671,380,696,379,697,379,696,404,672,380,694,381,1772,380,696,380,695,381,1771,380,696,380,697,378,696,380,697,379,696,380,696,379,696,380,697,379,696,406,1745,380,1772,380,696,380,696,379,1772,380,1772,380,1771,380,695,381,696,380,696,379,697,379,697,379,696,380,695,381,696,379,697,379,1771,380,696,405,671,380,696,380,696,380,1771,406,671,379,695,381,696,379,696,380,696,380,696,380,696,380,696,379,696,380,696,380,696,379,698,378,697,379,696,380,696,380,696,405,670,380,696,380,696,380,696,379,697,379,697,405,1746,380,695,380,697,379,697,379,1771,380,1772,380,1772,379,1773,386,1765,405,671,379,697,379,696,380,696,380,696,379,697,379,696,380,696,380,696,379,697,405,671,379,696,380,696,379,697,379,696,406,670,379,1773,379,697,379,697,379,697,379,696,380,696,379,697,379,696,405,672,378,697,406,670,379,695,381,696,380,696,380,695,380,697,406,669,380,696,380,695,380,697,379,697,378,696,381,695,406,670,380,696,380,696,380,696,380,1771,406,670,405,1746,380,1772,380,696,382,1769,380,696,406,670,380}, //17C + {5043,2131,379,1773,379,697,379,696,405,672,378,1773,405,671,379,696,380,696,379,696,380,1772,380,697,379,1771,380,1773,379,696,379,1772,380,1772,380,1772,379,1772,380,1771,380,697,379,1772,380,696,379,697,379,697,379,696,379,697,379,697,379,1772,379,696,380,696,380,1773,378,697,379,696,380,697,379,1772,380,695,380,697,379,697,379,696,380,696,379,697,379,697,379,697,378,697,379,696,380,697,379,696,380,697,379,696,379,1772,405,1748,380,1771,379,697,378,697,380,1771,380,697,379,29382,5043,2130,380,1773,378,697,379,697,404,670,380,1773,379,696,406,671,378,697,379,697,379,1772,380,696,379,1773,379,1773,379,696,380,1771,380,1773,378,1773,379,1772,405,1746,380,696,379,1774,379,695,380,696,380,696,380,696,379,698,378,696,380,1773,379,697,378,696,406,1746,380,696,380,696,379,697,379,697,379,697,379,696,379,697,379,696,380,696,379,1773,379,1774,378,696,379,697,379,1772,379,1774,378,1773,379,697,379,696,379,697,379,696,380,697,379,696,379,697,379,697,378,697,380,1772,379,697,379,696,380,696,379,698,378,1773,406,670,378,697,379,697,379,697,378,697,380,696,379,697,405,670,380,696,379,697,380,696,379,696,380,697,379,697,378,697,379,697,379,697,379,695,380,698,378,1773,379,696,380,696,379,1773,379,697,379,696,380,697,378,1772,380,1772,379,1772,379,1773,380,1772,378,698,379,696,380,696,379,697,379,696,380,697,379,696,379,697,379,697,379,696,406,670,379,696,380,697,405,671,378,697,379,696,380,1772,379,697,384,692,379,697,379,696,380,697,378,702,374,697,379,697,379,696,379,698,378,696,380,697,379,696,379,697,380,695,379,698,379,697,379,696,380,695,380,697,379,697,378,698,378,697,379,697,379,697,378,697,379,1773,379,1772,379,1773,379,1772,379,697,380,1771,380,697,379,697,378}, //18C + {5068,2105,381,1770,381,695,406,670,410,666,380,1771,407,669,380,696,407,669,404,672,380,1771,380,696,379,1772,406,1745,408,669,380,1771,380,1771,381,1771,406,1746,407,1744,405,672,379,1772,405,670,407,670,379,696,407,669,380,696,380,695,406,1746,406,670,380,695,381,1771,405,670,381,695,407,669,380,1772,380,696,380,696,407,668,406,670,380,696,405,670,380,697,406,669,380,696,406,670,380,695,405,671,407,669,380,696,401,1750,380,1771,407,1745,380,696,380,696,380,1771,380,696,380,29382,5043,2131,405,1745,408,669,380,695,380,696,380,1772,380,695,380,696,406,670,380,695,381,1772,405,670,380,1771,380,1772,380,695,381,1771,407,1745,380,1771,407,1745,380,1771,380,696,381,1771,379,697,380,695,380,696,380,696,380,696,379,696,381,1771,380,696,379,696,406,1746,406,670,379,697,380,696,379,696,407,669,406,670,382,693,405,671,380,696,380,1775,376,1772,407,669,406,669,381,1771,380,1772,405,1746,380,696,406,670,380,696,380,695,380,696,405,671,380,696,406,669,380,696,407,1744,380,696,380,696,380,695,409,668,380,1771,406,670,406,670,380,696,380,695,407,669,380,695,381,695,406,670,406,670,405,671,407,669,405,671,379,696,380,696,380,696,379,697,406,669,380,696,380,696,380,696,406,1744,407,670,380,1771,406,671,379,696,406,670,406,1745,380,1771,406,1746,407,1745,380,1771,381,698,377,696,380,695,380,696,381,696,379,696,380,696,380,696,406,669,380,696,380,696,380,696,380,696,379,696,407,668,381,696,380,1771,380,695,380,697,405,670,380,697,379,696,380,696,380,696,379,697,379,695,381,696,380,695,408,668,380,696,380,696,380,695,406,670,380,696,380,696,380,695,380,696,407,669,407,669,380,695,407,669,380,696,406,670,380,1771,406,670,380,695,407,670,380,1771,406,1745,381,695,381,695,380}, //19C + {5069,2104,380,1772,380,695,405,671,380,696,380,1771,380,696,380,696,406,670,380,695,406,1746,380,696,406,1745,407,1744,406,671,405,1746,406,1745,407,1745,405,1747,405,1747,379,696,407,1744,404,673,379,696,406,670,380,696,405,671,379,696,380,1772,380,695,407,669,398,1754,380,696,379,696,380,696,406,1745,406,670,407,670,379,696,380,695,381,696,379,696,407,669,406,670,405,671,379,696,380,696,380,696,380,695,381,696,406,1745,380,1771,380,1773,379,696,406,669,380,1772,381,695,380,29382,5043,2131,406,1745,405,670,380,696,380,696,407,1744,380,696,406,670,380,696,379,697,379,1772,380,696,380,1771,380,1773,379,695,381,1771,405,1746,406,1746,380,1772,380,1772,379,697,379,1772,380,696,379,697,379,696,380,696,406,671,378,696,380,1772,380,696,380,695,406,1746,379,696,381,696,379,696,380,696,406,670,405,670,407,670,405,670,406,669,407,1744,381,1772,380,696,410,665,380,1772,380,1771,380,1772,380,696,405,670,380,696,380,696,380,696,379,697,406,669,380,696,406,670,405,1746,380,696,407,669,380,696,379,696,380,1772,380,696,405,671,379,696,380,696,380,696,380,696,379,696,406,671,379,696,380,696,380,696,405,670,380,696,380,696,380,695,380,696,380,696,380,696,380,696,379,1773,379,1771,408,668,380,1771,381,696,406,670,379,696,380,1772,379,1772,406,1746,379,1772,406,1746,380,696,380,695,380,697,379,696,405,671,380,696,379,696,380,696,405,671,380,695,380,696,380,696,406,670,380,696,379,696,406,670,380,1771,405,672,379,696,380,696,380,696,380,696,379,697,379,696,406,670,380,696,379,697,379,696,380,697,404,670,380,697,379,696,380,696,379,697,405,670,380,696,380,696,406,670,380,696,379,696,380,696,380,695,406,670,380,1772,380,1772,379,697,379,696,380,1771,380,1772,406,670,406,670,406}, //20C + {5044,2129,380,1772,405,671,380,695,406,669,407,1745,408,669,379,696,406,669,381,695,408,1744,381,695,407,1744,381,1771,380,696,380,1771,381,1771,380,1772,379,1772,406,1745,407,669,381,1771,406,669,381,696,407,668,380,696,407,668,407,670,380,1771,380,696,380,695,407,1745,380,696,380,696,379,697,407,1744,380,696,380,695,381,695,380,696,406,670,380,695,407,669,381,695,407,669,406,670,380,695,381,695,407,669,381,695,380,1771,381,1771,408,1744,379,696,407,669,380,1771,407,669,381,29381,5044,2129,380,1772,380,696,380,696,379,697,379,1772,380,696,404,671,381,695,380,696,380,1771,381,695,405,1747,380,1772,379,696,380,1772,406,1745,380,1772,380,1772,380,1771,380,696,406,1745,406,669,381,696,379,696,380,696,380,696,380,695,381,1771,406,670,380,696,380,1771,407,669,406,670,380,696,380,696,380,695,407,669,380,696,380,696,406,670,407,1744,407,1744,382,694,380,696,405,1746,380,1772,406,1746,380,695,380,696,380,696,380,696,380,695,380,696,404,672,380,696,380,696,406,1745,380,695,381,696,406,670,379,696,380,1771,380,697,379,696,380,696,380,695,381,695,406,671,379,695,381,696,380,695,405,671,380,696,406,670,380,695,380,697,379,696,380,696,406,669,380,696,380,696,406,670,406,669,380,1772,380,1771,381,695,380,697,379,696,379,1772,381,1770,408,1744,381,1771,380,1771,380,696,380,696,380,696,406,670,380,695,380,696,380,696,406,669,380,697,379,696,380,696,380,696,379,697,405,670,380,696,380,696,380,1771,380,696,407,669,406,670,405,671,407,668,380,696,380,696,380,695,380,696,380,696,406,670,380,695,380,696,380,696,405,671,406,669,380,696,380,696,380,696,380,695,380,697,405,670,406,670,379,696,381,695,407,670,379,1771,381,695,381,1771,406,670,380,1772,379,1772,380,695,407,669,380}, //21C + {5092,2104,380,1771,380,696,380,696,380,696,404,1747,380,696,405,671,379,696,381,695,407,1744,381,696,379,1772,407,1744,381,695,406,1746,380,1771,381,1771,380,1771,407,1745,380,696,380,1771,381,695,407,669,406,670,380,696,404,671,380,696,380,1771,381,696,379,696,380,1772,380,695,382,694,380,696,406,1746,380,698,377,696,407,669,406,669,381,696,380,696,379,696,380,696,380,696,379,696,407,670,406,669,380,696,380,695,380,1772,380,1771,381,1771,380,696,380,696,411,1740,380,696,380,29382,5043,2130,380,1771,380,696,380,696,379,696,407,1745,406,669,381,695,381,695,407,669,380,1772,379,697,379,1772,406,1746,379,696,380,1772,380,1771,380,1772,380,1771,381,1771,380,696,405,1746,380,696,380,696,406,670,406,669,406,670,381,695,380,1772,380,696,379,696,380,1772,379,697,406,669,407,669,406,670,406,670,379,697,379,696,406,670,380,696,379,1772,380,1772,406,670,380,695,406,1746,380,1771,406,1745,381,696,379,696,380,696,380,696,380,695,381,695,380,696,405,671,380,696,379,1772,406,670,380,696,380,695,381,695,380,1772,407,669,380,695,380,696,380,696,380,696,406,669,380,696,380,696,380,695,381,695,380,696,406,670,380,695,408,668,380,696,380,696,380,696,380,696,380,696,379,1771,381,696,379,1772,405,1747,380,696,380,695,407,669,380,1771,380,1772,380,1771,385,1767,407,1745,379,696,380,697,404,671,380,695,381,695,380,696,380,696,380,696,380,696,379,696,380,696,380,696,380,695,407,670,379,696,406,670,380,1772,379,696,380,696,380,695,380,696,380,696,395,680,381,696,379,696,380,696,380,696,406,670,379,697,379,696,380,696,380,695,380,697,379,697,379,696,380,696,379,697,379,696,380,696,380,696,380,696,380,695,380,696,380,1772,379,1772,380,1772,407,668,408,1744,380,1772,404,671,380,696,380}, //22C + {5042,2131,379,1772,406,671,379,696,405,671,380,1772,405,670,406,671,379,696,379,697,405,1746,380,696,379,1772,380,1772,379,697,379,1772,380,1772,379,1773,379,1772,379,1772,380,696,380,1772,406,670,379,697,379,696,405,671,379,697,379,697,379,1772,379,696,406,671,379,1772,380,695,380,698,378,697,379,1772,379,697,379,696,379,698,378,697,379,698,378,697,379,696,380,696,379,697,379,696,380,696,380,697,379,695,380,696,380,1772,379,1773,379,1772,379,697,379,697,379,1772,379,697,379,29359,5067,2130,406,1745,380,696,380,697,379,696,379,1773,379,696,380,697,378,697,379,696,380,1772,379,696,380,1772,379,1772,380,696,380,1772,379,1773,379,1772,379,1773,379,1771,381,695,380,1772,380,697,378,697,379,697,379,696,406,670,380,696,379,1773,379,696,380,696,380,1772,405,671,379,696,380,696,379,696,380,697,379,696,380,697,378,697,379,697,378,1773,380,1772,379,696,380,697,378,1772,380,1771,380,1773,379,696,380,697,379,697,378,697,379,696,379,696,381,696,379,697,379,697,379,1772,379,696,381,696,379,696,380,696,379,1772,380,696,380,695,380,697,379,697,405,671,379,696,405,671,379,697,379,696,380,696,379,697,379,697,379,697,379,696,380,696,379,697,379,697,379,696,380,696,379,697,406,1746,378,1772,380,1772,379,697,379,697,379,697,379,1772,379,1772,380,1772,379,1773,405,1747,379,696,379,697,379,697,379,697,379,697,378,696,380,697,379,696,379,697,379,697,406,669,406,671,379,696,379,697,379,697,379,696,380,1772,379,697,379,697,379,697,379,696,379,697,379,697,379,697,379,696,379,697,405,671,379,696,379,697,379,697,379,696,380,696,405,671,380,696,379,697,379,696,380,696,380,696,379,697,379,696,380,696,380,696,380,695,380,1772,380,696,380,696,379,1772,380,1772,379,1772,380,696,380,696,379}, //23C + {5068,2104,381,1771,407,669,380,696,406,670,379,1772,380,696,406,670,380,694,382,696,405,1745,406,671,380,1771,380,1772,405,671,405,1746,380,1771,380,1772,380,1772,380,1771,380,697,379,1770,381,696,380,696,407,669,380,696,379,697,379,696,380,1772,379,696,380,696,380,1772,379,696,380,696,407,669,405,1746,380,696,380,696,380,695,380,696,380,696,382,694,379,696,407,669,406,670,405,671,380,696,379,697,379,697,379,696,406,1746,379,1772,380,1772,406,669,380,696,385,1766,380,696,380,29381,5044,2130,380,1771,380,696,380,696,406,669,380,1771,406,670,381,696,380,695,380,697,406,1745,380,696,379,1772,380,1772,379,696,407,1745,380,1771,380,1773,404,1746,405,1747,380,696,405,1746,407,669,380,696,379,696,380,696,407,669,380,696,380,1771,406,669,381,696,379,1772,380,696,406,670,380,695,380,696,380,696,380,696,380,696,380,695,380,696,406,1744,381,1771,381,696,379,697,379,1772,405,1747,379,1771,381,696,406,670,380,695,380,696,380,696,380,696,379,697,385,690,380,695,406,1746,405,672,379,696,405,671,405,670,380,1772,380,696,379,696,381,695,380,696,380,696,380,695,380,696,380,695,381,696,379,697,379,696,380,696,406,669,381,696,379,697,404,671,405,671,379,697,379,697,379,1771,380,1772,380,1771,380,1772,380,696,380,695,381,696,379,1772,380,1772,379,1772,380,1772,379,1772,380,696,380,696,379,697,379,696,406,670,405,671,404,672,404,671,380,696,380,696,406,670,379,697,379,696,380,695,381,696,379,696,380,1771,380,697,379,697,379,695,381,696,379,697,379,696,407,669,380,696,405,670,380,696,380,696,380,696,379,696,380,696,380,695,407,670,379,696,380,696,380,696,380,695,406,670,380,696,380,696,380,696,380,696,379,696,407,1745,379,1772,380,696,380,1771,407,1745,380,1771,380,695,381,696,406}, //24C + {5043,2130,380,1772,379,697,379,697,379,697,405,1747,379,695,380,697,379,697,379,696,380,1772,379,695,381,1771,406,1745,381,696,380,1771,380,1772,379,1772,405,1747,380,1772,379,696,407,1744,380,697,379,697,379,696,406,670,380,696,379,697,404,1746,381,696,405,671,379,1771,381,697,378,696,407,669,380,1772,379,697,379,697,379,697,379,695,380,698,403,672,379,696,380,696,379,696,380,696,380,696,380,696,380,696,379,697,379,1772,379,1772,405,1747,379,696,380,696,380,1772,405,671,405,29355,5044,2130,380,1772,379,697,379,696,380,695,381,1771,406,671,405,670,380,695,380,696,380,1772,380,696,406,1744,381,1772,379,696,380,1772,380,1771,380,1772,380,1772,379,1772,380,696,380,1771,380,695,381,696,405,671,379,696,380,697,379,697,378,1773,405,670,380,696,380,1772,405,671,379,696,380,696,379,696,406,675,401,670,380,696,405,671,379,696,380,1771,381,1771,384,692,379,697,379,1772,380,1772,380,1771,380,696,379,697,379,697,379,697,379,696,380,696,406,670,379,696,380,696,380,1771,407,670,379,697,404,670,381,696,405,1747,379,696,379,696,380,696,380,696,380,696,379,697,379,696,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,405,671,380,696,379,697,379,696,380,696,380,696,380,696,379,697,379,1772,379,696,380,697,379,1772,379,1772,380,1777,375,1771,380,1772,406,671,404,671,379,696,380,695,407,670,405,671,405,670,380,696,379,697,406,670,379,696,406,670,379,696,380,697,379,697,379,696,406,1745,380,696,380,696,380,696,379,696,380,696,379,696,380,696,380,697,379,696,380,696,379,696,380,696,380,696,380,696,380,696,405,671,379,697,404,671,379,696,380,696,380,696,405,671,379,697,379,697,379,696,406,670,379,1773,405,670,380,1771,406,1746,380,1771,408,1744,406,670,379,696,385}, //25C + {5042,2131,380,1772,406,670,379,696,380,696,380,1771,380,696,379,697,406,670,379,696,380,1772,379,697,379,1772,379,1773,379,697,379,1772,379,1772,380,1772,380,1771,380,1772,382,694,379,1772,380,696,379,700,376,697,404,671,380,696,379,696,380,1772,380,696,379,697,379,1772,406,671,379,696,379,697,379,1772,380,696,379,696,380,697,404,672,379,696,380,696,379,697,379,696,380,696,379,697,379,696,380,696,380,696,380,696,379,1772,380,1772,379,1773,379,696,379,696,380,1772,404,672,379,29382,5043,2130,380,1772,379,697,379,696,380,696,380,1772,379,696,380,696,380,696,406,670,379,1772,380,696,379,1772,380,1772,380,695,406,1747,379,1772,405,1747,379,1771,406,1747,379,696,380,1772,379,697,405,671,379,696,379,697,379,696,406,670,380,1772,406,669,380,696,380,1771,380,696,380,697,379,696,405,671,405,670,380,696,380,695,380,696,380,697,379,1771,407,1745,380,696,380,695,406,1746,380,1771,380,1772,380,697,405,670,379,697,379,696,380,696,380,695,380,697,379,697,379,697,379,1772,406,670,404,671,380,696,379,697,380,1771,405,671,379,697,379,697,381,695,380,695,380,696,379,696,380,696,380,696,380,695,380,697,379,696,380,696,406,671,378,697,405,670,379,697,380,696,379,697,379,1772,380,696,379,697,379,696,380,1772,379,697,379,696,406,1746,405,1746,380,1772,379,1772,380,1771,380,696,380,696,380,696,380,696,379,697,379,696,380,696,380,695,380,697,379,697,379,696,379,696,380,697,379,697,379,697,379,696,379,1772,380,696,380,695,380,696,382,695,379,696,380,696,379,697,379,697,379,696,407,669,379,697,379,696,379,696,380,697,406,669,380,696,406,670,380,696,406,669,380,696,380,696,380,696,379,696,406,671,379,696,405,671,379,1772,406,1746,379,1772,380,1771,380,1772,380,1772,379,697,379,698,378}, //26C + {5043,2130,380,1771,380,696,406,670,380,696,407,1744,380,695,407,670,380,695,381,695,381,1771,406,669,406,1746,380,1772,380,695,406,1746,380,1772,405,1746,407,1744,381,1771,380,696,380,1771,380,696,380,696,407,669,380,695,407,669,380,696,380,1771,380,696,380,696,380,1771,406,670,380,696,380,695,381,1771,405,671,380,696,405,670,406,670,407,669,406,670,407,668,406,670,380,696,380,695,406,671,404,671,380,696,380,695,407,1750,375,1772,406,1745,380,696,380,696,407,1744,406,670,380,29382,5042,2130,380,1772,380,695,381,696,380,696,379,1772,406,670,380,695,380,696,380,696,380,1771,380,696,380,1772,405,1747,404,670,407,1746,379,1772,380,1771,381,1771,406,1746,379,696,380,1771,381,696,381,694,380,696,380,696,380,696,406,669,380,1772,380,696,379,697,379,1772,380,695,380,697,379,696,380,696,380,696,379,696,380,696,381,694,381,696,406,1745,380,1771,381,695,407,669,380,1772,380,1771,406,1745,380,696,406,670,380,696,405,670,381,696,379,696,406,670,380,695,381,696,379,1772,380,696,399,676,381,695,380,695,406,1747,406,669,380,696,380,696,405,671,380,695,406,670,380,696,406,670,406,669,380,696,407,669,405,671,407,668,406,670,380,696,406,669,380,697,405,670,380,696,405,671,393,1758,381,695,380,696,380,1771,404,672,406,669,408,1744,380,1771,380,1772,406,1745,380,1772,380,696,406,670,379,697,379,696,380,695,381,696,405,670,380,696,380,696,380,695,381,695,380,695,381,696,406,670,379,697,405,670,380,1771,380,696,380,696,406,670,380,695,380,696,380,696,380,696,380,695,380,696,406,670,406,669,381,696,380,695,406,670,406,670,380,696,379,696,380,696,380,696,380,695,381,695,380,696,380,695,381,696,379,696,380,696,380,1771,381,695,380,696,380,696,380,695,380,696,380,1772,406,669,380}, //27C + {5042,2130,407,1745,380,696,380,695,408,668,380,1771,407,669,380,696,380,696,380,696,380,1771,380,696,380,1772,379,1772,380,696,400,1751,407,1745,406,1745,380,1772,406,1745,380,696,380,1771,406,671,405,670,406,670,380,696,406,669,406,670,380,1772,379,696,380,696,380,1771,381,695,380,697,405,670,380,1771,380,696,380,696,405,671,406,670,406,669,380,696,380,695,381,696,379,696,406,670,406,670,406,669,380,696,380,696,380,1771,381,1771,380,1771,381,695,405,671,380,1771,408,668,380,29382,5043,2130,380,1771,380,696,380,696,379,697,379,1773,379,696,406,670,379,696,380,696,380,1772,379,697,379,1772,380,1772,379,696,380,1773,378,1773,379,1772,379,1772,380,1772,379,697,379,1772,406,670,379,698,405,669,380,696,380,696,379,697,379,1772,380,696,379,697,379,1772,380,696,379,697,379,697,379,696,379,697,380,696,379,697,379,696,379,697,406,1745,380,1772,380,696,379,697,379,1771,380,1773,379,1772,380,696,379,696,380,696,380,697,405,670,379,696,380,697,378,697,380,696,379,1772,406,670,380,696,379,697,379,696,380,1772,379,697,379,697,379,696,379,697,379,696,380,697,379,696,380,696,379,696,380,696,380,696,379,696,380,697,405,669,381,696,380,695,380,697,404,671,405,671,380,1771,380,1771,407,670,379,696,380,1773,405,670,379,697,379,1772,402,1749,380,1772,380,1771,380,1772,380,696,380,695,380,696,380,696,380,696,380,695,380,696,380,696,379,697,379,696,380,696,380,696,380,696,379,696,380,696,380,696,406,1745,380,696,380,696,379,697,379,697,379,696,380,696,379,697,379,697,406,670,405,670,379,697,379,695,381,696,406,670,380,696,379,697,379,696,406,670,379,696,380,696,380,697,379,696,380,696,379,697,379,696,380,696,380,1771,380,1772,380,696,379,697,379,696,380,696,380,1772,379,697,379}, //28C + {5043,2130,407,1744,381,695,380,696,407,669,406,1745,407,669,406,670,380,696,380,696,406,1745,406,669,406,1747,384,1766,407,669,381,1771,407,1744,384,1768,407,1744,407,1745,407,669,401,1751,380,695,407,669,380,695,407,669,381,695,380,696,380,1771,380,696,405,671,406,1745,406,670,380,696,380,696,380,1771,380,696,406,669,407,669,408,668,380,696,407,669,405,670,407,670,406,668,406,671,406,669,406,670,406,670,406,670,380,1771,407,1745,407,1744,380,695,381,696,380,1772,406,669,406,29355,5070,2104,406,1745,380,696,380,696,380,696,379,1772,406,670,380,696,379,696,380,696,380,1772,385,690,407,1744,408,1744,380,696,405,1747,406,1745,406,1746,380,1771,405,1746,381,695,380,1772,406,670,380,695,407,669,405,671,380,696,406,670,405,1746,407,669,380,695,380,1772,380,695,407,669,380,697,405,670,380,696,407,668,406,670,405,671,406,670,406,1745,380,1772,406,669,407,669,380,1771,380,1772,380,1772,380,696,379,696,380,696,406,670,380,696,380,695,380,696,380,696,380,695,380,1772,389,687,380,696,405,670,380,696,406,1745,381,695,380,696,380,696,406,669,381,695,407,669,405,671,379,696,381,695,405,671,406,670,380,696,406,669,380,695,381,696,406,669,380,696,406,670,405,670,381,695,406,671,379,1771,380,697,379,1771,381,696,406,669,380,1771,407,1746,380,1771,380,1771,380,1772,406,670,380,695,406,670,406,670,406,669,381,695,407,669,407,668,406,669,382,695,380,696,380,696,403,673,380,696,380,695,406,670,405,1746,406,670,380,696,380,695,406,670,380,697,379,696,380,696,380,695,380,696,406,670,380,696,380,695,380,696,380,696,380,695,381,695,407,669,406,670,380,695,380,696,380,696,407,669,406,669,380,697,379,696,380,696,406,1745,381,695,380,1772,380,695,384,692,380,695,407,1745,381,696,379}, //29C + {5043,2130,380,1772,404,671,406,670,406,670,380,1771,380,696,380,696,406,670,379,696,387,1765,380,696,380,1771,380,1772,405,670,381,1771,380,1772,405,1746,380,1771,381,1771,405,671,380,1771,380,696,380,695,407,670,380,695,406,670,380,696,406,1745,381,695,406,670,407,1744,406,670,406,670,380,695,381,1771,380,696,406,670,406,669,407,669,406,670,380,695,381,696,405,670,380,696,380,695,381,695,407,669,380,696,405,670,381,1771,406,1745,381,1771,380,696,406,669,381,1771,380,696,380,29381,5044,2129,406,1746,406,670,379,696,381,695,380,1772,380,695,381,696,379,696,380,696,380,1770,381,696,407,1744,380,1772,407,669,380,1772,405,1745,407,1745,406,1746,407,1744,380,696,380,1771,381,695,380,696,406,670,380,695,381,695,380,696,380,1771,381,695,380,696,410,1741,381,695,406,670,380,695,381,695,381,695,407,669,406,669,380,696,407,669,380,1771,381,1771,380,696,380,696,406,1745,380,1772,406,1745,380,696,380,695,381,696,405,670,407,669,380,696,380,696,380,695,380,696,407,1745,380,695,407,669,406,669,381,695,407,1745,408,668,406,669,381,695,406,670,380,697,379,695,381,696,380,695,406,669,408,669,380,695,405,671,380,696,380,695,406,670,380,696,380,696,380,695,381,695,380,1772,380,695,381,1771,380,696,380,1771,380,696,380,696,380,1771,381,1771,380,1771,380,1771,381,1771,407,669,407,669,381,694,407,669,407,669,380,696,380,696,406,669,381,695,380,696,380,696,405,670,381,695,380,695,381,696,379,696,381,1771,380,695,407,669,391,685,406,670,380,695,381,695,407,669,381,695,406,670,405,670,380,696,380,696,380,695,380,698,405,669,406,670,380,695,408,668,405,671,407,669,406,670,380,695,380,696,380,696,406,669,381,695,406,1746,380,1772,380,1771,406,670,406,669,380,696,380,1772,406,669,380}, //30C + {5043,2129,380,1773,379,696,379,697,380,696,380,1772,404,672,379,697,378,697,379,697,379,1771,380,697,379,1772,406,1746,379,696,380,1772,405,1747,379,1772,380,1771,380,1773,378,697,379,1772,380,697,379,696,379,697,380,695,380,696,379,697,380,1771,380,696,380,696,379,1772,380,696,380,696,380,696,379,1772,379,698,379,695,380,697,379,697,405,670,379,697,405,670,380,696,380,696,407,669,379,696,380,697,379,696,379,696,380,1772,380,1772,379,1772,379,698,378,697,379,1772,407,669,380,29382,5068,2105,379,1772,379,697,379,696,380,697,379,1772,379,698,378,696,406,671,379,696,380,1771,380,697,379,1772,379,1772,380,696,379,1772,380,1772,406,1746,379,1773,378,1773,405,671,379,1772,379,697,406,668,381,696,379,697,379,697,379,697,379,1771,380,696,380,695,381,1772,380,695,380,697,379,697,379,696,380,696,380,696,405,670,380,696,379,696,407,1746,379,1772,379,696,380,697,379,1771,380,1772,380,1771,380,697,379,696,380,696,406,670,405,670,380,697,378,696,380,697,379,696,380,1772,379,697,379,697,379,696,380,696,379,1772,380,697,379,696,379,697,379,697,378,698,379,696,380,696,379,697,379,696,380,695,381,696,379,696,380,697,378,698,379,697,378,697,406,670,379,696,379,696,380,697,379,1772,380,1771,380,697,405,1746,405,671,379,696,380,1772,380,1772,379,1772,379,1772,380,1772,379,697,379,697,379,696,379,697,379,696,380,696,380,696,380,696,379,696,380,697,379,695,380,697,379,697,379,697,379,696,380,696,379,1773,379,696,380,695,380,696,380,697,379,696,379,697,379,697,379,697,378,698,378,698,378,696,380,696,380,696,380,696,379,696,380,696,391,685,380,696,380,696,379,697,405,670,380,696,380,696,379,696,406,670,407,669,379,1772,380,696,380,696,405,1747,405,670,380,696,380,1771,380,696,380}, //31C + {5043,2130,407,1744,380,696,380,696,405,670,406,1746,406,670,405,670,380,697,379,696,380,1772,405,670,381,1771,380,1771,380,695,381,1772,379,1772,380,1772,380,1771,380,1772,380,695,407,1745,380,696,379,697,379,696,407,669,380,696,406,669,380,1772,380,696,379,697,405,1746,380,696,379,696,380,697,379,1772,385,690,380,696,380,696,380,696,380,696,380,695,380,696,380,696,380,695,407,669,380,696,405,671,380,696,379,696,380,1771,406,1746,407,1745,380,696,379,696,435,1716,406,671,379,29382,5069,2104,380,1772,405,670,380,696,380,697,379,1771,380,696,382,694,379,696,406,670,405,1747,380,696,379,1772,406,1745,381,695,380,1771,381,1771,380,1772,406,1745,380,1772,406,670,379,1772,380,696,380,696,379,696,380,697,379,696,407,669,380,1771,380,696,380,696,406,1745,380,696,380,696,380,696,379,697,379,696,394,682,380,695,407,670,404,672,379,1771,380,1772,380,696,405,670,380,1772,380,1771,380,1772,380,696,379,697,405,670,380,696,380,696,406,670,379,697,379,696,380,695,381,1771,380,696,380,696,380,696,406,669,380,1772,380,695,406,670,380,696,379,697,405,671,405,670,406,670,380,696,379,696,406,671,379,696,380,695,380,696,380,696,380,696,380,696,405,670,380,696,406,669,381,1772,380,1771,380,1771,380,696,405,1747,380,695,380,696,380,1772,379,1772,406,1747,379,1771,380,1772,379,697,379,696,380,695,381,696,379,696,380,696,380,696,405,671,407,669,379,696,380,696,406,670,379,696,380,697,379,696,405,670,380,1772,380,696,380,696,379,696,380,696,406,669,381,696,405,671,379,697,379,696,380,695,380,696,380,696,380,696,380,696,379,697,379,697,379,696,380,696,379,696,407,669,380,696,380,696,379,696,380,696,406,670,380,696,405,1746,380,1772,405,671,379,1772,380,696,380,695,380,1772,380,696,379} //32C + }}; -const uint16_t ir_code_fan[4][91] = { - {8976, 4498, 559, 551, 584, 550, 560, 1677, 586, 550, 584, 1652, 585, 551, 560, 575, 585, 568, 559, 576, 585, 551, 585, 550, 584, 552, 559, 1677, 584, 1653, 560, 1677, 585, 1669, 584, 551, 560, 576, 559, 576, 584, 554, 583, 550, 584, 551, 585, 551, 585, 567, 561, 575, 584, 551, 560, 576, 584, 551, 585, 550, 560, 576, 584, 551, 560, 593, 560, 576, 584, 550, 585, 551, 584, 551, 584, 552, 584, 551, 584, 551, 560, 598, 559, 576, 585, 1652, 583, 1654, 559, 565, 559}, // AUTO - {8990, 4500, 530, 579, 557, 578, 557, 1680, 557, 578, 557, 1680, 557, 579, 557, 578, 557, 595, 557, 579, 557, 578, 557, 579, 556, 1680, 558, 1679, 557, 1680, 558, 1680, 556, 1697, 558, 577, 558, 579, 555, 579, 558, 578, 557, 578, 557, 578, 557, 579, 556, 596, 557, 579, 556, 579, 557, 578, 557, 579, 556, 579, 557, 579, 556, 579, 557, 595, 557, 578, 558, 578, 557, 579, 556, 579, 557, 579, 556, 578, 557, 579, 557, 600, 557, 579, 556, 1680, 557, 579, 557, 1668, 557}, // HIGH - {8977, 4497, 508, 601, 533, 602, 535, 1702, 534, 602, 533, 1703, 535, 601, 534, 602, 533, 619, 534, 601, 533, 603, 533, 1703, 534, 602, 533, 1704, 533, 1704, 534, 1702, 534, 1721, 533, 601, 534, 602, 534, 602, 533, 602, 533, 602, 534, 601, 536, 600, 534, 618, 534, 602, 534, 601, 534, 602, 533, 601, 534, 602, 534, 602, 533, 602, 533, 619, 534, 602, 533, 602, 533, 602, 533, 603, 533, 602, 534, 602, 534, 601, 533, 624, 534, 602, 533, 1703, 534, 603, 534, 588, 533}, // MED - {8976, 4505, 506, 602, 534, 601, 534, 1703, 533, 603, 533, 1705, 532, 602, 534, 602, 533, 619, 534, 601, 533, 603, 533, 1704, 533, 1704, 533, 1703, 533, 1705, 533, 1704, 533, 1720, 534, 602, 533, 602, 534, 601, 534, 602, 533, 602, 534, 601, 534, 603, 532, 620, 532, 603, 532, 604, 532, 602, 534, 602, 532, 603, 534, 602, 533, 602, 534, 618, 534, 601, 534, 602, 534, 602, 534, 600, 534, 602, 533, 602, 534, 602, 533, 624, 534, 602, 533, 602, 534, 1703, 533, 1692, 534} // LOW +const uint16_t ir_code_fan[4][407] = { + {5069,2104,406,1746,407,668,408,669,405,670,407,1745,407,668,381,695,381,695,406,670,380,1772,379,696,406,1745,381,1771,380,696,380,1772,379,1772,381,1770,406,1746,407,1745,380,696,406,1745,381,695,380,696,380,696,406,669,407,669,380,696,406,1746,402,673,380,696,406,1746,380,695,407,669,380,696,406,1745,406,670,407,670,379,696,406,670,380,695,407,669,406,669,408,669,406,670,380,695,380,696,407,669,380,695,405,671,407,1745,406,1746,379,1772,380,696,406,670,379,1772,380,696,380,29383,5068,2105,380,1771,407,669,380,696,406,669,380,1772,380,696,380,696,380,695,381,695,380,1771,381,696,380,1771,406,1745,381,695,381,1771,405,1747,379,1772,405,1747,380,1771,395,681,406,1745,381,695,407,669,407,669,380,696,379,696,407,669,380,1771,407,669,406,670,380,1772,406,669,381,695,406,670,380,695,381,695,407,669,407,669,380,696,406,670,380,1771,406,1746,405,670,381,696,405,670,405,1747,380,1771,406,669,408,669,407,668,407,669,380,696,380,696,380,695,380,696,381,695,380,1771,407,669,381,696,406,669,406,670,380,695,381,695,407,669,406,669,381,696,405,670,381,695,380,696,380,696,407,669,405,670,407,669,383,693,407,669,379,696,380,696,406,670,406,669,407,669,381,695,407,669,405,670,380,696,381,696,404,670,381,696,380,695,381,1771,406,1745,381,1770,408,1745,380,695,381,695,380,696,380,696,407,669,406,670,380,695,380,696,380,696,405,671,380,695,407,669,380,695,381,695,381,695,380,696,380,696,406,1745,407,669,380,696,380,696,406,669,381,695,380,696,380,695,406,670,406,670,406,670,380,696,405,670,381,695,380,696,380,696,407,669,380,695,406,670,407,669,407,669,380,695,381,696,406,669,407,669,380,696,380,695,406,1746,406,670,406,1745,406,1745,407,1745,381,695,381,1771,380,1771,407}, //AUTO + {5043,2130,380,1772,380,696,380,696,379,697,379,1771,381,695,381,696,379,696,406,670,380,1771,381,696,379,1771,381,1771,380,696,380,1771,381,1771,380,1772,380,1772,380,1771,380,696,380,1771,381,694,381,696,380,696,380,695,381,695,380,696,380,1772,380,695,380,697,379,1772,380,695,381,695,381,695,380,1772,380,696,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,695,381,696,380,696,380,696,379,695,381,695,381,1771,380,1771,381,1771,380,697,379,696,380,1771,381,694,381,29382,5044,2130,380,1771,380,697,379,696,380,696,380,1770,381,696,436,640,380,696,380,696,380,1770,381,695,407,1746,379,1771,381,696,380,1771,380,1772,380,1770,381,1772,380,1772,380,696,380,1771,380,696,380,696,380,696,380,697,378,695,381,696,380,1772,379,697,379,696,380,1772,380,696,379,696,380,696,380,696,380,696,379,696,380,696,380,695,381,695,380,1771,381,1772,380,695,380,696,380,696,380,1772,379,1772,380,696,380,696,380,696,379,696,380,696,380,696,380,696,379,696,381,695,380,1771,381,695,380,696,380,696,380,695,381,695,381,695,380,696,380,696,380,695,381,695,380,695,381,696,380,696,380,695,381,696,379,697,379,696,380,696,380,695,380,696,380,697,379,696,380,695,380,696,380,697,379,696,380,696,380,695,381,696,379,695,381,696,380,1771,380,1772,380,1772,379,1772,380,1772,380,696,379,1772,380,696,380,696,380,696,379,696,409,667,380,695,381,695,380,696,380,696,380,696,380,695,381,695,380,696,380,696,380,1771,380,696,380,696,406,669,381,695,380,696,380,695,381,696,380,696,379,696,380,696,380,696,379,696,406,671,379,696,405,671,380,696,380,695,380,696,380,697,379,696,380,695,380,696,380,696,380,696,380,696,379,697,407,1743,407,669,380,1772,407,1744,409,668,405,1746,406,670,380,695,380}, //HIGH + {5069,2105,405,1746,381,695,380,695,381,696,407,1745,379,696,380,696,380,696,380,696,380,1771,380,697,379,1771,406,1745,407,669,381,1771,380,1772,405,1746,380,1772,380,1772,379,696,380,1772,379,696,407,669,380,695,381,696,380,696,379,696,380,1771,381,696,380,695,380,1772,380,696,380,695,405,672,379,1771,381,695,380,695,407,670,380,696,404,670,381,696,380,696,380,697,404,670,406,670,380,696,406,669,381,696,380,695,380,1771,381,1772,379,1771,381,695,381,695,407,1744,381,695,381,29381,5069,2104,380,1772,380,696,406,670,380,696,379,1772,380,695,406,670,380,696,380,696,380,1772,406,668,406,1746,381,1771,380,696,380,1772,379,1772,380,1771,381,1771,406,1746,406,670,379,1772,380,695,407,669,380,696,380,696,380,696,405,671,379,1772,380,696,380,696,406,1745,380,696,405,671,404,671,380,696,380,696,405,671,380,695,407,669,380,696,380,1771,380,1772,380,695,381,694,407,670,380,1771,381,1771,380,696,406,669,407,669,406,670,380,696,380,696,380,695,406,671,406,669,380,1771,380,696,380,696,380,696,406,670,405,671,379,697,379,697,379,695,406,670,407,669,380,696,380,696,379,696,380,696,380,695,381,695,407,670,379,696,380,696,406,669,406,670,380,696,380,696,380,696,380,695,406,671,405,670,406,669,381,696,379,697,405,670,405,1747,379,1772,405,1746,406,1746,380,1771,395,1757,380,696,380,697,379,695,407,669,380,696,405,671,380,695,380,696,380,696,406,670,406,670,405,670,380,696,408,668,404,671,381,1771,380,697,394,680,380,696,406,670,380,696,380,696,407,668,407,669,380,696,380,695,380,696,380,696,405,671,380,695,381,696,406,669,380,697,379,696,379,696,380,696,380,697,379,696,406,669,408,668,380,695,381,695,380,1772,380,696,380,1772,379,1772,406,670,405,670,381,695,380,696,380}, //MID + {5039,2131,406,1745,380,696,379,697,378,698,378,1772,380,697,379,697,379,696,379,697,404,1748,378,698,379,1771,380,1772,379,698,378,1772,380,1772,379,1773,379,1772,383,1768,380,697,379,1772,379,697,379,696,380,697,379,696,406,671,378,696,380,1773,378,697,379,698,378,1772,379,698,379,696,379,697,379,1772,380,696,379,697,379,697,406,669,380,696,379,697,379,696,380,696,380,696,379,697,379,697,379,696,379,697,380,696,379,1773,379,1772,379,1772,406,670,405,671,379,1772,380,696,380,29382,5043,2130,379,1773,405,670,380,695,381,696,379,1772,379,697,380,696,379,697,379,697,379,1772,405,671,379,1772,380,1771,380,697,379,1772,380,1772,379,1773,379,1772,379,1773,379,696,405,1746,382,694,380,696,379,696,380,696,380,696,380,695,381,1772,379,696,380,696,379,1773,379,696,380,696,380,696,405,671,379,696,380,696,380,696,406,671,378,697,379,1772,380,1772,379,696,380,696,380,696,405,1746,380,1772,379,697,379,697,379,697,379,696,380,696,379,697,379,697,379,696,380,696,379,1773,379,696,379,698,378,696,406,671,379,696,380,696,379,697,379,697,405,670,380,696,379,697,379,697,379,697,406,670,404,671,379,697,378,697,380,696,379,697,379,697,379,696,380,697,379,696,380,696,379,697,379,695,380,697,405,671,379,696,380,696,379,697,379,1773,379,1772,379,1772,380,1772,379,1773,379,696,380,696,379,697,379,697,379,696,380,696,405,671,379,697,379,696,380,696,379,697,379,697,404,672,379,696,379,698,379,696,379,1772,380,696,380,696,379,698,404,670,380,696,379,696,380,697,379,696,379,697,379,697,380,696,379,696,380,697,405,670,405,671,379,697,379,696,380,696,379,696,380,697,378,698,379,697,378,697,379,697,379,696,405,671,379,1772,380,697,379,1772,379,1772,380,696,380,1771,380,1772,379,1773,379} //LOW }; -const uint16_t ir_code_off[91] = {9004, 4475, 559, 552, 583, 578, 557, 1680, 557, 554, 582, 578, 557, 553, 582, 553, 583, 569, 583, 552, 584, 1679, 558, 552, 583, 578, 557, 1680, 557, 1655, 582, 1680, 557, 1697, 557, 553, 582, 578, 558, 577, 558, 578, 558, 552, 583, 578, 557, 579, 557, 569, 583, 553, 583, 578, 557, 552, 584, 577, 558, 553, 582, 553, 582, 553, 583, 594, 557, 579, 557, 579, 556, 552, 584, 579, 557, 578, 557, 552, 584, 578, 557, 600, 557, 1653, 584, 552, 584, 1679, 558, 539, 584}; +const uint16_t ir_code_off[407] = {5044,2129,408,1744,406,670,380,697,404,671,405,1746,380,696,405,671,406,670,405,671,405,1746,406,670,405,1747,406,1745,406,670,405,1746,405,1746,407,1745,405,1746,406,1746,380,696,380,1771,380,696,405,671,380,695,406,670,407,670,379,696,407,1744,380,696,380,695,407,1746,405,670,406,670,405,671,406,1744,381,696,406,669,405,671,380,696,405,671,406,670,405,670,380,696,407,669,405,670,407,668,381,696,406,670,405,670,406,1746,407,1744,406,1745,381,696,405,670,407,1745,406,669,407,29355,5069,2104,406,1745,380,696,380,696,380,696,380,1771,406,670,379,697,406,669,405,671,406,1745,381,695,380,1772,405,1746,407,669,380,1771,407,1745,406,1745,434,1718,406,1745,381,695,380,1771,381,695,406,670,406,670,406,670,405,671,379,696,403,1749,406,670,406,669,407,1745,405,671,410,664,406,671,407,669,405,670,380,696,406,670,406,670,406,669,407,1745,380,1772,405,670,380,696,380,1771,380,1772,380,1772,405,670,407,669,406,670,380,695,380,696,405,671,406,670,379,696,407,669,406,671,405,669,380,696,380,696,406,669,408,1744,381,695,406,670,406,669,381,695,381,695,380,696,380,696,405,671,405,672,378,696,406,670,380,696,379,696,406,670,406,669,389,687,380,696,380,696,380,695,406,1746,407,669,380,1771,406,670,380,1772,405,670,407,669,406,1745,407,1745,380,1771,380,1771,381,1771,381,1771,380,696,406,669,407,669,405,671,380,695,406,670,380,696,405,670,381,696,380,696,379,696,405,671,380,695,381,695,381,695,380,1772,379,697,379,696,406,670,380,695,406,671,405,670,382,693,408,668,406,670,380,696,406,670,380,695,382,695,404,671,406,670,406,669,380,699,377,696,380,695,407,669,380,696,380,696,380,696,406,670,380,695,380,696,380,696,406,1744,381,1771,407,669,380,696,380,1771,381,1771,381,694,406}; size_t getInfraredCode(uint8_t mode, uint8_t fan_speed, uint8_t temperature_index, const uint16_t **codePtr) { switch (mode) { case 0: // Off *codePtr = &(ir_code_off[0]); - return 91; + return 407; case 1: // Fan Only *codePtr = &(ir_code_fan[fan_speed][0]); - return 91; + return 407; case 2: // Cool *codePtr = &(ir_code_cool[fan_speed][temperature_index][0]); - return 91; + return 407; default: // Invalid mode return 0; } diff --git a/src/ir_codes.hpp b/src/ir_codes.hpp index 4b02e08..5dc3188 100644 --- a/src/ir_codes.hpp +++ b/src/ir_codes.hpp @@ -3,9 +3,9 @@ #include // IR codes for the remote control -extern const uint16_t ir_code_cool[4][16][91]; -extern const uint16_t ir_code_fan[4][91]; -extern const uint16_t ir_code_off[91]; +extern const uint16_t ir_code_cool[4][17][407]; +extern const uint16_t ir_code_fan[4][407]; +extern const uint16_t ir_code_off[407]; // Function to retrieve the IR code for the given mode, fan speed and temperature size_t getInfraredCode(uint8_t mode, uint8_t fan_speed, uint8_t temperature_index, const uint16_t **codePtr); \ No newline at end of file diff --git a/src/ise_display.cpp b/src/ise_display.cpp index fb762fc..59e9805 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -47,9 +47,10 @@ void ISEDisplay::begin(DigitalInputCard *inputCard, DigitalOutputCard *outputCar // this->outputCard->setValue(2, 0); // this->outputCard->setValue(3, 0); // this->outputCard->setValue(4, 0); - this->climateCard->setTemperature(ac_temperature); - this->climateCard->setFanSpeed(ac_fan_speed); - this->climateCard->setMode(ac_mode); + // this->climateCard->setTemperature(ac_temperature); + // this->climateCard->setFanSpeed(ac_fan_speed); + // this->climateCard->setMode(ac_mode); + this->climateCard->setState(ac_mode, ac_fan_speed, ac_temperature); } void ISEDisplay::loop() { @@ -298,7 +299,8 @@ void ISEDisplay::handlePWMChange(uint8_t pin, bool state, uint16_t value) } void ISEDisplay::updateDateTimeText(rtctime_t time) { - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; // Send the time to the display this->displayAdapter->printf("time.txt=\"%02d:%02d\"", time.hours, time.minutes); @@ -400,7 +402,8 @@ void ISEDisplay::updateTempOutside(float temp_outside) // change temp_outside to int then display u_int8_t temp_outside_int = (u_int8_t)temp_outside; ESP_LOGI("ISEDisplay", "Updating temperature outside to: %d", temp_outside_int); - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->printf("outside_temp.txt=\"%d\"", temp_outside_int); this->sendStopBytes(); this->giveSerialMutex(); @@ -411,7 +414,8 @@ void ISEDisplay::updatePMoutside(u_int16_t pm25_outside) u_int16_t curPage = this->currentPage; if (curPage == 2) { - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->printf("pm_out.txt=\"%d\"", pm25_outside); this->sendStopBytes(); this->giveSerialMutex(); @@ -425,7 +429,8 @@ void ISEDisplay::updatePMinside(u_int16_t pm25_inside) u_int16_t curPage = this->currentPage; if (curPage == 2) { - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->printf("pm_in.txt=\"%d\"", pm25_inside); this->sendStopBytes(); this->giveSerialMutex(); @@ -445,12 +450,13 @@ void ISEDisplay::setACstate(uint8_t ac_fan_speed, uint8_t ac_mode, uint8_t ac_te { ESP_LOGI("ISEDisplay", "Setting AC state: = fan speed: %d, mode: %d, temperature: %d", ac_fan_speed, ac_mode, ac_temperature); - this->climateCard->setFanSpeed(ac_fan_speed); + //this->climateCard->setFanSpeed(ac_fan_speed); ESP_LOGI("ISEDisplay", "AC fan speed set to: %d", ac_fan_speed); - this->climateCard->setMode(ac_mode); + //this->climateCard->setMode(ac_mode); ESP_LOGI("ISEDisplay", "AC mode set to: %d", ac_mode); - this->climateCard->setTemperature(ac_temperature); + //this->climateCard->setTemperature(ac_temperature); ESP_LOGI("ISEDisplay", "AC temperature set to: %d", ac_temperature); + this->climateCard->setState(ac_mode, ac_fan_speed, ac_temperature); // updateACState(); } void ISEDisplay::toggleLightGroupState() @@ -628,6 +634,7 @@ lightPosition ISEDisplay::getRowCol(uint8_t pin){ return position; } } + return position; } @@ -636,7 +643,8 @@ void ISEDisplay::updateLightGroupStatePageStandby() // Calculate the state bool state = calculateLightGroupState(); // Send the state to the display - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->print("s_light_toggle.pic="); this->displayAdapter->print(state ? COMPONENT_STANDBY_LIGHT_PIC_ON : COMPONENT_STANDBY_LIGHT_PIC_OFF); @@ -653,7 +661,8 @@ void ISEDisplay::updateLightGroupStatePageDashboard() // Calculate the state bool state = calculateLightGroupState(); // Send the state to the display - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->print("light_master.pic="); this->displayAdapter->print(state ? COMPONENT_LIGHT_MASTER_ON : COMPONENT_LIGHT_MASTER_OFF); @@ -766,7 +775,8 @@ void ISEDisplay::updateAirPurifierStateStandby() // Get the state bool state = strcmp(pm_switch->getValue(), "on") == 0; // Send the state to the display - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->print("s_pm_toggle.pic="); this->displayAdapter->print(state ? COMPONENT_STANDBY_PM_PIC_ON : COMPONENT_STANDBY_PM_PIC_OFF); @@ -782,13 +792,15 @@ void ISEDisplay::updateAirPurifierStateStandby() void ISEDisplay::updateAirPurifierState() { //check for page - if(currentPage != 1){ + if(currentPage == PAGE_DASHBOARD){ + ESP_LOGI("ISEDisplay", "Updating dashboard"); // Get the state bool state = strcmp(pm_switch->getValue(), "on") == 0; ESP_LOGI("ISEDisplay", "Updating air purifier state to: %d", state); pm_fan_speed = (int) atof(remote_pm_fan_speed->getValue()); // Send the state to the display - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->print("pm_sw.pic="); this->displayAdapter->print(state ? COMPONENT_PM_TOGGLE_PIC_ON : COMPONENT_PM_TOGGLE_PIC_OFF); @@ -808,12 +820,11 @@ void ISEDisplay::updateAirPurifierState() this->sendStopBytes(); this->giveSerialMutex(); - return; } - else if(currentPage == 1){ + else if(currentPage == PAGE_STANDBY){ + ESP_LOGI("ISEDisplay", "Updating standby"); updateAirPurifierStateStandby(); - return; } } void ISEDisplay::handleACChange(uint8_t mode, uint8_t fan_speed, uint8_t temperature) @@ -823,7 +834,8 @@ void ISEDisplay::handleACChange(uint8_t mode, uint8_t fan_speed, uint8_t tempera } void ISEDisplay::updateuserACmode() { - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; ESP_LOGI("ISEDisplay", "updating display user AC mode to: %d", user_mode); switch (user_mode) { @@ -852,7 +864,8 @@ void ISEDisplay::updateACfanSpeed() { uint8_t fan_speed = this->climateCard->getFanSpeed(); ESP_LOGI("ISEDisplay", "updating display AC fan speed to: %d", fan_speed); - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; switch (fan_speed) { case 0: @@ -900,7 +913,8 @@ void ISEDisplay::updateACState() uint8_t mode = this->climateCard->getMode(); uint8_t temperature = this->climateCard->getTemperature(); if(currentPage != 1){ - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; // Send the state to the display if (mode == 0) @@ -944,7 +958,8 @@ void ISEDisplay::updateACState() } else if (currentPage == 1) { - this->takeSerialMutex(); + if (!this->takeSerialMutex()) + return; this->displayAdapter->print("s_ac_toggle.pic="); this->displayAdapter->print(mode != 0 ? COMPONENT_STANDBY_AC_PIC_ON : COMPONENT_STANDBY_AC_PIC_OFF); diff --git a/src/main.cpp b/src/main.cpp index 99abf51..5489623 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -200,7 +200,9 @@ void pmfanspeedupdatedisplay(char* value){ iseDisplay.updateAirPurifierState(); } void pmswitchupdatedisplay(char* value){ + ESP_LOGI("PM switch", "getting PM switch state from MQTT: %d", pm_switch.getValue()); iseDisplay.updateAirPurifierState(); + ESP_LOGI("PM switch", "toggling PM switch state from: %d to %d", pm_switch.getValue(), !pm_switch.getValue()); } From 18b3fa2e401c3ae4ab0fad301ffa8732a8558bc5 Mon Sep 17 00:00:00 2001 From: Siwat Sirichai Date: Sat, 17 Feb 2024 01:16:20 +0700 Subject: [PATCH 21/22] init pwm as digital --- src/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 5489623..2953ee0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -103,6 +103,11 @@ void setup() espmega.enableWebServer(80); espmega.inputs.registerCallback(on_pin_change); espmega.outputs.setAutoSaveToFRAM(true); + // Set value of pin 0-12 to 4095 + for (uint8_t i = 0; i < 13; i++) + { + espmega.outputs.setValue(i, 4095); + } espmega.installCard(2, &climateCard); climateCard.bindFRAM(&espmega.fram, 5000); climateCard.loadStateFromFRAM(); From 9016c70fac852bbdc14c499399f16dd61e3a13d7 Mon Sep 17 00:00:00 2001 From: reaw Date: Sat, 17 Feb 2024 01:19:16 +0700 Subject: [PATCH 22/22] adjust ac value, fix weather in standby, add mutex safeguard --- ise-display/ise-display-prod.HMI | Bin 37446253 -> 37446253 bytes src/ise_display.cpp | 6 +++++- src/main.cpp | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ise-display/ise-display-prod.HMI b/ise-display/ise-display-prod.HMI index 786086ce406c394e4460d4daebfc746f5bb953ae..16c95825fada42e6992684f4240d3aa55bd952a7 100644 GIT binary patch delta 3448 zcmeIyc~F#P0LSs&WdRSogR~VZvC=#OQUTMvQacqq!aUcbG}AyWJK5ZLWLGf{G+*f? z?;}w|d&vteyfPCi&7;!FqcTM8u-krLn5h|?X8NN)`lFrse)c_{=h=OqnccGDvN~mI zR{w(*KqNDP4-j(iH?9%bUa);w=?{K%(Go<2Nm#olqM~2>=hsxKk%yNd5 zlsgJqyIQ&`4o14&VF~fA(uY;9Q|W;d8IIf-9T)$(TE)38rB(Gg_#kI-`JBvZ{Tetf znY$*^S25RFaIRW{({t(VqF#Q-5WlAT9do)yZ1==nGJQZ&pyIy6?DOCv7VAn7VD>uw{!5)*~JL(MR$Eu!ElkK#s{^aiNMyZ`@+e4B9dr~cDt}n_e zi3o;SvvLB%U5Rb1xavWVwKdDv_>Yr|S-$R8azwECKN)Rn^rjFiZI!>hGtMfVAMnh} z_G#f*t4?m9gEP@8nIDL@y!C?JtUdYu=6^rN)|ibI3&q+kb9^nFcFi2$Ha9EB+C_^3 zx{$XhP(LaVUFug)t4w9o6g#>!tHWq_k19F&JZIljXNcvW=4)3m*-DEDPW$8G{_>=@ zo^+er*2m<>1PV6v4(9ko}ztM;i9RjS@o@2d~gesw^7s1B+_ z>aaSZK2jg6Pt;L$Ons_8Q=hBj>V!I}PN^@{m+C8ZT79j`)EQN-&Z=|jy!u9ctG-j; zs|)G}^`rVp{j7dbzpCHV#q7cj&Y22a5CU!pg)j(*Do_=wL3N0L8c-8zL2al5b)gUUbqiN!DzT2#=rwG7RJGYkOt{69wxv< zcnBVbN$?0f3Xj3#@B};w8Q_DbU^4jOX~+ZvQy>ch5QM2P4YFZ6JOeXeCd`7_kOOmI zE<6kKz=HXZ3(vvx@B+LDFTu-@2d}^aSO|+?F)V?lund;N3RnrR!Yasz)vyNE!fQ|f z>tH>+4mK3R8?XU3!Y0@ZTc8NG!Zvsl-hyJ-4m)5c?1J6!Htd0SU@yE2`=A6$;XQaC zK7jpj06v6+a0m{=5%>r`hEL!q9D`5cGx!{i!wEPEr{D|t625}d@HLdd87POda1PGH zH}EZd2j9a5_yK-|pWtWs1%8F!;G$E1e=Z$3!381UhENEDaHs-Rp&C?&2&e%yp%&DJ zI#3tt!DSE$QE)lbhX!y3c%UIfLnF8nu7azfF~mR!2w#gX^I=w1Ae-3T}W{ ah=X{z5n4kVXbTCD2uZFY{r$PtFZ~^9qxO6N delta 3275 zcmeIyXLOTQ9LMn_P0K12kZCAWK!uh9GRly>WEGhrs|d1bO4&*v^g_xG6dE=Ks-g%5 zi$+;xgCL_!*~lJN3J!1p{=T4Z@U`do!kqK{lV)@x)$KHIGJUnTB3%<^cxmEBs}h~VXS5= zZTfIBb^WZ#)_|<^z_cQ^Fx%5bbGtprVF`Ce|Gg9MC$EjOEGnbjcE=^g=j>Rt%5(E| z1znZ}np@KD<*Z?KRDN!p-qvmD;nsLhQevav-T&CWYozDtT-&FW$sL-MDc zi8AfXo2I?#U^<#krnBi{-ZEXy+oqf8ZhDxWrk9B}z0EtOkLhdPHT_I~Gr$ZqgUnzv z#0)ht8=UuTA$|JBjTkyOCb~~p1mEnrPN!eLqZL+LWOd(syYq>sK#)_#s$nWl4Ob)7 zNHt20R%6sy^`3g)Um$4Qj*EdK-K#b)@}0dlF4b1h=3Cy*UCWp5oDkCq!qf|{bHs%dJvnxST@S<0(s zt2ruB%~kVMlJcqfYJpm)7OBN*iCU_bsbsZWtxzjfiuyo(s6JAw)W_-*wOW0u)~K~A zRjpI&)n_VAZBU=9FO*+>slHMh)h4xBZBbiQy4t3;s~u{m+NE}@J!-Gor@mJE)dBU5 zI;ak*!|I62P)F4KFAuJygG{-_-Bw5A{erR!^oSr&wnxut5OWArOKf z8)SzZkP~u2Fyw|j5CVB2ALNG@pa2wvLQoirKv8%R98e5Gp*WO)l28gtLm7Ap%0f9P z4==+j@G4Y*iVz0jPzfTSGE{-8@ETNu>QDn}LL}6J+E54T!s}2E>O%u)2#ugIG=Zkj z44Oj=cmrBOD`*XEpe;l}J9rb?LkH*xouD&xfw!P5ybax;JM@5_&SQrLzFdRm}NEij9VGN9g_uzdP2QC;76Tl43ktcFiv4XlM!SO@FjGf0CC@Hu<|e)tl;f{m~VHp3R!3hA&7w!;qC3AhI5{g%xZN0Cot3 zAjk&UAqV7yTo4SoArFK=UdRXe;RPrF1)&fWh9XcDUIYgegHR|AC7>jfg3?e1UV^ev s4$8yJ@Cv*N6`&%7K{!-`2&fEIpenou)u1}mfSM3#OV{6@?ckO_0VghqSO5S3 diff --git a/src/ise_display.cpp b/src/ise_display.cpp index 59e9805..beefcca 100644 --- a/src/ise_display.cpp +++ b/src/ise_display.cpp @@ -945,11 +945,15 @@ void ISEDisplay::updateACState() this->displayAdapter->print("ac_sw.pic2="); this->displayAdapter->print(mode != 0 ? COMPONENT_AC_TOGGLE_PIC_ON_PRESSED : COMPONENT_AC_TOGGLE_PIC_OFF_PRESSED); this->sendStopBytes(); + this->giveSerialMutex(); updateuserACmode(); updateACfanSpeed(); - + + if (!this->takeSerialMutex()) + return; + this->displayAdapter->print("ac_temp.val="); this->displayAdapter->print(temperature); // this->displayAdapter->print("\""); diff --git a/src/main.cpp b/src/main.cpp index 5489623..198386b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,7 +7,7 @@ RemoteVariable weather = RemoteVariable(); RemoteVariable pm_switch = RemoteVariable(); RemoteVariable pm_fan_speed = RemoteVariable(); -const char *mode_names[] = {"off", "cool", "fan_only"}; +const char *mode_names[] = {"off", "cool", "fan_only", "dry"}; const char *fan_speed_names[] = {"auto", "high", "medium", "low"}; uint8_t row = 4; uint8_t column = 2; @@ -19,9 +19,9 @@ const uint8_t light_array[4][2] = { AirConditioner ac = { - .max_temperature = 30, - .min_temperature = 15, - .modes = 3, + .max_temperature = 32, + .min_temperature = 16, + .modes = 4, .mode_names = mode_names, .fan_speeds = 4, .fan_speed_names = fan_speed_names,