From c88fd3f22352225a1983d4f7054efc0553a4af5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Mon, 2 Mar 2015 17:02:35 +0100 Subject: [PATCH] Add initial code for LED button and state diagram. --- .gitignore | 1 + doc/State_diagram/state_diagram_v3.odg | Bin 0 -> 36301 bytes doc/State_diagram/state_diagram_v3.pdf | Bin 0 -> 14114 bytes ledButton_controller/Makefile | 2 + ledButton_controller/ledBtn.c | 282 +++++++++++++++++++++++++ ledButton_controller/test_ledBtn | 27 +++ 6 files changed, 312 insertions(+) create mode 100644 doc/State_diagram/state_diagram_v3.odg create mode 100644 doc/State_diagram/state_diagram_v3.pdf create mode 100755 ledButton_controller/Makefile create mode 100644 ledButton_controller/ledBtn.c create mode 100755 ledButton_controller/test_ledBtn diff --git a/.gitignore b/.gitignore index 2d48ec2..521f1ce 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ deb/ *img +ledBtn diff --git a/doc/State_diagram/state_diagram_v3.odg b/doc/State_diagram/state_diagram_v3.odg new file mode 100644 index 0000000000000000000000000000000000000000..d17e080c71afb0553f2e815030bdcf44cf45d464 GIT binary patch literal 36301 zcma%iWl$YWwC%y&T@UU~a5%WT6CgmaKyY_=cXxLW?iSqLf?Ejge$Q9+-jDn5PSw=( zOigu7&z_#W_FAh|%Wp%YRWwHD2Wa-3WXK!X}YG>kNV`l5j^271Fy@jQTlgj_bADaOH2mm}JxaBFD9}NIl zP{>M%YPe_r>xL6CSxMpf$o0g-goKtUbi?OIX4~R?m~0bp_)WdlKtkKVGo99WZLZ$C z_4e60W{XKnL`yUh;q|ZWx6*I37d9MxPa;pa0BFejo1WW0DJ*F0Y}oy5+_b2aLfwwr z-MwDxLdW`~lBz>AHuI1}oy#bz#VCqdPpiel7FfWnU-&kACP}zOir&`q#=j!s6m_Gy zuN!2e=4e3Nmh9_8BQ(rX|CgJ^#IYq4s3HO_XW^c_mN@G?Z}uL`@F@s%#}&0ivYy~k zb}??Ay_4f8P6`TlIA0R@0zROR?Rklxkc11+t}uLq>#9|0Wl;5_Sqjo8PJ7{rCpGWH z)6qVT2ee_SBt}&mBjRS`fy4&DXo4^}D9JctWb!OcbmZt+IMlTLd-ryI76hnEpv&iM zp*pWVG#;uGUqs&C^^3cH8=(k%+tqruZH0yy>@)%&(%O);1^n+ws`hVFX@B^1y|&-o z5Zwh6!o9BF_->QAbb&w`oN&{hDSPXNSTd#b})3s>UZ5FbDla+vGiItEhR0r_+?pIVu+t+ z3X9V`HVS>LhsGYQ`y(z1)Vi-N{OKmvho`bPx_Tn~e#xop1F3y*an3_6F*c%@q<4d) zq^+fyjQeFV_fS41(w@YOQ{JSsokDW(nbObq;yLf*$xy(Pf7|akrQjn#+|awakPQnO zWhzlj8XPC;{wtYc$FK!~#SPzp#NZI=$}hX(MN$dz!sqD`+*H&P)ZAy-W7k(tkZ~hF zn>snw8_j>yQaQFyozv6TT3GW|#zf00D&H@DJ0T(5NHj0!b4z7Rpco0bqvN z>(S*N)C$=0IUNNLAK{EO>&A5Vw4+?@j#!?6zsCadS*{&BPusbZ~n-zVk0iBM=_;|y^% z-9#k7;RXDJ-OjkQm54ImnE; z_-ly;w35`JBeO?FLqkJFwcYN?G2)xxAtMX4K)LQWplmZX+-VLvD``p<6Gfu7w#UZB zEp)0adPHFd1+oPUF*MX~h0I7Jp#!O_XRWBPVgAba`F*aguHM6=QfNFG)iE0DjRCI(e9-3?fW_n z%XY}b0^`HMMwRDBOfG+fToFNd4Zfudc3s{rWOVQrEfi6$f;+vG)jvL-Kp$+!Ze7 z@l6S$CE(Kk+WGm$43w9boQ#cw6B2^@DoT{J$`2<3G}vYJd!9gI?NZU!cKdkqaGnMa z&Y0^7ey;=z3(IINN}@128aYL7SZj9mFF&cBH+n4$vLq+8^rX3yw6wIBmzTLYjRL5p zt^Fv6h)OC#gw_ZIR|8|;$N2Wz`{`w1@aM7TQD`Ua#1y@HRk{)5k6FYo-H!m+wvrMU zXQUI1S=w1q!TUNo%Bz*<7p4>H;o)JjCL$uDUC#XTOmS245`hzD00h|=9K_+%g|goJ z8oL1Re&GNr>LWyBSBp`p-{Xka{kiXWEc*TdOpJ_!O~FAVUboY|6e?GSn?7W@JE47& zm6et8j?&+v_;uR)MNzHOk;%|&kVS(;b1^3s08;RV0T_Ydg0BDY^R;7*IUxHulG0TVraKZM8GLY!zN4jbT!je~=Omlrg6bh_{ASNc$-WXvAgg4D%B)3b_{WRyM8DRMXiW*TH&sA zlOzQO?GWwI$cR@rsK^1?n%Ic;Dz+~PH*sJkUW>)BqqFlnjVv`LF9mLthc`={e9VJe z_s9AK+x_Fky3=0FV6oaC*LE{c<9{=(T^iX5DjTb~MC6V9!Nhfgrw=le&C1^UbHX3H z^a9{u@!@tpzFnia&(o#n9#8wSakIbg6m8Q_Dg?il6&L%fLU}TJ8Pviw^g}ceW0R$C z8(DXLQ_9*R$Bk0K?pQd*jFbo#&d&}rqu%}D>(t{ZXb_D53tt|tm2)p;WFPWK6_ zDFkO*e!hQArZswaH9GJLFBs`A=QCWTAj+}p<6+y?wp0Db4k@2Q!Ob0go=P>kW3_=C z*-qOeYJ&uEMPf{BwC7efytt#JtyY->fGr^{>AFARHnD!FAlH>ua&1yQH24HmLx}i^y#Typ_YbE zKSyg}b3Qe*U2?#I_+v-GKy*6TgM){5WB-@i!<{^}ajuMt+tI)Bl&;HMJuiVwgaigT z`oE<3`<^ww3AU$ijN?Y2x~M293VV7$w6t)}t5$^(tP+g_Jk?)SWZp1 zkxL!UHpRcqoA^nTFg61Y{@rczg1F4WW6Viq!j=G0kdn|k*O}AI&Q48hn`>+BHXGb* z3IO0G317p0pOD<;Q^KGfpJ1}n@4wdy88N7e)$7Lv-l%#`Bdb3y|M*;=jOF&Q#F@;~ zCR+*a_kM0ojI+)EErc$n6Xf_iBK+jw?2LVwLD-OZy?)a1Qb_^_5``}G1>ml&tt~Ar z;o#t0HJ*`4rO8y?#06Z3(qyxM2tKmjBf{B+sGo!jhe#7=hx-wX+Qt#I{-zHL+B!Vl z+};YJTJ;W+TFH=g$09UIrX{B{V5?LwqAkWT+MZ(~AmGg+L`Fu213KjvB@G1K#7@5O zJjURr;kGj+{f>x;p8VFpzBr~ni`!o<=#0*`!tET z6d^(Zw7RWme>aQAoh8n&7g2)P)3^OR$_q&ekB=Y%9o>uq3C;sAaOmZB`CdhJX<1fQ zx}Ka^&OZCnS}Km!{hvj}d$2rl{U?-*2nK9m{s-oeh2#$?#8T2|0Fb`0)k7 z$VXg0Yt-}O&v5XN2Q0-IP`kdj@9MH+*V`U@pP-v3H<2g(wnc2bs+VQ7?UzN`ORtZ$ z<0Z!e2Wt*~?hX@sCRLynDX{%9!7ldxmmDQU?@LNp-b-BGV>GH%DV+@H$M5e>{6dhV zc~@c9^CqF2Dq;opBs8gW7SK5feFg%$MO5;w=h?Z$dD)q39)pUgSvKC@Vk9`^81P7P zE$*DY=3yYZPG33TfO8BM5PEvG3NRC zKvd{>M+X2y`faU0+jBHa6UhzNh$R{Yk&2NkgoRwH-&JE*{`lRD8Aebv^Cj%U@DL;K z>#EJSZhE{j>&N!?s_+DmKsZGi)%XY3!qtjlC&mU}mK^6QvsT-$O>#6GJpagje{<`p zqOArRw0VENyL}vtd@^XB$~#W}P$u4G7);)s^RVPE8gBBtoTjw7})8rYp7 z<5o!0lIv}@Y1N!FYio1yy90{9RT$)oShOlAZERr>atU$rb=3*IEcNuyfwK|n;o;3Q zRmty=*AaAH=LJhb;!f#)+L=H$-D$4785^uNx1N12ILvM?eg#W>Js z+Del8Ee>M(Hh`pVM%rsR2Rj7}(FjVy!z16{(t4lrKCkWUxO2*=68z()r;n6{?`Cp8 zehUk|YH2m@&L|5z4gMh^5fcAR|07s!w8eam5$aJ+Nr{GgvT(BU&BUltTT2U4#UB{B zga?$q)mX=pbLhDmu2YE)5+Y~EsK}riD{2x*W@t}zO(_(BA8!1m0kbc+M>$gIKl7u< zG2Rd1V|j70FNimQ?X#Kk3splygHab5HNdL}Ml2w$5iO4Q3qy*HryPa)4KHzm%Dldz zx(AIeLu%XkGJDb57xtGZLqUQP`5C#x9z%Qiu^GrAWU2fPB5N?n--apaCMXd)fp{Cd3uylWf%z zq;$ZeSfG)wG3D!EwY!-IuZlIsB=iokXSeT4?Ke}hRHLGRARV7Key`tTmWV}2H$;5R zMmyi1AQ;6MkMm>Fz3VVnAsqU3IpmwZkw8#63#M=%m=u<*M{k# zpHbX>cL@B=p`v-5fg3$xwjJKj911z}^J*uCUtreM@@{D93}2^>qa-c3Bd;L}5Rem# z)BXwNQ}w$K8t!-p1qE4n0?PWk0}?$|V$r;%5K+)yeddC=9SNmJZ;n^Jap1Pqs)u+3 z5wHTj!f$HQVN+}c8cD89)y%n`i!ZTDh#1pQ}Q9^u?x1;rK&bO=={o_Wi zoAjpF(j!$b!8&gWP79)``{gDK@pK~A=>P#_RD7|fHDnv9HD8_PAsbXglEeC+E;~c0 zfiS4XL5e|D^PUHna4sn2XZaU7ARm5qc8tYtvZ%Zc*Y>u5<~xG3%gb68wCpQKx~9%+ ztevw#+#n{l8bcqrmQ9!v(KNM1+A%I>v}&4priL8;dA^0Mzq_C@)wI!ai82z zLUtG)46gc{@d^qeZ^Eo1oHY3tH=}+^SHcPsk|LV(mFF2brlqA(3cZ-XBPoy{0n1t3 zf5@AN>uDRPS_T>r?MyoV!4h?prJ;fy9&RJy{B%F|2~g|gV(sqqo?IxAXAj9NZvR2NtYQH^xXY;591vm7R701W-`y4&iF zpfJhx{i~g!cQduWUy+efdn#KYCnRL~_vBPrS>DR>r{`5wobS~Ql50ln!uEsl)-YDt zjPTv4IBFOrw`cFlz9@a>==SW~+}!pyFb+}DfZi?5h_AkGv6%0-So|dt==RyWO}HMB zt%8jy9OW`Y2Z-42JHE(kzY)DKT|K$To~1`r;CVQV$7hhGQd|ICEJ4W4=SVRbPlsnO z9WBnY{bKnjvcNg>alV}8*8BW-;*jT$6x$xcDT~D}k;;wT=YyTmjo`~k(MF5SpbHtj zR_d)U&>k7kg%}hOEhbRdOO?oQx?SGE2 zq~!QbX@4Y<4?k=X={QLJB321kYrHA0w4CX4<;( zz5e@-D8D};k~nGy58IJ5zJ@oDo0qhPue_h zH7ZQ9O6+H%k?h~Kn$Ufaw>V$2!hpW%M%bFZWJc~-)Zt>2 z!srs{_<>z9A9?i4+NfzpW+E^(A4yJ+GcWULJ<$7^@$vqXN-e^mQBko*E$Fo}i~vlM zHZ6?JS!?cXrx_stM%h9{&6>-@hOH@L`v<#pS=RROKPc1L$M(m5aXoc)s35rU3LPf% zy1Ts}-=#OjrbLEdQPeEC2vKAR+HOZjN86o_MSRKaR%tlcY-V4^ESN;Q%d4su*bht? zR!usCgnH9>vqiO72z0)OZ3N<==*p<8tLy0zG4Qlmu2HPpKlNEdRVT`)vGiN?GmXq; zlCuj0`G;_e`3w9oGi(0!>sL!lX<3<_81!6dA6zP7x_Dpu((-bkE?}q617P6-S3-?3 z$&c!FRUg`qi+&R65tlW!Idp+lJYs5Unl0?-Yhgi0Llc_WNqBW#Y!!#r(i{loU!%o% zLY$9oWIriJo^L;idw5-@lK&I*#TLFamSDHH32hAPhz7dJeze3~bNy>|{>JgqQ7)eo zEVfQ`Rvaf%JNFZOBZ#h4V<-ZP*1+d}N#LRlN(%m;@+|Q+->Tqut*|Y-?wj%8r1kC} zhS5@gDPaT$&Tdo}N*#dOm_#)V8|Gcu+6=hsBuZ%$}Pf8HTnm zc`rg$tgD8%q3FX=&U-W2gF-ir=}^(NGeq)d1sPNA!`t?GW@5LbL$CYat;K4w3JHa^ z*G|u3$A=FX*G^hl9I6UWnj?pOw|cZBTr$(7aCzdUnUM?|32N>f+?_|EbfK zl+<6wVWWl(LQE~3-E(AA_wrFityaObU_GrZwtl!l!m0BLUajan%uv)hxf#i?cfD;SS)u6Z}6`V z0?Un}*JtPFA>*L-al>%^Yoe~N*$*hr8hY_rXg$GfGro%ki@UF&PCO?RGD5Fz79$37cQ;Dg zM-jFQGMXzcEp430+rLJoTAZn9@>e#J&io$aYHf}Dg*W5LBp>r)Ni78-B#I z8DHj=CGltNzVo=Zv9Yn58s?;XycT%i<#Ld3(7Mc(9E_L|C&m`uJtO-8c}5l$B0A{f z7ZUAA`KI|g;uI>@eg!-3ZP4-9HwGOB7K#r%k~{bW1Q0pcM?%AhR0bE=L&q~La~RN* zUMh+zZR8!tlat7m#1OLqGiacv9W=iu@t}SYyN*6VymUpCc0eFbS&xh+tp=>k5{Xmy zeC8FJNYK(x7^{+BzmjXPs?&v=G?l8;jEb;70vm!DNUJm$W`D$y3cY|cB_|6DY8(7I z1nL=uHHyi#KZG-MI?9O;MPl{6#W8L2Qy4)n9BQ&-cah>E&jE z707Gve{L+Q4O2lcZ@DzG%qJC$4zwPdUtEMyjdVZ$@fwLGfhtLdA6^`(92-dz>+0pV05CH%TR0&b z`yf%&CpAs9U3mh{SVB}LdSdBJZ(!Kt4h~FR z!$J>^rGra#Hc-X0w$zLsN(-a;15 z03{`e24qf$5aS)dVr649Oq5nlduvp8&>uEEt&|)J#5@Xsre-)}{O;=bt^=-zs6nff zgNKdF-(2%#1>HZ}?h$TywU2G1h(US~C}42+CTjg6qk_8A{!&3N=typy_? z7H$nu*MwE1&t*}G{LxtkUPW|{c;2eY%EXDoe}Guc9zw)d_rDcos6Y@hBFfIb$qD?| zrH@jHKI;bE8qe;J$g+lILvIUO%gCz&oALLNj8$Qlrok@)oqh#jdnH^PA{Iqw;CBU9 z)0W(=gPc)=H+7A9F?mjeK4%vEPRiX{!GO7@XP&byNb-(f`$i^>(^l!j^b_e!N2`-AD9? zeZ>o1l*VMN8i2b)Rp7uc7V>&PM{-6dk)A$$XkPieMEc})KkJFUt4{a`)iw~Qj*^dD zkgn1otTKzn48H6w*o*A;mJEgX_Y+*g<}%_&IXOAa#Y#-naN!^P=`(Ynr-_FD!f+54 z@?*>AaqEidDf%H%t!jxdCiL4#XgBB$LwpSJIzXVLwH1#asicp!5R;#Hx;i>}`}5<} z=M~kVoL@A(tDs#M*JC6BFPCNzMOJN1dzuAP+bb(@Iuc$3yAU*WxPQGvXc~;dLa@D2kdWl%qQo7zHR0&Rt<5`9wyH*!(@GQ|o~QQjG)eOA#UtGEdQ*=y>QTzmVmo=|8M>iWMqc zH-5B<(eJtp*6aRYQY+CVPnvBA@&-Ynq7o5@pF>4K+5-mZSXoDKTIrW@32uSiG81d{ zS?TEjC4d4X5D8!z4HsE|x`Czi#z#o-N%0V&Ow z@y1?bLnFPkj93YM!6pn_9ee`1%KW+DqCLcXM2^s?M>P{CbI;Uxo~mo`Fb9uqHd+c~ zVwbQZ5dulBqOY$VidWUDvk}Z!3<5dz1brXS4p~`5KciC2EOcC5xzo7;TmXGvU(oB< z6#)sY9zW{0kPl{hdU9M`7H43)jq>|TE2ImRWmD)WO6e}h(!F|yV^n9D@Y^rpX-C?eU z(=mrQWr{-&w7j3sn`K3xs!QqFdt~QH+{XGe7|K~cGN(yYB}aNb)*1EOHk1ES<*M-LH}$XV@8LYGE0)pBt0K-!XP{%4v;48ZfZT-kX@nM^7>A#ALCA2j+lWTSzE^pY5 zPfb}`TaS%S(OMt9Jk%ZxwOvgAss5Kk`MaXq>){)((*U!IY{;+HYOsQQ!~+Qzt8aKH zAz=(-N-+wFjN0M}(fYVnhT8jXJD-~U|}0Vz_zWRr1B<+v-#2Y zB1*SGn=~aE6F6lpC1U&u_X}&7IzSCFyRNM*J*TlbGu2RBxBWek+m^Z(*IYE=ZR4`X z?J{OVwsd;I#PAa~OeyyMk2_MBxC$wde8(wA36CzqDBa#&pGB5+HpsHx=~xNdj=1uJ zI>UIAgoLEi^}G;Qrrp0zu(q|KM-_+E`g#Tu+7cDk@#P2ce_yO4FU{%oia1f^M zdfEGypABERL@=vYFa@yE=!GspG3?zT(+Wj9fdR{DKHcuSP^A;_1sWdvF&jQI=}FjW zBPIvjXzfeS;L@RFAr;KCrX9!KS%aa=7$FnQq^}6=(y4R#y8;O3+kF;=xnchqCDO#> z5so=f$dy5#`cQuGP(Q3QCsMooMUPdM0#hA()0I-0ys*htwV(3|i4eZqwr`Y9gk%%W zTnWtGC^7c>k~fNdK&TVjcyx`v!C%=BLPT$ktL*4IwpeorNzE={H^Cw;pgIf1>ytD_87js{dnC;XmL5-iSQt!rF;Y!WV@$6PmG2ySuSlWj zl5m&>XX?(tswD>8s8dax@!M%VKgP8lS_KC5h+*z5l4xtxxRGOrAJwky3j8J+d+=14 z7#=rw8Id*{FIlYJZZ~3%Ql;sa=jTA0>Ac>OG{M}a)wjl4*z5u6-G7KBiPvS=O~dT z*>7xVtO&FH^!toCY5@_%DTjv`tWeQwgjQkKkU&{RyyRX?7cVBV`d&;o;Z?QRZ7i>> zuL|>aHGAt#l{A@op)Hd7)_~|Y)|^7sPC$O@Hw%951$9Lwew(RT<)kO4ott(FbJFOO z=DYXz_m1tv=QWedf$uK(Q0t7C3VjoFz>rNzP+l5_f$s#N+w05gR_c_n%0_-&e>{?n z`p&e)8E*Qa6~>QX&aX^bWzn=aH^J={4kI(Iq^sX?G{5`g)q-avV$0l59Ry;lu9LY3TKSjyB_S zQ2?jUz0s0`qls4~u;De{aw)k~O+!ly=6XeY{F!>(ulJT~^q@A@Rm1)6TwNqjk&{dY zv67BHJ`&o3+YmSBMS$sAd01 z|4U-92S#`L7>R~PVV51j>+zyN;j5aHoa;sTPU2#K-lZ6t{I;4%Ltyd)Nf+e_4bFz^ zQwm$|Nv-%J46ks_--|@KeavW8Id+pO)jnO35IAl?WTsY?jg=KtdqkIgA7&es$3YFx zrTd9hil5hg%y{LNmmLBAzqU;w<2>%Nx3{t7b*H5%ACB4|_Vp7NDSm&ap=RE%Wz7_h zgu*~LwaK-VuR5rpdPD?Hs1!zOF`-B@!+K@v;MQSdb`YqiySt{knu(c<1m`m!#V#@@ zG$N8dNrS9|x*WhGhUUY(&qfVt45^^spr6uBOH22X`jDy2;PGCpM$) zf(G~P`*|J5JvL^NC6X}UzoqWFc}_v0**;V-5;D2L8KNv@AgtvF1t@*N9^FPQBDUzA zZkLlRh2$^ZuN9qH^&RaUWiURUFOd%k3Hiq#&M1!H8dq44W<>h!+qYTLpnf*t=v*Ja z#EL0IA&=cn*;Ww z>aBLk;VJMc6l{Fcfev2wgZYQ&gv1LO2*`!$B1}ijbhSv53kLiGQU`Pq3X(GLaP`g; zv$y_5=fM8%7&PVa@Nezy%{#pr{7A2u4DlwahK84}ok)m?Yz9Fr{dwIWLIppc)AqkF z=B&zZAKSc;5NVX?(lTSU9}Usflk~UIBOpHU>&<1$0wzI_n(xJ3h&UQy_}W|ieZJWl zuuu33R8#;7_X7BdG9W50J_r`|+}(LC_>7YG2sgF6aQUPH>ikFTY;0iq0}zd-(e6#e zsi>)8c+t~yu2}K~jsG;YWgExw4d{ zd&8%oMdCjHbf$oXQQOXL|DH@ctT`@#V-yKduNl_p)V;ZVJoLq z%Jz4FiRk;YnLMQt$PdBE=L|G*BvTJ`WV#Y(w}Oy@*LmDdI^qQdVxQAb3Tke>1=03w zY;0xZ=&|vxR(0N^E)?HRZ`gWVzEf6wT`Te6$QmwGmV5jvJ!AM&Sy{O-Yvijiic7_l z(Ie}|kPZsiYMxF);&0Q(8=&j&7>`>=6nZHF%`4b}R!`hECRX5!Z)0JxD++eL(E0yr zY{aZVf`rqx(EH}iXryfsXTIYxOQhFgtxAWz*hP#aSTSkNIbM3bjm0;EK+$VW`vymw zV#6HJ`<0;LqZD%}$WZAw2l7^l^$6%L01L6DTS6E1lPrTH@haE-cimC{zf&%5Zm`4+ z-Hq%-n36%6hHE8H9$US zzb|Z7WG`nUNUnkf`(xCcoDD)n=oeXu4f`izLw-o3?G9P$gs>50L46!L=K2t}WpdPF z1vO+&6n?ZYL$XN0!R#C{_K|pl*n57(*w~nhiwiY1^=%D8;IJZaGry{AB2Jl~fu1huCxA3cAzBmjVm2TE;zV?3K1v#jJp!iK#T?ciV*mFI zBiR_H5$(ahcMOSNy38kW7AyP13DWxX8zD8aM$Xe|lt>lyC+_8PiTYT&q#&{8>No+y zU?Gd}p+aAUA??bzUbiP_7jpvxTUVOHl2+D3hjPnKMiwanHe&^4dC`2NdA1$S^iHEW z04UJ?mBNM+x8)Ds05r`cAH0;irnYuaF_NroqLtXhVA#@6Ff1LaEQ2HzOyAC*-GT3d zxg2}rwR@-B)uG5(%&kM{TNYbd8 z7*`_Jl;q3CvJVNP{9_33BRDCh6F$k*a6(34MgXR> z@7*soduSf;7S0A)@FZ^INPPBMJSy&;xCUZxdXGTF=%O-I41eKeGv{-^{RUZ(4!;UX zN1h!)d2Ea}-hm;;Z6WC6z8l=~sN_n4e}gKYbv zy1P^W=Yyfw%h>fchfoWMv~&ljR?{Kj&qZ|%`r*88x6jKw@4r=_#|_7Rw-fAg9bVFw zhZ%AZ+B-DC+ix$FBip{`-Wz0j(!(Pb+dh|1Zn;m>*KQxJ^I7|oFjC|K}FjN*mcnVWO`Ga;Cf0#DQrWz}wT z@)|xxi>oxj98NB3?iLdAqZPeU+^6&tc+1_AkL=1-Et)gq`aDYOJ&=%O9NJv0?mG5+ zv`Wy4*G#Wk7+%g5UY`F`7Y{ET7Dl4dEXU5NBCeu^=bk@KGVfV&q3af{xG>py%P-PWfx~Mr&$14Nb7I$8_pH zhg%J%L86xPPG*+oEXu?YiJ#d@Kh|0rmosmhbFdbU5~}|(TMU0WU>*tHvH&am+KNP- zJr--%qU7G(dlW_xU@;7ACn~&e?@Ijk)m9fnt9)P(e!WdmCR)13!Nnc=4Nf>Dq(a5% z;BI-{m$hsfU3pfkR-3Mv+1?|0dgsclxTIhxiScDc{FP#8b96Hfa7&gN64wlXGagPz zNI(oJY-w>dG9sg-6sIb_m7oJ2QWK!Tk}&j3_`G^M6^+rmb}#lVuj|K+cxVc&7ir-PbhxO{zg@@qz2$vAbE4~uWbYv-2UcLGCRlql)YPK6f@Zm2BcXMM z&|ctmSi+ZG{q9T9asPxT(HN2|6K*8Aq;SBfe-LRLoVE4A7z_wv68Vq^-ASm+ z-X2U$0D0Mp(T>p?V>+BruSw0sxTdxAcH&_SbyZ+x-plln z{M;0|HFw*YY2iRD{I@QQw5;wL0uhwm3C0WeiA$=EnU zeoW)}P4A)+**pI}q1kHOdmty!>*qD++AKtPbZl&3yzZIQ{BWK}7q~`$&Gou~_y|}w z3>P7U7WwY&P5i||B|-#5u|T785@5?lr*lHK2@S*b^9x}zHa>K+RbV3ZE|e(I6YWi% zp;KuqZ^2PXY3YCp1Zdfl9@=I4Vykm^FqK(Pu>mI~uvCj33Fg9GpR`83aOJqYL*}EHyZ_Tb@>;r83eZI3@_S3+@5F7_LHY<6P>nSuTl5P(A!`5gay>PL7 zCmvsOAcZK|@`f%g=_C`1$iEA`()B$M?f3s)tNenV8?df4{xG zWoHv>oCBT0pS>ARPXDo(?WZFi*cR-4f)jrJNIvh=eRc^@@k10^EPggn#KnaxP^R2j z$W?gNn!8O{!8SSgIIA&)=&^JO0>YDE3@%q3lBc^p*) zx+hoI55&r9H@rk#yNVn*M+IIOfryAGk|QA)R3iy{({{3IsnL^Yi8<^`qs|n$U-W%v zKc2X5#t(}^Wdz~}bYMO-^N#}X$O^#`Br-B8D`4*ChWs?j@PpRfL-}IO{XNAf6y20B z+}mHq+FHTb81urR`T}DDLWmT<4VqWl(UAiZt`oj?6LAo_-QmL(pb-vk-v|& z*&_UL)Jht_%T3-)Mw>H2Ej^-;K|qgkk5WOfR@xxiAh>y4-v-|kF3qRkLx0O=Sbfv6 zML!l%Q!|xG=VSea!CILIx{2Raij1x%zo9nB%^m7_B~4~jr=0)ePsLxF2L1NtE-^|x z{HfIcB;6yL8c;t!7inokCbzOZjPby6MoW5`wQGhBVL?nvq;lH5 zk!y}F(CP=faqfEfhJVlAK`$Swen(}kllLZmR_;fCmY+?nteQl~wa=p6=ha<{jlipy zz_x&c6bl+>Oje66Gr`YZx~MVP=p&%8YMJt4?{lg+J&vO8sNeesPd-4>AMe!Wr&r2s+&u@-}7c+iOioRya%Zut{nKDt&M%av|L8X7WG{u1uo` zEpe|)jA{-p=%nArhmpXi@gm)C(bNjWmq+ooPMRhwK)=_hg)*fyU>hSRZ5pkXJMjV! zG5m3xO^6Z$yOIE(rFz96=@ar}+UNV(zs4+h;ZgH6$NJo0cv6%psn;rN?Du_Lj0;Gb zir84PVBhg=50eI+(&VUze|%)Pjxz>rcX_?O9S?gMo60_8AhTqKrKEkz4QjcvrN;eG zA}WepezB~(d%L$4zfbQ0mZe~N`nr)p=vqkB{4}unh7b@n3`sm}%}qIi9gX4-i-u;v z4}siY$FuFtxgerDMnX!cQAt^14Ekm*MyD1k+tK0qYmPnPyM51%hytX3^XHM?j@dx6 z-ieuDoR^V(Jf)UdIrh6xkSaTWh(dOf;Y(i-cP+Bi7LQFcq=Mpa)y}N&n25r1KD`<7 zECGK0<$~L^0JLP)Zdb*x>E@L1-J~l|PYR~Vx+EA8znN&baeYDVR{;C{Ew9Hx_9V%g z=PH8(?_vc}y~D4u)Q*33!N)`ja?VV@1IMfbl7HDdJDbs(?5n<3J`S1C93^LmFp zCp4i#Z1xwsd}{ywc$lde%p_u;#v3sQ zRoNeUCQkBhs*)MQUlMcl7PWkCayXfVKR^8zSJb>(3Oc)}9yc?ZWHTg(Jx;gMvUI&- zPGvhd%arZgy_u_4|YYE(M4>_H6w8gvDxNVvxjk zRvp>sX__u?B)10&K6-8%rp00dQL)Hg?>TN06Hx~44<5~8yn?)$slD%dhM!#%=evVb zLZl%aOe{3E`Ms~;so%1Dj@Q`xhUd6r z(&`rKyiLu*6b5rA=##M7*8 zUq0RMzvhX!KaDoL6-KVY ze5P{j!`yv-4Kv0pFlesJxP1u^i71`$VRy*zXxD@H8~qQVSVo?lzb0K218 zv-}!POF&8Yf4nZIl%oHg62(Tu_FVg?&FtSjqDh?HQQ3sL)BiT`xvPqcQB3E`JYPt{ zvIUlr`9(Qw!v9SORHobG=(#zBqxqqaaP8STF}$tH&Axd%-C5?ea1Wj1_ctyYZV8Sw zCi2sc%-jD7uEyp(vk|@E=iw=zHAc7Ld(xui@XOr#*`XRCK6 zAISU#4o=RQJYlprba|>g{yWRE3Ffph?_}0LM)~mIm2E+=|HIlj#YgrZr$C;<8r@B=S^-$-Yd-h)IyEa~K-0q8$kOph#-B_{_ zOEFB12F+=g|xYfD!} zju>HIFcRIaudgq+@xikBT@%TRnxJjPFoEws0168xIJ`Ow6UX{kC>3D3GOTQ1Ifr~v z0z%4A{*${Pw8lV41uFJa=SJ?z*vvSjnN4C&vlE(V=&J8NIC%wyUR50(eSJU+KaMgr z=g7aE|3Xs)%IKR(GOdx(mWU&pYffTs-LvT?X@Z;!O{dDB!wH%oV#RBo<~UdFGg zx2oTRl-ZSD|-9@M{;76qAofqi+^m6ZceTPxLWgMfzQ z`ryfflGvGbX{9Ziu?X1kq#+ZYfKL|yBPl2V88O#w-W8x=fB3zzM22dhtfd9b`uAqL z`@+D*to$7kUDLFOg62Gg91IztQ;zd!vMHB0<>v!;z*ZR`fn9Pslk5f$X65ib0gz`g<5ny6Mx{4rbD=-e+e-hq)FDxvS;Vq72`6B&g6@jLJ$7({tngBTW zuvR8g84JbmfFhEJ9sTKy1Ck}-!0MPXr+~oQzzqGL*$2VZR@zTeLlNEF>uQ(Fs5OfF zaKM7CeC#zdq4R6YR@wO^R(yJ`y#5}N;Nsy0?TONOsj8xt#gQd`8nfYac6Rz>_qiR= z85b*uM@)gr$;s7oa0eVPeKj;RD3&nm2#C$-omjSaeeoHxJGr>jn0nT1Lp(B~e9F$u zn>NpN@P47o{%Zz<)KL=r2NEpTk0wD}b9u;x_1k3_X`DoS!-Vhq^1RC+L3^H- zb%4qTLJ@x+O9jM;7i{|K86{$2uX6Mz3QR{a7oAN0Rn6?*qeBP5e5R%)ExH}+ris5t zo9F)g+X`(W>uovK?H$`*a8yc6BRwfp4IxLrgKnVbs=`;JUT)wgQS4R3LIwgUx&jDs zbKIjOW+z^$vT}0pc`&v-yu4BBerqR_cEo9I045~gU?nM~{s-2>{S>Dwe)k;oouuS~>Hym83TKs5f^aEIgJZ zY<~ApetB3L9l8v$F)=A)Cb#}3?s}=o&td;&d>#u4uhyF@i;7I{On^Se(>%d>&9c_$ z{W{|bbx^lxhCB2XV%=`FE>rp4jZVufOT--jp6{1H4&p4 z3jPZbkqKFoj~KM(0zh>bM%-HEF&Xz_WJ-bEg%7-zN5LV&|CQg$m8L|X8 z_rhYMEzYo36Ova~7R>QDFq2Z?UYerQcw@beCQ$mb*u;w%{79An=Dm47F0S-!YlSJ9 z2;$@FO8S?ldKyqaAg{iITe%uHTDX$%JBMcRzjvbo+r6tD<}=SKH-xcLQ_L1`5oJYP zQANGIZ`=|kFsP1ty5EPZhRSCC^{rEs%2Ms}nAC@!_zcQ)dn(74l`G)2yN+&c*wi5p zCyYs|n{gRfo=eJ+6ETFK!xKjAf5C=4@nx|h(vbqY`Q|#3j*mUY3lprw6CYsoecoS+ zJ)egqWPI-g>;Q)J)o6x?$*2J%{A*kaz2j&7gK9{`&#R{uSDT$Fd@J1CCM=S#7IGI+ z7bhn_L4WJH0-S!DPC*ElqJb%>@a!l^P_|5Zofh4vmeUFV9}<+56jKv|eGxUq&c|YQ ze&$&zEj>(jTzaZ1_k@3sH586`(UMGYo~Zo&+GuwHi&!Ei%lq7f;$A(QIDE2CM-5GvUXKzdtGsBnfW_i zP>X31pXdXimI^LxHku>$Yg3puzAHLNv=juYTkX!}Ez=Qv4PgZ2kxE#yT@@MbeCxDe zmg0H81X0k8T{Rw={6W6s`dz{-JUl^5MMEvk>wKr|WSq0Y&u5G>GKiI++~Cfy@yFT| zpkVx+5{pzxGf+$_QF=mzM|eUkH(p4Y{{{$|Wm|o?Lb0G;RiQ5-?d^1Q_ppe(x=JnJ zPiL*Y*~CaN-JUM}X$gk6^PX#oL#C!)1gqNw`AF3f@n>guGjbX5>EwGX{D~YQjnU!Z z&~dQ<%AYDCAZ?1DMEIK_?N455Um*bNOH4?ZRo{Vqi(5@Ny+4{jmSyrj>&ZL=vtT&s z6!SiLpQi7(hzq^AMU!*ma~b`Jq1qUYGFx=@;A4(P66BW^CL>h@KgTmnry;^}^+p z>&JLIhe6$Fga-U2P6%fIN~Nv$6bbE-9rBRQ$S)fU4Ej3`iwd!#sR>PC=V;wihKwCl z5Dyj&pGhYoGBRG|GNMIfR_)f+&@iv63J&2u{m<5}Yr3wu^*%RWVGvC3^J?JtAa{VI zq-+Q(*&H{>*4jk{uPbqHlkUHR#jM_43bNv2C!@81hOHkJMPjswv}^cgADA1zuCj~9 zWm#~N9KRb8r>Y13mZhGseplr_n+xOQT!xV^99- zx8f&0U`l;ylIE7)-@|3Apy+ZX@BSj>sLeA zwBfG-MoxV7e8tHQ$aI;KQu;sD*?f8jMhTk&UH8WVzE_!cy?6h%brA7=uM{X^M>+Y= z9JsA3yVxTgoYtXTv2ac^a)_(hQ}qcSjvr=5o6b6)VY&zq%`JO;_!Ht3^ApZj4r}A|g#26aRB43Vq1QRV;~A=aV4NncA#)ytz8`2}Re%T&@88@K zF9w$}l1Jlj+r|$oo+fy;3LtCio2Xn~(K+$@S3@qXL~RHe&dog(3}gPI=~PM2-%7ngseSiKqe0~$+=5& zAd-!rIG8=O-b*N;)iiW_qOsF;*LS7DIz9Y=S>zZkJ6hYh%5U_SVvqu=NI3AH_pwd1 zc%c;`)AeS1q9af06T`$XqCMPo! z6(xn_a7jtSxcyuX0upS(5Up;}n}?}Vu8ONQ*e9Bmo({YOS2gJTo1n~GmIAegp=ng) z&WdRr6q<6H&WFDr+3PO9mWe>%-@zTTdv+5mpmQ{t9DLL5z>|F}^QKEs>o-$NMO!L( zVT_SvyXuQu*gWf#MBXzEaAJ$e%E(L%qcN8i3YCF|t^Azz!S$t3q_luQP9DFVPV!!u;^av29$?ua(5(?e5IXx|z4q{Ym z{`8SR6!B~md1s^di9t>9Sm35b4tg8~?Vkj!>PZtTF8=O2%yHX?jvQ+6{&*g`LoPa> zzB6L-1-Lam_tL+{@%|B#G|*}P`Ko_?eeHud!v)6!t2D4-$31?yc+*W=czD4v|LC7} zB1sD~WeQxFpBI;quxmfUAcJ(c(l>UHog~drq04udAuI=Q1hRq8&(BY5<(6kbC*)Ah zHtkg#fBW5xSm@1uo0S8Biw&T{@$cFh84-^PWmSyz;10p)=|q&{X=}HC3xOBZ30i@O zF7Nc)t2wsoMnd*hA!}8uvkj-I)n)5h&=R4&MJ?~`W&u1jO!{%=_)V6(gj7Hnf2f20 zHhWk7nOH7u)ff^`{17xD;PXIZJkkG~w9D=%+S{_!hb`mpBJ!5@Iu>3eW&l0>v;xD1?8wPcJXI0>1hr@q)Rey$C}vVz6&K zHR?TitzzVpj0Qbj{FyLx@{;r3FP%GIM~uGh)+;r=0KL#g&4E4)9^rKzQ0dOi0XKR9 z@Yyh(x)W|L#@BSsz6L{24P+=F48Wf`~uUh?F33b>QAsRFOb$ z-@2egWcjhMM-2i7s2nkts&83t0$fT#$AaIzu3Ac9{k_^rV6{S-BJ<9~AS!C}dRw+8dX8;QcI^m4CysV`1xaS<kTk~)NQgkAEA`8OA~z(8 z+tth|v)%4c1bmQArkfJQ>_GmGnfCLcL0R?+qip2gb6`EwjcVj-op%5T$Ux4{qb*@^c zmE;>NmK_nmP7mvJ@@_&At8LBNIKMX;Z7!T-;<>!+0!WMem=&>1S=0#oKUzl5nKwNj zuZ6Mfs(_m(|7p7On%D6%O!@cgZglVH($C>#yM0MXBazC>N9p&8m)-%WfyXM#Rht4~ zpbPy07`rs6NfT32d_3}cI(EYsA5xaTI~)txFn5kV@!p=OAsTYJYzaVH?E}LLA`ZQq zo}3hwnjGZ)MbHXX2NLGrjxY?a3x#BKW87t&#KysKV0B8BUeIYyB;c#z`;|`mb&!~X z-OOz~f2u@VJTjfN;cGwhVb`taY&OnjB~QQJ=((Y;kXKQ~B8y%gvwH_NgwDe?>>nOZ zJ(I*t&SO1O)79JU?sgIlDNpD_%Uc|Et3gRruL>Rp#1ca&fZzeWZo;L?$_k*QIG~DT z0dgms)6*}LTf@ey;s5GREWlnt0DKwIO))Kw;=}e2^}WgjN>CO81`H(0pB40XfyVC^xVbWur>)<}dkqe;_br)D<_yj$hvcoU2bd+r3-qlq zPc9u@J#`iyXFRflZ#x3LSk%bDW8~R9 z9IG6iKZ2>~#G1$RL%cor?U9l+xnUEhb>Ux|`<>gjh;d@%u`*43h9YW8$iW zcG;cRHdccS<=sw9$*cJ}m*6L4WkmIFsZO$9%f<=^C*9#5TJ9RSfE#8XH-f^Z;Af!W z6GZ|`-;aOj!P0s1n6u5x3lmuDR{LMdVK5(tjcog&(zvQ%#mOZm^eROsN8a;bXN>xT|tzGZ9x2l$t(3N4fo z<9)v2uSN(%2%%9T6%z zD%Pv0nHn8W$FY66MQ1^1^>sR2F!15sWS(1f!@hMW=~$0TqdjyV8K!%|@Azugdz3&Ke7>-$9FXUF^L3sOqR%|&d1Db6FGhRCss@u*6?Lq?%9sHXuo^}e> z^yG0DP0U`vLJ{aJ$&w6vfIzy#n0v=W%i;aoVe-MQm%Vb47q1M7zof?0hG{uDA?>0; z2;37Rp*vp^EK0TCzioQSkPZFp!K$LJHd+Um29RfSj!VD5c6ero?D?sp^5Q@_DDyC%39yAWyPn`*-FqB}_|hwei8ig7SWT(cvLMSMrWMf_9d^-Eon}ARL|v zxeGy$n>?H&@T@5S9*?Na>Ue0d*PS-#(5&t{LV2w|QgUd%(8=hv7ir+Ppp2515ESIg zW8d}~iO45AneIz&ziQ?R9w3gnm=q3l0A_08v$<|%@%C!S?YA7#_8o0Ki)Pf;-P=C7 zfig-c%ha#bS2Jby*Uao#4PLUy9GG*LuRma@KaHhbxjHTu!AYy6l&6D&Z7<-sWqDjB z*%VR$y4Q-tiGJ&<#0WOkuG{{4^UBq?qqAEGBN1mh^ZXo_estlh_qm3*Eczm<_FCr@ zYzrj;3G3FMS^U)s@5J6~sQkbop(SzpHFr7Ngyq16qT8J1tB^JOxz?;?L25&Goip7s zX5Dg&LVkbnHypomCJ=jQI~Wu+FbYb-?3Ue&R4jO)u|3{_neRbAw~I#S&DXYT_ltKd zZQ}FhDe}f2*8KRYaeW=j&#rFzRn`m>)63*$Q2f*Yo2kT5nTA8{9j{GjZh|cRw!cgf zsTL3@c>t@7gt3{FT#}rDjcp3n@MH0~CS3(xyqNJ_C8oA<&};YzAu=@h_Z+b=m02qm z06V9xwEoKB7gi)euV>+spP(ekivyM5AP^JdIt#rlr@Dk7|QhVRz)Eq`Z5+=%)AU&uhdM{A=?a+P|QWGR0 znT!+fwt5na+FmGu@c9+ZK~D1)uJLgsy#z_tHhk%&a}nXq)?9V+u6(I?w>h*dDOk91mV}yjZfy-EqVn@=h*HYT-{n1Bq9Ip zEGWE|^e?2O9w1ZTDfnY3DoL!rRl?P<9S`9-Fd4Y-fxiUwQWz7KZHTO0mN;y6X1Q;z zR(^lXZCvpX2DM&TuOv)5*^%6%k^d}ro}|myRIGR9qr%#)f=KrwlQSG-8ey_`0&oz) zPfaVu0No%@m(H!#8QobvUjMd^l5qi6*7K)gROpylNt1sZ-RUA91Q(C;DDA2g64TIR z^P3U`+urB7c2dPO{Hf@%lpM?4s^s&AY=Zj1zZ6F3iAJJvIr>IL@W`)=zl08H;Uy2P zBGn%5Z+14;O!g+0&@uEz4BO@{`JcYib9-+$M*mfBtvf+J%0742NlPqHxG-Z~Q zt6i81u1bbU=1yckBrk{e#u{mnraS-pIvq`;6wRN}kU0gQ<_ldUW6S3EVP!I&ce(U8 zlnBu$2Z0pkgO&cP$ewb5w|c{+)YsU!c;Ty~P9_P2(am=nNvY-vkR>63;Ry6a=7dkV zR~Djl!lJ_D1Y$#`nN!fndmCsA_+#Qv^{r~i%bz(}vY>^apiz=41$Lx{9Wb=vYj_hU z(B(OkuS@au2`hkid2JH;OMw46qIhjZz`DL;b5ZSh`~V3&Ffi})q^5?!O(r*2N2-+} zBzdtE)DHN%!sCy7toi=X!3^BTux7*w4qI1Au!@Euvzj{?<)Q2;_8e zeO((3j?eWP?^K2;8judVQAlJ2Iue*b0&{YJS=E)F*c-jtbkp1_U+t>yHM>%&2=%kL zoUeLuP+p~9DHmey<|swSayK_rc}ZtLcDyzjvS8PW3St>PoD>O8{;qYeyjx?xnwBcV zSF1^<&vqI##M#iZ2Lmt^y7>?y!rg<1S~Df6WjmX8=+r83FV$o?u5A8VDvFw1`JAPa zVbg9vK=kzC7C=!gSB07Mty`M?{7&tuGA4f#P-MLJa{8GL-cj*^clQO0;PG#hH*e5I z$YgNaV-`#yN%6}@h5`!-4P7{6%LUOMsj%1kNb<9ZW0Q-$e4hHZmZhO_7L5;}M; zIkTr(-Qbxxf(`oI9kk)asdeOD)YfwIAjv*bOXi{cr_`e;7(9BMVl)eCn>PCj9>lcIkO_;*9b7AZ?17$j8~JcMd&+c@3SxbUOG$su@n)xel@vLtRJOCfzWp!6TL zT-XA3HX_xv&_`HDlRF;X?^Ar}mvDA7T{Nc%zg0lJjJx`uPqxAwIt4S|K-DOy9+uXdR^OjsfsbE6Aawp_^^|&=Pdp^vsfHgA`J&8hlVjx zPBwUX=@0LYm#Ou^@Ut~NuT;3MoV23@cKS{{Eu5OyOB#9GUfe;C(Ex;nZbvc)`?->Z zld+MHrSJA`k)jM2{%!cwbp#~}O+HPsEF5?OB%*+lo+Tm9W74_YMoWtM!k7~a!~A-Z zDp##HMP1C_gKy|$arobvLnM@)yNqpEq~FxL9=6|_kULUn}f zTYmi(?3qH(yLc&^EGv`;E{5pKlz`lRP}V**p@=HUqY9o8=}Q%+Lz9RE3zqJ7BWsC| zk&by5jbz#_7t2weo|^glon?#|&C4b(kiFF`vRp(P(0%stBbmqe5>6JSd{Ze>(o^q~ z?8HnQTyb%4mqH^J9L&20I{!^=b;sgvS3T#U;$?LSx!(gGAA~=jC%;Exnm<3Xef3UP z8+~VX^nWH)nc}mezjj|0JQ#gmGgA$CUKfeGg{d`g6ZY!y6gIt%tLFE4+kX0Ks{uZ@ z45?ZP5{;%DJFeHq#$y)ulnC+skFIPJ?f2Co7&LuB*MK{yeaIv( z7&{^N{P(POQ(OFc7P?eINvww7jc2L)@4=cRJ56)zYkaDEO_nlCfb=a6Zm-?jRx^r` zc|57|EZ5>I@dfqyq7yp&ntt7WUw>>sNaD7)?@e3~T&RbK({QA~PxpJz9 zSCNqY-e#$K=P&zXn}K(jd2C`(CF*kBnw3+?cTYs$m$m1Y?b8k)RJ2^riD&BE(uetE zHp>UQIfJizb36ita!W+805xllT8Gn4&)Uq1O^a^INbRto1h^i>enzC| zQAHs1-_6?b#Q=^8;uwTkKmg`w%oO&QlYb#YATrG;bhFo>KC7T$<@L z-?Gh8UHl)qTPP%&_CZSZ24%oO&95h#B|{cU7AsQ z2p?-SkufOfRiC$4H#ZWd-nOW(QV!8nK%;Ormh_{wqVA5D{|4#UXcZwl2%R858OCdi zHb^An^CNeB25PV-YJH`VSlZ#Px;3$=igJZ}OzRuDSoovuvOkfg__tetf++lyK<=}& zi!2;fH4J*T@nb|OjL!(W-4+WpGHgoVB5PA3yLtrEYofZ`yg{?vE|RqRnjDDlO^!FpF*)c37cc8)BMy_R%&gvo_1*cH$ z5q43Ftw0rN71LPADrCQF~` zSQvDZziV6*xy$=aM9L}SjMSW!qccVNyE`Nn%nWW*2ln;UvukV6DZo_0jI>nlmBr0f zs5j6(pHD)r2#Y!vzQKT`NBhIRu!)i2vU#gWc87TEiO+Z$Hr6ekp-m900P5T1BadqB zDsG?I0Xgn$1iT@DOXuK<)1qN-;*6<7MVe?OiYCgACEbR7V=ROVGxjPO2qY-Yp|E_5oFyL^wz#rRj&yF z0Rb>1^ofDB8?$FB#gOr1(L?Ar@i??)Tq}|#O5GNG`3St$<3yVQnyh_YbbnOJYgt*5 z)ENb!*5PR6iRw140HE-m{p!g>zLlPGIa&um!SfTR%E1iki4ZUJ7c>NnfM5VArA?L& z9mrQMpKUh~8hro$S8)s}q(dUA5D(spx(YN6?i~ySg{YeYdn$Y)O@$`>kXzP3lm)9{ z&zQ8`Q;7Z9Sfr16ZD<~l^CzqcNySPT=sF;NF5RxZXTwu*I zsfqRiDS&iJmtT7-!~(=kaP!_{5kMRhI483B!o=oouVGC2{rAoPdBFkR`~^%9v9vY+%i#9MW=nhL z?>;+{&y7L+-DAEtQOIEpW?CP7+$@s>3eITr3WpJ6p7^o{8CTFxPXZG)WC$nAwbQsr z+UWdCwR+{3DT6?-=;a}HP|;|n{#Da?HV`6Hk=ODg!ASRb@JsvC0J(fAo1b`?5DKsc zI<)i|^}Q(LNkhHI<|9f!t|VD9ygW%9JUSZ_M34URYSvbrNo72y_?yZ?CM`OLmv6mh z7Q?iH(&VRhxBko3!qcLr-=d*_0`KM>Uu zs$7+|FltEHxLi`9(NS^=D(pGbbo$jJ6WT9d8MUf7;7#Ch%){I7`P#$p#7E=S*&2)t zUwUb-LWqVH4Ry3n4~^PJk2{uS$LR$tj11?&dv<=)$LagI8Uo(jGm!@2lDhf4L6}gj z?S}E*>Mqgj9QBi=%yjR2DQU{kf1vay(t-;Me9_r1CsYY_Zc#-cf;{QTQK&$6P)A$U zK4JLDWw{Gpj=~b%qC$#AUy0NE>5*B-kM4doQ84>LCJpFEklGyj++%`OP(B)-(TOak zmSs)BX_44LA!3iR>%<-D9P5NlT3txTtw|dEYWZ>7q~Fb$3v(%6TsT7m5IKEE&+Nv8Jb@0So#;^bko+xAy49oBga&Ws)tCrwMUBx9;q6xgrpV3N;8Wc0P#mK46~dneHQGl)*N$^c(R`}-0~pTrMQg+f zWX_&1*pFBBY5w>5lFpFhj7*#AD39s9)Ht=DaICF|s7)e?#R;s99! zj_7i){(R-@s*@lB8eU|#wneEconyA#F+oYD2$C7SCL|f_o3AX}dSo#aO4?=JmD(zX zyBU;qT+Vy~doLptas|`5zz$LnMH&9s%h${{qnDV*zPIV`isUCan4OIG@jwtH4VUH& z`o%%|vMl6XxDeOYo?HL|bj~=H4+j^*b31I}si2O0lRZi6^NsAOIext9XG`*$?UCgTKa@rV9BtoKaeHAFV8W;WWjjvv!~TF3XgpJ zTQ|fPmlnZ-Vt$av==kwvzVhWs%>o7=lu*P>xiqY$ddY*7nya5lqA6iv3u;MA-SujI z@B7iY@+ewc8@H96(&1jF35W)VsTR6-3OTP3rOBf?^REQV@5EJjn@iFQ$zScdIR`1hf*%#$_hcU=oP zP}a=JYu4a89xzP=$m=EC(Pf0Sr-~<x;}BW%5jk3Ak0)n%Izs_ie?j z6R@@#6`8_Bw3FDqDV)!rmZ7JX1spmI#L%TK(*e$kc| zW3`TUgN-+|lE3jzn7^BfFW-(nHpmUYBOi6F9~JuPB>(0J^$0MvNza4SGSTW1861)P zKCP1`npzHDeHiOAs8;%Tmv9>ReOhJWAA9koxJ7SMdr2YNfTT*^md@GsGNI}VSQd~_ zUXgB(cfdeEg<$`$WdaL$*8aA$b^32qAYi3j>2Adww4nFgs6Zj$GzmTp7)T{%!*^J) zb97q9t${~uTavA-i(|k`5yU>AbYFfvNqJC>v6#xVP%K|^gWd#>kRXl~-h3uL_Pl*t z#$&~jO#DvYmXAA>I(#U7DdBkgzRKMmJ!3-{k|P^f5-tkH9&hsNg@}@W z$gFsAX&9f!#XfZKNrZrn-$C1p){SuDITtVOp3E(C_-3=Oqf1pV^sJ##f3P+kjghg-JDvF{#uM3D>Y~{eF&V_Hi`L4!E2+Uq4ZbX@+XRybp}EpL+QU1^D|;w-l1Ofg{dJEaD^jeEG)4h6(;)*>s6&Lp zU~tTk8t6~#JcK2$COX=c|Cxz2wgW|_bFr+Sm(lp>}? zNnIymV{g7IJ2|3R)tlZ_u;4KC_yUOWe<}@067`_tUW3%BlEn>;Io@qO&`^QTumdfw-KBVql0`rEnc%Iy(3aPMd`;ajnd*rgf6#O}y z1(DB0icImg!J+15l@Wceb?43Vh9pu)yZ7rl0IdrQES{b^?fBT`{!d-fo2#dj+QFcO zT=nTxx+E}^y>q%Qm}R6fHYPDx;0RHq%vED(BZP`PC2n1cg7 z#=jpyplK5v?!*`;_Ak_FGDky*ZdTmWdRx~jEggKC=*sSgvvenxO?96(cR2J)jha)Y z*>)Kdh9%wSd$U?DOin4_6YhAnnW;i0%HQ|>RS@Nx=-^sxYtuT2%&CTDB(%oysclDM z6og=dC8EOYuhA;snOG4V_VCcJcd8`?wu&JzGT_I$W_NbV?!c^)``B0)wUu3ArJ3IU zB$`#*NOcC0a9b9rA1AdaR*rQC8@XP?EaMK*Z*j0j;`$i_Wykcvr!f4?1B-ER<}KfD z*rLMIFuG6C*3OYSobk#x8_zSxGsUvlL9^`VnwFd@&aht-XnW9Ylg+L{qv#`UiANXj zp}YxZA7LJm#l%xi5*m}!^_clfCS!)YoY+S{VeXmZ;)7@3h&namVgn~-emn_Ax6uy^ zulH^IzD_{tZhX;=>SH3?b}=BuUk#`*h@$JG>he%f1TDt2`B- zvO8^mm0VgUrUv^G{6JKabkJ#kfLE-+-E&HQa4*H!k>s3T_ussn0ci}a9a`6G<&2U$ z=x<1SzQD*i1&H!S6tS0os3nB`E8|wKznUsSB?7{}>hYSF^-k7ZZu*V492g7b9u#wldc0LIe9rOeX@Dy?b@>X% zS`4?;+K-e>x*-!pfK>?um%Uv(VcLqIG`N_Ij~@)F5zJ{6C^9>m)ub!eZ!P0D2j{NH zVp>eDO37BsXf19fY9cD4Y!MWho|4JbHm>W2{&xK#Ri*6-b`d3F3Ze^13bWqQS$~oV zbE;vu7Cn|74W??4;}YHybf+{T7_o#eqRrsNEItRs{@Z|w~uT3=)@Eo*sh<+WSyon#?aJ{Um!VfubsFz7sKebFD-2IjBH zpG(P~Bi?u5hKp{`a9Xr1VZbwPN7I|SESQYagv)JUF*8cN2q?mMT3c0r7D*Yq1h1k) zoeN&YvRzw6!aPNtN1oK>OCz@7>Zz0o)!BTgF>_He6DL;8jxr;X-Y3#asuA0q8(5o3 zhZD;Y`F;UeZUJ5!eG10Hv&6>Zq9%uM&ue8QH|8SPNKAuUm}6Uye?8-4u7?p+2~0KnDhJk zbU;+H9k4@X3RShCh>~)cnYM4sZwvRAIfy z1AqWzx>qaPe{f1B%VabUThg*6F2JOBlKG4IcGL2NS>f+>A_$C-zzT+5OYmGS#>?LV z@(H!f%L-#@vadhB4{m}?7M>vL1ALaga^JQc=P}A9Sx_JBK+E@+DCmQpi|eR5uW|x^ z<*0#`4&k2RhRB6GMZ!5!MKlAi{V3THzZE0FI^Lf;>N@sS>lCgGz5mOwVkH6y69+$c z#`Pu&vVJTYN?2qS7rzHZ5$*m>MbH7ZvszCQGomY%wmf=Q-^>rSs43)hXO0_`$@Nq6 zgp|)xY}3(8uet7b{#@(F_DDEW3eVtpEA#kXQ}<_-7v(tj~bd`#CdP*D5HEfL|zab=G78@kO7r+zN`uq z3d@D?xIhZ33vn?y=N^q`RjrIb{ykB+MLBRqz>e*2$W-{85L|{Y{tEdjtK)#GG8FtT zlXk0ZQ}-qEKhhsz3cW5ZmW(PDX94+dr` z#veoJuQ4Np2&6p-v7SQ8Iv3m<##n*nxe+VeDZ74!{8xYI(+AlHvDiDoy9e>E{}=6hR0`p}$>UjN>K zM!NkT82T&`cY7c>UCxXZ)E zv^(1;>tM#`} z5^c?KD}_KLB+#DL*MEF%i>Iv~_gP*IS`OjOa~#YJ*~wmP#6L<#AP0zX%+fk@;C}7& zm!}?uXaNISl%4sIE7{NZ#;8u|mJfG}wJ3tZ8?eCFIZjJl?LfKJub+-^-ggR?^VGXM z+JeVJAGj8#6>?~Xq!=F?l^21V!7JMy8j^N-c>9rHte-N-{e_10ZJ(cS+Dt0DbSgrk zHDF4wLci{e!0n`liFS9fWiQ-?=*bA<3>3W-rmagJG6WsHrjd6}Ka5 zODB5r0ntR7oYe^-THg%OG^|1ry{A4X*0q=y)AJ38)y>-=%geOtR7+P)m*DYv^YZ?3&{7D3zeCwTgb z_Na%UPW;FU2`t)mzK8hFDhRNj)K>1+>#Y=f)7QUrWqu_K3^wQpEHrq2t30>k1Wg0tCN+fO`bSqm_6dGuI28_~TLe^Zj$nKNj`>}Ub5RixMf z*Nlee@-u_0V~FT4tb3FsjN!(f%DndKUfOQf#pCWsHtd;^Q;))Xfho zlXH_oKdEHgo*xHF)n45W@)p{|-cUlcYs>JolY)za9STmso!TeKlE+P4hnuXY^}Ed(j@cyHjJ}cweE_e%9<~PbTZYTq-arIz znBx)aHdmuf<&thmG(doRnpi>4Z1G_^wwP_=A=~jAq6xz%=9Xoh{^-0Gtzx|~d4Ez7 zVCZu~Q#x>_hnV5f9RC6Py%}q7j~|-rYE{Zc`pZtfKz&hsB$@0egFNTxPtKRJa7J82 z{}}p8Z4z28RgojZZr%Nq)AM!0BrmDSFsB{$&A|m7@Xf@a7pTlz0ozD|@at%d={`o`O=PMp(9zSPwIq=ch0 zD5lh!w0l8kC%dMwu`&kqJQOBk()CQccY3t}0jIxx#NEVn>WHR5$_lDxhX<^hFUwZ^ zTb#wbId4jg4=$!~$&#xqCCc(SA&Y)>8|V5H%t#lHa8j%P(&|^FcoGCDSC?XXi~Zr% zTnVj^jL?rAF{NLl+s@mlva`%xNtw4Xf&O`Yv*+POv43akGMbp}G?me7{F2j|@AZ9l zQ9l#)`xT0d0I?~JTqe%)B#(%K4^1I$h~KYu-tOOMM4cl$K=wiqO_>NJsLqMiippr5 z}h}Sp(gy3but^7gpo2?ZGZltv&PXrZ;$(Nq&gRag@B&-2l^DDMPnQp^s zhE^&f)r61)Tr7NF25p#_E?C(O;;PUggSxtpU#MYeJs%6SN~&UJj4pWh3hq75nzrII zlmSO?za`bexfkY+(apaH_piFM%6SfAyA58<>?YI4M8@9=ijc4ady>1!LgF_!a&5Pt zkDJ`;0j@|+{?e1fs#`8CkmBYi9z`N7X>N8s&7B@l*zG?L#k<>SL5oxDjT3gxN%#wo zV0ioHyLr~Zy+!tNg&0Atp|g)RP-4R~J9xs4tRzlP6v!RCxWacsmvSVJ*EUdcJ7oMf zGodrMQwtjAA{Ni$506jS$R3&Q+%Pi`b4LcWN<4?h!x(UST`?`FhIVaNRf zrt-RloFt~`i+Psy75~>}CEgW@2sXCoI-LJ?gy&pr zkGdFo`KLj0*k-+T-Cfl~XHvQ->dS`y^4nOf-)>m$C-dHAj)v+Lgs!G_r2^$j`p+@--6lyFW~=lXW32H63Ywb++XL<+ZS=$#QsuXb^V^jX-$lY+F^yhrY)jp|fjfP!W=Z$YUhYeCgPoBJ1E;dWy@sY@+q~lh`@dgKc=2aNU%!v9Y z6{P37tJc@EfBw%|mrq%*P*=}xjs4nl@u0X!yx;DHpSM+(U$12^*fi@I&)=_Fm4}ut zs#f1%zII}P!O?hA!=Az?H{YnZyG>nm{X*sk;MOdyTjJ~HJzjibj{C7$%64~UK6X!k z^6i4iySS^RITKPni)#Ot-c0bBFgx~JHM{slhwlqizufqq$;*=b<)!D*6kpG->&@5C z>-0O^UtrnY{-9^^M~S&&5@L(PJww;C2W@Xpnl0yj@bcw_)eEL%*}o#BkJef$-1yD4zVZnF zg%7JAAKA{*{kiK`!OrI2Imf;B-)W2EKQDM)T0^+{@G=J1y{sqtUj3DN@aWuv+@Ryv zm)*a3LS3>!N#*w6dkl3tx}3!y3%5v=ox8oo#$(di{DL1l9J)KLD;_j>PpXOX{3Ef$ z@M_Qrk=2hDiyut55W}meKJ}8`&bzhAoL&zF_GRC&-90}>YHi{6x?g_x3~iQi2JvoI zd$2g@gR+b--+?2mb~e@8@@VvK>L@(!RbCyxZ71KZ;`rG-Ws)w@*MByZ@}F7ofBM|K zfBc{ZPS=$3Yb$|6`8uYs1`Y#|$2K?A4K`T{q9uUXIX^EgGrhDZu_QA;uh>XGH#M&` zDX~Z&GDCn(mlPIVCHeU|1&Mj7Ie7G8vkjyVzirrbrRC%&mZaiyqdXQjX67cQrxxow zWtQY778K)gC^iokmn4>y7UOp+Hhl&81*HX`FvVk^3>L>06y>KEr4}REh;7DO9gEJy zrvWI<}o$rcFd9AnHyZ951cuqW^khAL9`{^#PQfC>h1+JgoPJ43{;LM>KPc%iS&Kh-od<~(rRVziOVkY&wATbRQ%)lCTM+qx=lX&+Nm4GY5GJ$g2#+n&Y!oVq$d(5CvWn>az5MhAj zocYXpN3?cx~(i@c^w?pZov- literal 0 HcmV?d00001 diff --git a/doc/State_diagram/state_diagram_v3.pdf b/doc/State_diagram/state_diagram_v3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..78eb300366cd99fc67121bf380bc6211aca451d2 GIT binary patch literal 14114 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 E16{4n>Hq)$ literal 0 HcmV?d00001 diff --git a/ledButton_controller/Makefile b/ledButton_controller/Makefile new file mode 100755 index 0000000..b6bd8a0 --- /dev/null +++ b/ledButton_controller/Makefile @@ -0,0 +1,2 @@ +ledBtn: ledBtn.c + gcc -o ledBtn ledBtn.c diff --git a/ledButton_controller/ledBtn.c b/ledButton_controller/ledBtn.c new file mode 100644 index 0000000..e52aa16 --- /dev/null +++ b/ledButton_controller/ledBtn.c @@ -0,0 +1,282 @@ +/***************************************************************************************/ +/* */ +/* file : ledBtn.c */ +/* */ +/* synopsis : */ +/* the compiled code should be ran with root privileges to allow for access to */ +/* the GPIO pins through direct GPIO register manipulation in C-code. */ +/* After initialization, the code update the LEDs status according to the commands */ +/* passed on std input (using a pipe). */ +/* It also monitors the push-button and triggers a reboot sequence */ +/* when it is depressed. */ +/* */ +/* */ +/* This code is based on examples from */ +/* http://elinux.org/RPi_Low-level_peripherals#C */ +/* How to access GPIO registers from C-code on the Raspberry-Pi, Example program */ +/* Dom and Gert, 15-January-2012, Revised: 15-Feb-2013 */ +/* */ +/* and from Raphael Vinot (CIRCL.lu) */ +/* */ +/* v 1.00 - 22/02/2015 - initial release (Marc Durvaux) */ +/* v 1.10 - 27/02/2015 - added 'z' command for debugging, improved handling of */ +/* concateneted command sequences */ +/* */ +/* */ +/* */ +/***************************************************************************************/ + +// Includes +#include +#include +#include +#include +#include +#include +#include + +// Constant for low-level access to GPIO +#define BCM2708_PERI_BASE 0x20000000 +#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */ +#define BLOCK_SIZE (4*1024) + +// global variables related to GPIO +int mem_fd ; +void *gpio_map ; +volatile unsigned *gpio ; // I/O access + +// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y) +#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3)) +#define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3)) +#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3)) + +#define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0 +#define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0 + +#define GET_GPIO(g) (*(gpio+13)&(1<= 4) { // final state, immediate reboot + close(fd) ; + do_reboot() ; + } + } + if (Btn_press_count == LONG_PUSH) { // trigger forced reboot + state = 10 ; // LED animation before reboot + repeat_count = 0 ; + } + } + Btn_prev_state = Btn_state ; + + nbytes = read(fd, &code, 1) ; + if (nbytes < 0) { + perror("read") ; + exit (2) ; + } + + if (nbytes > 0) { + switch (code) { // codes evaluated at every tic + case 'z' : // clear without restart (for debugging) + GPIO_CLR = 1<= MAX_COUNT) { + count = 0 ; + + switch (state) { // states evaluated after MAX_COUNT tics + case 3 : // green LED flash OFF + GPIO_CLR = 1< 5) { + state = 12 ; + } else { + state = 10 ; + } + break ; + case 12 : // proceed with reboot + close(fd) ; + do_reboot() ; + break ; + } // end switch + } // end if + + // loop delay + nanosleep((struct timespec[]){{0, TIME_TIC}}, NULL) ; + } + + return 0 ; // we should never come here! +} // main + +/***************************************************************************************/ +// +// Set up a memory region to access GPIO +// +void setup_io() { + /* open /dev/mem */ + if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) { + printf("can't open /dev/mem \n"); + exit(-1); + } + + /* mmap GPIO */ + gpio_map = mmap( + NULL, //Any adddress in our space will do + BLOCK_SIZE, //Map length + PROT_READ|PROT_WRITE,// Enable reading & writting to mapped memory + MAP_SHARED, //Shared with other processes + mem_fd, //File to map + GPIO_BASE //Offset to GPIO peripheral + ); + + close(mem_fd); //No need to keep mem_fd open after mmap + + if (gpio_map == MAP_FAILED) { + printf("mmap error %d\n", (int)gpio_map);//errno also set! + exit(-1); + } + + // Always use volatile pointer! + gpio = (volatile unsigned *)gpio_map ; + + // initializes the LED and push-button pins + INP_GPIO( GREEN_LED) ; // must use INP_GPIO before we can use OUT_GPIO + OUT_GPIO( GREEN_LED) ; + INP_GPIO( YELLOW_LED) ; + OUT_GPIO( YELLOW_LED) ; + INP_GPIO( RED_LED) ; + OUT_GPIO( RED_LED) ; + INP_GPIO( PUSHBUTTON) ; + + // initializes LEDs to OFF state + GPIO_CLR = 1< $FIFO +#sleep 1 +# send command "PROCESSING" +echo "p" > $FIFO +sleep 1 +# send command "FILE processed" +echo "f" > $FIFO +sleep 3 +# send command "FILE processed" +echo "f" > $FIFO +sleep 3 +# send command "processing successfully COMPLETED" +echo "c" > $FIFO +sleep 2 +# send command "ZERO (clear display and return state to 0)" +echo "z" > $FIFO +sleep 2 +# send command "ERROR" +echo "e" > $FIFO +