From 7b038d5243fe1f1706cb9011ad55e4e60e092ee1 Mon Sep 17 00:00:00 2001 From: Janosch Date: Tue, 11 Oct 2022 00:05:01 +0100 Subject: [PATCH] mocked timer test, EvseRead --- include/charger.h | 76 +++++++++++++++++++++++++++++++++++++++ include/param_prj.h | 3 ++ libopeninv/libopeninv.a | Bin 40208 -> 40872 bytes src/main.cpp | 77 ---------------------------------------- test/digio_mock.h | 6 ++-- test/test.c | 1 + test/test.out | Bin 51640 -> 53696 bytes test/test_logic.h | 23 ++++++++++++ test/timer_mock.cpp | 7 ++++ test/timer_mock.h | 19 ++++++++++ 10 files changed, 133 insertions(+), 79 deletions(-) diff --git a/include/charger.h b/include/charger.h index b7e66b0..73d6477 100644 --- a/include/charger.h +++ b/include/charger.h @@ -58,3 +58,79 @@ static bool CheckTimeout() return timeout > 0 && (now - startTime) > timeout; } +static void EvseRead() +{ + const int threshProxType1 = 2200; + const int threshProx = 3700; + const int thresh13A = 3200; + const int thresh20A = 2800; + const int thresh32A = 1800; + const int thresh63A = 1000; + int val = AnaIn::cablelim.Get(); + + if (timer_get_flag(TIM3, TIM_SR_CC2IF)) + { + //The relationship between duty cycle and maximum current is linear + //until 85% = 51A. Above that it becomes non-linear but that is not + //relevant for our 10kW charger. + float evselim = timer_get_ic_value(TIM3, TIM_IC2) / 10; + evselim *= 0.666666f; + Param::SetFloat(Param::evselim, evselim); + } + else + { + //If no PWM detected, set limit to 0 + Param::SetInt(Param::evselim, 0); + } + + if (Param::GetInt(Param::inputype) == INP_TYPE2 || + Param::GetInt(Param::inputype) == INP_TYPE2_3P || + Param::GetInt(Param::inputype) == INP_TYPE2_AUTO) + { + if (val > threshProx) + { + Param::SetInt(Param::proximity, 0); + Param::SetInt(Param::cablelim, 0); + } + else + { + Param::SetInt(Param::proximity, 1); + + if (val > thresh13A) + { + Param::SetInt(Param::cablelim, 13); + } + else if (val > thresh20A) + { + Param::SetInt(Param::cablelim, 20); + } + else if (val > thresh32A) + { + Param::SetInt(Param::cablelim, 32); + } + else if (val > thresh63A) + { + Param::SetInt(Param::cablelim, 63); + } + } + } + else if (Param::GetInt(Param::inputype) == INP_TYPE1) + { + if (val > threshProxType1) + { + Param::SetInt(Param::proximity, 0); + Param::SetInt(Param::cablelim, 0); + } + else + { + Param::SetInt(Param::proximity, 1); + Param::SetInt(Param::cablelim, 40); + } + } + else + { + Param::SetInt(Param::proximity, 0); + Param::SetInt(Param::cablelim, 32); + } +} + diff --git a/include/param_prj.h b/include/param_prj.h index 134d06e..057647d 100644 --- a/include/param_prj.h +++ b/include/param_prj.h @@ -108,6 +108,9 @@ VALUE_ENTRY(c3udc, "V", 2035 ) \ VALUE_ENTRY(c3idc, "A", 2036 ) \ VALUE_ENTRY(test_time, "s", 2037 ) \ + VALUE_ENTRY(test_timer_flag, "X", 2038 ) \ + VALUE_ENTRY(test_timer_icvalue, "X", 2039 ) \ + // TODO: How to hide this in interface? /***** Enum String definitions *****/ diff --git a/libopeninv/libopeninv.a b/libopeninv/libopeninv.a index 1f3f92c34e176603f5fa3ee71c770369c1608eee..6dcafb097fa7a2ee9a2966a610b85ef5212f1a21 100644 GIT binary patch delta 1550 zcmb_cUuaWT7(eGGb@#?5xs9bcQv3X?s_9n%&l#3A3Lx}j`*r?AHseV=Xqb#1>7i}tJ4yHd$4x|go4|4qj*(~9p`VW}d zpZvH#cPO20=2((PnfD2Fu~CS}Pzpw>hqyQ^)?p4hh>J+%B|he^H%M;@L1BeKR@j}C zkP0HK#!mgh`aJ?fuZ)}`gL#;w*-37k4h7NYsiYe6o_1QmqcdWs0*|@d_zlj@rH|PuLat9s8(t+KygnM-x5K(IQ)Tqr_a1fE|`2usMK4mI=g%KZ{iu4~r;f6{)z*VlaHOxf=7FAo}pb zms`LFnb73p$I7`O83`V$KGdJtf{53N^MjSHgwIMHww9kCWUh;LwONWgug2(gM04#@ zidnoWRD`NAQO~5IkcFJ%T~w{l=YFqsG^k3Dmc=T1c^S(Fms8<{PRXesQj~;nE zdT9B|4xaOyk#~IBduDoW<|&kx70TQUCb|oVR4R}Uv#LHLjhm@Pmq-3o*y&!^i@z#g z!Kt?gP(Sv4)S&qIk^4;|Awm0{w{c^2!)!qbaIe;n>tlVfXS=WHE(;=jb`xzt^sL|g zj#b_4I1i%nM(W4XHovfg;AB9>d+N6|f#|uobkt!nHS~ny{E`{hZX(3&QOO+TJzEh8 zGh8|$V#=*xD9q?AmN+^QW|FBPFEWf9;kY!rTCbu$E~SiK=5_%2^L);3&>wM{&&l?0 IB4-@h-@ZC`r2qf` delta 964 zcmb_ZOGs2v7(VCRQSLFFI~T(_Lg^*JM@@Pq@s1DXIzd>A^0Cpt=q{p~7uBj3fk`dG z)z}v~CXPleT(p?FEh>UWa4`vi?Oe2&Herj%Xj4$pnMcyH*AL(SYa_5kiItQ6K$1v<*W343nh;P0tAV742Ju{0{nF6Y@_uDhc9J_5Z-Fn-8nQ z)P2c5R8*XboQa&ngV}&$bqA53HR)OCsaj7J;RF{Bn8>6I+^-dGp1-9{3aOEwUoct< zBrFr1D8yT?srzon7`x#$;CKaw11i-p<+TbKatj9Xvg_&hVR%8n&;&h?aJmJKCXk7H za9Qi8kMTsaDR;kUCjv@W(8QbB4mJ?DJKfJ{AKr%q?ZLg!;qAQAenETOb^DX2qM+d* z?$mU-yAFL*-N>;?rQXL&$_yE(6#COPK}Y?x*R3DDSV^;(89zz0?#J=P8sxNU_v`6u zg{t7uLAr^Ns7-q@BYh69q87iRmPmZiV;0ZuE>mJ8X0fD>p}{&V#adam4QsIwOX+CX z(+o2%*s6{dUI!=M%5pl=vYV0JO&x3T5Zh=&RU$+k97))0%a7?qh%N1N*AlgRm2T54 z?1m8q>5c}NDNXLC6J0yUvC4((%&8Qa+Y`kP@M3D-k875|=lON&2lX~$D3E7G$C-2KM`8wIX|0LDM$9F85;dl2y2Z9whMk~o8@@B#q;I40lsK) SQl3o|@62n0B^kc=HU9v_p$3lt diff --git a/src/main.cpp b/src/main.cpp index a5b9dca..b771b3e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -47,83 +47,6 @@ static Stm32Scheduler* scheduler; static Can* can; static PiController dcCurController; -static void EvseRead() -{ - const int threshProxType1 = 2200; - const int threshProx = 3700; - const int thresh13A = 3200; - const int thresh20A = 2800; - const int thresh32A = 1800; - const int thresh63A = 1000; - int val = AnaIn::cablelim.Get(); - - if (timer_get_flag(TIM3, TIM_SR_CC2IF)) - { - //The relationship between duty cycle and maximum current is linear - //until 85% = 51A. Above that it becomes non-linear but that is not - //relevant for our 10kW charger. - float evselim = timer_get_ic_value(TIM3, TIM_IC2) / 10; - evselim *= 0.666666f; - Param::SetFloat(Param::evselim, evselim); - } - else - { - //If no PWM detected, set limit to 0 - Param::SetInt(Param::evselim, 0); - } - - if (Param::GetInt(Param::inputype) == INP_TYPE2 || - Param::GetInt(Param::inputype) == INP_TYPE2_3P || - Param::GetInt(Param::inputype) == INP_TYPE2_AUTO) - { - if (val > threshProx) - { - Param::SetInt(Param::proximity, 0); - Param::SetInt(Param::cablelim, 0); - } - else - { - Param::SetInt(Param::proximity, 1); - - if (val > thresh13A) - { - Param::SetInt(Param::cablelim, 13); - } - else if (val > thresh20A) - { - Param::SetInt(Param::cablelim, 20); - } - else if (val > thresh32A) - { - Param::SetInt(Param::cablelim, 32); - } - else if (val > thresh63A) - { - Param::SetInt(Param::cablelim, 63); - } - } - } - else if (Param::GetInt(Param::inputype) == INP_TYPE1) - { - if (val > threshProxType1) - { - Param::SetInt(Param::proximity, 0); - Param::SetInt(Param::cablelim, 0); - } - else - { - Param::SetInt(Param::proximity, 1); - Param::SetInt(Param::cablelim, 40); - } - } - else - { - Param::SetInt(Param::proximity, 0); - Param::SetInt(Param::cablelim, 32); - } -} - - static bool CheckStartCondition() { diff --git a/test/digio_mock.h b/test/digio_mock.h index 2a2ed02..ba7eaa8 100644 --- a/test/digio_mock.h +++ b/test/digio_mock.h @@ -31,8 +31,10 @@ class AnaIn{ ANA_IN_LIST #undef ANA_IN_ENTRY - bool Get() { return 1; } - void Set() {} + int val = 7; + + int Get() { return val; } + void Set(int param) { val = param;} }; diff --git a/test/test.c b/test/test.c index 38354da..2a04fbf 100644 --- a/test/test.c +++ b/test/test.c @@ -21,6 +21,7 @@ int main() { (TestCase){"test_disable_all", test_disable_all}, (TestCase){"test_calc_totals", test_calc_totals}, (TestCase){"test_check_timeout", test_check_timeout}, + (TestCase){"test_evse_read", test_evse_read}, // Example: //(TestCase){"Your tests name", function_name_without_brackets} //... diff --git a/test/test.out b/test/test.out index e170f4017f89fd2d673df7945e57be6019837578..f5636e0d921d6ae3415a30055b8c3c8fe63587d3 100755 GIT binary patch literal 53696 zcmeIb3wTu3xj(%3Om;E@xlAD36$SyhCgdg;1xAuOQeJehdH8YCE5}#1HZGi zOSM$MDfll@WP5nrAqgD16rU3z$xWn4lJFu4YaFtL6q4LXhkt^kaHx4?n&b?Mdg%v; zSNxh`%{-ar&?+bLt5W>7a957RIkd`=Zysrp^ha(@4EwTV+OO~2Gx_83$|DF7*l-#Y?Nj>)P%c^`F za(*9$9QozHdazs9s{BT(2YY#`ozStcCAeu(@xqq++?HTlWNYr$C5v(w73YQ8^9lu> z?4mrVOd5tA5&#~OaFS_-AkKmGt{%=xhP<_I`hk)4G9;0XMm7=iz_5%`@b zNHTj4jKDt)xEKHSW7G(Gs7}0gW~3j+f3ke90Pe-V{WuHY5<5s~w2M%j0WDBgT@k2n=xk^ThQbY<)fFpS+S?kcYd5ttNLq5r_0`u_7UTy4 zbz8UAZVGl46f8!(r8X1_gtv7x1cGgi?LIAF=PHCmD42v1dTIk5k!iUQk#GoB!{EBjfx70+fyUZkiw3l=xwaDoWZHnDNVGH97H$Mc`Wl06wJpJqH)x@7 zXI*OtP*SQ&-dY=M(^jruU%H|!P>@%oU0q(bVr8H(uh@(g=3PeabKuX3-r*E6YTfi7 zZ}mD_I;vLmEib}fKE4@U%&A>OAPyb;KSap=J0}>-ppkDj=!8Wk2i>HzK=Jdq%j4a^ zbkd?}PpI*j@i&SkzR!m5Rs4N6yzg4c-*3YYD15+%A657n8~(b&U22?Xd;BWxvEfr! z%Y3~ye4|RwvEdK;B>xf{zE!2GYQ%S|HQwZTRL~i9cY&ug;Tr-zO9G^skfY!#4c5 z!uxIbn+lKFaMp9ihQFowhio|O@pLD*XQB;{DLq~r&U%*EaJHw!hM!S-{5D*xmUe8k z;jE|GhR;y^9X5Qv!gtwl*0aZk=PLdOY&h$A!iKY+eKx#U>FKlK%M^axhO?dl8@@{M z$80$3(e6lIUoIP7uJm|p_ zdu{k!h5K!Ifx@e7IJeIZ8@@>KZ?)mvPam-1%M|}!8_xWFHr%K958H6&kJ<1F#ec?z zGr#AqME`tL@lUkjT;3%%yhibt*zgSs-)O^cPUK{?T;(x@3?^F0;8~&EU`)znk;b(04X@w8jaOR)5E76}HD1NUEXZ{i!{x`+% zx8dAAn{BwR=3^Z;oc+1ShNmh12W&X&-)F-!6n~!$XZ-^J8eS2WQ-lN7(l zhI4)8+i2=C;E-`du_O1@z1g0tlw|LD;0m04d?pmu;JB;f2$4W`g*{I-=O&S+Hm$~ zpAFxn_z&A~=8xI%pyEGc!xzUDiSNzR3ob~Ur z;oXXVj}2%2PuTFN;@@Y(`MiJJhJRM^57_XpDO}r~=%24E+-1X=zr=fz&~G4^L3;h=j%DbofiK7+mXPLihsIK#m8|A z?q(3-fCV3A!DAMDv;{w7!EvE)9(xs@283+l;}Hw)U=ZOG7Cgm*@3Y`k20r>MIOV~| zVGHhJ@IrXO0~b7S!2=gOaKQr?JaEAS{~z+e2U%19>hC`7^7k082QVG;+I47QBC1%D`u z9=q8eecRuC@=R5Ad9QKlT)3h)^{rW-wv44bfprAo1a19SM zigL0%`FF?iS0JlJ=GXYUmrn+#=8wJ;PWSgLUyVfU$UlaMWA$*}LF3!t({F;TnLo*& z+5#d)Y9NQo_WGmSW6{XTL%wrlYLD;S6~2?(KZ4Nzfd9Zisz3UIzsDEz>;3+ok|o3a z$q3OGfJP6ZcrV}y%0AK)tAZijzH|EEw|jgi1?`|oD+X=Pkrypi^CDPd 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 literal 51640 zcmeIb3wTu3xi`Kilby_jTqY3iR0g>SLP93t5)?E61}1(MZy|~Y$1gtH`38RPEt7395PLE zIz^rIgTpC)W1)YROmk?I6Zusuep9%8w8S|y%8_p#X_oXyZc7ZEIV!C}mLqqO-1Zhp z-`1;9CRS{-+&U#^4p%BU4k-^h*1i?0|9kSQR&vePNImC; zs(j5V7lA!Tch$DsUFPbrFKHc{N}*MMGNLP*XK6}TEm<3HH$Gd=36HOq#J_1fwuav5 zaus^Lb(=T)HU>IfuEmHq`+`AlXiK}_8)$84b8B8RR}mzFfh3I3PJx|+7W0CH2@@i4S`l)bKq9L z77TUNwX_2zrK;pDzCf$CV%@s3<>g*iL9w>FqI~%ZZ&AU5SgfdEA-OLFe^&GktB6tS zrvG@Wx1gn?YDM32B7E^Dx1ftzwJ8MRuz>#;2)Tdf1p-+#@?8QtVc|&uJLz;Oejayu zyc?KCS~P998jl&D;ga}X6TVCF_nGkBvb$>iCj6%gA28uhD*UtwKdf+@8t2&_k4igC z_^jp9PNxaqpwhEV_`jD){t^?uS*5E@c&Qqf*O_qUZ!+Q4ioe~2Gyhf-zCrQZwo1FW zyqsQV!mpYm`F5J{=M{e3gs0Aw{1fh!A?v^SQkh<7!Yk)We8ZO$`J-!Oy2*r}R(QJ! z|5)MMO*re>VZuLA{5wrJ>)CC>SDgeyYZSiOgtMNlCj17)zuknh zo?RxK^*mz2>y@6}CcItYhfFx@={Mm&Q~bwG_%9WH+Jv*7ArpRB@oRS_*6)i7pJ2jS zkJE&|tN3S|@G}Z8HQ}tsW5UlW{%RA>dfH9+r;2~G3D;_5d3Kuc5{2(F;a4iW&xDsL zJZi$r6@J=;bNh5`OY~=z;-6r`xu2Gp@EXNmYQmX+g9*P;@i&=p=HG6@{fd8w31|M@ zCOn|{_nL4n?{O2}qWA|)_?Hx}-JR&4pu%k?oZItk6W*ox3r#rlSDWy=6#qIC&itEA z_}3KwRuj(l?=s=vRQ!*a@COxs$b^4i;r%B3#|l4f!kCj1kHx0`TH&1ZI)@KlBGG~vv@*MyH!{Cy^z`3Fq+7{wno;oLrL z+Y|jWQSm!WIQz5EgilrcB_^EpuQTB@75@ek&ic2S@VSbAy9wv|dc=gg6#s4$&h^!A z!b=qYaTCt|95UfoDt;}J=r`tfn($SMf3^u{evb)Pm%CcE31@${oA4T?f3pc^f9^El z>lObl6VCekO!x-Hf5?Qh{-_CWQ2eJ&IMhY4r?-6lMu`1hJ{_UCaE{?Cekz=X3uwVp)(+^_g;CY<%pHsRk^ z{Dmf*^;etl?<)RvCY;avyG(e$;@@q;HFf>6*M#c|?=#_<3NKaHK^7D{Qx;wP@^v2J zI{x{(mapf`IA2#0ZZ+`t-+=^Czy%Ln@W2HR zT=2mE)&pm9F8b8deahzP(SPUFG|#raP|9$>r~5hEvqE-w;mv?Q7@m0xf}E)u@i!6W zgSX!p9v zZKWpiL;Ay;DED~!T~qokQ~EVi`Xy8P1!LOvZh7SBO`gb`p6-*Ut7|HH^+hw`ir%cJ zXHc*#2NU7pu|I>z*&RsUdo!W>Jrpb%3XO&9z6Kh(&OSVlGj%IUqdlua@cRV+!u1r) z`P>sZ?b-j{m7e`WR*&U?=ji95JSgxh1-9XV22oCyC;x6;wh*#fcy6tyd)Xv#YM#hj zp-fNDvQJwVyU$q$ zf7IhXDQE{`v<0B;IQ*=^ib7?DCsKPHYMupa^d@i}bPq|ZhRCYhdfY?jStaZ{?m-rj zSE7?36LFvG?mDN1-O0FB8Iq|1yRh@~d0d9Cenw>&vb=p8wZ;U49Z%DRMs!1lrpf$L zLZd0yP$qsYp)~yJ;q<-K83uLXk+^tt57gb&7n<<&c+#;6I=W9=03`6=823-_vPyKb z=p0BkmJD?h}y%Pv;S)qc~5a%V^Q5B;_7> zx_}a+MdIYsiv^EJMA0%XcSmp65e{0>$S!ve+&0<>+5i$|AmTpN<35Ef#*+BIL3{^> zrP#J{L@I zdc2b0=;L6FK8OoV#9yHJ*Jb=!ir+2cPf+|;8Q)FuRvCYo;u~fBK8jx>;}MEqCF8eK z{0bRwruY=Z@9GOr#b^_~RMYm2K`}hN3(q1B6V4%s+W$H{jQBEQe>W}0{y4Fd`@#Mz z$^HVd|Nc|Ko~H!J|K~XS^~63-vNuZh2Z{YQ$^Hvs z-wPWWM5D0DRK7S5c@>Q{(HpX zjpfAtmrq1dFCq39^_XWKBKAp={fCl$F0uDX_D|{&e>l$GPVAE<`)!gvkJ#^(?9UT> zIL=;1>{BFrrDUh#L^pyxy7Zi|=w6a3gN*3pqINS#%qhjjNwGhW*j$;5mn3o$B#zI9 z#55^!5^ZHU&B(XX{!a))UV+BK|+7Vrx&@1wOd z$o~p)l&YWP=Rp1`Arm(RrsTGTA$Sd+xa}OnH;ZdG#{)sZW2^q-~O&^Mc!5*jW{X=^9(2Nj` zo4cuAMneQ{c~a(kkn%nHA#83zspYAukTf?_Qkei;`B6{GWrlLQl4(E6&cZq z1Q{(OHj$N^vQmBji!!Tr%BlfbnI;Pd^*c9c8kOWJ4|G4h1hMF&P%8_I!A*;P2gzuG z$&HIC54e(w^Da68n#m6kL{q3Z{g9BVd?fn;3`P@6Y$hLpdmkn=q~KAhpqUixKa0tg zK8Trh1=as!Qa08+sXF!*O0lpMbCK9R5Hpl5(sj<**zY`54d>K*dQxW!n^8NiK2Ptq z-I$emddJf3)yE~_peOS38PE3=?I{d(n8qHA)}vTrvgE-Dy53WqC-j8$=*7s_aBhxt z4S7)SIge>KJ}a&|#AH^X2Q-V(s2FOT+t9=}(se2lj-qo6V`|~4>-R+ZG2u<2neP4p zE6sa*^^I8h?@3Kr;*Q={H8NLejO&is#I@7Yo4E}|g44&^aBmc|m`G|aO<)d2_rn*| zA#1)M;|9ly>5R`?YT2K^ZGn>zlCe>SFZgLR3yq%wbGTuLHB9e%ZUn%z#I?S z;X(IVlIrd{yX1~yYCE`^!F6tJ6b+GD-oxkx+xk#WOv7zG?z0j1>A_Lm?z0vTE&yf^ z9_(?Sj<-LwoOlkGB*|ea<J z_Hn-uoF)YelL;z=#*PtEsg49M$aYGXZ{hKGc40uoRdzNm$M0TGZqdJwdN!Ex6w#l? zaHmC|z~x-Lj^v0u9do}V-7=ydgEpv%jau zPnoGtBQx_-dh`>D!UfPr5hc|kn$%BWagY8u5H{;ahz~ww%u9a|P~6?rc6;;#>&R2# zF*rYZrt{@{7A6*hUSmPlh=Rn7+5sta2)KAjA|XfwSWCr@8M;w$OG9liRJh@h_^3dZ z@K`6;7gFU(#9xk@5#`2L+lJ7FV@I%i3d%uI|}h?cm|hLpi?64g*Rx%d^S9iSW%2EUWqmPrI2 z(DFr=!d4pZKECnf;MDG}lUkSx1A3v5MT>>`a>XZ1(;Kghp{RD@;`Z1;-VF6^}HE4&Fq+bTa-c*4?OER1XUT z6EbPV5d0GDoDGotvQ+99QK?@Zv^o$ybe% z-KR<+jYZ3Ff28(Er1H=~_bK!o4YLX-g6^&(+U=EU$^z44Qubm`MHj~9RiL*!hcd?vKQ{}^j*)E}Sfr?i*}4Ik}x zpR#nf9I*_(L|Mx$X;e}C3Orv1wc2kPeEz?oAI>*aO82R1IOR|z{9L5AFH-sB%7}aK z%1GrN)Ahtb_c1EzLHBVAdfd-p`LVm}IW0W>fcsS80r$IFPvxGT+P$9M@G01Oh#FKk zrYdj04)*S@C$-Sz?ykO!@K_Ssk^^;e$b0T%TFCVDV*cLUHwv{+L&5;Mba&SYEwrkq zvJZ=#`zX(k-;eZ1-2L5M{r21KJ#I&L^fHSZ3**$y(Ip2gqOT92uXn{|K8EtaJ>6Z$ zw9pmZU3<0AydL)+Sw|NOGpRCYSUmI;7QZp!I5_;4m0{>kDIOVW71~(R^I%T*pOeYP@b1DZ?2H#;+4tbRCI`!dLjsP=WVlG**7gKYQ))*4V6;keEJvo;`i zZ69rdBO8v<%D1v1$6&*{{}~&~lphjos5aQp0}rtu!v8Zia9s!+xGs*+vbgd?y1|Bq zuva#~|GPG6Y!C2ypK5vEp;}P2UYE1&YclzN-vhS0KRV$4n45cV_#Azh@*=(DQ^ucX~_@xVngWDD$CRf+o4vAX^eS&;vNzs;-QdyVnLn4-{-eF|cNSV0(_^gSpA03f;wg!RqE#Ed=)rR0S@T|>^C6|hCzwGsE`PwgMj<)k_c6JaMz zBz|06&P8PpSvpe&Uj%HpwnamVbe)J@F%8j;X_}*ByM<^{n^6T6K^4&WgC$?>b{C9> z?S8bZ6Vu(eP77yKF=$tTz)w&Z^N{=O;NiVfAv@Pi_QBBoEhi>HRNSaQC&>fNqP7-{ z6YZ0h?+tAsc6%Y-4j@8pkIZx;I_N`7b|OLeU=0#i-hsUjX!m_W;VD{b7>vTMeZ&sq zKc%Y<^BGM9qks7wTKN9Ytf8r{SJnQdipU2Q zk@r?c{#-Vk_qwP1S&L`MYvFe=8L?e|W7!R5HCzy%Ln@W2HRT=2mEH#|V^Q=%hlX1#Or^@W!g7q!@{%hs-Sue8q$0%)OY z861k{EUTz+f^|jNTK8I~WHfL=&zjn*s`9GU&ho02<=2$2tSzf>*0|T!#FX2KUF&QM z)H_4|V8~k^2-4fJyuRk<*>g04<_kQ~R?wua3^bOvU3OVhr@z(bZ3~AAR{KNXQn0VC zy~7_oANO|#{l2=;`GmSA*9dsg2)HY0#&u0aBjCk}__PrU!1#G3V8Z!DV9I%Ah!aeO zh!aeuh!af3h!afZh*wu2=q20mN;14METO{iMzN3|b%rX@rqNGasIJM6myLy6+nd9U zjsALw8EC%dI&Y{gKk>g(nJO9aF9buGTl z30g&tp+Jittp<9v6?nT@qrXFgd~={hE7Jl#5kWfG-Wt;A?Ps8)`eb`|EmIP%dCnq^ z7tM1n;CQiyT!rX06eFdS9fd7;V<6hFNY^)S(S)z?9yiilxU2>-D00b2esMKrKp=7| zURLRA#rxVQ9~l$$g^IT<9BR|*e64kDt)Y&#W+=P5p@CFg-KxQIbfb2GmeqvRnfMI3V%zxCV~K75ShnOb{C+vY$^AhboJX?JPQ>|P;ndivXgOBGDotS|mh^glLfvEf%81QnXl#QUFm3NVHgp77Nj0AzDnLVlWiG zrslI;Tj42Nv)a98MOhU`SC!RP)M)N?HH4x3S68{I{BcInf~AVKi5-pi~vk0w6hKKX8$g~IHeF)DW+=FoX3&X?55dJH|vj{!E86KX1WvHD9OA!9yx5LBh z5PDx69^Q=bbA&q)zHtoOO%eX`rQzY@2%kqdgmA&j!@~=p=PHCX2sa=MA?!prMaO#; zUKt)GJbVseCBi9bupi-4geh2JxdCB5 z!rKtuh42A{#}Gb=@Kb~*5W0R3d4xA3q-R9#LAVs*UW7LwJc{r(gi(YKAknbCm@e?xl)8n5&jzC4G0&%26=?vMfd>1*APC5aPl7@kFXr!IfS<(oMP9s z+SehE@OgwcAPfya9^pQO40feC_^dr3XZRkhne+T*z zUN#6E@;4zof$%nj=SVNYDWFFw#6GCQr=TC0sk3v+6ot^KN6!K0X&5EJl06B5M)u7Q^4N?omNF-@|AIVCdz&C zZ_wv~J^}slN~3&dT)qPI#h@1&>5XwZZK_`l`X(birByIEfqfP92SNX_k?!ucrtFIA z*bSc9==;@1o|M&sfqd8x`Z~~8p|8fuXkC^{3`9Q-`t9iZcP7Yhj>$VPmb?!7LkaY6 z#^{Bh-}GO@!+%Vm|2{^q27OvT+Gqm(#TdOE^w&VoHqzaKtT}=00R4H;14eqv2FU=7 z%CHAKYw#59js%{s#PT=>`ZJ(YTaEePdZ~isX}mlD`XxsCO>uf2#tm z@$U`LX){WUULU8^xcDCEBeeq>FFyx;u2FttT>d`L?P!OkM*5~WeGlk!KyNhCQ)B_C ze8)g<2fZqRE}bmO5Bh_kkCcBN+RhI^zcxX>N*F-$^pwm1=p(hk8qgg$kIXX4-x#+) z1o}A8>4B1%|7151^?M)a`JgW`(%a+mdq7_Wy3 zdLEsRKp$_U%i;_B7J$C;Z_sN%Ukdua80AyGCNd!Zg+Si}`aC1OE}s8=p!b2^Y^0}1 z29nMJw|%Uow5ASg5Ci6mIS(Nz@$G9=hOcL{pJL^FDAbL z^v^(FYNQ9__Sb+u5%YyBjP!7v9s+$a=p)t7eW1HRUucwXj?3=>eLd)}80jg$iP?7y z^jyqGIuqzEG5T518$tg;0$mQWqWqW-oCbZBkuFa|vi?CIhxyB8M*5fH_SJyiiCq=b zjr8?#dIP0&a3-!ag4!~U@t>tp(@nHJJO zH7W9OI}(05~=^v4AG z_&Fj3dJyxa?1cRFSpN5c?!){^Y|@X-1CGS<-vjz{m`A;lp#OM`ehl<&@Xxsf`k5I0 zEa}JmYoz{_hk4bHKz}$v{@XG61)#eyUrToWSqYgM(079_{I@FG@y{vc*%Q8Ib!R(! zQ{CCKzpAgyF1$OrCzB;?KHM^uNyRa;K_VR4!^6UxAvmMK`ZQ}iA4?xdx=s|bA za9r@f1rJ>Czy%Ln@W2HRT=2jJ4_xp-QV;NVTlhOI{9P9Q4ht^*#lhcSVI}$7`THqmI)5j{jPv(U=#qgBbNCAh$KM(3lmNXk zgN}9LVh-1(GO6+RZYHa=xRyp7&zFdUzi&g=J9OZZK^z}`KHNr;UCNO>H!oBXTw03b zkfLL0RvgQe!B~0~#{?CMwMrGIfa_=b9TLP+l{mz;24b{+N(V0C#39xw5GxgnnsIzU z8NzmNP~T6(C51RR|BFL+Qg_NuZOW{y6b>M|p$KbWF2vE` z=-&y94<{m}XrTXpI`}&;{M{seKRcC?d_w;;HZUK57s<${QRjvaY0P0h{_c^HkM$8d z^YM3$_&Y{U&<4~$E%PuRf47L=H(!c=zZDDRR9{qu%*Wp)GV@WL(on&C{M{k`J`mNl z_GYT6cN&wKkH0IFjE{ys=Bvl6DCpqt1W|k!{+;;G#Xs}$cY*l3CLjqO3bXOge2103 z7gb1fC;i|Ujeq9j@A~j}4Fm(q;Y5VSZ06(d_L%voJsZyj{JkFjK9A6+e*VgXKhpf2 z9)3T+kuP@A0?6OzNuaC5Zw>nRdp%rlMt%#QBmnYvdW`Lgc|SGiXUH=RpG>f2SsypHCV1`1>@;{PLcGkH1TkjPEZ7KK>p}GQQIWKK>3(GQYfU;N$Pl zB=gG$20s4oOfr3E41D~(nPmFtz7rq(otb3ktq%=+%ujQWzjg3;Xkt9q$QXZbhQBYf zdc}&%oU>~;hFe2n=aPa21%>&put>RXFDfi3Tu|VeBXO~PMPBB}@$T(uQspnyHQg?8 z|2BTweoUp+m6&$Kl#ZFEBJbl`Q0cb>QNGm6@x#|yW@bvKSZwn!cS=b~e+Y6Zsp<4? z!xUTk4HQ_?3It6bPcy|=@nf5l*9fW9R2^TZ)vWX`58I{VX!A;nP0vTlN`AKOoOmk& z>nW1>)?|w7wlv#!iOrI>5IWN-ZhZ}O`y_fhm}Y$$!WonDS}8sqKcnX7{s@6>4t~;8 zDF?@$X*Mv~e~ll_z8$g_dmrK{_8S3M?N8u0)&4aYplccQmQ2T^dE-F0Ski2dfR;{) zQ7@xlnUhAnK!MboIW_gaKz;;>eF=UvdkTatcDme7u}^>lt@cvDsp2|Uw@(C5nw{PS zkZuoA3GE&dvKQhv!@d%w8)cu0-%LAw7&pt_0-kI;y_Yq|{(V^Iuv?)y*Zv>CN84`z z=a?+oZJ3uuI}gWZ(N4{A_U}PW#P4+b9%!3kcY$Z7-407;+3$hQOYCohI@|sxe&^Vy zLFc9RHQ=0U4?^cW`(fbu_WOVr*uBs>-~JGO3+=QSz-3PZPmw(fzs2@S@GP)*LFYm{ z-NIgE-v>R5?SBGZVyDf8OYHO+;mhnFLH2Sj+cFcp=^0toFv-#fdJeT7&3Zq`nbXr` z!UjC+==fD2I9>(g@obmv-(h_&&1|!a(;GoZnXcvLAk1E5r}cr9>9*V)qApfRM{X)| z$}UmK3AtNfaP|_FbmrcTJhCrS$=SK}#C*9*7UqUX^HP;8$z4yHm#JiF?je#bRY_0o zZ%DRGC988sQ*yaVuFK7V;n^$4^&v=^z9E+ufwEWS9T3T;++j+3REgSi>6NJ2r&6T9Y{{kTitMXxN1)p}z1xy|j_mwm z&Iys;ZppPEl6_qkH4y9c9hTfM>AQY>RM2-?a%Ygf8z$187VGp~mfTN?extC}I{gt# zZYk-z$^I=NzuS^~6_wPRL4C?PeXk{V5}CU}SZ|%)XUUyU`Zn4=75bjDXx7)kkdr>~ zcMurePt0?($IM0oJ(ZqkPO}ju@4L`XHjiC}2%$eiVoV2&0Uxe|v@z4581eTI7u*?0 z3+^#mMln?6MzSXm3wWsAWH^ym?mY_2=!V(3J)Bw%#?g~9sZCiddDK|f0vV@e&=$JU zlP7tEqKs9Lz6Cz2)7+{cj+ z=DM^AX*Nn(7em~VZtX&R;#bI&l$`XBVCN)y2TRK6)FU8RER!xlLE@*BwEV& zjJ+_5Fw0*2(Cg#B@EN7Fi!5u2VM0bLIqxN4v>#Uyr&@kSWto`q2jYD%PQXbe&YGjIHp;?0qfEoI#u#wbt>gkE-_eYA?ExcV(Fu^C~m!X zSC^L82ep2rL|vt77t^U?juK}z8%X>cV48lG^2nG+gIdbH&DsphVxVcxwCm9Vd1;EJ z`$&rB_%rFLjkJqx!c+IQ&7ybK(_GGCv0Goji$cYbN2f7Dg&`BQbdsE5c^y@imY#M$ zh`e;h`8cULRobAR&M;}Y_FsW1<=!Tt|3=`Xf0NShd;#T5o2+=6HIW@LiR{K}>7;0e z1n6YB6v}fRniz{DTk^=S5yl}&8A*#otc%U-Jkyz_R- z$Gc7ireHDpfNxT&!8=snj}AQ`Q2Nyg{4u5L8+xWc~AWX({Kp zfpWU^G(hVZQ53IYV8%XTxa4ZM+L|R8oQi=Nogi6m#_ZJj3$R*q97jc2o3**rGrtM~ zPf6cY9bzj<{3{6aenO>#ODyn>HkZ2jlYn_j%W?z6|LgPl9|Zp?z}!E7uJo6}sg_UA zG@BG;L4l1FWEWVj%w&ELmu35zd*JxfE5>+SeRkzc}1>=sZOIOQ;@?nBU|~H zT+3)nY1%iJ3;$ePU|Fq@f04*^-QXD#pJ5b-feG?6ky)%b#6630C$pO~DS1gjtPV{% z&yG_PG|nlA!e_SYwtU>=o#OdtdDN1-8)Mu#jIsTioZPIM@%_EYM% zmcM3a;n#w=MrpcTgy;S0n!|WnZGJe|F<&L-Z!THnU9=#-8P5i8&TniD&)*mb;SoW4 z-nF1$esf@BTf4tC(AvoYQX2UD#=5%mrI#e~{moqFhwyY^Fu@#b)<(_+O=NU^pfS+q zZE35!MW)rGkVvFRHm`UV7o6f|7(eI9X?{>sr3>mvr^pc+Fxmt|^|(&Y$A4=A5RM}) zTf7bJAYv45_jUMMf-(-tdVd4r@OLoO5ym6EtI8|f05G=1V?xB+-f=Ssu$c0rXNNHa z2e;tHWk*MIKok|WXnG;8ta<#i+AVsfZN5GhYYx_so`oQ#ThFFoo$jFEWj&9AtMtn$ zn6EFDv@0Y{2rSi8DP_Ax&$wB)*sjyBxI)jcHR_p92)&k&eo?nRb)7!#WqtfoJ>51< z&uP*f>-5nt>*KD{m(AC&Sf`i1tmm+vwYp_zs@2-DR4;l$U;dz8xlF%^GHB2jAV_V{ zD-onM;3r-D+Cn;>;ZDs+yUwML>((c()8`^-xk{fx!Grol3dnA2+Ew^XmF#K6KB-%u z{DeN`3H*vfw>)vBKK-zM#Xi00LH)V{z2QN9%zAy|TZa$pV}4C~(!Pw}ly#(sRO%E< zC(K5%v~~CpR7z@Q+ERTCh0BCxnQz^#&w4_i(XAIhsApcGkN>(p6;w-uKAwU@__3x5 zl`+#&Q>~Q+`uJ{r!V~($C-5uHvpz`zX&xQr-5Xo>!q;yG5Q2x`Qmpdy9cbiSv~!b=woVqvFr{cmqLj#(@UGnVM#8SgJdI z`PN%{)}Qo=>vij4q4-f!{5y$GiJ^ytOsSsrr0#g=Eq&~tI9p}MSVMNgHDe!&bC6-F z>H0$JbxZZdkLsDrPa;d}DBGj@C>v`0x|DGk5K~jo6znNHZ?cZF=o9zp7ll$%;zXW= zS;t%Sar^X1AuM^tBzb0LonX-??9-=6A{M9Ud19}(t)ami(!AwYdprETdT)EEL-S(X z!gI92;-ZFj`N(z9@KAJ}c(4}o@@en*Gt}N-Q(H%9W4J*pud4P|mQ~@61>(VF^+o`Z z3CP}!z92m{Oi$^Gr}`0>PwslxyB3L&u`a&Npi_*ML9HX)>J5eic+fho-CJCZ2ZiZ5 z->QYxG~6wzE?ZMp>8+}*bjv4+T?oXZ!s2=5T7GU`^EL#U{jF`W2g_sS_qWz-Qb|SG z+8Xs}cXL~7qm!0MOKLFIuORciq&0|#-TA?PnIGIns;HEt$y*oh@Yc08hg&3GhexmL zIzyUxN`FPT15e4r_lCh0PuJtQ>Kgg9z2W)pP*VVz$p@*$BhBQ5n(M0FF5wP}6`?Ze zOi)~e`ZRk{YYn$}>tJ{gmUsB^cz)1JgSi$A-0BCvd}e+JPu5fEG(Aes)7k=}uuUaUox)>`0?#|fL>7;#A2P##xJ3RA^ z%i2~SJq=Gy$(f*IMYA7IMaMN^@d27hL(tdhmyJp^0$F(Rpf}noG{)Zzp>1r#WBuM{ zoT2%(1=Oy{F{(!4Me%$*3XAt0XrU%JtDXEJpI_(4>4krdn`y`{k^3S%yxrR9cUP_T z8e5}x{gPMV(whm0(tkuncor$xB8bg`dj@SfjT68 z9d%91FuTiNw7{9)Sii~F(U4z+m@~h@7u?cX*VNJ0+7=Gxhg&xVTI=&e^l}6|QQv@h zRNXE4co{;-Ul(fY$j1zaIxG|FU}O`M@h$`q>KY7bawpn9z2ro-JL>A9X$I>3-g;li zr{R?w;h?`>z1jey3XNE3E7WyiKH6ocFem0!@v;JbuY!8TL+tGpD=@s(h!=IldoPV; zvC#`Xie7Wj5N^fG68Ieu-t|R=vR@~@1f-MR2!XeDKu8RAUNl!Z3e*>iLWx0s(E>CL znL&BgHDwj$D@75-pf3jGSWlvX3(e}50KMu1O<9X|Luwp`cT5mdJ4T&$U;RQjkzbk; zds&5Wq3GSDGXA<1^@av?G4h;z8N~diwif^Vo6+}!^HGyGqb7s%L%z*{`7~zE4~AOk zzqlwL9%%NdR;o4o(T=Ifq4jS>BM7(4aUeEIEEJ;#jT3xoF?3ptL-fiB)FuT*G}w29 zXzT@d36Beg&RVVBA(7CoQU2;R?wXqGysK)fR@9VVUFG$v;Wx3GP*6JK#hs!~gH+Kx zniqM?YHP06VsGh@?*idP$))o!@5Yg$ZL)Fv$~flW_(L(Q)4_3`Kai}{6947p%YvBP zCL70Ham>N-MKP??!Ev@RnSNfrTr*eZNjw~{jbjdu&o=1iINO*^Kd)D|T^iTV@s2p= z;CMwW&rS!&*~Vo0dA+iKPFz37UyNf8jt63Sb~-rDHYU^0iEJlqm`p#fblPXe?dN!A9CL8I+@PQ1Y-2M0yb}8OjJSS|KN-gy9Jj{u>~wIPZA_-0 z*FQ(ab=f$c9mgCT|IZlK>EJlqm`pz}pWdgI{)mU;{}RU>9M=u{InFjF)6c7~^>JM` zjyJ|J2gkn_!#W)tXB(60=XKGUF}Y1Pj?a!`4vyax!#W)tXB(60=PQV#v3|M9#_?lu z%)#+DVpykxN-=VMr>gX3&tGW|UEeJ>`r$;RH8(Jzv6#b6ZJL+^Vfhil=I~CB^mF^B2Zk ztXS{j=PnZQbgd9;W9Gw(4YI9RA~PRWY@|-M566m~)dNZSN5!7MFzT|>(YeQXD&^RSS`t<*yYxo%wl}M0_+}ykkU|e~i|w_DdP5R_t6pzRrj+ z|Jc~`Ge)Wvci{QCnM8cN)_0o`VLcPHWY2S0@stif|6-J~($hIxjR@ep(zX6vrhO16HZCOcbV|Tz%5$bZx*EKScQK}l6q_bPI?ARdbSAu^V`Et;K}TN zNa^7b@k*rWpxbVwpU+f<0>yiJ6wYVJO$vWS;e2NPvBIMWsa(8`AXVWXDSnT+0c(C4Xg4W*sd9{XrwC}I7{~6~s2B}FGW|aWKkihXHy-xkrdLXm@qE9~fBrc3YoTZCdE?=$3g_n!*_`); zp7Y1ORGj~E(VpK`^+n~RV;pdd=I0%kD*n?Z{xZSu&=wU-5$ex$gcScN6Mv85|JHoT zcdZPxM}c3AdgoaL-Jqr8Nu|g0Rhi~~_dBKM{d|e5K>Jkb;n@don$3Wq1O4cbvPVk6 z2f#;z@=K)vj~t1kSmBEo$@C8tJ_`NPndE#ydu(&bb7}xUQXE$ae3G_H<;$1R>w#aa zc#J_OaIz;$8M0Inw<^3t**Qbu-%&VUNe2}EZwh}$>7j9rj{i{jvuc18@5%xG1n_Cd znV*M6vlPc+;JGQ2G}~4MsNiL#=W#W_&^`q^&JaJ^)k;%+9e!jv!q41>&|Bf2pRJYgK1g@A2!99w9|3V3ND%#f-UgMI$c!mEMIN3jF zYPZiSyuws2+P<8tWR1bM(V@tGp6&8@l9CBL<@|Y64(5NvU#{v)yyFTACn|iF8V`A# zzZf|6mtU93TzTeEtoVhuh54 zwDB50KhEc!Qh|@w_<3-L(q99d>bKNXkDUttz+`8y!vA8z9|lhK~FqdY2a2!&jkqEB+(E$$q{Xeu?ohi_EW0b$t;D_mVXE8y;{{fOD$9Ue5FhCMLMn# zxQrWrZy5o0JyA)otTmo+>{1Ju!T-A#jp0uASyjhJ)|DyO`Q+T23r_Bnt zV4xQDuJCyZp9-A(9984PGKDV&PJS@As})MmMXG_QVrcbB55Jdz+s~bXUnw;N-%xt0 z6eG8j#}q!`mdt)7a{xH?$9GKi{yX4wKH~Q_aQ}T*=~<@y!{c_^DCvi9s`KL|O8+c{ zZ&CJ?D!d#x<@=E--|H0rfEs{#TxwMOQ4{}dz^Q#sF!kRZihrqToOu*@vU+(AIMpMs znBJ-EJOSLP;>KV|@mH^sC{9D-uw}|}o#~Nji^8V@$L!?1;|kzpzh<(34RGgq+<3p; z2zs`T!2hpGKfiZ_>+unx$Dy58<4Lv3>luX)sCkzvp7uO&s;{?AN-NfP#9m#s?%^I$=`?@o&FAQ2=}>h1DbAhd+Xc0jm>Qvea+r_+!qXb z>BZ`GZ7uE1{*b@Eprmk-D>)N(2ebyfzK#yx7Tm@Ub!^cZu(<%Y0>dpWTOeXc;a*!H zl)y^2=wOm}eTBo=rry+t7~uP zeP0xf-IT6a>yMZ!BMNyFc+xctGqh=#abQ$VhRQ8n^v|zD9q6 zw7SBzNT4hI!Mct>JJlU|Z=u|Mhdpk{9dAm9m)jAB&;mqZD;9}lusZgt^y>drN7k)Z zlt7#k5C@SKOC9YAG?ASk#9=6_b`^WQoj$R3!W+U%^5uRzRomFVSLF4zi?{M4SMMt9 zMR9xGRV#5v(CfwRZ?D^ezdeHDx3tzNfsNNMTnit^n3rS2#>m>_ZW6Cw-lOL&7$uNfg|8ok%z~&bG#u=IpiLvRnbJ!)_0QWU;q}&S z_R$zXjozQ=OWFA9e6-C$?f59BG9@;0xt9aH&7n4I9$3FPC>vRI9U9TC0BY98+9+zf zKG^2Pt@iq6e_X4p7&|pqb+om}%^PkA5;4(jt|IcAsI~I?&2Fus-5dN;2R070dwroc zYWc~xV#I7;BJPi`!d@m*2~Zw12eF%KRRyXaR{DZLe@DpM;0rXL=M$Bi$-Kp=AG)9J zzFCw@>;PI4ySbgD1uklD!ysNyl$vX*T!mB&ljwdtC*^)Dtl()U|KXTKp~8*iww$8SATJUS8o6n*bI!sEUXYRE1QTKDV$~eQd#< z%jkB3pQ}k=95hBs)(d<_;U{ymi5_ILC|n677Al z+RG&B7#-78$Ln27Izn~cMt=zVN%3j|%ycn*6U9{f4p9x~7eVM3Jy4jGL5tZHXd=pL8Q9?WaY65k)5Wm@vD~d#A@cGHK#n4+`Q;A6? zPwLUzX-Z#1JK<1)F%Qx-U6>ymF?bIevXpG1qOrR%&}y!#nrlq$10szrn9xcQnzGR} zpgr8-_jU$4Lim_e!U;#%nA}2)wuZrq=LxQ&3Ve}irN4o`p+qMQoTzZVk|!$V9fS?SrMwZA~sLzq#oAXiiM%zmKJP2L>TIjVH3wNoAY!wKs>f z0-D`w1&9_jwy8+aU#As>{F{*!l~~ZxCgyMj{w8&G)l?5{oRT`^WtNoSI7v~aP#_HS zwFID9>Ox1?3UIyGLc6RB>irwTjS!*#$H^iMk+<&5bNAlo(5geNDQ1d!~Vi$LYvBVgY=lv5LI+;<0ScXeD=dESq~p)-;FJo#%u{|N7dX31f;m*qKpA8a`WdEQ^NSIIM<)D~~QjDH3K`JeOWeMo&u{tyeQ&}m9%K$u+2 z^1NSZdy8UJ{-gd&2j|P>`XMl5{=Bbgdz)a_+GP;?WqA(AK-eg+ZB?vF@DL4-hQn!y zQ*lVGNNGmY-|F$yPczq}M8OTvFuk8I}JABZ#<} zmtN6g#zi;aqjN%PEoG^s@9+Zh{14dD^Jf%%85)uw|BXWbf uSwX|#)%fRj%jX{&9=PoZLG{!AQyH> 5; } + +bool timer_get_flag(uint32_t timer_peripheral, uint32_t flag){ + return Param::Get(Param::test_timer_flag); +} +float timer_get_ic_value(uint32_t timer_peripheral, enum tim_ic_id ic_id){ + return Param::GetFloat(Param::test_timer_icvalue); +} diff --git a/test/timer_mock.h b/test/timer_mock.h index 34a842a..d3572b3 100644 --- a/test/timer_mock.h +++ b/test/timer_mock.h @@ -1,3 +1,22 @@ #include #include "../libopeninv/include/params.h" +#ifndef TEST_TMOCK_H +#define TEST_TMOCK_H + +#define TIM_SR_CC2IF (1 << 2) +#define PERIPH_BASE (0x40000000U) +#define PERIPH_BASE_APB1 (PERIPH_BASE + 0x00000) +#define TIM3_BASE (PERIPH_BASE_APB1 + 0x0400) +#define TIM3 TIM3_BASE + +enum tim_ic_id { + TIM_IC1, + TIM_IC2, + TIM_IC3, + TIM_IC4, +}; + uint32_t rtc_get_counter_val(); +bool timer_get_flag(uint32_t timer_peripheral, uint32_t flag); +float timer_get_ic_value(uint32_t timer_peripheral, enum tim_ic_id ic_id); +#endif