From 234fa38502e9bef46673c0d0b046a64be63de306 Mon Sep 17 00:00:00 2001 From: MiloradCvjetkovic Date: Mon, 13 Jul 2026 08:23:07 +0200 Subject: [PATCH 1/4] Update metadata files --- .../algorithm/SDS Recordings/ML_In.0.mp4 | Bin 26882 -> 26887 bytes .../algorithm/SDS Recordings/ML_In.sds.yml | 6 ++-- .../algorithm/SDS Recordings/ML_Out.sds.yml | 6 ++-- .../datatest/SDS Recordings/Test_In.sds.yml | 26 +++++++-------- .../datatest/SDS Recordings/Test_Out.sds.yml | 10 +++--- .../algorithm/SDS Recordings/ML_In.sds.yml | 6 ++-- .../algorithm/SDS Recordings/ML_Out.sds.yml | 6 ++-- .../datatest/SDS Recordings/Test_In.sds.yml | 26 +++++++-------- .../datatest/SDS Recordings/Test_Out.sds.yml | 10 +++--- .../algorithm/SDS Recordings/ML_In.0.wav | Bin 0 -> 340780 bytes .../algorithm/SDS Recordings/ML_In.sds.yml | 12 ++++--- .../algorithm/SDS Recordings/ML_Out.sds.yml | 16 +++++----- .../datatest/SDS Recordings/Test_In.sds.yml | 26 +++++++-------- .../datatest/SDS Recordings/Test_Out.sds.yml | 10 +++--- .../algorithm/SDS Recordings/ML_In.sds.yml | 30 +++++++++--------- .../algorithm/SDS Recordings/ML_Out.sds.yml | 20 ++++++------ .../datatest/SDS Recordings/Test_In.sds.yml | 26 +++++++-------- .../datatest/SDS Recordings/Test_Out.sds.yml | 10 +++--- 18 files changed, 122 insertions(+), 124 deletions(-) create mode 100644 ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.0.wav diff --git a/Alif/AppKit-E7_USB/algorithm/SDS Recordings/ML_In.0.mp4 b/Alif/AppKit-E7_USB/algorithm/SDS Recordings/ML_In.0.mp4 index 2ce23d1f483e88813cf39caa622c917863421b27..59e12f199f76bf6e05acebc6cb9130d121ae1238 100644 GIT binary patch delta 26233 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�jrw*{{H5?Cd3+8f;av!iy7_w!{5b+`-I%>}AOF`kb4S`gN!E<- zt>tr8^dmg(0~i#4>et}VeO7HC?dvjYbu0LJ$<;(mE})}4g410D>gvn7yQRq9x+Jbd z;taEHGhs;fAl@r@z@0GY7_!-ZpyGJYaWWj}3fua_o9tv<2u3akyJwTCPKGlli;+#` zUam%Ik}O-;}htsXGqU$9-Yok$QQO9;BVtuBv2cFvsO4x zXB;Tjn89$NF|Fuy(q||9q6@y#9=GVm4s;&g+ZMKDKR$8%o7oLb7N37%Rcat?Z{M>T zFST#H^LhRGi}iXBeE4wOIdS)!@V)&WCrP~8mvE?-E2&FWou`WqAvlyYago_o_ZcEcOD zbG=5zFW}`v^m-x6`YaruffGIeng)ZMdy75B+4$fiu(2apkCt>CSZ)g2deFvt!qEX> z@;Z2W3>;WZYJIt8-=#4D~MC9W*;NPH`<;uk#Z zV^1y<ce$+qtnv6cUcuiO~MHbh0*z_m-+nmWPL#&&kvnu8nBv}euYtA*!X za)Q6g%2Lgq==%1W;uZBL+sb~VlGH7|)~dzQ9lwjgg*_#CUI$t4RGpdwf`7*~{=pB{ zftbMgzicQwkSLoM{Ni%D%cZa>6{l;%qSUHwMvCkK_O7J=H1{ihzlXWHD=2PMVAXNt z*T#6wQT`r5*4-P_rv}50zU}SWX^vDmr~_idy;95SYkVYGhX3-(w-S%h1~B(vR)$oz zOO*1jbfQ>&;vJMK+wo970Cw$KwDPYu7UDWH3r~sE&s&ZjETuP1cWw?`om5~$e2-Fr z^%i!B`0^*0a5!@^fjrK-oe0c3oVf|-%Fgte_<2i^-5HS8NZ}Xb!3U5}(hi6_uIevv>9qx|ba7iyV;&UqdfnK|?2i|3_fP z0y_SysOSQ+<3n&HIT!9mcb|eGp|isr**EM3CVIL)$o0rt;XY@e(k=0emhk5o_JNkT zRkWcqz)&N+p?1L)b|kIEX0d&d7jZA&YvDbqqp&N!Qd>=hI=JYecvo#)>nHf~i)i4* zVE%J(`-RLdA2_$P^d`OWX>ffXjcXM^)|Ifb3QoBh&R3(n zUU{jr3t{)KrE)3RWwtB-2Wwa1ud8v`74Y+CEj$DJ=IikahQJy|w?8?xo)NF{+}E_? zEzHW%IAa_1Eh3t%>Ee$&o>b^~Xy{Jua&{+LAiCb{!A zJ9X#4!kzG&&CtW-mCVlEaaJQ$-;Q>q3PJKTeo1X>HE?!fv|QK~NL{=d>DR#~rc=BTXLI&P~oVQK6vu)1dX zSMT}_mi$xNUTb^0UeCMMgE?hfvu2T@X`AwI@a6;f{vI5B3(o)PiEm;4M_LUZ{oSvR zw6sW%pM|N5yl)flK7?-B3gy|?2E-^;)Mgdk&Kw*J|5~G6*V797($$8N z;G3ad$K!QpnyVAF(Tp74fqt5Z=LZWcd;nHnM+%6QCr`~pJKtjk4*#oQ+gxWA;&1-3 z|C5_|v6V@d&UmzMWglsKdgKPUWb(75Lg!``zmh)VwUH{;hk%ZKe5^d-!b0n|ljV(m|l` z6!xQ32Iy1BR=1!5=W4$_?Wlw2V@)QfX|r*%kc~9T`jJd%(L=iS9y_DVe1E z*#CXXn}*?l*(0vZL*9;-nko~CYDp#d_|(KZGy8ql8u?ZJUZXdO7H(Gf(WL5kcF(sn zlRJ?D6F++x96ZCw>*AiNHMgShz*){x&z9Tj2Qo*8w(3+awiK$_{tRH zolB?e&$82z&f6R=oD3(<#LtiNIfit6K0N5na?zc>+LS%?NW8r{d9jQ0scdl(tIv6! zIExgSEPxki=W2Ydox9rmzXPo{`JGasql<56yYtk7f*b%}PsIb{K{OH#90Btl!~gCf zhqv?Q`Y6ajbkTGC>Z+yA`gl1h<8=7i6*l+OVoyEm>K)x+>TQnXAb1+*9HqV3Xh)J* zBGn`Z;dt#&^qJ%hgY>;G`_RqqYDtH0Px?=`!oHsAV?Ofjc5@USyb!;QPw+f*^)?tv z_S@|Aq)NiUAhCtDxzyj(hiybA-izLHEXnvd_!z(Sc=_g9{E(BM{aA2tx?ktRw~nki z*MarEU_1HM2hm4I;xCJ6o(pJE)9{`6EF=qk;)~-Y@egb3J~(cC*Y;qcE#um;DlT-# zn=tctKDhD7Yl-W|zhF4q=cTykJ~Y1g{I0Q=wyp1n;f1MXw2md`9}@XGeztBCfeorNbjw6#kPCD&Q z|LbDkqOBc^PNm*{x2NfKbMEHStv=WIeY$;)y-WL*PPM1ewA8rN(3vy*I@Z|({B2Y^ z!6(PzrQJ)rmi8&tbyO?;yl&aL1?%RnduiRmb-%9Lrc}?phnMzs#}=iHCETf2+R^WW zOZENUytK7_lwG{((9%hz(@IB_>NxYqy1&+~UAJCoC;KbS_2~xE^}tdu5_ZQ@Yj@Tz z?OfWnw5i>hB-QY+$N1s&%rp+c(9o`h=!T*~yMrO()ph zXbN*T5mAxMqRA_;7s>Sq67kuz*sThW`b3K)8um{-xHdYl2b|i;Gpo(ar!e*@*gOwz zCEL+w<}NdrNcXpBu(NRHXr{^QA1|%Bu72$9C;51dA@!yP$&>C(uB#Eg_bhl={Nmc; zO2^yJZH_l3BW^vbb_847N%&bf?K-?^enCT1{cjA8J051mDlE1EOpn%^uJ^X zo#Fm33(IG965UTViFw1X#bn*zydjpGWq!Q_J12Yh3$6x3H!A<@ zj+NfOjGUT$qwkQPmy=EZE^SNB-o$&?V<%ef?r%Z$+R~P6vdxU9C(6+oZ%J+SmUO<; z@X15T(3_DeeDD(R;X&w0a4umC6?<@aD(~Euo0=B{93!jV)LEr{3EdDF;AZhM%q3cc9 zAREKGz35j5dE!FaRxCMJ(Hwiw0XK!s?K`-rN_w9Cjn74UHf4|P50XFee6Bw`! zD^T6SdfLX7ha7{v^J0AQ1Y_COl?L?29);cZ;iAwzV>9M^YN)vnHUTP2jXI#@v*b;u-$l*)Tc!S zs=q<0=h3(3!GvdMiZ6rxH{sOy(rtFl&nY<10e0cf!=r|jhRe}A9ao!$lidL~TNV81 zM1Nb_XK#;JbYbmG{@#0WjG=hh;L-qmV^G24`e^Y=zX!OdSE;A}$HC48xW%f{R`k!h zbh!=aqSbj3yz4zLz_eiIZpPFM<=9n!E6|AFOI6`{U0UE?g~h3sUp45x8`(8H0xv#; zg{qyo=!|EdOBQW}@-)Z6lMOPwXBPQ*ED7`gi=*UnB+IKmxr1KHox4eGt~B zV#w?Cf@+1;d0T(~qYut6sM;hro7$eq_nB%sztR)maqbx_Gsj(v+2I~0mELCdv(I{~ z@BOqp*;|v5`*o7~9MtjF!d@M%|988Q|HAhzXp-Cd8wqFQio`j8Li2w>YpLY;eR)Ux z@=V&m8R%~+iiT=zt_NlPT%V0RF+8aUegRm$5#(hLq!(E<@#hbbtdf!XWjtaM?Ikhj zm(ebwYb6#nn&eHM3w>!zhCKjeHf42ckG}MT0m-;Ek#2LT-z`CGG8A;C%Z-5xbIEMe zzvdZ_Z0(-MVfJ+VZmN-m8xEw)4TZ~3>*pxHt|Ijx4PR4r`4F>o8C<`c z#XGTcx0{#dT0DYAum}DZEIy08KghnwR5Sg~|8dsm{hCYOPaUZzind=Z=Cb z@qe?>=ZPpya_>E9ody@QCb_;Jb!EO|9=iRWIT>m0u0Ty%d-r9&CpYJV#+``KkIZ3e z5sjsN_OVVQ{h!SGp;33ENAa7>N+uRJS!fcee!H>0O;T7@=oho}Vx$p_K(|ucdal2T ztR7fA-Oaq_={}wsLysBgNFKcl=stC&fos)OTVt31NGFCs^MV5R1pgZQ|o z!c%g+yyX8yW@ReudBFD%z-OWu|E5DFyY~vKmI&V5yPPhT3>yDh&41nTlWQM<>7POS zN}uGL`V@a%hU5NKz-%4+cSo~$?&tr5@t@1_&1-SP;rL*0obo1~I=AC`gYmfJL>%gB zSDr7Akzt=Lyj$k+l$qn(qd4h#cvuH_^z+1{Vl$p6Neo+#kKg||&_GW8{N%&Wa&f0$O*|J2{DYqw-O zn&lQgH47io>VSqb*XuECs^!hUC*F}*I||0qtMT5 zgU55Ma}W1)(Eb(fzQ~*Eh=EMBVlp|bW~Ke5yeY05&bxgP)wq;?ncB@CvjQaAaT)lW ziTXak+VBLaHg!K=!b6_JGm_~gQIs#c<1YHmt*j0Y;SSHbD>a_eR`zCA;tbixnTPJr z_FViYzbyF5Zs0TV$N$o4e_+>{iPFF7-9I>%;U=%U|2Z6IGR}1)E^-rVMlWv~fg3zt zSUTg~^B6w$px({mpD=~IISL0GLOVT^RC*B^v|r(oGEYyJ_`Kx)c(n}CPI7Sf*YZtT z9Pdc1TgVU+p%~`%Zu4Yf5I)lWVQau?7U+n;bkux&nx=qA#=Y!c@ghgyknj@}55YiDRvYx0UJdYt7Uz5%N9J_|L6U{n-AIJShC0@&4wbir()*a@+%@yAWl194^gATi(VoZUp7oQ$L!9)(FmY zfpH^ou;j$(g9pUpEMC!<_Hr0JSsVA$7<5pZ{_NGm&z+sV8G-82NJii!u3C4{u>~DH2fH##m@S4I-I!?UOofQXMyxo z9Q?vcE&&m#bNs4yg5NKCGTwHt7C4nkF7cm^hk12Sy$yIT6|K+p&PTw>H1DhiGfuIp zseE-29vJ_oKMJeXdcG%j&+g#+WEAou@=6oDwPwX~qnrXumur13C`&f_)apB!9Tk)qmR2isQSIaTa|*37IT(gp;ag}t$-;U$_(=}o=$XlU6z|q}W(@*;LqJKO z>P_4)c^tp=|A)Bav*>d&GGBszCpSoP-%P}9pCaRQMUVH?`^{kPPK9)ps=b4~EmGM# zATU)+UL#c|5B7NSXQjW|LwI*$KBsAYYT<`6U4Leh%Eo9l^@LJSV}iHL_VoKC#jo)0 zb-4C&@Ee_O9ZsCuDDibmUgJbLts|js?r$p4Zw!4`gFnAD^p*!~N=sRiw@X zX|cU{gbu@}Z^ON#hwj98AZ?~Xed3;WqZ{u*lPtSGHkuRJZ`#-~-PyT+wUd9y7mb;aUwtl;mm#9k^10W`R}y!#9{0|o9N}w zWQ;#}5$&&kXKU?Paz;b8*6MaUmy?kbGnbm*8#uRvo!Lfuwka>8|MVvorTOOTGjp?X zkze^sbN4)1Xf8T(8@~LQIUQ}*7rHkUTEEriABEf#&%LkB%s+JIjqSH4XJE4XziQ^I zctcGZ_EK%9D$gz8Wh@CH6;VEN*CH$UC|VSm?J9QmO3CgrkT=bhH$C-)ci)7M-+_dz@?^J{H_y8_^$W;T-eW}Z~Uz1$tIeJ($Co0mYIpfHGX2; zznO=4ZM|x~?xRb@W^kQ%4KniB5R%2|M!iU_ic|%=%J)>wO-7w$jZD_eZn^Fq7&UD;w1i*zoW zI2&}ISnPEi;{A=;lj2=)rruNsufLhwufb9Dzzv)UR&G+|D^Qs#OQ}zmnyrtTqX*1s zs-vEP1Ez9m7qgn()MWDSWW8I_Nn3%i#FSrD%=o1!TBu=iGVFi{?26+5TdqQy$ga-b zh19SeuKovZkvO<`8UN#Yxg7bWDyz(IczQBCWMBVBoF=tQ-XISp>(XDi$wz*FNe=kW z^GoPCv5Te-=?A2tNP)kWx5k0aw({}xO|0+tb#UT!XS(1m=Xo|>nb`pzq!%M$$|Ep#jNU$2;Ab*AHp4MeV?EXWPAz1K zWRO17+BVdSWd2IV&r~%{mi1joV0HBGMDuo>dlK>4#F1R^2jYgQlNx#RcQ%_9xa~jq zZFc!1i6$FLq>yTOYGjlA{>Hk!WIbOZExd%Ir>^=aa=>FGzCC-0y55P#&n=@cOrdVVm%Kc zS*|8aCz2rk<$GJ1)@HVyIjKV)OYGa9M*6LGl4HBNxr`5WGnDWgFqd3{$*B}Shg37~ z2$%Y3_axHXF0_^nND+zjiWc6$bMcQ!h0=ClsHs&>b-(Q2omEH_{~vzu1gkd}H1JM1 z`yz^&%%kD<(+iqC0VFL(sdgf1raHqyu$n5f_o9HWqGZYLyf5ChAC6odpZe7CBj{RX zFJx0YAiuFQRoL%biDLY%oprd`Rw%{>vJ`!f$Ayc%407++>TUWr1XMl?epAEbFLeGX z^kf*=?(6E5V(%$Co}Xwh*{$LeA6wQIsAzJ||L1LqN~_0vsVJMw&ZX`)LO`$TT}%b0$^XOq|WBRxtz zm|OIICf=A#PO%<6ftw_2eiyKx93%%@yI2B~N#H>1RKkghfz~9ss{t{iA0s0>Vlkr1(lkd`UFjX!zJV_3JelXCHphVGU0C3@L%C}@Vqrf39XQzksQ_Lbt&UE; z4vg<=R#J82B-i&x^OMIinJQC$}GbDUo-ag%nQZi4O+$)#-}QHNqa48lGI>&d756dHL2oQhXK5489m z)NhUzj>H%^ssSEfv(C}Y`k}dfJw4yE%fP~K;BlE>sUa@7Lxz_bNqIRJEr@@J8&K-`(E40 zVztuMcj3c3urYDdiO-mVqdcG&L*UHAw8iA?9Y;P%)aO-bQ8LFS+iLQBS611Il_xv? zBRw(FeUXwbc3*Un-sb5^(EYr&XM^maMxHtt7n|F&aJ^*GJso{XCYa3G)1$)-!z+?EExuEmft1v}Kg1d*Dj=D$b^;YUJ1TRQ#`f|Kc%K1Q zp8>t2LH>ArJG%zSR=OCpzW}-)L6uV#<3^u*-1idQZk}tQsBfdjPodWL`HV*C$7v(c z!IRyQyj8IzJjMFbmWAe0dTDpu`M$r{qLsJ#uhae zFX+d@)5u=V&h~On!f{%&R>c41DgFKs&41aq^!g!QJn??%&f1eI=TGb9J0z6Rbk$q! zLY{7)GWmXX=Lxtmf4+V2wD<q(4 z@a7mR6MkFIDxC@H+rXg6TB#}D!DK7CCg-z5fUC~6&9co9BZm(ww2jX2?{e?zq?PgReAOqg9BuLit;~iG)o_{yG^*74tbreW2k$B1DpY|3{au)4w51b_x1i~}wy57njX>x6!tHnmzjfcR&p8Q|oM_U(X z+!`-T4#@3D%Uj`n@s2IyB0u0Pf7wO(fF!s8-~AZx`Jv#MiOK$|pf>}o({Oz9U1ws` z{+2!;YtPfLX^@pV7v+rvurJy9T&vrXoR&(rr=o$Ux^^nLERy!gpy4p9xC4ybg)CAX z{?&8rQt>xhyc9?H+>y#VtNe=Z?8~s~F4!~-)MlTvFaNLDJ5zt=QSiJF*Qt&|?_A*V zdIfas0E18Vwq%39#k!`ZKsWGqtn;z^g=U`t4zC7XeF}?mN3`QyeNGMO!GEUlzKMU{TLLl ziUETDm;H)V3jK-(7)d^PPm>+)3%sK&H_oPo?cghS%>xrpfbIqE|IVE&JpH35ldUwK zUhyMYfJ1zWTSO23#XCy!z@0+3+n((t)`ZIaub15M4t^7_o>VV=+cRG{K6S?oTqV!O zcjYzMm3NLewgoWkFZPAx{P`a(aBGmg8I0V77g-{q0;`+Aj{^&QJsQTPYUs8kte^Eg zHR?8JZK=)vk{tHQ>9Zp|36|7^S>NMJPv8~3!TxC9CZQ9P3Vr=D5RvM)sixQ3`lsgY z_Gr>NxQ?- zVGpgRZowY7*CwRu8sK|-5T5onBAKitS*8B^eAM?Pl2vm0ehXicMQtM9aywoSAC$}e ze}$d?J}{=I-&dpWSJ?%>oSu=Ioo#6&9dMg=_{k;y?**qO;1Q!x_E9X|1L+yL(yh=? zCXvfNXS+V#XwGmnrU7iPH_3|lJvs01ay7j^fL5_Hyxz3pH}c&xdh`rl_XuurC)@1p zFnJi>b&+=a`acz_Z(y12i6`~+wn6S0>TEx6OeLx7@wQZrf0M?%y;k=&yW7&pSK>IS zdtEATU|v!^=|oU|u1{m1i_CJg&eZKmp2K7s54TU2?$nV?#im|x^5S9?4GV3*GAnFr zIC83)Pd4=9;od3MCzzgCium+4MOl)wKlOl;HM>;a%qk`4(81bmWUUWHCu&)<6*T=w z$gfzR?C+SsJN4Uc`K(Di!o zVd!X0hTGYhSi3NY3?71mmDzQMF+0xIVzg`GZ25M!z=LcB5 zOTkep51s5d8*FuQ472LlK^kdgyZMZ;u0u%}&uK4t-4pflNCBz6wKP#*6X7{tzfxta zJKgt6qlo0w(YH3FlI9>Wu-H#8?=zE67qFF_6v-~Q2$Z}ALKo8@=9#-W#*;YEmt3vX zXIHsnrum#~oTCbDI)4B2;Z8D|q;C4|g&uGe2uQWd)L;)z9^!ZV!qS|oH_-wgK;_$l zknoeOt#^Hp5+D96Q2Jzuyukgb8g)EKI@q_9!A-M5E@}aWx`5ME)@}zzTYMZ`dj=;O|{{)jvL8HZ=>7s0*SZ5jYiSlGx2Os{eZj=-ejw6ZqEMaO4W*$U}~9p&kp~F@bh53PQKFc+vGQ| zgUW4cZzEatZzM(ZX8}lmy8G4N_)~Q}<4=~K0cPhxTqeGsGmNQ|_a{?cL-*W`%TChY zjPp2DGj+mZ$w@5m>hk&($>#b4>J)E*Pr%1q>;0ND>%-AqV0kL&{@~m*B>8cmIko7Y zb<9C=7L!6MXqm5omQ+DLAD(sx=U2j>ap3rQ7&I7kc5_?-BjPF41MamYEAP(%Whr05 zEqN;?l6ptJNOj25yYaHxp!_pm!bQB9mh%UGnP1Zfg^%Gvf4`9d;d@ar3wdDWj#TQ} zm^ag=Vs%RV5qBb&pUGpgGyJ+=zaE3n$v-w6&L>{r<1iDH03&0oYzfn))4ne_}Oa zv5alAcHaUED^Q(q6E|(K| zy9L^p>eR`rb&YixgENnVA$J#$RB270hp&I=_?T?*D=A?K-W@OUmq`GBvY7lMPgbnx zTi8YXuds+@=Oo(Y7i>7yap?V6j9ZXw>gLj|6THJ+A`6d?RM3e20qyJJ! z4sU?tS!9^%g>|T@`z|FVABDrGPSiK9R1tNWe4fd8-qrreZLHjV$la%s7;4Ij^8p#= zU2?=<;#LoEXL1B?#AdW9P5R$L()ol%=1U{mgh%9lB#`Zm;TJ7O=Uz%qF1fbK2v?9c zmXl)MWO;oA4)h`4#WFjFPVv5ZiQoMka?KTZO`<}h@!q5NFOqgrWn>Vj?~1A%1;Y2Y zG7V9sBh30~aPJ`B;;pbRc&<_r+w&)O65oJ-sYIeE6=+VP~AhF^{J znTpf=SzeD6l6-=xsB$oh_h%8sR|_6>M#1iZ0kLJ==i6{NF#_$3ohC6V8;XP@R2m~*OovRAkQ)W^!d zqj6=2=OUVEDn~XTtM3VeH-Sl8d&5Dn?;L)-J?#9X4p}|z{Q*-xhr_?IjBco(HJ#hv zvqu&Ma`S3iPjkHe_` zxNhiP_6}OWw#3?f(&khUL%DNp&tWAt8f*^OXp2Ao`m4u1ywvj3jlheV;o9{+A3n>`AWZ%4r+ zzu)D#hx{F0yy*!~$9rbHw+^HQ_wt^LNnw%jBN6p*ZYbQG?2g<0?o3i_MP9l9KE%Ji z5qr>CtVS*Q!yeBgwvj6rI3KUrb6JW`fQNmJAQr7e%p_OkSg`-TK1cd{0e;LY`uVesQ##}hb5_Uj+P<)4N-IqtGDspCAP;3)AiOcmF}A0>L>6B0pU_TOTi$xieg zR`yo9VJcERtBtfc7Cv6?J*mKR1!*T0N=6s=4)8l3g{e21IytGx)Cw1@tU#K*qMi`$?6s(ORmx$&W#``rAqfA_M^%6T%RD_Txry) z2A?R*Vd(l~G-7hW1E0aEoY80&ShWG6aEOGU*!tdrTe|yj^Tk-{JASU>5mdxhh{RDezk-l~og|UA5k3y=d zCNeo*LD4k2!;=$9Y1@j2-b9VmHKpo&&tvyIn^ZR%R?WmoX2HkyETM;J?IcoI>L8Cd zruXzB*<9zlBmOy$I^v_0y}Rde+Aqn;D~&h);IH6W$!qhICz6BxGc+KcZSgs*ZzlJ| zt@rUavT6384=A|&$%XA|b5tpLpSK_bRQdw+2XPOAfymBxgOnlQ@?=^;q~}g#^|_$t zFA~UVE1lScKCtaJ@Od|An`CuIqlU@PI}5B%1Z6#}YxaFxz?EAI&J{b=&7kWll6ikE zKF8AYpJO%7lbiv`i;8d-dqGAF5|c8K{%J)k|!LH63e1rf>flWJc-qt`nZ z`c^cH)qbyY=2sS(>V?!A$>|8#eTEjdF}vG%{xh0D;wg4kNrw46fOcOA0(+vt!$Hsllt1yXvCYI{6C3}7aNu2#{~$^q56=FI3&wl)e%}(U@GMy+H2@y>=GbAL1B>xlTu6#qUEY}Nv$L^p=SXb94rU}( z598_jXL$=$Jy~~-K^1FPtTUUx+Q(Z?R$77IrP|>dP+KAgm0=xmT zV_@)ToTR7E%`~GS`rX+Guc1d>=GPQG8s)yb;ol9$d2PWzFLU)|n7bQ|XFY%SbL;>Y zHy6)Q5@q$3*sjGitB>U@SmgU^I@X%f7PPADdBpb70wx~`^LO@4U3=)4oALeyN4-rC z+KbAn%uAL0b1ms=&0%>foUlzH?{+M#Cs+F2P2XmLfcMSvi)hjUG$%QfCt0)D#j^i$ zw^2?r_8Bn#J~Q7#8_kWN3CeP$&oMad@y^74cCD-3%|<70Iu%_y*eDMp3m?o6pbmMt zrWl-L4Qt`*0rbU;Ik_lL@q9b;HwKma*y_bMKD(-0uxB-e=U2g%)QpWas~wFwR>lEn z!3*?|eM_d*R2fbE;MDj& zMhh2^L0iy`lF7U!iLISyP9weTPx3mEzH|_|FW&2ikka-caUQLWQ~}?ZgjlVp82cWI zklezX>C3Jpz^&{?{z?yg3YQ;-OTSIx`-`@>o}G!%IMLG0wI#rHr#C9}sgKwI$|3JnSUZEwcULAffcp=FOZw#U;@vg`sk zL8neaQ4?u$zxIZ@|6~|-k~>m4tsW{-$KU;6SR>zdfse@&@)xSLDZM&*uBxy}eFN%J zp>YwL#7oxyoAUbfx$WWV7bwC6(0w6@y9C^vQtZ%m0@Ifi^5FHLy$ud_gq^(Y;le@q z;Kl3}m-!p3@9E(0ND$Ynz{0yxji*`Vo&#m6ag$u*$wM;1`Fr3`c;H8P-Rn5vfcUKzu(vS{(tV*c|6ZOulu?_dkO*8 zC)8hY7*3>Ya}>D0L;Qsu(Co0=8kn~4ggwpFGwe8HreJq;66>H2B)8!^A}c$Q(a;{q zZUdBeN7J%C{~{_E{z%2rY2;iC*6i*}KL_Uak z%(2sC@a`fO?i~5RiKzvgD>55rtRhNoGx2a=5;6A&b$(BgU3`Y9xwYh0EFu%bER7>v zeV0t)vt$n+C7a`S{#KEzJcG~uMAlu4cupSjRrdcv)`l^5QyAe--0KWccU#GuTupS{ zH;jBB8I65-qp4Ir^~tM4hR88t(9onK_ky4EA7l*sQi{jBz%gSEf8*~I->e$2 z1-aC`r={T21o*#|Y@6}O^~o*?h_e&ydN? z$v6b;-vp-b!|VP82NuJr1|Xp}g>SSB9J(jgw(p?##_MnAK4akpJ%XO4XM8N&cRpBT z_QywDWBzX~q|ByZqA}{F;8SIT4WtNEKRaCN1^8PDY$kPx{Avd__eX#HgnPE2TMpEFBmp;2~w z)pOO1RkF_Ut6+0hXqFLk$_=l8!ClZu#a)1vjfabuOkshvK z6zVmgEH!qEGH?^Ea&O|nt^h37!t#)bbM2*_mp^L~=fjFn0&89k_){@B%DrGQuoBG; zYyxr|>%IMfTxwrv^WT49Ta0cw4ytZn_DO*%58-nT+Xl2s{hLqWGnawZ%TSgGcu*u( zj>lO1tTk@`((7=X`_PvwP@M-{ahh{?AU)g1VkLT;o!xh1H67SCc9ifW) z8;nOXDoHxolkIkCM(~RMw+2#!@Te_xx{t8hay_ zW(^x7@tPI+7IJSL;Ki)EtiXWPb6)`O%soj5Jf(-KEAb|Vi`C=mw|MTC+)2H$HpkL( zZesMCoWM+DHltJ3R^Njg8ZTG~PN9e0E{*YH9>E6^0bllkGydF7sYk7rdmE)~?F|+2p z82>s8O?rIb_n&buV{qG!qM%H;UXzyQ8 z&Z}r!aj-ZWMVJPAU{P#n3GtmvnG<4ps~WhRy$K6|Nyc#}4OaB@aKMWEi6KR>ktM~h zb{T0&n7sl`{ugO1E7xblqWwFxc@tRjE6+~K{p$y5uqaQ<%u}B-PU~$PgGNv19Tx-P zw~@ILfpP4M57fH#-9+du4ihCFBdN}PyGJb4Z9 z_ce2{k?*^~p(Eh!9>%nfr(WaQ+sxZ;&eHO8gz?8((|-bkW^%}QN+pz3zB&B4m4N$Te-0i7~S`$EtHA4VsG-W3MEiUE6%k+Oe+9^M9yp1?`| zfYOgcw`qqQJ_~thBgZa4Z!e)g>Tf&*#UBcFUc)cFEKj5J0Tnr*hgYDw8{spj(2^qY z7iR|Uit^-KJS#KwHyu>iUchnq{RX&acA~w_YJ+Rp!Hvk6yU0_IxcVMcH!E;&$6+H6 zb8@!_=%+j3H$S3#OoNwcQLwi0c}DyT8sIE6#Xe{pEzvx*S*~R?+F`aJ(e*$EY=|wR zB9db-^uulFynFexL(Ehp!f}DmeFMjtf(EJW{SKIa7YXkn+M~TP?7*T2+BnY}yj^kd z$_UX6%-MeSUtsUkXrmwsvK2)ZYy|b{4}G$Z*~iG!TFpkWde#6N2d^Ip4o!uQZiQdi zvG+uf7tBA_=Q@V7>~hr|IyfufmRPkJ%f(8tOz)+gvUh-Md%>FI$SZP>X6PpcgJzNy z%4!wglwd?Vv6olc9Y)BU>9KJ4QShcVXb!p zt-Dy)XXp-A5|6`Xmgybj^Bw$I3G@hSXnx^oAVbf_6r_p?NE7NzsXbXdz$+l40kkASYN1~7^}|jK-M_U6}Q2J%i*cw$4-vh z$!9&Vw+(ze3`U4!dgJG#+iEA!u3;C#-N+c$Y`cQqZ9ZLRG~n`R$sZz%O=o1Ad3toT z{3iwPZ|%gtc&fUHITnfGDJ9`n=4%uM&+>yualj)j7D?b1^2v@+igr-<5(M<|LP>w)`zhqvgTRX23Wh<2hGB2{j+Gyd9j6g;@+;Vd(qkX8#`4)vo%sTl zwyslCYaJCXx8PGh#&&}WL3gPjd74_1k@(!>@)yBX$*~pXq)K`;^(h}vSSJDZdI_n# zAo6$yYFF-}BG&|}nM?|GOBPa7Xbsgzj^d?XMGcaz{8~*_+Wl0LUCi@-!~Uf6P1#Y6vgV3H$(+wU}V~y zixYcWi2XIN|JilqeYE=O*pak5=i?2Ya9wV!&s~E}&5Cw?un(2z9%->(7eU)lPx+j^ zefiU_*b%saAqR*O8^K1u5BzyEguKNo5KMpN>BDB3f-|WEiCG^`owE|e0iel}m3_dgpmW1};-D_Y(HE<*! z*!etEfv}#(O{lmXo)0kUUzvr=$TUVf9%q&=@je$hW+(cYNX>1LxIf|Tt=Y7dd6c*P z0B1BW|j3s4`AdFHY2n2 z-B`(SE;L*#^k{6H)?Dp{_Sz7*Ee}>` zy%@ttl%IbB}3otBuT!Tx%12>@XZxi~3pqzsB|uy+yC_e_)cBV@6fn7%O$({NHRpi_UT3|ylSG?);iU{NiJedk9kMcd#p`>8cI3rzR`uB0CQCf2de@Sxei z_ZXnRJICzwW-nViOWIGaHD3KjXc=9A|4HD{bhc4&uJ&-8n(%?PSdf&WCL#&V!2NT{}!5i9q#@m7OBzv4Gx*gt$D5;p^u@5m=FF8Yi}N~G6Q@pUC!Y}%nN3E@Eam)D;GSsDBA{|InD+xC8V7tE%XlVe z3-)r~!TqNMm=~&>0^N2o--@&z3D1p(jDCl){LF~05VD;AmD`T8tz`^i&-4(B^AmU4 zz`Ymp+?AX+HQ?23uwgo*-G>agHb`_eD1X0;ySx0#F9UDa!1x1N5% zj%B=@k;umSei8gYL&0+M#5VFSn|PiPL3Z>xjMSMT*pKZ$P#bwoy*##JT3Xhx3cu^K zp5LLxTkA+r&?h4C-6I~^mT_K)Pj2Cg|B5nj>`(QQNE1>AG;4WsTWm)%RXn0 zF2aB9jd>jEq!q$*o?x*^3Ga=D=ieY(%{mEL+0wBk42m66nX29llm-8}#`Dd}PEkU|i%l~_@D<6gmo?uOvVY`|Fe>Bto zBY30nw?^T922E{%%u9#u z(P54N*;4z(K;$CeuoW>g4dGoafL3{mevuAXX{`^N8tJhVT&)$n>mAO}%U2qCt_V?b z6+$I-J%M%c!Muw6mWeon_~DwQNRK&?67S*B+!i80?;}wrM$)@UExZZz`KU*o*A~>< z8&6+@gGiiv`2Sm~=?$f(-atCr_2K(`_MazqG!r&uJ%`D7g7w`~BVQKecUqolM~0&C z-qv7Rf4F5c#%2e|^vI$4kTIKpiG86l1K^;2;f~+H3H!kh<-kqh%1xmoL!kn{LS1e{ z@yK#_d4D0GEGjV4mYauC%|k_5~qs z2XM9rxzwDLC)f}kU}5%bBhkbXqx51cUnK_SGjO+f@T{~!B7G4ZE-&A-k69Dz5hJp4 z*nj*luAJj}*66s*_E(4(jbwcCzs)>*56}Jy3iTaUx9yC0SC9#r~fk8&foEp>($sdb|{By@vHNUSKL~Hygcc4YYYQ(A^W5=nH2v zuW%~sKM*MS9GU4W*ub`;X+w#>VMax5M%R?lOh3bOIV*M}o9dR3Gj!I`DxW z=rPv*uMFfS1aAtX?bJs{dKYY~1@_s4su);T5Lhn;rqw`~D#%{_>ZL;s=c3?ZeRN2# zs?XK|Shri-I7V(>@)GcT8qYTqV|9RQy(TxA!K2LHLf*s-%4KjprN2`_>iY*v#V;I_ zH_MI9hdu(AwN7U?cvdPtwOXgeK3$C8>5(zCKvsc+mE*T@7-?ecB#;0J#JFp_x@e`& z4?bl=12fXp%mM8d&52QI0{--XvyDJEnt^^W9!%&3|0~a(Qt=G+fse78=~-_Bw|td9 zGx3bjZUw$sv(zjzZEqi-^I1WmER?b*^m8Emaw7NE*KMt}*y?H@VwE(*d_ET19pKs( zVD>n8vJY)ctJ`rPIyrct=RPi-5RZW^R{nVger1B6=+A!uZW(j-8`!lAY~2f%FXx;X zGW+v`B}Ks<`wBk+kM}?gW&z{Nz;8K?x}FvG7QolPVub6#4>Q6pfHi;fc_Y}AALFyp zMy@QG3Ar#2)|ZNK9&76rgJatZwi{gWUHEn$xLG>Rvr~wj=!|i##yO4P@pf!)2e+&R z-^vX?EQwy%jM^u?*tCLFhmRWf@H&>0hVU=DE$8B|Am^Eh*@CSl9J4vxtvq*#U`EdK zzUEpVX4K|t8)=}O)7bbs(4I)fn;Bp04bD6RCAfmECIYL<%iJ{&qg2MV>wRX%V|^kk z*v5x)-DOVy=K3^nZ!MVBc-~#;-Z5s#s(Wh4DVX0vXsh)Zb7j88@RU*wa+XaYXp zX4Xa`r7S_~7{;vD!gf`JS$>^y#zx-1!}oH~%7;Av0&Bez$~y|Z$lTuPto|Wp;}8BH zi|yD-E%u%=Hp42O6VP(&!^Ms0vO+;zu*_;`_J?>0>HF_s&$I^K3V6G<)$V}J_7FGY zTI{vX+kJSKwUv#p+7IU1_s@z1*TBelXueTsbmqAI1_fOX-CPLuvTK2zluknh%vRO5 zZ&sc@WBaz>#6tNJvWB(%;v-#{nQE?yv1VzB2~#sj%_!?azgvQnpJCB$#k*8TQZZXS z2iEjAc)R{!;xIU-^?kIx=&Skx_@B%?G=i(zF|9a$wof@~9V9a+%_gvJ+uz_`N>-;L zYm?j!#?MQuz+;NIzA9fcwb~hvB${q@<8@P zEP@B z&e)0_eK!#hKXbR8oZSx%(r(OskVU@^x@a%-NP8Q1<;XOwGlMzj3-+`GKi>hj-UF7a zBG+aHCsHFHCIcIc;`s}y{T#3w7mP7B{uMaBRkz{i5ZW4oo9 zrFja7Sj}cl3%w$zfx_cJ;}RsuVQ5%G;kYw_rVYqb#=iax&zz6mGYHwsV|Ekm4@c^U z9QG-D`(vfBW7lvvu^D|ckWUW-*LEO}4`(TaR`eoc$O;S@Nm>bRUzk(dXJV@h|-eteuWQSPDN{O`GHVUYTa^|A8*u3#5y60|^Z;cMZZp{iMdE~~Q{#b!p(FYG;o zM0ybzO2B(5Y1%#2UcOdN)JLHGAu8Bxk_5k~xy#m@lb$98QjMIw28^BrrhepoZb4Vo zHU0b*3G*bBc|CVB146Elmb*NIj{k#{X#cvqjP(Jw)AUf*Ha@ypL@IPg@M79mc%(X8jxUX|CTa#x@W5x5C;` z=5P{p=LddU;n#S*`CMa-$-GD$FCjnF3sBY>x#LszYK^RhWYGl3Xa_X4X7-07wHuYc zkezHk8_pviS26eC;RMAn;$Myf|)4HIvEH30Nys3GPIpLYn@>|3E+d_M4a;>qA7kG!G%y=Zyjg&MEGakdrxY@1qdElhh z6D-aB8u2DoxN~97G~3OtgAwq_DB$`I@2zfq8b~p=9W@RM`F*|8lsY^U}3fS2bs%ae50iI*k^o>00Cn(e= z_UVB)x26YY>eHJNDCy5U%^KtAqeiSTtsUH%)hdvNbMvz289e`F z;2`UH-b3{31ffoaRs-paG%*3S1D`>guK}~xq;QnRV@-!&n3ZXae|vNut3>z0hG_S+ zx8QvLA=jNiy3>NI44DwlWQ7r{(iKO-i^Sexb?0kDNJL^=wO+qEos#82c>Mk*o}AU4o92DowjmEJMvC~FWOg3J#Z-N zYBkF5p~*%?&j*UOavz~-Idpyq+a$&?kLyQ6-P=Ra&6MZ@hh4&E1l4f%T1&AmZ&Z@E zF?z57@12^x7;jN;31MxYP5nT%tUYG znWD%>De!$JVl;W!O0b@lg6v=q;(W;8CD?0xS8}+U_0h6(W*Rm#pVJ{<y%u@Z1Jyw90udCr(A=M7PR^pn@%#H|lwmz)&i#TnFphr}tJ{|~Y{yuv%Q~K4A2CzDlbdxcH$w~W zK!KA(6Yf9-wf29{9IXiOI-fgy$2(4CuQdhi9<`cdcB`1f{1|UJkvq)*n~p+7o}sjV;-V8*RJ*VIBE}pKcM7BXrzXE<$&^K2t5BLvfBy9 zXSDh;Rx&Es%C(axf)4t$#89@PNIy;BH+A3vg?U15C|m|;bs}h81GrriEEH|wM1|R7 ztzIKujSRH!PII`eHi^dY#g1rGec+wr@j=Xhw{62`Fb$n-G**m$=yrYKfuryn=%tto z*BixI3(@gLbEG4Fz*g|RZ}2LNX1|qQ*Wklg${91!_r`ILx8crpd79&C#)#Uprx?t5)J5RadFahY|PR=R5e zZoLN8FjA%^)&O(Qtgl%YYTb{wn8Gtgf|cL$JZa+qo@8x~Z@FW)Ks(Ap%j`R7mliu; zm>v2l&;5XV)MU0k<;larnYKKm9#7EDXvO;|X3L1F%HX9LZVj1ht3asHmg6jQ3VSf( zDa_=2=*MJ6VO=nFgVRp^j4ToV)Z^&CIvuW)efJ!T82#Xg3MUqjbk%eD`1?LD@KWVD%ynFAQg35_q# ze5B)C`!4Gpj;#b%jn$~k+*IN|@rb~b^2dXhB!tr0h0xp_Yp-kRjf{B)B}~a(?3&XF z3i~a*pa(14kn4+bUSYm{0422_lzA?4vTuPgV`|0%9Y!Lz1uEX>n4P4?L6z*|b``3% z5_ssrwf597qFwr^{H7dv3CedFDPa#Vco>><2WoT!e6&9IBP5~pP?;orW`si7!{Ze6 z&y3|=oc%9!%SZw>unb68*0DZ~#B>$D6UkN98Ymnrs@ajnq)kR9Yj3r_WI||N739|U zp+z6^e|hd<=2m|2zX9@hBj`mt=u$JJ`10JRJW{k-W;HopJlsWT`8Hah6}+sop|$i8 zZ*-pR4o|oV#j~DeTr`?}ysgz(jild>&SDL-Xx=X+lB9Cq5iocj_-seYyKqdS;HNM~(GN!S^6~X%Y zta@{x-rh-eDAJ~>7c&cRmlWwTGcOv!?*hmo6~P2+-(+O3c1R_X#6aI&u=*Of@E`v_ z1$z8CO$Xz57;oLV!sGLot>%UPii zO@PeyK(xK&^tReVXE3v(XLu!euYcW`eXE&tg({edZ;g{ZP|xjfqrdPSZt3y`TQ1s zHM?W1JB7wK!zmJK?7x`vn!^kq66%l!a z{*KGAdrrm@zKeLXf5{k29hnMG{%!1^6XC-jfGq=w(^oTD==EiOh81-jmRBpfuEOHFif6Ck_Z+@0#kRi-55YZb zoj1_o9!2K@Bi{uNl||kF7mY5q(`7#J&ssdynVYuEmvzvsP1_pIlr+Ztvwx$r^Zi|p zYGJjPbzf$+dyrwYv$o{B{QO%u`#0disPOj#SoAa0BL!M|NwoD$*dVphSeNlvw#$4^ z0?Za-^-Hlyt!qP3m9W|XGsBSYdIBNikoL9!dz*kha~KC<(U^$k{Ypft$jXsbfz9Of zEBzzD<}BcAJa9D`OUo{7{Lg{W`yrzJDze}A+-o9|pWRINV=;LUkq{WQQ|e4?^dEp3 z-MRM&FvWaIBk1QMResAcV~aDwBaF+;4W+LQJbwYMOh=ZS!BzFK($!(?`hoOT7?o^I zn-bWH%E1*%0;Be*I0S|G4LCK5(ry`6c8aZmY6oGXkF9zW2fAwpHS#M%EHV&F*ZGv}@n6!a6X5H+v(2P}V54@{EwGYx- z8>F^cKto<&JQ12ed-qv|>>AeoLwJOZaqmjJV=w&P*5I>mwVkWK;nyg9 z?S1fcf5!1H9Q&5r+Pj?~w+J%X%tO>lg#S^dqh_#QP zwSFf9`xEeA&*RrD{0ejMYxn2wM*7di_il~9sXU=4aUk!5BOUnm4fkG-cWVzguoU0J zR6G+S8P!ny4OVAbi{`c;{M-vRTGMes@Hy-zLR4 z<9(ahm{QdW7-$|H`YY%_FuFTS`7GD z1Wu+*{R+}&Gd_)VE*K*pjm5sge1t zFm7+4XRQ4{Jlmd8zYuA63$B|6zFnN>y@=hTB+tpflk#w_RVq?pS&(0z1+gl++H&jZ1SfZ;trt`RTR<~E<}B(lvf0UuIA(Q_h$orec6L>`>P z=jI^27;m)?EoWNLc)9?~1K`@9@>DBcwB@rA{97B4m1lOrMK{2UtqC%hzhyyY-@xrP*^{pW)bjHn0T_{>Bru+5>51C_50jUf?QK6jV`bV>@czH>{PScmCr1K^4=s7jn6#d4gewUEfT?u_+M}NS{>XrKv@x#h2hJPG42_1yHf3(Rvi3hR z!p)3tFLyOIY#KABFUl&(T6XNZm>RFa``92_!2?S%8~SvvGqNcBNkx&a1|eBR!PU&H z-%8BnJUGyg*#EB~tL2S+BeGuPyOH%HUx};`Sp>dlcE6u-A|Jym(?=#mR!c@ke|DlU zpTbjrglA5L-_6APy@BY?ts%>P3egV6ei}dB4-1KTKRxgt$QkFtg?Dr1S|q;BSYwvs zV;Bv8Y{!~4VSHb3)pV}2@8UOb>&YCo>r-F&@qBDIzmZv%m=5F#BCqof=OP{=gWf@s zj31dI@;UtaFKPkUJ$VvuI+1NO&-|AECm}J;hSQG57W4spwgtYAUPN{q57!=@%pS{i zftWY=_8uOEw>hH=P~^C~GNUzts{+J!6vehv3b=Y18M#2fr5Nz+0W1F(D{if|15g1w zUPb|rNsubFc4-0mnWGPY+}ga$NZ!+XW+573JCLB>b{?244cBi2{N{(No1mr&JX!RW<>1T0F&xi5yLWtSdlYxvaK)t!7JD_S-&^iMYEeHDM z0C!p?x`5l0(4H3pnRd}`8>mh@WZr&Yq?%eys8w<3wN_#4o4Bh>1R>U747X+1B& z|Ao2wH7s1OBYQUFQ_HAvlpi2Fc3@N5?7{!-8A-2TS+Zx88QZTiuJVC{#b$;Z_hqFs zw`QDSG?#T^`mtFT-MsDsP_T@QBRB7p3O;GY@mokRSCM4?L0&ggeMr#Zl3@ zdC#{Qqum?EF{V!fKOD>&{tS+T7t z++;@dEj&Qq%d$ZCj2Zt5ZlI^&RaUkNn_5vJ=B@~S4CYBopqFdlK{LYN9O&G1IKo7Zj0d7ubJYCA)y$Ax72f0i z*2WtTZTyANY9TSxVFD7W72yUzU$ygFU1KX4U_`C;d&dQO+Y4?pkn_F*7R>RljjU_r zVROEf1s?2pRhoBmj9N^q^4;hT`!{^RN*cFhSD^Qi9%`cLSK@rDqN^3X0>%{P>Jscz zPb|gv!tATU)oSxb)NBeiktf_4S$EYTThD*A`_wabx~MXM8|3 zu{KdFhiMN<9P?kaU4m0_f1`}`zu57xBDiGrw5p8WDm@K?y)GpX8V{(;!yA?e*jAAL z%K?$Ofys18?}@;2I}*Ia`&$#s{scyiR|5B}`%@fv)$S4n^x9vl0W0t&Gp$AUeeP5O zTr#q=E%?}*HQNOJIt1<6icDoR<|t-=HXKxs!(!G&FTfx0sMzjM6NLF??6L zH1@{c1@FN%`(o$$42z3#C7F175xCZ?a5b~aJMh^7{@Dy3XEbCD-k<`srWRRP-Pr~~ zox1YIFSEZSo}twIS*g`JUB;7Y&v}tINX1B#Ga4f?>>_zL%&c>G6`r;Zj-`Ze-E4b# zFJPY;%3FY|Az*Y}*4Uc&!eUkMQ#i0kPAT}0{R2(}t4dVxM2kHs&`Y#w6yy9FtoSPd zmyANL&hPU4vd2gHVE;?T`AON5bB#6itgMqBJbZxt@HY06yKuF#Jg*Gr+`)458(OK6 z)eF!ZcSN6tGuY?O`h3=llq+69bF=DyCp5?bXs~PHDEl~jEmti>R~^Fs=IEwqT^#XGG^3D{V(u; zdPaJkqxQMV#tc1!+o{9Z+xaxlNXYT*+^G=MAPe8p25arz=rr8BC>8*_^6H^#0*-Ws zx~f~Xh0A`$$}9p`k3pI3k6~|%6UZ{F*^YqgXV_~dz!NYgwo|wQvAO|K^_N zDf$^7d@c#*zRaJs;qnnFqxIzsZ;+9Fb&)K4APe`zrr91G`3&FW$dDa%iX3?Rl+Q#? zorMkb6c*I@RL^=PvJTl#1(3QkVJ%J0|GALA^N}r83d?G7@}@HLyJTcpB=r}NgVRPv zMqWiWJ{NHqd3hIER;T%X4axaR#7$)6EByKyd)Q25<6&UqIArks>`fFhuo5EWM@BwG zmLHGIy@I&aGaSi_K9DN%E~Dy0q)#toi>}0`4i6G`KkhStU%ip1`;zI{8aiN1YC`B= z9PCl=A!YkME7+DIfpY94aQPyd69g+ZdWCdyYqTb_#ytQ_$JQi1i;?A~atS3B*k zgOg})-^N|ksFV-J0x83R+HZiO<-o-bX!U)N;jQAYe1t{24WPG!G5(oO6kZ*ah@)>KdZMy~3J_9t**vPwFdlO15 zFR)Uym~o8J&gD7Ad`#d8+NyU2T(Pf=8D(}*+Z}XMI~30VN7eoA#Rh z3Tblw1fM zH`m-OrbQfG1g_5opY?PlLDDV4xUEJ}nUU0Fs|xqAibP%Dwkxvq%%CGr2zu#4e=l<*ImbvRebK`b3E5C;ruz! zfst67yTQv}=c$#E;=6GFL1@*p_!|HReUDAM_AAVtU5%T9Cu#uw(T(RpDW;$&H%4ms z8;Dy1Mbp-li1|;3{%8)#N}%~;q?qQ&XhVRCnNYcl%*kzNurk?nXs0puV}bd>{8|*G zWc!|LZ_>^?7+6tGwr|})_76o;Z3-uS9SPq`S54q^cJ^oqwbv%}|0AKx0#WJ$Y6f

>Y?^$12X2zlC$&< zzpGGHv?LjX_4u8iyulZ#F7Y%feyFowGE|Q!NKLs^R7*`t4q-a1uMM#scfpQpURNKy zBkyu`b@HKFV5|KcyX%sW>10*n?buXDvQ5NJY`u*+*r!LZZ&R>lZbi?Vz#Y1hlhq0v z?_hi;)(o<8(4W{^r(rXW&Eg-#F>S!@$Th4TavtBqO8qgG-_NjX4+>fK-T3__Pg>1W zPcaiqdDh3+yj$=$o>?)g;sKI`J&hJ%6ShXo>|k%+g64UV>d|AiXU#zdvxJO=JuF;ShF}J@A8H`L&b!ipi+#m=!+r z7&tzJ*JCMGp7ngY$B_(hpS1WqZo?JM!dc8**p3}(Cil37WhshW-h^d+i|K zVh5I^)okmzuk~V%Vt1OyQFHfu1RB#j@TT_Qgr1=0@L4@E#{P@|vwFd8jKOKoEWCx( zngN=X2PzvU!fYe+a;@9{5V`yT99#R`5^%=q>{9~e)jD?w46%dsPPCWlaEzsa`xx0a z4H~l~&=_r&^P$sY&`s?^(*k@cjimGnw6q=+wI=wG6^SZd%p>dxzXizK#!6qnqOcGD zgtC_-*CI zxA{Lcd9-)vw{kM-GXLiWBCX`8ufm+dp7=NVd<*9BZRfK$ zewOsnH=-^?B_Wr$74T`M;x}CNF_>D0yx&ATB{TnL3w6QYU~g^k^HrXtKj%xHGmNu) z;wPEF$hYDfPzwHoe519z!$E$Z!OmirBI_4LGB1gcLW?1FH-Hnh#oA!q>26S@uc1p; z(Vxj|+wa~AArqlfeVOV0td=}m>%G=i*G>C{w)KthfusN9BHQ?OpH)r(oirLgCz^;c z*yZ__k$uVGx@q~AoBcI`&*ngC8|d%5(BgvdHEUs&1ee+)+i00w358z>3=YAz@)~zC z-nb*fbZ}#k`n4a3r&VWBb1Mfa7!p9*ps7izTHU{KL3g*rDY;6nHlePb>aKDgG`y3x(?Dx=>(y%2V zM)L_i9<}lEz@R-0dWNwR|#li zdvy4ZfY7&~&q8f2_G)7=3iB$@Jk7fsTb~^$utHZVw4}{!#!OrPHV&hS50oV5eXLDt zKIcDNW#`e^tZ--K$uC&NpSZ$kxUpCO8=-m2%^HI74Ui|gvDzQ=zZHQ#VwFE-RTl6D zc2K&*yKH5K_5&T;paJ&kbv{loBi2${1AX`jDRDnDXN4ha4*kyf=ChXC1t&najTny2 zhe;lCKhJT7TA*6N?_8z)uK)ZvcizH$Zv%>qZc_LAm0ueeft1Fcs#eKf#;;9`XE(=I zux}brW4^zhH8a1=R9?VyX8=)lrtgm=)eo$g0R^+KXi^}^4l*@aheF_w89qr_m6GhM z0}f_k9_=8dz0ACM{eSi>T@>ceuA5UC{VDd|XNE2?Zo5!gi&ffpjQ9B$`%Mz$?bHEQ z^mFOO9LtKVXWVN!)97k*hl~m{zSj{W_s~{22O6*T)tUPZ<$h{%(|O*0Ao>ZEOKK+$Nr&N(+nLuZ)vSF7Rru4M#CLr&Ni?uhSrRQ+YIN=PMG$kZU=OJ5WY8unx%-j z1}8fMA5Vd#+mSP;vL0Un&DK7O2QRZ4QfBynHQuW>c3JZslEdNd5+iX08S_Ut>{g`V ztw?%X_|xX1gm)Y6Z#|l`*kb-h-m?O69PBvy+p{3=W#U_Wo_+=y;e53H3bG*sYVFAy z>^Hx2uMNnJMk_2qTCh5e-8Xh4Tg*U?=!Nv#h3E&Xp*KYqwyN_SHftitqpj(0Z-O?V zrhjv6PiwGS{TFSt=P@J$yBN+TzF;x3ua!5C!oUAzjOJlpWd8`BVO@dYe140(uo*cw zidnKVj$V_)=m9a&MwQlOHop$|U_|}cz!$~=&qMfbhJ!k9e{_#Uz?2nFcL1+?Wp@K{ z)?qbcCg1;bxC+pmf6<}s(whW`Xnsk*tSFbX1r!RcEFOuWr5Cc97U9BVMR)xCOf~&s^Z8WauDYQ*ZSYGlBDrbGo!a$-n zQS*v(0C{=9;%eYg1+IMq>N)^f^iy>H>d@3|(A*cfB0KQsUvlu=$j#rt7Omau_!b|S zt_A*Cy}cfHO97Oc#cPhdb)K~*#OIwZgY)~Dn+4FDJ&ebULMh^Uu*cZx@6nI-hU^5s z7egb5Gv7U#Sv}PLo&Z&T8%@o6Ot)E|htcVPv<%3q&-rd;ulv|7g~ywGPe9g(5$5&? zZHX3G73fP1Mr1}G$&U@bMz9^!Zd0q*^d4K$Lczs!*; zXjc``c#Q^Zhn=DglDx6kS-`>Ax)qKx7tq{*zhb=qi`+$cPsW_&L-uco^wTczv7zuG ztGSM1BxbgEVO$k>A9It7U|Y@1JKN>X`p%s>s+Y-pkyhZz#K3p<0vo@xzQ^H#d$`*u z-ghNOtlMoBfm6`U@0h8+JkJ_u+c@^;) z!C$BFEHZOf$I8(6M`)GF_6%Ql{W`^F1%tI_@EtdDt}hxoXXg(*=T3%p}ffq zRzkQK$b7e8cHU&oOEUj$kX60|o6IUa!?+H>%g3>=H_+Las|WL~Bl1dp;HCzvY_^n? zIv!9{7JSejRxVgbjGZrneJuqz6CWRO31ECUa*CZC)&iwwft7_fji^CRcP_K}#( z`&*&g42|PKB3#KFDTjRr-e@U5zQ~r$^u1ddr7sX{Wp%sR z_vHFDK&IOC@7#M6&lnG+=#}rlxqX;Bp=A!A=3AR7-45GPd;T93_L@~;k29Zt9{9-y zHMHlK+2m2I_|HI&m5zT0-jw1u^QKGq6CbVw>HG$eJAwHe%gP^P-&OD-8tK~pl=*U2W^^-e^$T~5!a8f^k<2b0@m2Ai5}Y=`NhrN>t>X_1(qxEzRfJPW>ZEe z3-oCtNW&e>e-T$d4%)A^?X}@{4Ol$}*xU@o-_4&|&wSQL2yOs0)#1)|nKP48%07f= zc7uM|SL)S3o4Y|zx1N>MXRz z9DVaMte>8l)ye|pu%_BmwA@py!*%4*e5_y|jwN9IjJx_9%T^L>>Q?;C0iAdgdvg~! zeg!B-Zs5oM9C4sb#n|&I99!MU%B98GqnFi6z7?TM*PuEHxu!4@xN#O0d3Fp}MzdE> zWLabgt@XXJ0FS_`v=n{672McfLF!0v@>v4dvJTEmj3f_NsSExJ94VLU`}!N0&cK$D zrFCG9AJPy0Cs4kMc{2xQGIRI|YxpsrgV`gGo&*GRhC)?jedJbeF{4fR zZolNW`Rm47Phu7N!*MFXiL*hK62_PfX7{RlaLSzUm(1|^3&?}Zv1;1$;}r7S6{214 z!Qn3=EAB^vn}LmIDAu1YNPw?n8ES#Orwi84E?6_|#BJX?<9O}ZwGK;;9YdF5qqOtY zTuo=m~am?e28QiaDsD0Xm*w?~TxJpT9 zsN~pji(-R%2iw$?Aj2-i7B&o9YF}hlpKJfK8_3AXp_SS~bK%X%##<-EyLtm}uYDMm zS&VPc>zN|vF}&RlsIe936C+7HV0P{xlO)0$svpE0=5!oS73R;}%#HzDtWR&vS!dk- z44;EpQ-N+Pq?y;T3o2lK#uBK%j-H18>4&pm8@95jV3P z#^d)3Hr7GNidHPl&eL=Atu6BF6t;QDxLY~C2pP90R-oEI`-hC67nzYOu+VNr{vC#d z+7WrPE#s>Rd|N>y8`x3$HUf>uf%g=^fN`hBCgp&drsK*uXkJEXSqHH;ckd6^pTHA7 zhYQsVR@oG+cXlvG&zG5p*4ca={?>?3@yQrCGZb4w{l0|~&gMO=%HIr}G z0eb<-Gwr=){Lz=t0-yc{5~ew$cILEmhw*XU*gj_d+Cs<6GG;5^l!x}4Y5!WFDb`CK z$a{PYUH%|QF|Xl4u(sMjX#HYFDK!5CWZSuU4XdS2SSyU2aRzHHwk(7*--6Z`028ciVs=~F2!J_{m z_)!^J{Q^g=uURl?PYr;+_lbe&9H?(`AkL0wCxALDM`L@E~ z`y8*vH~+84HO<1T%GPx&+v)^bLYFbqCwb3bfF!F>ObW7yG3&}AKZ11~ zSlQPZ<(rIdR*;(XnOn7>18-|)t98wnFn`J5xK?&63fKJ`-gO3!zL;mZ=JrO3CWc9g z>;_NV!oAcxtoLJQVJp+@0b*9N{=3+7i`6hzTMMA^tY_fz%9>^?{smpM7XMwioi%%` zqH;9I0n5TW?&jH6fjh_N5%{4MHI8#vWS>Y@VRudy&;-K^GhG(tBnsF9datBUX4BRUR zCY!}_9!=4ltN+k8jgzt4Z>)U&9Ily&>+KJ5fosj8wcdg{@XN^YYQlA(CaqabI}=*1 zRqf9lU_BS#vKpI#NaMup|7%XaeWi?Lt&ioX6wqfJlD(=jpb?li&@FNe9}p*Nj5F!DfV8Ph%7FZbsD&W~}Yx1+Yk2 zsVH(!S?GQpBpkcq*p12>dRDh?hR@<1_?RA#yl@(Q@phha(*uznDeWaVg`RECs>mIc zy{Ub{&sNQ z4nik`d~OAyy}-j%c!;ub^Dq<6xHPjXaL|Yuvl7T~q|hFGw@R{=$E_OLgIO8OoG2rE ztx~!b=f*OFMhz?koAj64|KbXBWY1;oD(WA`L0EV79`K$K-S;l@sUESP{YN?5?tIo; zGdlbXIQE?CGsT$2ccF9jm|Ja?=6BuatgFn0@whj!B*jKmB;=Qsx%P0+y*%?WNAv*Y zhR#_N=K-|yMP$y5tUy6{eQM@&A2=|9Ih+i2&?ayRZ2Oxl7xI>0K!f@Rj9JZZwa0mE zKOwj5VA~F^ZDHK!82MI?4Fgg-0c(Aj2`xu*tM9pL3UK@myreLcu?};oovsh_Xas;+ zfIYy^AF$F z&_Y`TjI9gJF;1cZa={Bo+*-Wsc5G*L<8bpLOVk6$&95pG^sLzY=A8U`6&`K%w^&)| zO=wX{`^ZJ@W@qHpA?~;r9wYC6 z5Olf!xbiG}{)7uH0+PpYcROjGgMQowht20O{>&KOSUaqEuBFMUa@H=6KoZV}ul8lA zV`-?;Q?TD|AJT;@JR=G@<{q2%J?4QKR@HC~l>gSkn`Sce_EPPMOk0N4H#)}(AmhLW z>DO?e&C12^vAqopSpBvvuv9r{G}aJG4X=p<@2Q0(*N}S@0s_oPE{9xK9tkx&(x+7! z{w3${F&50Uobw82+t0lU$5L_Zzi9hDXNC9Km+BL6aRD=7PX&ARje$mvXWzHb;@{Cp zuLBo<1x{=?L;bPl;bKQ(2 zw!fe&o%mQHXcudA5a?XPtj%WjoSA0O9V=<~VC}T++QoYX zG^rQ3&_2vqOK@f|_^Ea61aj70?xW|=Y?iLfwvt*Cuy+i2V(wKl=BzT9V;u@PMF*a5 zhRc`GlJB5Iu@x@OP1G0sCBOSJI_scV9muT3mfW>3vt?)TFZhhLnK^^Q7^&L3mglZW zrjrd81Z0z<8I(@MfMb9rH#|I+u6hDxUBw5oTWrs z0BPWbQ0E{aI!jhGqOv?sy44mAR*7FZp+!YG+p0~upcK}9H{-D}W9rR}e98M6@%SC< zK9l#cj)om0wM3i)T8+||>Mey%F9WNr)%y?i=<~qC^YWJ%U&~?W?kuh||L9MkBr@38 z%u9B~t$F+>>z;yh6T;_Sf?5>7|CS#7E&`^%0G4aX$%XBt9NIuGa4S2M{Wfs-2OQIm zwpIzu5T2(zkqc^*Jm}L;SlcN0WIDJ)A@*nItnARJ%0OOS?pBa}#nEiLL#f&!tF*^| zGL-1^9_*_RHL8aU(+(YYB>8Hy$WEI_bkcmZ;L)7dI>c#oCJM=pv7e$%4?!m$fo?nv zoqPyUe0B@@iu;Y`+NEgV>xoA?NG#PVp70fS{fhnbIP-I!Q;0YGllR%roW@qB+QNJp zdHN$z*qxOy|8D|+o#3fv)#d?Hi=nj^f=3hqI?Q8w4IFO?lr{?-$QaZ{fj;B~BC@i^ z)+KluOwS37*wH)<7#@R6YRva7tUG@aQ?wNg*^H4Qz(9AN+6kIan6r~XHOlgoK2R#{ zb#s7<9^i`B$h^RgT^{Q|LF|K6i~Y^OH#4u^LH~K3KO;KSoSJhF^Rrqa6|{i|)#KOa zeD4n}k>;tb+MTcgh%vG@yXAa&i zGe?RrvceoQ%G+uL>G8Q-z}s{NTb5Pn{*6u;{7V@*&-|Uz(8`R#E|8gfF z8^?h?T82)-L-v93OQ0PSxPLcj#mB7v;=pzFy6gm#)Up>c_eO1g#JpJ*`Aue9{jCLa zXH7dhZ+B!YUoxWDbH3)O)&iT&wQBAAdD2c~n%!`wjo_bs+LRFUfE}5z(A8-s)%fvwVi)>Hf!8h)0~2k?d`;C4>XX3x!LBPNCWf+7?ZOD`SL>0^OY}>;>)=Q&pZefv|_V$)Q##;Pe07ljmI-5 zy!=c%V1boNz0d8jEp&ak$SOT-l&8MR`kW zgx5e)d4umop+pgk_A#T3!uEWQD>pEU<|@r#HCDl2cJjP~jDIPsXCCIyU~#M;bp>bt z5o{s3kiwM<^1$t4ct^EkD;Ap1HwxY$m#E81z6$hMb*dKYX{|u>Cbi*P5>5ayJ!bQb_cHOhcl!edh6|X_zZkH%>BeH?{yDK zvXEH5N!WWg5>N0Wl@=BgJ1{0xaTq`ji?O!Dh=UzUuF6+@x2M85thZCJ*|x=&n~(k+ zsiPy=G847f8hdhAA`R+Lt0XP4yZ57#^UcWJPq8+)3vrL1a7LGq0n?8=FD0g7GS=Uz zJbfp6yOmMS@h%szHvdS};t9t2n0L+yZP9Q09yqKu=M{e2vo|f+Uz%AP55DL@v0}hr z-oGdF-2~hn#!OFv-`jU{2wc((H!D+(gho#V+xzjWKkF*Tv|8FBAaM_Cu6E}>*?vU9lP^3wxh)U8ufmK z_~1XWIRC=Fjc~m!9KS_Plz-{ila_py40H&6NT>Kze2W|TjPK8h56&D}II>t|3GzvD zbL2i&?e)aL55(R)p8tPhTZ8?1CwJURwC`m$4r=sh-2V(3?F_oBhc4*0WX~HQH`G z5YPi2_DB4uT8&iH(^D4$KBJKLKuQ zg?R6l_)Xp*2DT%3&?m&vl%y|B5_)vxjn0F2qa?jKQqz|)DbclwqaQ`ti7^Adj^ubf z?$br_aMZ8#ay%S$g}B|@;KUR9DgMo`zoO33D`!vCFLcAX7?qOyWyVW#H|h-C88^_S zaRvPu*U)Qm6Tc7ApD}{IjH!7-Wb|#iFRqN*%bCxko<+ssY4K>1mY%rXDvY!qcv+mz zA&;W2v7O`@ccP-A5_3)*MwSZ9%t^d`g7B*#_*skECBs5D0Q+SP54dh^_E|(FFK3R< zLt*~o&s?%Ui1ypcLx%>v2_G0CL_Pi1YYK{O(DvBHa?V(!HVI)b`Q?&h3{@WFn56% z^+Z7BHDLBBm5=`l^^fmF+{brv0ti1xeEUWI&PCh>q8}5(egw!jgG$){jkt5`{;%V6 z4ckKCvn#l!-|++RuNBZ|t?H8CR(^1{2zqi|V6zz9Av^e7n*G&?LvI?SOtG;MXQ&k$ zcdLcWIHBTTdJZ^od?>+1IFP+>w4d5F(MpU~`dSCok(b{J+&n3qI|^O+B)`r99So6XYk-1L_y^k(Yu*u`UJrP}R3M};{=^T+?RYWz zKj3RSJwYRZxf)cCw zt6h!HursxC8guM@?mikGvwNk@SwlN5J%cV?>~aVf50y*GM3<+bc{6d2Cwl>f+W8YK8T*VK53Y{zs zYZq(VDa!x3(ZL=8ukw)<@RP%E86!Sp;5udqUj~9^0h8^3@;Auc=m8c?z|Uz{^7BYO zx4_C%z}ODp+>RL|*z7boh}g?{K_5TB$MrTGXuSkra!+8IlKq-7EaBzN5x;A8b(XJcO0OicrtdZ=R#)*xkrp z8urUDvgtV27$3feaZCpDXCV<=72rG=ZC5!xz*88l5e;L}SGCz60FO^`pUXVsSMcVi zpm$meNgI(Bxi^6=O3->%`=U!3AN3Ra#)BdKpdQ-0YJerp(5pLxHfPqV+*2y|?t=vVMIvGu)Ia>u^#sYb{PpCGRr`?iZ?%b`lz)2zK=)!7z- zHrlzy-tlT-rP#{h$Ip#^RRP`qbtI5RtkG-iFODXrr`+g{qEOhrz?cK;_iHD~5wx{n3p^0c)#)y#v7Uak#18+zrg5eU~nOLw*h&|D3@R1D$DqFfN|UhejjlDePUOS z!dvz;qVvSU8he-pN>drCQUz_VB%J#i$M(RN?O=Q=M7bp4?JGg4j2U>D_ch8lRm>Bv z-v_O@4&Qu%_g7nN$r`y{u^x=;JmUf0&WupAcC6HZKn;x>uEUIG1{17!Q-<^3;NDfj z4BjCw;|`;Z26(OdbBj?Y`CpWUbyT%(RAii0f*x$nsM23!M)wM1D9$JfqKR5xJsG34 zCURx&--(f_Gh0=s0Tj0}Bd7yBSkZqRkZRRif!e*S@@kkn>ugsq{e3dk6XM4RkxBekvmg=HM>&cF_m;Zjc+BA~(JPPbwZHzZyuZ zUm?-!flWxt;|w}6|zeCYrtGFBuiISJ6=+F z-#ug>pmm!L40!6RKIsnEx1$@WXw*;Y+u3W7KO9yzTJtdKMdNQk#ViCW4LvJ&-LWaow>^dc-3?w>Ar&+ zI12gNYNW#7dDll+Vv_;a&-p(a5?dzlClU;@E@BC&QF&&oAGFU1c5||o`|Om~nYkX$ zYHmTAvTuUklfJCN5I&7b?u~82IQUr{wb$ki*6b|Q`W)18XrQGtSUsbE)f3Jkg)hgh``688JlaKe zaCf_~J%O7U-LR99E@#YIHtxaQk^!5~(dq64d2l;t{K-i4=EZghJO$r61LWFgV>x#| z9rizDWTzO5T@}cwX3qDA5tAhb@sNz`TUWO9YhYH8m)yxh?WB@PB2q+E=)I;+B z1kKn!mQDEH5z1%GQLF!H%Ei&o(sD&wEPUzVs+GB4CE&-tDp`Q0crh{H&Q)+IWzglc zIm#Wf$J_^>?C5fv?Gij}7h2tq@SG!TR=$ppy!s#br~I`VY_l4T*&Ao!O)*&3QvtM~(LV%Q@D}#J>xbO(1+-KA`-;tcyrDplmB|hPE9OQTp}mMVh|M$H5B``(YE3?? zbQ%{HL;hw`U{@dV1FZ9D&|>nz4@$xrngm{9zI+KZ9^-~nb6jmF4`;oI&XXYGFf%5G zEe2nfF*`p(HLP3RgjpyEge2r$jQuVJw>1{95O4f95D*h>o=RfiCn0YaKhR|TCTZB4 zi4}R1_q1QkBjn*)Kh>Ode-G`s5jdkKzAF;TG}b^(cp5l40La_H z`WRWZ1^#G!$|$gQ6}0g*Fclebj=jQ~{Zs7!rX*~p=TW3^`=Z#t%=}U1al5`s;|@dh zehW}}j&-E?Ip-;}-$kOn#nbdEY=xFQ#44PE>rOC+ZCrJm-^r2aUGa)+1>x(d&{6Lb zD`*5p3H08VIGP{L_N73B6YylS&+G?&9f+|TR1#wC4zTu1`P;$%KY%c`T50txptA!r zqwi@rbZ>Hi*4{v^air#H#_I0s0Oqe6C)FAJYYWve-((~+pjV?myuBT8)gH)Kwx7%2 zWM=qt?rZ$XNbWv0VCs0d))4MtMnG5Y)(za~jXa>QyAt@=Ajod*xiYpdwm4)ylo6Qr zC%5-T9psAUjKV${HNfAh&@O8V7v*~6;Ijd*>A+SwhsJinHbzd)It38ev z;xFvAfADz=&%;Z27ph0rj4T(KGcs}HUmQP%=VCRn?i2AAOvS%ol>Dt==QYoBGM3wJ zArfr5AC{;3WOx)q!bk+JYG2h4nvHK}JR6I+1*&fU&UJ9I z-;pour(`_U95B%CU{;_Uz|1yLaS%D@a$KL?gukv}wY3|4>O*9ltIX2r=y+UPk6G6aS|401&2Q_H=V5kVnxbFk1}gPpwLlN-fF-mK8lin0 z?QYdNM4*fUTjt>Jm=ih^Y{Oq>jh!iA)By0UD_0Bv_9p`CL;2O3e2+?a7)v8DWW&Z< z4(P7HugXXmpW-{w2lpc$xeh$N0p7@_;I28)*3p@ccV!N^I-Wa@0h=a)BZE2GiRvHL zFsn}-L1}c=T*xI>!@dIdvm?$$X5uvS;h$ATo&@_-Z2!_HoT07N4y}<;4kN|PjVcUH zu{Y#Ju*vEitKpb>yzMzPf)#P=6eyjNp_y$TLBH+w_YVIXf6|W?912dEN8A`1XBAYV zC#=|Nl~nbp_u(H6fSY{4lW`?>T#`1MqnR8|Vh@iD{LTc;O$T+4!WQ@xJTl+dc&q={ z(wV^7RJU<_j*z9Ol+skB$dV{TmT4hdh4fky8YGb|M6zTJi7b<)Df>QUry6BMiBejS zEYT6c9v35^qu@Ija701 zy88(Z`~}bc^>D%!L=k_0S9h`eihbi;*7N<#-;+>hHs@EDlwvFob0<$gkBvCnC9G6! zE9caq2D%gfehW6Zbqs5{ zKXX1$V=dV+`yw{dHh5jXqE*HA|J2)IuJ#c|lMJVpgrYC!%HnF6Wn!+j-DRyNF$et^ zM{egxQ3+S@TxW0%@d-qW`VguWIl@|w1j_qTuIFs!E40NCp4Q*kh}qb1tAmARZ_x$3 z5v!isA@5R=X}x%Roq0p{6}ASdcKvwUuoEgF(;7pS^^tBB zknYu>)kIG5y~s+ju^U4BQbb>*YD;9HIVj=>cZNP@VjB#^l9PJ|vW&-yGe=OY`vW{5 z(Z{C--8P4BbD*?YVLmp8Cu_azcJ9Uc#VOb$=0$DhnVGBZa}wWEv@Lr$7v_DI#Llh4 ztj4b9DOk2;kslS1dG;+g*Wp2AR&S)AC`O{uJj}P+Y^@hOVJZC9%IJy}(HAN71Rk-+ z@u}H0*{r7eY=0E*oSwA`$X?_BcGR*PvR#6X@}|uR&yVF|4v?9<$9Wg_qO{j}Z=U(n zJbkOgCk34}mhZjMhY#_@ss$Y+?#7+riCP72c8#-=JA;O*!d@xxrSte&JacEU_5m2g zIePMbYO&Nncijc|I!D!W)`}zULB2$}=Gz=bL*L39&yPiU4eN4Pvxk}X(I7YCNS1R* z4Rv}>$m}yiIF~i2(9?EeNMryzr!9-7|CgDSUbKRYu{<*BZY0SAP?VW(4=~QkjI<78 zN(t6uJMR5)#&#uVyomI%{^TmgkcZKT({+q!)2nq~VLyuOY1xdRQH3~g0KN8JgPi6)Sr z{fwBO4-`-g>Z=CjbbwmQV-MDWhV0|k2@Ur&ny@vWR6bAgw>`hQ20JkwyY(Y70y42! z-$FNvs`>)dI0GEJt=Ogqv1(r>JHgEO_MGQ+tkG>$Z|1?CJ)e}#K1Sj z^JBJeCiCS_a3t@>qAdm{>wkkK`#F1m%5@fT4(m9-4fd}{ln1ea_ma8uCF{0h@h-uF zeivQ75vyP|`>$s0k4dKh=K3e>^(B?0+sWJ6#j&|bMY%?CP-V+Arhh>3i;)wtk5PP$ z1)i6l4@I%2PcYWs1McNET8_=^x6BMEOt#}zO~}h4ez(ruY<5u`tq$cPbrmm&`LhLLkKw?=XFq_FiFD9l<&d&-r9 zvc+w_fNlI2lw2Nt+6GB$CVDEASq)jsdHQM9#qPu>fn`K1K8J56>d*IT8=`GJMo)*|Grd z^>FNKF(uQm<;U?mow#Xxu>GoohuMT^YIA(ny~tItkCNSyreO7FV4Hs*EQ#YGX1RxJ z9)?Sga(Dm4%_}z3)>umlc8|zfU3ePe*Ei#v7_WoEGc@;qB+tNFTq|GRLCTAvq3tEw zT2HL6-h3BdP5gz!SiDBx_raezSa@c(B_rFfh9^a{tBf>mg)P|yY7nETA$Dg2=)$gV zeVJ{IBu+8~4p@p+`40KmV?s_?8dhr>xjXg*nGQYgz`9+66v)^21lizXF`|!*vIA(UpY1990B&xg02&w}Oj&1Du&BDir05oR9tnca;E_ z`QfNmz+|q=JoHZZ>Pq(hp?OeZ&Z+GE065`+g)G z(HCwQjC>h|ED^yd1?^Q7F1U=jgMIGB4sL>$6dk?{lFTkRdJ(gUQyC=|cja#^qGh~0 zs~CKf=6f4S5LK-uwEO^+S{UlS2AN+MneSXvZ*dZm-AG$PubF>c6IYba}VMx&yZu#k>y$9Diz6d z%OS5VCw7udvp6}QH@Bj_GGlw#k`zA~ zI~d!}?~hp4#Xcur?LaJ>thv3hugIGFE_R4)Idj!clQVao&o5!i_iWii=Fukt?u-?L&xNswGm%!Fdu*G7$6h6{mYcAC0DH|OKc^4$J&7}qWv@YG`k3dln5bz^-2QPV@zNi|2F(ny z%vJcArUhL#2kn!=IPEZC{j{^zOK2hW&SlJAbFfJ5Uztht^)wdfb;0v;7gnjAfOjj#+HKf#)$yl@0+a#=RD}wPQ4EX~^4J7xgXHVf@F0SW#ZAMv}T_x|u#U#PP)vb;~= zwO-hjj-pP8&p*huT4GnK4W-eVT(=y5tMT7)-@*OdhAzDldbPq@eOi{a+NzBiQDJ5^ zr;z*ycoz10jX=6HgJ=tMYX*bSh~4OieSF);a}$X)AC!MJvY-;0`KlyivtOb;j&uCg zJgsEzwIu)T7bj+HqQ^-NPuxyyRu@m>-53M?82Kg2rd9mg_->E9i$o#BS1N`EI?GeF zFR(NCpYi<^}3BM=Ux})0P^n!_Rb1kSz}~xvuy#hJYyMy zxz1uN8FLz@heb3edj}W~PiF?Zk!x91YCQT&&iL{FuYQClFN$P-o>Wnumz6Ppql3jf z-NsYd!(AJDS+Wu{JL+*lput$jqT4_k1!z}h@`H1~R?$XLNhh-*K znBDR84v5?~E^veM?@Zo>*#Ab!XLH}3ku=UVMNBoX(R@qud@~ufeTS^IHCIa{WIL%^ z(f$S7Co=Q0(@7t$vX!;xvE;V$c6uPQoW*J*6_wa##MOF~p;#IT z9INv9&y2L5KyKWO-B1O~(+s&J>%mU^`Ap{)1ED{^n;dG^DcJd7uv*|P3K(=K!1nqc>%QC zdE(4fkz~!V$(tYnL}5r^pBD|BTN-QA&a>5#5Z6H0q6Z&mImNle(-P~z*|r^q)S1Q} zMccfC5gH9W7v|#^;1+QJ3u2|%qe8sOi}>fxu>XE!lK56SOfvPvUY*PKseI2si*F`h@O_S)jZV)XTC;#X zHeoR@MQ^9GekBdG@t5x7kQjAqO zLG<_x)+P`)vx05Dg)0th_~At{uzn{oPzYrV6oSW)!<_4OhQhr zgAO*M73_dv*HH0j>{PEd{1weE&Df(y9PA@}i^DGkf+eh8Esi(YC}tk0xi~uS0rdH! z{58X`2&mR}3fUW|Puyn_>aIsOm*5N{eeCB7<`IdD@g5`lfa_bKDC&0>^fVp$pa;GK zehB^T^O3#k9`PoX-xGuXRdmWvpn35<_CoJsr|6TicchX)RL*UjPfX%DNR5?f01-*_ z$dBVmbw*Z+74QsKvFgmes&-FRAFSnBjSg40j%G*TBK6gk+<{o;mzby96aFt|mU;Ll zM)Wo0mlT1&bGY9WShByI&>xcXz$ZP$ed!qRw@x>Pogv0 zXF=!AhexNPWixmxlfw}oat~$+>l+-xx+&bvXei-T_Djdk8w+)`;J%*Z`PrMV160(F zzYoFDC9$51Am!uO%_418!J<}%+bPdlEjx0E0#=k+t@%FX6ED^&0gdZ#ef>1B-1JodcMMnQNdfq-Z?$_9Aon_@pd zg>7tv)4o{U@OyOOUg~2l4`pUIi& z+32F;3`Y)(gd@znUw{nz6i&Ctueb{{gZ3W|b-ajNeGxmr-bm)@Teo-+e%lo^U>2Ni zmeMMY{25u6pAp+PZv%41{?!{8+c#|2lHSV}ZGi$<6?&2>Q~Qc z1ZQ!e+&8%PSVnF??hiTYN2uv5uIGK)hgRNw4Qn=?tC(Z_Nsw6UxZhXc;hso9d&4~s zmk;AJguCt;qVIRZ$5sK#o44XoDv!3c`)dOhduG}x+z#Pwkpll==>UH`29MQ;cdEii zrQy1&!EYr-hMmicbH;L5ZT6|N>)qez$s=&JS&8<@v8Shbl-1!sdpg#|B5jN}%>LhI zG53cfjpA4XP>a!s3(|^@9-Nv%j+ldE#+i7UzaSGzAWzJz)NZw}>rS-gMzpWpdS)=6 zp2%!`Cz9xM^t^uE8O)Y5(W;-Yb|-puYsltM>#qtGY3lODd|Sqr!}x6vbDe`MXYnrI z%-z{(@OWGc#fZ>NJT>Ff<}wzejBJEbfM`?d8>$YmbyJGvv*OSQn83RxEVD8+JWfGBt1^9~e1oh+p zSn`3U;QxF+>@N=cMAi<4hr1&oT5`s^oVgR{n1}yoIX>SE{5@;&6F(PX3SzWQfa~AG zhx8F%BRh0$VwoE%Hdo+h+KvBpH~ync{7O4Qx1!JSCFwa{$ay{u@sWLOUykp}9(i97 zTD8XWSp+f&PH&FJj*h=wM{WuhsaUUuQohTAz^pG>G5t;JsRk ze{4GUH-fwDjrD-*E8miInQ*? z_bSH^HVlgZxi&w2XcleQPw5d3JbVX4o@PTzp{dO72r#~IS$(VbZRU*qvI z`*jnR@Ym@48<1J|vsB=lb5-%T%E5Q#;J&)Z6f0X2cA4^|QIIli;6rDgRgo`No|vm= z)YmAe+w=>+7VO;3aMk8u=Zc3WKJ&ZGmz+77NAoj!#-6R#f?edz9m0Ms%{%S{#q>mL z`@Yq1_Og3~h)Wl|PG$fNhEm$XH;+Im($+j^egg9lK74wp|vk43eKbXFlY@(;&uV@&T8$N7PC@5lFh z6i(d?7tH4_S~329XnN6m?2FfySV>Q$!ytUi?fCQ}de{mpr3==AC_ncENpTm}LK$p& z@c~Lg`xlW>X6o5ZMju9g{5j#wb<7;9a%VRTQbNP&6N$1z9 z*itI~6Ood+teF#AMs4+eI(8i)R+0+_z-bT!juTJ$ff&bT_FWTOL?k6Ewl(%e?Bm#b zu?(Us%fS@z*KU?i`L+w}fp56l7WUggWaTgslzsg5jAvrMbGE%K8#zx#Y%xcy;0!y6 z%6!W{mtsXg6(~+5=PbX@G5UW&Dk#fcd3OzX3Vq<>C*k1Mp+dAO&q5z`b9~aHf(tqIC2@a!q7b@irEeUBW)a`Vz(c zH|!#NzZAnR&CM-=cB&2q8J(`ke8;L|d&X3ULd0b@^4tTu>H`&Zh2jRXCV?51ij} z+2Zbe*sn4Bw`7kNd~1)iNJH-|#RBw`fks-6Jt%h0Nc7ZbG}uCF zajeO)lFexUpU9s>*p_MBn;nEsU@NM#D+dj2ZL+qbxkz<*O3jF|SPj#LS>`Y_P$z6Z zD^^~HtNQbF*Wr6Jf*+CXY`3T)c(+C5zXO}AI`5$sGIjvEV>4FMPTuo&z9np|`B-t^ zAg@oL3t~xEqb2f%uEaU$1Ebv8tUm^SWQUxSl2J8irv-AqG<%hSt{#S(8nLE16hAl` z%hHPo{3C3sfu5)rHH}*H`yqNFH{y5opj*lijjtU&#nK55=>n$=hr*{s)1lgQXuL05 z8gN8w&ihF8IPv`6(IA#?P_5mSo1=a1k2dr6EJCyAm z8BJff<9T?oEm!Imb!MDTapuO1scz6=w~!-X=hp)0vU?ccjqpT)=nQ#4_N@FKL=m%R zjvxzu4jS?}834vIm+|D@!;;J*|KQW`WVJ=#{lBfZ4r_8Q7Ok`447RQf`!8eOI|aEj z4NLG%Y|q6ZYMO?nxFW<*jlRB!#eE;PcU~eVae7dfsZ%oP7&95j)rI1}mqLF8^3Y`p@^IGnFt&vF}fj#U?DL-xye_($@x)>+rJG4fMo7bVzTs>a*yPRBXns=-6TK$%?S73!Y7p1zv_zhrylZ z$;@U^vsjh65Z+pYtcb@&gvv!$h?4g^{>}4z6Wim@coMU#htd1(;FDg#J{uS2?IV~Q zwP5LizFB~tS;^BIiQVurvS|pGU4Ld(Mvk-{GK1e{C39oZ->egykCmN;4|_ZFXuanV z$Q0*zLxqD!|02G&{CFbl#@B#1*apwVb1YBu=9+}4UtPQ)otZU^M;oO>H;bT;g?t;w gZ#B}JVO}IY%?k9?YG`RCGl{`yvToQ+smvGt2ZEF)R{#J2 literal 0 HcmV?d00001 diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml index 0a9b957..74c56aa 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml @@ -1,7 +1,9 @@ sds: - name: ML Model Data Input - description: Mono microphone with 16kHz sample rate - frequency: 16000 + name: ML input + description: Mono audio from microphone content: - - value: Mono - type: int16_t + - audio: + sample-frequency: 16000 + bit-depth: 16 + channels: 1 + format: pcm diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_Out.sds.yml b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_Out.sds.yml index 72d220e..75948ba 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_Out.sds.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_Out.sds.yml @@ -1,11 +1,11 @@ sds: - name: ML Model Data Output + name: ML output description: Classification results - frequency: 4.0 + sample-frequency: 4.0 content: - - value: helloworld - type: float - - value: noise - type: float - - value: unknown - type: float + - value: helloworld + type: float + - value: noise + type: float + - value: unknown + type: float diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_In.sds.yml b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_In.sds.yml index 6909a4e..be56e4c 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_In.sds.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_In.sds.yml @@ -1,17 +1,17 @@ sds: name: Test Input Data description: Generated accelerometer samples at 16600 Hz - frequency: 16600 + sample-frequency: 16600 content: - - value: x - type: uint16_t - scale: 0.001 - unit: G - - value: y - type: uint16_t - scale: 0.001 - unit: G - - value: z - type: uint16_t - scale: 0.001 - unit: G + - value: x + type: uint16_t + scale: 0.001 + unit: G + - value: y + type: uint16_t + scale: 0.001 + unit: G + - value: z + type: uint16_t + scale: 0.001 + unit: G diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_Out.sds.yml b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_Out.sds.yml index 2727caa..f1a085b 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_Out.sds.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/SDS Recordings/Test_Out.sds.yml @@ -1,9 +1,9 @@ sds: name: Test Output Data description: Results of algorithm processing - frequency: 1000 + sample-frequency: 1000 content: - - value: x - type: uint16_t - - value: y - type: uint16_t + - value: x + type: uint16_t + - value: y + type: uint16_t diff --git a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_In.sds.yml b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_In.sds.yml index 87dc445..6a09908 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_In.sds.yml +++ b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_In.sds.yml @@ -1,17 +1,17 @@ sds: - name: ML Model Data Input - description: Accelerometer with 3 axes (sampling at 52.0Hz) - frequency: 52.0 + name: ML input + description: Conditioned 3 axes accelerometer data (sampled at 52.0Hz) + sample-frequency: 52.0 content: - - value: x - type: float - scale: 0.1 - unit: G - - value: y - type: float - scale: 0.1 - unit: G - - value: z - type: float - scale: 0.1 - unit: G + - value: x + type: float + scale: 0.1 + unit: G + - value: y + type: float + scale: 0.1 + unit: G + - value: z + type: float + scale: 0.1 + unit: G diff --git a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_Out.sds.yml b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_Out.sds.yml index d1fe1cc..022e7a5 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_Out.sds.yml +++ b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/SDS Recordings/ML_Out.sds.yml @@ -1,13 +1,13 @@ sds: - name: ML Model Data Output + name: ML output description: Classification results - frequency: 0.417 + sample-frequency: 0.417 content: - - value: idle - type: float - - value: snake - type: float - - value: updown - type: float - - value: wave - type: float + - value: idle + type: float + - value: snake + type: float + - value: updown + type: float + - value: wave + type: float diff --git a/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_In.sds.yml b/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_In.sds.yml index 6909a4e..be56e4c 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_In.sds.yml +++ b/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_In.sds.yml @@ -1,17 +1,17 @@ sds: name: Test Input Data description: Generated accelerometer samples at 16600 Hz - frequency: 16600 + sample-frequency: 16600 content: - - value: x - type: uint16_t - scale: 0.001 - unit: G - - value: y - type: uint16_t - scale: 0.001 - unit: G - - value: z - type: uint16_t - scale: 0.001 - unit: G + - value: x + type: uint16_t + scale: 0.001 + unit: G + - value: y + type: uint16_t + scale: 0.001 + unit: G + - value: z + type: uint16_t + scale: 0.001 + unit: G diff --git a/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_Out.sds.yml b/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_Out.sds.yml index 2727caa..f1a085b 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_Out.sds.yml +++ b/ST/B-U585I-IOT02A/MotionRecognition/datatest/SDS Recordings/Test_Out.sds.yml @@ -1,9 +1,9 @@ sds: name: Test Output Data description: Results of algorithm processing - frequency: 1000 + sample-frequency: 1000 content: - - value: x - type: uint16_t - - value: y - type: uint16_t + - value: x + type: uint16_t + - value: y + type: uint16_t From 7c3cb45c5c0f9e924011c7d5dd3032793784b49c Mon Sep 17 00:00:00 2001 From: MiloradCvjetkovic Date: Mon, 13 Jul 2026 12:33:48 +0200 Subject: [PATCH 2/4] Update stream view setting --- Alif/AppKit-E7_USB/algorithm.sdsio.yml | 2 +- Alif/DevKit-E8_ETH/algorithm.sdsio.yml | 2 +- ST/B-U585I-IOT02A/KeywordSpotting/algorithm.sdsio.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Alif/AppKit-E7_USB/algorithm.sdsio.yml b/Alif/AppKit-E7_USB/algorithm.sdsio.yml index 6e9f962..1aac288 100644 --- a/Alif/AppKit-E7_USB/algorithm.sdsio.yml +++ b/Alif/AppKit-E7_USB/algorithm.sdsio.yml @@ -7,7 +7,7 @@ sdsio: # Data stream information used by VS Code extension streams: - name: ML_In - view: video + view: image - name: ML_Out view: signal diff --git a/Alif/DevKit-E8_ETH/algorithm.sdsio.yml b/Alif/DevKit-E8_ETH/algorithm.sdsio.yml index 6e9f962..1aac288 100644 --- a/Alif/DevKit-E8_ETH/algorithm.sdsio.yml +++ b/Alif/DevKit-E8_ETH/algorithm.sdsio.yml @@ -7,7 +7,7 @@ sdsio: # Data stream information used by VS Code extension streams: - name: ML_In - view: video + view: image - name: ML_Out view: signal diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm.sdsio.yml b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm.sdsio.yml index cce8142..ff03682 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm.sdsio.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm.sdsio.yml @@ -7,7 +7,7 @@ sdsio: # Data stream information used by VS Code extension streams: - name: ML_In - view: audio + view: wav - name: ML_Out view: signal From 04b75d6826778a01858e412a9fa293bc01788c44 Mon Sep 17 00:00:00 2001 From: MiloradCvjetkovic Date: Thu, 16 Jul 2026 13:00:11 +0200 Subject: [PATCH 3/4] Update audio sample-frequency setting --- .../KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml index 74c56aa..b6fedec 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/SDS Recordings/ML_In.sds.yml @@ -1,9 +1,9 @@ sds: name: ML input description: Mono audio from microphone + sample-frequency: 16000 content: - audio: - sample-frequency: 16000 bit-depth: 16 channels: 1 format: pcm From 9d7fa2b7b291a1ca3959b63fcc3b4c74961cd1b7 Mon Sep 17 00:00:00 2001 From: MiloradCvjetkovic Date: Mon, 31 Aug 2026 14:49:39 +0200 Subject: [PATCH 4/4] Synchronize with SDS-Framework v3.1.0 --- .../Board/Corstone-300/vsi/python/arm_vsi3.py | 11 ++ .../Board/Corstone-300/vsi/python/sdsio.py | 168 ++++++++++++++---- Alif/AppKit-E7_USB/README.md | 10 +- Alif/AppKit-E7_USB/SDS.csolution.yml | 2 +- Alif/AppKit-E7_USB/algorithm/sds_control.c | 3 +- Alif/AppKit-E7_USB/algorithm/sds_main.c | 6 +- Alif/AppKit-E7_USB/datatest/sds_control.c | 3 +- Alif/AppKit-E7_USB/datatest/sds_main.c | 6 +- .../sdsio/fvp/RTE/SDS/sds_config.h | 4 +- ...g.h.base@3.0.0 => sds_config.h.base@3.1.0} | 4 +- .../sdsio/fvp/sdsio_fvp.clayer.yml | 2 +- .../sdsio/usb/RTE/SDS/sds_config.h | 4 +- ...g.h.base@3.0.0 => sds_config.h.base@3.1.0} | 4 +- .../sdsio/usb/sdsio_usb.clayer.yml | 2 +- .../Board/Corstone-320/vsi/python/arm_vsi3.py | 11 ++ .../Board/Corstone-320/vsi/python/sdsio.py | 168 ++++++++++++++---- Alif/DevKit-E8_ETH/README.md | 10 +- Alif/DevKit-E8_ETH/SDS.csolution.yml | 2 +- Alif/DevKit-E8_ETH/algorithm/sds_control.c | 3 +- Alif/DevKit-E8_ETH/algorithm/sds_main.c | 6 +- Alif/DevKit-E8_ETH/datatest/sds_control.c | 3 +- Alif/DevKit-E8_ETH/datatest/sds_main.c | 6 +- .../sdsio/fvp/RTE/SDS/sds_config.h | 4 +- ...g.h.base@3.0.0 => sds_config.h.base@3.1.0} | 4 +- .../sdsio/fvp/sdsio_fvp.clayer.yml | 2 +- .../sdsio/network/RTE/SDS/sds_config.h | 4 +- ...g.h.base@3.0.0 => sds_config.h.base@3.1.0} | 4 +- .../sdsio/network/sdsio_network.clayer.yml | 2 +- .../Board/Corstone-300/vsi/python/arm_vsi3.py | 11 ++ .../Board/Corstone-300/vsi/python/sdsio.py | 168 ++++++++++++++---- ST/B-U585I-IOT02A/KeywordSpotting/README.md | 10 +- .../KeywordSpotting/SDS.csolution.yml | 2 +- .../KeywordSpotting/algorithm/sds_control.c | 3 +- .../KeywordSpotting/algorithm/sds_main.c | 6 +- .../KeywordSpotting/datatest/sds_control.c | 3 +- .../KeywordSpotting/datatest/sds_main.c | 6 +- .../sdsio/fvp/RTE/SDS/sds_config.h | 4 +- .../sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 | 55 ------ .../sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 | 55 ++++++ .../sdsio/fvp/sdsio_fvp.clayer.yml | 2 +- .../sdsio/usb/RTE/SDS/sds_config.h | 4 +- .../sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 | 55 ------ .../sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 | 55 ++++++ .../sdsio/usb/sdsio_usb.clayer.yml | 2 +- .../Board/Corstone-300/vsi/python/arm_vsi3.py | 11 ++ .../Board/Corstone-300/vsi/python/sdsio.py | 168 ++++++++++++++---- ST/B-U585I-IOT02A/MotionRecognition/README.md | 10 +- .../MotionRecognition/SDS.csolution.yml | 2 +- .../MotionRecognition/algorithm/sds_control.c | 3 +- .../MotionRecognition/algorithm/sds_main.c | 6 +- .../MotionRecognition/datatest/sds_control.c | 3 +- .../MotionRecognition/datatest/sds_main.c | 6 +- .../sdsio/fvp/RTE/SDS/sds_config.h | 4 +- .../sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 | 55 ------ .../sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 | 55 ++++++ .../sdsio/fvp/sdsio_fvp.clayer.yml | 2 +- .../sdsio/usb/RTE/SDS/sds_config.h | 4 +- .../sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 | 55 ------ .../sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 | 55 ++++++ .../sdsio/usb/sdsio_usb.clayer.yml | 2 +- 60 files changed, 888 insertions(+), 452 deletions(-) rename Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/{sds_config.h.base@3.0.0 => sds_config.h.base@3.1.0} (95%) rename Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/{sds_config.h.base@3.0.0 => sds_config.h.base@3.1.0} (95%) rename Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/{sds_config.h.base@3.0.0 => sds_config.h.base@3.1.0} (95%) rename Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/{sds_config.h.base@3.0.0 => sds_config.h.base@3.1.0} (95%) delete mode 100644 ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 create mode 100644 ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 delete mode 100644 ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 create mode 100644 ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 delete mode 100644 ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 create mode 100644 ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 delete mode 100644 ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 create mode 100644 ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 diff --git a/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/arm_vsi3.py b/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/arm_vsi3.py index 22b4d0a..6250c88 100644 --- a/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/arm_vsi3.py +++ b/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/arm_vsi3.py @@ -25,6 +25,7 @@ #More details. import os +import atexit import logging import logging.handlers from os import path @@ -214,6 +215,7 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by Stream = sdsio_manager( work_dir=_work_dir, auto_playback=_auto_playback, + exit_after_playback=True, play_list=_play_list, mon_port=None, write_flush_records=_write_flush_records, @@ -222,6 +224,15 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by control_input_factory=False, ) +# Shutdown SDSIO manager on exit +def shutdown(): + try: + Stream.shutdown() + except Exception: + logger.error("Failed to shutdown SDSIO manager.") + +# Register the shutdown function to be called on exit +atexit.register(shutdown) ## Process command # @param command requested SDSIO command diff --git a/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/sdsio.py b/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/sdsio.py index b5c3809..cefe648 100644 --- a/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/sdsio.py +++ b/Alif/AppKit-E7_USB/Board/Corstone-300/vsi/python/sdsio.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import os import os.path as path import threading @@ -26,7 +27,7 @@ # ---------------------------------------------------------------------------- # # SDSIO server-compatible stream implementation # # ---------------------------------------------------------------------------- # -SDSIO_VSI_VERSION = "3.0.0" +SDSIO_VSI_VERSION = "3.1.0" class StreamInfo(NamedTuple): name: str = None @@ -133,8 +134,12 @@ def __init__(self, auto_playback=False): self._set = SDS_FLAG_MASK_PLAYBACK_MODE | SDS_FLAG_MASK_START self._auto_start_pending = True - def apply(self, set_mask: int, clear_mask: int): + def apply(self, set_mask: int, clear_mask: int, auto_playback: Optional[bool] = None): with self._lock: + if auto_playback is not None: + self._auto_playback = auto_playback + self._auto_start_pending = auto_playback and bool(set_mask & SDS_FLAG_MASK_START) + self._auto_terminate_pending = False self._set = (self._set | set_mask) & ~clear_mask self._clear = (self._clear | clear_mask) & ~set_mask if set_mask & SDS_FLAG_MASK_PLAYBACK_MODE: @@ -166,14 +171,17 @@ def request_auto_playback_start(self) -> bool: self._auto_start_pending = True return True - def request_auto_playback_terminate(self) -> bool: + def request_auto_playback_terminate(self, _force=False) -> bool: with self._lock: if not self._auto_playback: return False - if self._auto_start_pending or self._auto_terminate_pending: - return False - if self._target_flags & SDS_FLAG_MASK_START: + if self._auto_terminate_pending: return False + if not _force: + if self._auto_start_pending: + return False + if self._target_flags & SDS_FLAG_MASK_START: + return False self._set |= SDS_FLAG_MASK_CI_TERMINATE self._clear &= ~SDS_FLAG_MASK_CI_TERMINATE self._auto_terminate_pending = True @@ -216,7 +224,10 @@ def __init__( self, work_dir, auto_playback=False, + exit_after_playback=False, + no_progress_info=False, play_list: Optional[list] = None, + play_step: Optional[int] = None, mon_port: Optional[int] = None, write_flush_records: Optional[int] = None, status_bar_factory=None, @@ -224,7 +235,7 @@ def __init__( control_input_factory=None, ): self._stream_id = 0 - self._play_step_index = 0 + self._play_step = 0 self._rec_index = None # recording session index (None = not yet determined) self._work_dir = path.normpath(work_dir) self._rec_dir = self._work_dir @@ -239,19 +250,23 @@ def __init__( self._read_buffers = {} # sid -> ByteStreamBuffer self._read_threads = {} # sid -> Thread self._read_stop = {} # sid -> Event - # lock to protect stream_id increment and open checks - self._manager_lock = threading.Lock() + # lock to protect playback selection and stream state transitions + self._manager_lock = threading.RLock() # timestamp of last stream read or write command self.time_last_rw = time.time() # status bar self._status = None - if status_bar_factory is None: + if status_bar_factory is None and not no_progress_info: status_bar_factory = StatusBar if status_bar_factory: self._status = status_bar_factory(self) self._playback_mode = False + self._exit_after_playback = exit_after_playback + self._send_ci_terminate_on_shutdown = False self._play_list = play_list + self._play_step_limit = len(play_list) if play_list else None + self._single_play_step_selected = False self._mon_port = mon_port self._write_flush_records = write_flush_records # SDS Control Flags @@ -262,9 +277,9 @@ def __init__( if monitor_factory is None: monitor_factory = sdsMonitorInterface if monitor_factory: - self._monitor = monitor_factory(self._mon_port, self._flags) + self._monitor = monitor_factory(self._mon_port, self._flags, self.select_play_step) self._ctrl_input = None - if control_input_factory is not False: + if control_input_factory is not False and sys.stdin.isatty(): if control_input_factory is None: control_input_factory = sdsControlInput if control_input_factory: @@ -275,6 +290,15 @@ def __init__( self._info_IdleRate: int = 0 self._last_async_time = time.time() self._last_playback_stream_name = None + try: + self._loop = asyncio.get_running_loop() + self._main_task = asyncio.current_task() + except RuntimeError: + self._loop = None + self._main_task = None + if play_step is not None: + if play_step < 0 or not self.select_play_step(play_step): + raise ValueError(f"Invalid play step: {play_step}") def shutdown(self): self.shutdown_requested.set() @@ -459,40 +483,93 @@ def _file_read_worker(self, sid, name, buf: ByteStreamBuffer, stop_evt): finally: buf.set_eof() + def _get_play_step_limit(self): + if not self._play_list: + return None + if self._play_step_limit is None: + return len(self._play_list) + return min(self._play_step_limit, len(self._play_list)) + + def _is_single_play_step_selected(self) -> bool: + return self._single_play_step_selected + + def select_play_step(self, play_step: Optional[int]) -> bool: + with self._manager_lock: + if self.opened_streams: + logger.error("Play step selection failed: streams are currently open.") + return False + if not self._play_list: + logger.error("Play step selection failed: no play steps are configured.") + return False + + if play_step is not None and (play_step < 0 or play_step >= len(self._play_list)): + logger.error(f"Play step selection failed: {play_step} is outside 0-{len(self._play_list) - 1}.") + return False + + if play_step is None: + self._play_step = 0 + self._play_step_limit = len(self._play_list) + self._single_play_step_selected = False + logger.debug(f"Selected all playback steps 0-{len(self._play_list) - 1}.") + else: + self._play_step = play_step + self._play_step_limit = play_step + 1 + self._single_play_step_selected = True + logger.debug(f"Selected playback step {play_step}.") + self._label_list.clear() + self._timestamp_boundaries.clear() + return True + def _create_play_label_list(self, name) -> list[str]: _labels = [] - if self._play_list and self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + _play_step_limit = self._get_play_step_limit() + if self._play_list and self._play_step < _play_step_limit: + _step = self._play_list[self._play_step] _labels = list(_step.get('labels', [])) else: - # No playlist: one file per open, indexed by play_step_index - _candidate = path.join(self._work_dir, f"{name}.{self._play_step_index}.sds") + # No playlist: one file per open, selected by play_step + _candidate = path.join(self._work_dir, f"{name}.{self._play_step}.sds") if path.exists(_candidate): - _labels.append(str(self._play_step_index)) + _labels.append(str(self._play_step)) return _labels def _has_next_auto_playback_step(self) -> bool: if not self._flags.auto_playback or self.opened_streams: return False if self._play_list: - return self._play_step_index < len(self._play_list) + return self._play_step < self._get_play_step_limit() if self._last_playback_stream_name: return bool(self._create_play_label_list(self._last_playback_stream_name)) return False def _request_auto_playback_if_needed(self, target_flags: Optional[int] = None): - _target_flags = self._flags.target_flags if target_flags is None else target_flags - if _target_flags & SDS_FLAG_MASK_START: + with self._manager_lock: + _target_flags = self._flags.target_flags if target_flags is None else target_flags + if _target_flags & SDS_FLAG_MASK_START: + return + if self.opened_streams: + return + if self._has_next_auto_playback_step(): + self._flags.request_auto_playback_start() + elif self._flags.auto_playback and self._last_playback_stream_name: + if self._flags.request_auto_playback_terminate(): + _complete_msg = "Playback complete - no more steps remaining." if self._play_list else "Playback complete." + logger.info(_complete_msg) + self._request_exit_after_playback("playback complete") + + def _request_exit_after_playback(self, _reason: str): + if not self._exit_after_playback: return - if self.opened_streams: - return - if self._has_next_auto_playback_step(): - self._flags.request_auto_playback_start() - elif self._flags.auto_playback and self._last_playback_stream_name: - if self._flags.request_auto_playback_terminate(): - logger.info("Playback complete - no more steps remaining.") - + logger.info(f"SDSIO-Server terminating ({_reason}).") + self._send_ci_terminate_on_shutdown = True + self.shutdown_requested.set() + if self._loop and self._main_task: + self._loop.call_soon_threadsafe(self._main_task.cancel) def _open(self, mode, name): + with self._manager_lock: + return self._open_locked(mode, name) + + def _open_locked(self, mode, name): _cmd = CMD_OPEN # prepare error response _resp_err = bytearray() @@ -523,12 +600,13 @@ def _open(self, mode, name): if self._playback_mode: if not self._label_list: # Get flags, Set working dir + _index_based_playback = False if self._play_list: - if self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + if self._play_step < self._get_play_step_limit(): + _step = self._play_list[self._play_step] _step_desc = _step.get('step', '') _desc_suffix = f": {_step_desc}" if _step_desc else "" - logger.info(f"Playback step {self._play_step_index + 1}/{len(self._play_list)}{_desc_suffix}.") + logger.info(f"Playback step {self._play_step}{_desc_suffix}.") _set_flags = _step.get('setflags', 0) _clear_flags = _step.get('clearflags', 0) _recdir = _step.get('recdir', None) @@ -538,10 +616,13 @@ def _open(self, mode, name): self._rec_dir = self._work_dir else: logger.error(f"Open Failed. End of playlist. No more steps available for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err else: _set_flags = 0 _clear_flags = 0 + _index_based_playback = True if _set_flags or _clear_flags: logger.debug(f"Applying flags for playback stream '{name}': set=0x{_set_flags:08X}, clear=0x{_clear_flags:08X}.") @@ -550,12 +631,16 @@ def _open(self, mode, name): # Create label list _play_label_list = self._create_play_label_list(name) if not _play_label_list: - if not self._play_list and self._play_step_index > 0: + if not self._play_list and self._play_step > 0: logger.error(f"Open Failed. No more files available for playback stream '{name}'.") else: logger.error(f"Open Failed. No files found for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err self._label_list = _play_label_list + if _index_based_playback and self._play_step == 0: + logger.info("No play steps, index based playback started.") else: if mode == 0: @@ -614,6 +699,8 @@ def _open(self, mode, name): for _sds_file_path in _file_paths: if not path.exists(_sds_file_path): logger.error(f"Missing file for playback stream '{name}': {self._format_path(_sds_file_path)}") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err if not self._timestamp_boundaries: @@ -657,6 +744,10 @@ def _open(self, mode, name): return _resp def _close(self, sid): + with self._manager_lock: + return self._close_locked(sid) + + def _close_locked(self, sid): _resp = bytearray() _stream = self.opened_streams[sid] _name = _stream.name @@ -699,7 +790,7 @@ def _close(self, sid): if not self.opened_streams: if self._playback_mode: - self._play_step_index += 1 + self._play_step += 1 self._label_list.clear() self._timestamp_boundaries.clear() self._request_auto_playback_if_needed() @@ -809,7 +900,7 @@ def _info(self, flags: int, idle_rate: int, err_data: bytes): logger.info(f"{idle_rate}% idle.") self._info_IdleRate = idle_rate if err_data: - _status = int.from_bytes(err_data[0:4],'little') + _status = int.from_bytes(err_data[0:4], 'little', signed=True) _line = int.from_bytes(err_data[4:8],'little') _err_mgs = err_data[8:] if _status == 0: @@ -850,9 +941,14 @@ def get_async_response(self): def get_shutdown_flags(self): _resp = bytearray() _cmd = CMD_FLAGS + if self._send_ci_terminate_on_shutdown: + _set_mask = SDS_FLAG_MASK_CI_TERMINATE + else: + _set_mask = 0 + _clear_mask = SDS_FLAG_MASK_ALIVE _resp.extend(_cmd.to_bytes(4,'little')) - _resp.extend((0).to_bytes(4,'little')) - _resp.extend((1 << 28).to_bytes(4,'little')) + _resp.extend(_set_mask.to_bytes(4,'little')) + _resp.extend(_clear_mask.to_bytes(4,'little')) _resp.extend((0).to_bytes(4,'little')) return _resp diff --git a/Alif/AppKit-E7_USB/README.md b/Alif/AppKit-E7_USB/README.md index b3dda58..99180e2 100644 --- a/Alif/AppKit-E7_USB/README.md +++ b/Alif/AppKit-E7_USB/README.md @@ -111,7 +111,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\AppKit-E7_USB SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -174,7 +174,7 @@ The SDS file `Test_Out..p.sds` created during playback should be identical to ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\AppKit-E7_USB SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -279,7 +279,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\AppKit-E7_USB SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -345,7 +345,7 @@ The SDS file `ML_Out..p.sds` created during playback should be identical to t ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\AppKit-E7_USB SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -432,7 +432,7 @@ Detected objects :: [x=109, y=69, w=43, h=58] ```txt Created by ...\Arm-Examples\SDS-Examples\Alif\AppKit-E7_USB\Board\Corstone-300\vsi\python\arm_vsi3.py -SDSIO VSI version 3.0.0 +SDSIO VSI version 3.1.0 SDSIO_FVP environment variable not set. Working directory: ...\Arm-Examples\SDS-Examples\Alif\AppKit-E7_USB\algorithm\SDS Recordings. SDSIO configuration YAML: ...\Arm-Examples\SDS-Examples\Alif\AppKit-E7_USB\algorithm.sdsio.yml. diff --git a/Alif/AppKit-E7_USB/SDS.csolution.yml b/Alif/AppKit-E7_USB/SDS.csolution.yml index cc3f077..42392de 100644 --- a/Alif/AppKit-E7_USB/SDS.csolution.yml +++ b/Alif/AppKit-E7_USB/SDS.csolution.yml @@ -15,7 +15,7 @@ solution: # Refer to https://open-cmsis-pack.github.io/cmsis-toolbox/ReferenceApplications/ for more information packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: AlifSemiconductor::Ensemble@^2.2.0-0 - pack: ARM::V2M_MPS3_SSE_300_BSP@^1.5.0 diff --git a/Alif/AppKit-E7_USB/algorithm/sds_control.c b/Alif/AppKit-E7_USB/algorithm/sds_control.c index 6a11479..60ec0fb 100644 --- a/Alif/AppKit-E7_USB/algorithm/sds_control.c +++ b/Alif/AppKit-E7_USB/algorithm/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/Alif/AppKit-E7_USB/algorithm/sds_main.c b/Alif/AppKit-E7_USB/algorithm/sds_main.c index bdc1e65..27cc504 100644 --- a/Alif/AppKit-E7_USB/algorithm/sds_main.c +++ b/Alif/AppKit-E7_USB/algorithm/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/Alif/AppKit-E7_USB/datatest/sds_control.c b/Alif/AppKit-E7_USB/datatest/sds_control.c index 6a11479..60ec0fb 100644 --- a/Alif/AppKit-E7_USB/datatest/sds_control.c +++ b/Alif/AppKit-E7_USB/datatest/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/Alif/AppKit-E7_USB/datatest/sds_main.c b/Alif/AppKit-E7_USB/datatest/sds_main.c index b2e38c1..32de570 100644 --- a/Alif/AppKit-E7_USB/datatest/sds_main.c +++ b/Alif/AppKit-E7_USB/datatest/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h b/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h +++ b/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 b/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 similarity index 95% rename from Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 rename to Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 index 8d0b50c..ecd50a5 100644 --- a/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 +++ b/Alif/AppKit-E7_USB/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/AppKit-E7_USB/sdsio/fvp/sdsio_fvp.clayer.yml b/Alif/AppKit-E7_USB/sdsio/fvp/sdsio_fvp.clayer.yml index f4634a7..5c2f55a 100644 --- a/Alif/AppKit-E7_USB/sdsio/fvp/sdsio_fvp.clayer.yml +++ b/Alif/AppKit-E7_USB/sdsio/fvp/sdsio_fvp.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using VSI packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 connections: - connect: SDS diff --git a/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h b/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h +++ b/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 b/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 similarity index 95% rename from Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 rename to Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 index 8d0b50c..ecd50a5 100644 --- a/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 +++ b/Alif/AppKit-E7_USB/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/AppKit-E7_USB/sdsio/usb/sdsio_usb.clayer.yml b/Alif/AppKit-E7_USB/sdsio/usb/sdsio_usb.clayer.yml index 23e8729..5b36837 100644 --- a/Alif/AppKit-E7_USB/sdsio/usb/sdsio_usb.clayer.yml +++ b/Alif/AppKit-E7_USB/sdsio/usb/sdsio_usb.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using USB interface to the SDSIO-Server packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: Keil::MDK-Middleware@^8.0.0 connections: diff --git a/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/arm_vsi3.py b/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/arm_vsi3.py index 22b4d0a..6250c88 100644 --- a/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/arm_vsi3.py +++ b/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/arm_vsi3.py @@ -25,6 +25,7 @@ #More details. import os +import atexit import logging import logging.handlers from os import path @@ -214,6 +215,7 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by Stream = sdsio_manager( work_dir=_work_dir, auto_playback=_auto_playback, + exit_after_playback=True, play_list=_play_list, mon_port=None, write_flush_records=_write_flush_records, @@ -222,6 +224,15 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by control_input_factory=False, ) +# Shutdown SDSIO manager on exit +def shutdown(): + try: + Stream.shutdown() + except Exception: + logger.error("Failed to shutdown SDSIO manager.") + +# Register the shutdown function to be called on exit +atexit.register(shutdown) ## Process command # @param command requested SDSIO command diff --git a/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/sdsio.py b/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/sdsio.py index e6d8581..0d18f5d 100644 --- a/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/sdsio.py +++ b/Alif/DevKit-E8_ETH/Board/Corstone-320/vsi/python/sdsio.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import os import os.path as path import threading @@ -26,7 +27,7 @@ # ---------------------------------------------------------------------------- # # SDSIO server-compatible stream implementation # # ---------------------------------------------------------------------------- # -SDSIO_VSI_VERSION = "3.0.0" +SDSIO_VSI_VERSION = "3.1.0" class StreamInfo(NamedTuple): name: str = None @@ -133,8 +134,12 @@ def __init__(self, auto_playback=False): self._set = SDS_FLAG_MASK_PLAYBACK_MODE | SDS_FLAG_MASK_START self._auto_start_pending = True - def apply(self, set_mask: int, clear_mask: int): + def apply(self, set_mask: int, clear_mask: int, auto_playback: Optional[bool] = None): with self._lock: + if auto_playback is not None: + self._auto_playback = auto_playback + self._auto_start_pending = auto_playback and bool(set_mask & SDS_FLAG_MASK_START) + self._auto_terminate_pending = False self._set = (self._set | set_mask) & ~clear_mask self._clear = (self._clear | clear_mask) & ~set_mask if set_mask & SDS_FLAG_MASK_PLAYBACK_MODE: @@ -166,14 +171,17 @@ def request_auto_playback_start(self) -> bool: self._auto_start_pending = True return True - def request_auto_playback_terminate(self) -> bool: + def request_auto_playback_terminate(self, _force=False) -> bool: with self._lock: if not self._auto_playback: return False - if self._auto_start_pending or self._auto_terminate_pending: - return False - if self._target_flags & SDS_FLAG_MASK_START: + if self._auto_terminate_pending: return False + if not _force: + if self._auto_start_pending: + return False + if self._target_flags & SDS_FLAG_MASK_START: + return False self._set |= SDS_FLAG_MASK_CI_TERMINATE self._clear &= ~SDS_FLAG_MASK_CI_TERMINATE self._auto_terminate_pending = True @@ -216,7 +224,10 @@ def __init__( self, work_dir, auto_playback=False, + exit_after_playback=False, + no_progress_info=False, play_list: Optional[list] = None, + play_step: Optional[int] = None, mon_port: Optional[int] = None, write_flush_records: Optional[int] = None, status_bar_factory=None, @@ -224,7 +235,7 @@ def __init__( control_input_factory=None, ): self._stream_id = 0 - self._play_step_index = 0 + self._play_step = 0 self._rec_index = None # recording session index (None = not yet determined) self._work_dir = path.normpath(work_dir) self._rec_dir = self._work_dir @@ -239,19 +250,23 @@ def __init__( self._read_buffers = {} # sid -> ByteStreamBuffer self._read_threads = {} # sid -> Thread self._read_stop = {} # sid -> Event - # lock to protect stream_id increment and open checks - self._manager_lock = threading.Lock() + # lock to protect playback selection and stream state transitions + self._manager_lock = threading.RLock() # timestamp of last stream read or write command self.time_last_rw = time.time() # status bar self._status = None - if status_bar_factory is None: + if status_bar_factory is None and not no_progress_info: status_bar_factory = StatusBar if status_bar_factory: self._status = status_bar_factory(self) self._playback_mode = False + self._exit_after_playback = exit_after_playback + self._send_ci_terminate_on_shutdown = False self._play_list = play_list + self._play_step_limit = len(play_list) if play_list else None + self._single_play_step_selected = False self._mon_port = mon_port self._write_flush_records = write_flush_records # SDS Control Flags @@ -262,9 +277,9 @@ def __init__( if monitor_factory is None: monitor_factory = sdsMonitorInterface if monitor_factory: - self._monitor = monitor_factory(self._mon_port, self._flags) + self._monitor = monitor_factory(self._mon_port, self._flags, self.select_play_step) self._ctrl_input = None - if control_input_factory is not False: + if control_input_factory is not False and sys.stdin.isatty(): if control_input_factory is None: control_input_factory = sdsControlInput if control_input_factory: @@ -275,6 +290,15 @@ def __init__( self._info_IdleRate: int = 0 self._last_async_time = time.time() self._last_playback_stream_name = None + try: + self._loop = asyncio.get_running_loop() + self._main_task = asyncio.current_task() + except RuntimeError: + self._loop = None + self._main_task = None + if play_step is not None: + if play_step < 0 or not self.select_play_step(play_step): + raise ValueError(f"Invalid play step: {play_step}") def shutdown(self): self.shutdown_requested.set() @@ -459,40 +483,93 @@ def _file_read_worker(self, sid, name, buf: ByteStreamBuffer, stop_evt): finally: buf.set_eof() + def _get_play_step_limit(self): + if not self._play_list: + return None + if self._play_step_limit is None: + return len(self._play_list) + return min(self._play_step_limit, len(self._play_list)) + + def _is_single_play_step_selected(self) -> bool: + return self._single_play_step_selected + + def select_play_step(self, play_step: Optional[int]) -> bool: + with self._manager_lock: + if self.opened_streams: + logger.error("Play step selection failed: streams are currently open.") + return False + if not self._play_list: + logger.error("Play step selection failed: no play steps are configured.") + return False + + if play_step is not None and (play_step < 0 or play_step >= len(self._play_list)): + logger.error(f"Play step selection failed: {play_step} is outside 0-{len(self._play_list) - 1}.") + return False + + if play_step is None: + self._play_step = 0 + self._play_step_limit = len(self._play_list) + self._single_play_step_selected = False + logger.debug(f"Selected all playback steps 0-{len(self._play_list) - 1}.") + else: + self._play_step = play_step + self._play_step_limit = play_step + 1 + self._single_play_step_selected = True + logger.debug(f"Selected playback step {play_step}.") + self._label_list.clear() + self._timestamp_boundaries.clear() + return True + def _create_play_label_list(self, name) -> list[str]: _labels = [] - if self._play_list and self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + _play_step_limit = self._get_play_step_limit() + if self._play_list and self._play_step < _play_step_limit: + _step = self._play_list[self._play_step] _labels = list(_step.get('labels', [])) else: - # No playlist: one file per open, indexed by play_step_index - _candidate = path.join(self._work_dir, f"{name}.{self._play_step_index}.sds") + # No playlist: one file per open, selected by play_step + _candidate = path.join(self._work_dir, f"{name}.{self._play_step}.sds") if path.exists(_candidate): - _labels.append(str(self._play_step_index)) + _labels.append(str(self._play_step)) return _labels def _has_next_auto_playback_step(self) -> bool: if not self._flags.auto_playback or self.opened_streams: return False if self._play_list: - return self._play_step_index < len(self._play_list) + return self._play_step < self._get_play_step_limit() if self._last_playback_stream_name: return bool(self._create_play_label_list(self._last_playback_stream_name)) return False def _request_auto_playback_if_needed(self, target_flags: Optional[int] = None): - _target_flags = self._flags.target_flags if target_flags is None else target_flags - if _target_flags & SDS_FLAG_MASK_START: + with self._manager_lock: + _target_flags = self._flags.target_flags if target_flags is None else target_flags + if _target_flags & SDS_FLAG_MASK_START: + return + if self.opened_streams: + return + if self._has_next_auto_playback_step(): + self._flags.request_auto_playback_start() + elif self._flags.auto_playback and self._last_playback_stream_name: + if self._flags.request_auto_playback_terminate(): + _complete_msg = "Playback complete - no more steps remaining." if self._play_list else "Playback complete." + logger.info(_complete_msg) + self._request_exit_after_playback("playback complete") + + def _request_exit_after_playback(self, _reason: str): + if not self._exit_after_playback: return - if self.opened_streams: - return - if self._has_next_auto_playback_step(): - self._flags.request_auto_playback_start() - elif self._flags.auto_playback and self._last_playback_stream_name: - if self._flags.request_auto_playback_terminate(): - logger.info("Playback complete - no more steps remaining.") - + logger.info(f"SDSIO-Server terminating ({_reason}).") + self._send_ci_terminate_on_shutdown = True + self.shutdown_requested.set() + if self._loop and self._main_task: + self._loop.call_soon_threadsafe(self._main_task.cancel) def _open(self, mode, name): + with self._manager_lock: + return self._open_locked(mode, name) + + def _open_locked(self, mode, name): _cmd = CMD_OPEN # prepare error response _resp_err = bytearray() @@ -523,12 +600,13 @@ def _open(self, mode, name): if self._playback_mode: if not self._label_list: # Get flags, Set working dir + _index_based_playback = False if self._play_list: - if self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + if self._play_step < self._get_play_step_limit(): + _step = self._play_list[self._play_step] _step_desc = _step.get('step', '') _desc_suffix = f": {_step_desc}" if _step_desc else "" - logger.info(f"Playback step {self._play_step_index + 1}/{len(self._play_list)}{_desc_suffix}.") + logger.info(f"Playback step {self._play_step}{_desc_suffix}.") _set_flags = _step.get('setflags', 0) _clear_flags = _step.get('clearflags', 0) _recdir = _step.get('recdir', None) @@ -538,10 +616,13 @@ def _open(self, mode, name): self._rec_dir = self._work_dir else: logger.error(f"Open Failed. End of playlist. No more steps available for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err else: _set_flags = 0 _clear_flags = 0 + _index_based_playback = True if _set_flags or _clear_flags: logger.debug(f"Applying flags for playback stream '{name}': set=0x{_set_flags:08X}, clear=0x{_clear_flags:08X}.") @@ -550,12 +631,16 @@ def _open(self, mode, name): # Create label list _play_label_list = self._create_play_label_list(name) if not _play_label_list: - if not self._play_list and self._play_step_index > 0: + if not self._play_list and self._play_step > 0: logger.error(f"Open Failed. No more files available for playback stream '{name}'.") else: logger.error(f"Open Failed. No files found for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err self._label_list = _play_label_list + if _index_based_playback and self._play_step == 0: + logger.info("No play steps, index based playback started.") else: if mode == 0: @@ -614,6 +699,8 @@ def _open(self, mode, name): for _sds_file_path in _file_paths: if not path.exists(_sds_file_path): logger.error(f"Missing file for playback stream '{name}': {self._format_path(_sds_file_path)}") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err if not self._timestamp_boundaries: @@ -657,6 +744,10 @@ def _open(self, mode, name): return _resp def _close(self, sid): + with self._manager_lock: + return self._close_locked(sid) + + def _close_locked(self, sid): _resp = bytearray() _stream = self.opened_streams[sid] _name = _stream.name @@ -699,7 +790,7 @@ def _close(self, sid): if not self.opened_streams: if self._playback_mode: - self._play_step_index += 1 + self._play_step += 1 self._label_list.clear() self._timestamp_boundaries.clear() self._request_auto_playback_if_needed() @@ -809,7 +900,7 @@ def _info(self, flags: int, idle_rate: int, err_data: bytes): logger.info(f"{idle_rate}% idle.") self._info_IdleRate = idle_rate if err_data: - _status = int.from_bytes(err_data[0:4],'little') + _status = int.from_bytes(err_data[0:4], 'little', signed=True) _line = int.from_bytes(err_data[4:8],'little') _err_mgs = err_data[8:] if _status == 0: @@ -850,9 +941,14 @@ def get_async_response(self): def get_shutdown_flags(self): _resp = bytearray() _cmd = CMD_FLAGS + if self._send_ci_terminate_on_shutdown: + _set_mask = SDS_FLAG_MASK_CI_TERMINATE + else: + _set_mask = 0 + _clear_mask = SDS_FLAG_MASK_ALIVE _resp.extend(_cmd.to_bytes(4,'little')) - _resp.extend((0).to_bytes(4,'little')) - _resp.extend((1 << 28).to_bytes(4,'little')) + _resp.extend(_set_mask.to_bytes(4,'little')) + _resp.extend(_clear_mask.to_bytes(4,'little')) _resp.extend((0).to_bytes(4,'little')) return _resp diff --git a/Alif/DevKit-E8_ETH/README.md b/Alif/DevKit-E8_ETH/README.md index 0ff9857..4233136 100644 --- a/Alif/DevKit-E8_ETH/README.md +++ b/Alif/DevKit-E8_ETH/README.md @@ -124,7 +124,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server socket -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\DevKit-E8_ETH SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -187,7 +187,7 @@ The SDS file `Test_Out..p.sds` created during playback should be identical to ```txt >sdsio-server socket -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\DevKit-E8_ETH SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -294,7 +294,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server socket -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\DevKit-E8_ETH SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -360,7 +360,7 @@ The SDS file `ML_Out..p.sds` created during playback should be identical to t ```txt >sdsio-server socket -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\Alif\DevKit-E8_ETH SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -446,7 +446,7 @@ Detected objects :: [x=109, y=69, w=43, h=58] ```txt Created by ...\Arm-Examples\SDS-Examples\Alif\DevKit-E8_ETH\Board\Corstone-320\vsi\python\arm_vsi3.py -SDSIO VSI version 3.0.0 +SDSIO VSI version 3.1.0 SDSIO_FVP environment variable not set. Working directory: ...\Arm-Examples\SDS-Examples\Alif\DevKit-E8_ETH\algorithm\SDS Recordings. SDSIO configuration YAML: ...\Arm-Examples\SDS-Examples\Alif\DevKit-E8_ETH\algorithm.sdsio.yml. diff --git a/Alif/DevKit-E8_ETH/SDS.csolution.yml b/Alif/DevKit-E8_ETH/SDS.csolution.yml index 12b971a..0bb1a6c 100644 --- a/Alif/DevKit-E8_ETH/SDS.csolution.yml +++ b/Alif/DevKit-E8_ETH/SDS.csolution.yml @@ -15,7 +15,7 @@ solution: # Refer to https://open-cmsis-pack.github.io/cmsis-toolbox/ReferenceApplications/ for more information packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: AlifSemiconductor::Ensemble@^2.2.0-0 - pack: ARM::SSE_320_BSP@1.1.0 diff --git a/Alif/DevKit-E8_ETH/algorithm/sds_control.c b/Alif/DevKit-E8_ETH/algorithm/sds_control.c index 6a11479..60ec0fb 100644 --- a/Alif/DevKit-E8_ETH/algorithm/sds_control.c +++ b/Alif/DevKit-E8_ETH/algorithm/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/Alif/DevKit-E8_ETH/algorithm/sds_main.c b/Alif/DevKit-E8_ETH/algorithm/sds_main.c index 325cc77..48ba2d7 100644 --- a/Alif/DevKit-E8_ETH/algorithm/sds_main.c +++ b/Alif/DevKit-E8_ETH/algorithm/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/Alif/DevKit-E8_ETH/datatest/sds_control.c b/Alif/DevKit-E8_ETH/datatest/sds_control.c index 6a11479..60ec0fb 100644 --- a/Alif/DevKit-E8_ETH/datatest/sds_control.c +++ b/Alif/DevKit-E8_ETH/datatest/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/Alif/DevKit-E8_ETH/datatest/sds_main.c b/Alif/DevKit-E8_ETH/datatest/sds_main.c index e9eb3fc..60c61fc 100644 --- a/Alif/DevKit-E8_ETH/datatest/sds_main.c +++ b/Alif/DevKit-E8_ETH/datatest/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h b/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h +++ b/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 b/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 similarity index 95% rename from Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 rename to Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 index 8d0b50c..ecd50a5 100644 --- a/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 +++ b/Alif/DevKit-E8_ETH/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/DevKit-E8_ETH/sdsio/fvp/sdsio_fvp.clayer.yml b/Alif/DevKit-E8_ETH/sdsio/fvp/sdsio_fvp.clayer.yml index f4634a7..5c2f55a 100644 --- a/Alif/DevKit-E8_ETH/sdsio/fvp/sdsio_fvp.clayer.yml +++ b/Alif/DevKit-E8_ETH/sdsio/fvp/sdsio_fvp.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using VSI packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 connections: - connect: SDS diff --git a/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h b/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h +++ b/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h.base@3.0.0 b/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h.base@3.1.0 similarity index 95% rename from Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h.base@3.0.0 rename to Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h.base@3.1.0 index 8d0b50c..ecd50a5 100644 --- a/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h.base@3.0.0 +++ b/Alif/DevKit-E8_ETH/sdsio/network/RTE/SDS/sds_config.h.base@3.1.0 @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/Alif/DevKit-E8_ETH/sdsio/network/sdsio_network.clayer.yml b/Alif/DevKit-E8_ETH/sdsio/network/sdsio_network.clayer.yml index dd6b6d9..d4b51e5 100644 --- a/Alif/DevKit-E8_ETH/sdsio/network/sdsio_network.clayer.yml +++ b/Alif/DevKit-E8_ETH/sdsio/network/sdsio_network.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using Ethernet interface to the SDSIO-Server packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: MDK-Packs::IoT_Socket@^1.4.0 - pack: Keil::MDK-Middleware@^8.0.0 diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/arm_vsi3.py b/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/arm_vsi3.py index 22b4d0a..6250c88 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/arm_vsi3.py +++ b/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/arm_vsi3.py @@ -25,6 +25,7 @@ #More details. import os +import atexit import logging import logging.handlers from os import path @@ -214,6 +215,7 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by Stream = sdsio_manager( work_dir=_work_dir, auto_playback=_auto_playback, + exit_after_playback=True, play_list=_play_list, mon_port=None, write_flush_records=_write_flush_records, @@ -222,6 +224,15 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by control_input_factory=False, ) +# Shutdown SDSIO manager on exit +def shutdown(): + try: + Stream.shutdown() + except Exception: + logger.error("Failed to shutdown SDSIO manager.") + +# Register the shutdown function to be called on exit +atexit.register(shutdown) ## Process command # @param command requested SDSIO command diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/sdsio.py b/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/sdsio.py index b5c3809..cefe648 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/sdsio.py +++ b/ST/B-U585I-IOT02A/KeywordSpotting/Board/Corstone-300/vsi/python/sdsio.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import os import os.path as path import threading @@ -26,7 +27,7 @@ # ---------------------------------------------------------------------------- # # SDSIO server-compatible stream implementation # # ---------------------------------------------------------------------------- # -SDSIO_VSI_VERSION = "3.0.0" +SDSIO_VSI_VERSION = "3.1.0" class StreamInfo(NamedTuple): name: str = None @@ -133,8 +134,12 @@ def __init__(self, auto_playback=False): self._set = SDS_FLAG_MASK_PLAYBACK_MODE | SDS_FLAG_MASK_START self._auto_start_pending = True - def apply(self, set_mask: int, clear_mask: int): + def apply(self, set_mask: int, clear_mask: int, auto_playback: Optional[bool] = None): with self._lock: + if auto_playback is not None: + self._auto_playback = auto_playback + self._auto_start_pending = auto_playback and bool(set_mask & SDS_FLAG_MASK_START) + self._auto_terminate_pending = False self._set = (self._set | set_mask) & ~clear_mask self._clear = (self._clear | clear_mask) & ~set_mask if set_mask & SDS_FLAG_MASK_PLAYBACK_MODE: @@ -166,14 +171,17 @@ def request_auto_playback_start(self) -> bool: self._auto_start_pending = True return True - def request_auto_playback_terminate(self) -> bool: + def request_auto_playback_terminate(self, _force=False) -> bool: with self._lock: if not self._auto_playback: return False - if self._auto_start_pending or self._auto_terminate_pending: - return False - if self._target_flags & SDS_FLAG_MASK_START: + if self._auto_terminate_pending: return False + if not _force: + if self._auto_start_pending: + return False + if self._target_flags & SDS_FLAG_MASK_START: + return False self._set |= SDS_FLAG_MASK_CI_TERMINATE self._clear &= ~SDS_FLAG_MASK_CI_TERMINATE self._auto_terminate_pending = True @@ -216,7 +224,10 @@ def __init__( self, work_dir, auto_playback=False, + exit_after_playback=False, + no_progress_info=False, play_list: Optional[list] = None, + play_step: Optional[int] = None, mon_port: Optional[int] = None, write_flush_records: Optional[int] = None, status_bar_factory=None, @@ -224,7 +235,7 @@ def __init__( control_input_factory=None, ): self._stream_id = 0 - self._play_step_index = 0 + self._play_step = 0 self._rec_index = None # recording session index (None = not yet determined) self._work_dir = path.normpath(work_dir) self._rec_dir = self._work_dir @@ -239,19 +250,23 @@ def __init__( self._read_buffers = {} # sid -> ByteStreamBuffer self._read_threads = {} # sid -> Thread self._read_stop = {} # sid -> Event - # lock to protect stream_id increment and open checks - self._manager_lock = threading.Lock() + # lock to protect playback selection and stream state transitions + self._manager_lock = threading.RLock() # timestamp of last stream read or write command self.time_last_rw = time.time() # status bar self._status = None - if status_bar_factory is None: + if status_bar_factory is None and not no_progress_info: status_bar_factory = StatusBar if status_bar_factory: self._status = status_bar_factory(self) self._playback_mode = False + self._exit_after_playback = exit_after_playback + self._send_ci_terminate_on_shutdown = False self._play_list = play_list + self._play_step_limit = len(play_list) if play_list else None + self._single_play_step_selected = False self._mon_port = mon_port self._write_flush_records = write_flush_records # SDS Control Flags @@ -262,9 +277,9 @@ def __init__( if monitor_factory is None: monitor_factory = sdsMonitorInterface if monitor_factory: - self._monitor = monitor_factory(self._mon_port, self._flags) + self._monitor = monitor_factory(self._mon_port, self._flags, self.select_play_step) self._ctrl_input = None - if control_input_factory is not False: + if control_input_factory is not False and sys.stdin.isatty(): if control_input_factory is None: control_input_factory = sdsControlInput if control_input_factory: @@ -275,6 +290,15 @@ def __init__( self._info_IdleRate: int = 0 self._last_async_time = time.time() self._last_playback_stream_name = None + try: + self._loop = asyncio.get_running_loop() + self._main_task = asyncio.current_task() + except RuntimeError: + self._loop = None + self._main_task = None + if play_step is not None: + if play_step < 0 or not self.select_play_step(play_step): + raise ValueError(f"Invalid play step: {play_step}") def shutdown(self): self.shutdown_requested.set() @@ -459,40 +483,93 @@ def _file_read_worker(self, sid, name, buf: ByteStreamBuffer, stop_evt): finally: buf.set_eof() + def _get_play_step_limit(self): + if not self._play_list: + return None + if self._play_step_limit is None: + return len(self._play_list) + return min(self._play_step_limit, len(self._play_list)) + + def _is_single_play_step_selected(self) -> bool: + return self._single_play_step_selected + + def select_play_step(self, play_step: Optional[int]) -> bool: + with self._manager_lock: + if self.opened_streams: + logger.error("Play step selection failed: streams are currently open.") + return False + if not self._play_list: + logger.error("Play step selection failed: no play steps are configured.") + return False + + if play_step is not None and (play_step < 0 or play_step >= len(self._play_list)): + logger.error(f"Play step selection failed: {play_step} is outside 0-{len(self._play_list) - 1}.") + return False + + if play_step is None: + self._play_step = 0 + self._play_step_limit = len(self._play_list) + self._single_play_step_selected = False + logger.debug(f"Selected all playback steps 0-{len(self._play_list) - 1}.") + else: + self._play_step = play_step + self._play_step_limit = play_step + 1 + self._single_play_step_selected = True + logger.debug(f"Selected playback step {play_step}.") + self._label_list.clear() + self._timestamp_boundaries.clear() + return True + def _create_play_label_list(self, name) -> list[str]: _labels = [] - if self._play_list and self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + _play_step_limit = self._get_play_step_limit() + if self._play_list and self._play_step < _play_step_limit: + _step = self._play_list[self._play_step] _labels = list(_step.get('labels', [])) else: - # No playlist: one file per open, indexed by play_step_index - _candidate = path.join(self._work_dir, f"{name}.{self._play_step_index}.sds") + # No playlist: one file per open, selected by play_step + _candidate = path.join(self._work_dir, f"{name}.{self._play_step}.sds") if path.exists(_candidate): - _labels.append(str(self._play_step_index)) + _labels.append(str(self._play_step)) return _labels def _has_next_auto_playback_step(self) -> bool: if not self._flags.auto_playback or self.opened_streams: return False if self._play_list: - return self._play_step_index < len(self._play_list) + return self._play_step < self._get_play_step_limit() if self._last_playback_stream_name: return bool(self._create_play_label_list(self._last_playback_stream_name)) return False def _request_auto_playback_if_needed(self, target_flags: Optional[int] = None): - _target_flags = self._flags.target_flags if target_flags is None else target_flags - if _target_flags & SDS_FLAG_MASK_START: + with self._manager_lock: + _target_flags = self._flags.target_flags if target_flags is None else target_flags + if _target_flags & SDS_FLAG_MASK_START: + return + if self.opened_streams: + return + if self._has_next_auto_playback_step(): + self._flags.request_auto_playback_start() + elif self._flags.auto_playback and self._last_playback_stream_name: + if self._flags.request_auto_playback_terminate(): + _complete_msg = "Playback complete - no more steps remaining." if self._play_list else "Playback complete." + logger.info(_complete_msg) + self._request_exit_after_playback("playback complete") + + def _request_exit_after_playback(self, _reason: str): + if not self._exit_after_playback: return - if self.opened_streams: - return - if self._has_next_auto_playback_step(): - self._flags.request_auto_playback_start() - elif self._flags.auto_playback and self._last_playback_stream_name: - if self._flags.request_auto_playback_terminate(): - logger.info("Playback complete - no more steps remaining.") - + logger.info(f"SDSIO-Server terminating ({_reason}).") + self._send_ci_terminate_on_shutdown = True + self.shutdown_requested.set() + if self._loop and self._main_task: + self._loop.call_soon_threadsafe(self._main_task.cancel) def _open(self, mode, name): + with self._manager_lock: + return self._open_locked(mode, name) + + def _open_locked(self, mode, name): _cmd = CMD_OPEN # prepare error response _resp_err = bytearray() @@ -523,12 +600,13 @@ def _open(self, mode, name): if self._playback_mode: if not self._label_list: # Get flags, Set working dir + _index_based_playback = False if self._play_list: - if self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + if self._play_step < self._get_play_step_limit(): + _step = self._play_list[self._play_step] _step_desc = _step.get('step', '') _desc_suffix = f": {_step_desc}" if _step_desc else "" - logger.info(f"Playback step {self._play_step_index + 1}/{len(self._play_list)}{_desc_suffix}.") + logger.info(f"Playback step {self._play_step}{_desc_suffix}.") _set_flags = _step.get('setflags', 0) _clear_flags = _step.get('clearflags', 0) _recdir = _step.get('recdir', None) @@ -538,10 +616,13 @@ def _open(self, mode, name): self._rec_dir = self._work_dir else: logger.error(f"Open Failed. End of playlist. No more steps available for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err else: _set_flags = 0 _clear_flags = 0 + _index_based_playback = True if _set_flags or _clear_flags: logger.debug(f"Applying flags for playback stream '{name}': set=0x{_set_flags:08X}, clear=0x{_clear_flags:08X}.") @@ -550,12 +631,16 @@ def _open(self, mode, name): # Create label list _play_label_list = self._create_play_label_list(name) if not _play_label_list: - if not self._play_list and self._play_step_index > 0: + if not self._play_list and self._play_step > 0: logger.error(f"Open Failed. No more files available for playback stream '{name}'.") else: logger.error(f"Open Failed. No files found for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err self._label_list = _play_label_list + if _index_based_playback and self._play_step == 0: + logger.info("No play steps, index based playback started.") else: if mode == 0: @@ -614,6 +699,8 @@ def _open(self, mode, name): for _sds_file_path in _file_paths: if not path.exists(_sds_file_path): logger.error(f"Missing file for playback stream '{name}': {self._format_path(_sds_file_path)}") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err if not self._timestamp_boundaries: @@ -657,6 +744,10 @@ def _open(self, mode, name): return _resp def _close(self, sid): + with self._manager_lock: + return self._close_locked(sid) + + def _close_locked(self, sid): _resp = bytearray() _stream = self.opened_streams[sid] _name = _stream.name @@ -699,7 +790,7 @@ def _close(self, sid): if not self.opened_streams: if self._playback_mode: - self._play_step_index += 1 + self._play_step += 1 self._label_list.clear() self._timestamp_boundaries.clear() self._request_auto_playback_if_needed() @@ -809,7 +900,7 @@ def _info(self, flags: int, idle_rate: int, err_data: bytes): logger.info(f"{idle_rate}% idle.") self._info_IdleRate = idle_rate if err_data: - _status = int.from_bytes(err_data[0:4],'little') + _status = int.from_bytes(err_data[0:4], 'little', signed=True) _line = int.from_bytes(err_data[4:8],'little') _err_mgs = err_data[8:] if _status == 0: @@ -850,9 +941,14 @@ def get_async_response(self): def get_shutdown_flags(self): _resp = bytearray() _cmd = CMD_FLAGS + if self._send_ci_terminate_on_shutdown: + _set_mask = SDS_FLAG_MASK_CI_TERMINATE + else: + _set_mask = 0 + _clear_mask = SDS_FLAG_MASK_ALIVE _resp.extend(_cmd.to_bytes(4,'little')) - _resp.extend((0).to_bytes(4,'little')) - _resp.extend((1 << 28).to_bytes(4,'little')) + _resp.extend(_set_mask.to_bytes(4,'little')) + _resp.extend(_clear_mask.to_bytes(4,'little')) _resp.extend((0).to_bytes(4,'little')) return _resp diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/README.md b/ST/B-U585I-IOT02A/KeywordSpotting/README.md index 9aa7272..f907abc 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/README.md +++ b/ST/B-U585I-IOT02A/KeywordSpotting/README.md @@ -118,7 +118,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\KeywordSpotting SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -183,7 +183,7 @@ The SDS file `Test_Out..p.sds` created during playback should be identical to ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\KeywordSpotting SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -288,7 +288,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\KeywordSpotting SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -348,7 +348,7 @@ The SDS file `ML_Out..p.sds` created during playback should be identical to t ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\KeywordSpotting SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -427,7 +427,7 @@ SDSIO VSI interface initialized successfully ```txt Created by ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\KeywordSpotting\Board\Corstone-300\vsi\python\arm_vsi3.py -SDSIO VSI version 3.0.0 +SDSIO VSI version 3.1.0 SDSIO_FVP environment variable not set. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\KeywordSpotting\algorithm\SDS Recordings. SDSIO configuration YAML: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\KeywordSpotting\algorithm.sdsio.yml. diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/SDS.csolution.yml b/ST/B-U585I-IOT02A/KeywordSpotting/SDS.csolution.yml index a500dce..f69536c 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/SDS.csolution.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/SDS.csolution.yml @@ -15,7 +15,7 @@ solution: # Refer to https://open-cmsis-pack.github.io/cmsis-toolbox/ReferenceApplications/ for more information packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: Keil::B-U585I-IOT02A_BSP - pack: Keil::STM32U5xx_DFP - pack: ARM::V2M_MPS3_SSE_300_BSP@^1.5.0 diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_control.c b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_control.c index 6a11479..60ec0fb 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_control.c +++ b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_main.c b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_main.c index df1855d..50ac5fc 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_main.c +++ b/ST/B-U585I-IOT02A/KeywordSpotting/algorithm/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_control.c b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_control.c index 6a11479..60ec0fb 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_control.c +++ b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_main.c b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_main.c index b2e38c1..32de570 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_main.c +++ b/ST/B-U585I-IOT02A/KeywordSpotting/datatest/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h +++ b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 deleted file mode 100644 index 8d0b50c..0000000 --- a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2025-2026 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: sds_config.h - * Purpose: SDS configuration options - * Rev.: V3.0.0 - */ - -//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- - -// SDS System Configuration - -// Maximum concurrent streams <1-31> -// Default: 16 -#define SDS_MAX_STREAMS 16U - -// Internal buffer size for I/O transfers -// Default: 8192 -#define SDS_BUF_SIZE 8192U - -// - -//------------- <<< end of configuration section >>> --------------------------- - -// SDS system thread stack size -#define SDS_THREAD_STACK_SIZE 1024 - -// SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal - -// SDS stream open timeout in kernel ticks -#define SDS_OPEN_TIMEOUT 3000U - -// SDS stream close timeout in kernel ticks -#define SDS_CLOSE_TIMEOUT 3000U - -// Optimal I/O transfer size (read/write) -// Default: 8192 -// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) -// to ensure efficient read/write performance -#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 new file mode 100644 index 0000000..ecd50a5 --- /dev/null +++ b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025-2026 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Name: sds_config.h + * Purpose: SDS configuration options + * Rev.: V3.1.0 + */ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +// SDS System Configuration + +// Maximum concurrent streams <1-31> +// Default: 16 +#define SDS_MAX_STREAMS 16U + +// Internal buffer size for I/O transfers +// Default: 8192 +#define SDS_BUF_SIZE 8192U + +// + +//------------- <<< end of configuration section >>> --------------------------- + +// SDS system thread stack size +#define SDS_THREAD_STACK_SIZE 1024 + +// SDS system thread priority +#define SDS_THREAD_PRIORITY osPriorityNormal1 + +// SDS stream open timeout in kernel ticks +#define SDS_OPEN_TIMEOUT 3000U + +// SDS stream close timeout in kernel ticks +#define SDS_CLOSE_TIMEOUT 3000U + +// Optimal I/O transfer size (read/write) +// Default: 8192 +// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) +// to ensure efficient read/write performance +#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/sdsio_fvp.clayer.yml b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/sdsio_fvp.clayer.yml index f4634a7..5c2f55a 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/sdsio_fvp.clayer.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/fvp/sdsio_fvp.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using VSI packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 connections: - connect: SDS diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h +++ b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 deleted file mode 100644 index 8d0b50c..0000000 --- a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2025-2026 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: sds_config.h - * Purpose: SDS configuration options - * Rev.: V3.0.0 - */ - -//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- - -// SDS System Configuration - -// Maximum concurrent streams <1-31> -// Default: 16 -#define SDS_MAX_STREAMS 16U - -// Internal buffer size for I/O transfers -// Default: 8192 -#define SDS_BUF_SIZE 8192U - -// - -//------------- <<< end of configuration section >>> --------------------------- - -// SDS system thread stack size -#define SDS_THREAD_STACK_SIZE 1024 - -// SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal - -// SDS stream open timeout in kernel ticks -#define SDS_OPEN_TIMEOUT 3000U - -// SDS stream close timeout in kernel ticks -#define SDS_CLOSE_TIMEOUT 3000U - -// Optimal I/O transfer size (read/write) -// Default: 8192 -// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) -// to ensure efficient read/write performance -#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 new file mode 100644 index 0000000..ecd50a5 --- /dev/null +++ b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025-2026 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Name: sds_config.h + * Purpose: SDS configuration options + * Rev.: V3.1.0 + */ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +// SDS System Configuration + +// Maximum concurrent streams <1-31> +// Default: 16 +#define SDS_MAX_STREAMS 16U + +// Internal buffer size for I/O transfers +// Default: 8192 +#define SDS_BUF_SIZE 8192U + +// + +//------------- <<< end of configuration section >>> --------------------------- + +// SDS system thread stack size +#define SDS_THREAD_STACK_SIZE 1024 + +// SDS system thread priority +#define SDS_THREAD_PRIORITY osPriorityNormal1 + +// SDS stream open timeout in kernel ticks +#define SDS_OPEN_TIMEOUT 3000U + +// SDS stream close timeout in kernel ticks +#define SDS_CLOSE_TIMEOUT 3000U + +// Optimal I/O transfer size (read/write) +// Default: 8192 +// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) +// to ensure efficient read/write performance +#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/sdsio_usb.clayer.yml b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/sdsio_usb.clayer.yml index 23e8729..5b36837 100644 --- a/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/sdsio_usb.clayer.yml +++ b/ST/B-U585I-IOT02A/KeywordSpotting/sdsio/usb/sdsio_usb.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using USB interface to the SDSIO-Server packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: Keil::MDK-Middleware@^8.0.0 connections: diff --git a/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/arm_vsi3.py b/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/arm_vsi3.py index 144ab12..c1df180 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/arm_vsi3.py +++ b/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/arm_vsi3.py @@ -25,6 +25,7 @@ #More details. import os +import atexit import logging import logging.handlers from os import path @@ -214,6 +215,7 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by Stream = sdsio_manager( work_dir=_work_dir, auto_playback=_auto_playback, + exit_after_playback=True, play_list=_play_list, mon_port=None, write_flush_records=_write_flush_records, @@ -222,6 +224,15 @@ def _build_sdsio_request(command: int, sid: int = 0, argument: int = 0, data: by control_input_factory=False, ) +# Shutdown SDSIO manager on exit +def shutdown(): + try: + Stream.shutdown() + except Exception: + logger.error("Failed to shutdown SDSIO manager.") + +# Register the shutdown function to be called on exit +atexit.register(shutdown) ## Process command # @param command requested SDSIO command diff --git a/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/sdsio.py b/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/sdsio.py index b5c3809..cefe648 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/sdsio.py +++ b/ST/B-U585I-IOT02A/MotionRecognition/Board/Corstone-300/vsi/python/sdsio.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import os import os.path as path import threading @@ -26,7 +27,7 @@ # ---------------------------------------------------------------------------- # # SDSIO server-compatible stream implementation # # ---------------------------------------------------------------------------- # -SDSIO_VSI_VERSION = "3.0.0" +SDSIO_VSI_VERSION = "3.1.0" class StreamInfo(NamedTuple): name: str = None @@ -133,8 +134,12 @@ def __init__(self, auto_playback=False): self._set = SDS_FLAG_MASK_PLAYBACK_MODE | SDS_FLAG_MASK_START self._auto_start_pending = True - def apply(self, set_mask: int, clear_mask: int): + def apply(self, set_mask: int, clear_mask: int, auto_playback: Optional[bool] = None): with self._lock: + if auto_playback is not None: + self._auto_playback = auto_playback + self._auto_start_pending = auto_playback and bool(set_mask & SDS_FLAG_MASK_START) + self._auto_terminate_pending = False self._set = (self._set | set_mask) & ~clear_mask self._clear = (self._clear | clear_mask) & ~set_mask if set_mask & SDS_FLAG_MASK_PLAYBACK_MODE: @@ -166,14 +171,17 @@ def request_auto_playback_start(self) -> bool: self._auto_start_pending = True return True - def request_auto_playback_terminate(self) -> bool: + def request_auto_playback_terminate(self, _force=False) -> bool: with self._lock: if not self._auto_playback: return False - if self._auto_start_pending or self._auto_terminate_pending: - return False - if self._target_flags & SDS_FLAG_MASK_START: + if self._auto_terminate_pending: return False + if not _force: + if self._auto_start_pending: + return False + if self._target_flags & SDS_FLAG_MASK_START: + return False self._set |= SDS_FLAG_MASK_CI_TERMINATE self._clear &= ~SDS_FLAG_MASK_CI_TERMINATE self._auto_terminate_pending = True @@ -216,7 +224,10 @@ def __init__( self, work_dir, auto_playback=False, + exit_after_playback=False, + no_progress_info=False, play_list: Optional[list] = None, + play_step: Optional[int] = None, mon_port: Optional[int] = None, write_flush_records: Optional[int] = None, status_bar_factory=None, @@ -224,7 +235,7 @@ def __init__( control_input_factory=None, ): self._stream_id = 0 - self._play_step_index = 0 + self._play_step = 0 self._rec_index = None # recording session index (None = not yet determined) self._work_dir = path.normpath(work_dir) self._rec_dir = self._work_dir @@ -239,19 +250,23 @@ def __init__( self._read_buffers = {} # sid -> ByteStreamBuffer self._read_threads = {} # sid -> Thread self._read_stop = {} # sid -> Event - # lock to protect stream_id increment and open checks - self._manager_lock = threading.Lock() + # lock to protect playback selection and stream state transitions + self._manager_lock = threading.RLock() # timestamp of last stream read or write command self.time_last_rw = time.time() # status bar self._status = None - if status_bar_factory is None: + if status_bar_factory is None and not no_progress_info: status_bar_factory = StatusBar if status_bar_factory: self._status = status_bar_factory(self) self._playback_mode = False + self._exit_after_playback = exit_after_playback + self._send_ci_terminate_on_shutdown = False self._play_list = play_list + self._play_step_limit = len(play_list) if play_list else None + self._single_play_step_selected = False self._mon_port = mon_port self._write_flush_records = write_flush_records # SDS Control Flags @@ -262,9 +277,9 @@ def __init__( if monitor_factory is None: monitor_factory = sdsMonitorInterface if monitor_factory: - self._monitor = monitor_factory(self._mon_port, self._flags) + self._monitor = monitor_factory(self._mon_port, self._flags, self.select_play_step) self._ctrl_input = None - if control_input_factory is not False: + if control_input_factory is not False and sys.stdin.isatty(): if control_input_factory is None: control_input_factory = sdsControlInput if control_input_factory: @@ -275,6 +290,15 @@ def __init__( self._info_IdleRate: int = 0 self._last_async_time = time.time() self._last_playback_stream_name = None + try: + self._loop = asyncio.get_running_loop() + self._main_task = asyncio.current_task() + except RuntimeError: + self._loop = None + self._main_task = None + if play_step is not None: + if play_step < 0 or not self.select_play_step(play_step): + raise ValueError(f"Invalid play step: {play_step}") def shutdown(self): self.shutdown_requested.set() @@ -459,40 +483,93 @@ def _file_read_worker(self, sid, name, buf: ByteStreamBuffer, stop_evt): finally: buf.set_eof() + def _get_play_step_limit(self): + if not self._play_list: + return None + if self._play_step_limit is None: + return len(self._play_list) + return min(self._play_step_limit, len(self._play_list)) + + def _is_single_play_step_selected(self) -> bool: + return self._single_play_step_selected + + def select_play_step(self, play_step: Optional[int]) -> bool: + with self._manager_lock: + if self.opened_streams: + logger.error("Play step selection failed: streams are currently open.") + return False + if not self._play_list: + logger.error("Play step selection failed: no play steps are configured.") + return False + + if play_step is not None and (play_step < 0 or play_step >= len(self._play_list)): + logger.error(f"Play step selection failed: {play_step} is outside 0-{len(self._play_list) - 1}.") + return False + + if play_step is None: + self._play_step = 0 + self._play_step_limit = len(self._play_list) + self._single_play_step_selected = False + logger.debug(f"Selected all playback steps 0-{len(self._play_list) - 1}.") + else: + self._play_step = play_step + self._play_step_limit = play_step + 1 + self._single_play_step_selected = True + logger.debug(f"Selected playback step {play_step}.") + self._label_list.clear() + self._timestamp_boundaries.clear() + return True + def _create_play_label_list(self, name) -> list[str]: _labels = [] - if self._play_list and self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + _play_step_limit = self._get_play_step_limit() + if self._play_list and self._play_step < _play_step_limit: + _step = self._play_list[self._play_step] _labels = list(_step.get('labels', [])) else: - # No playlist: one file per open, indexed by play_step_index - _candidate = path.join(self._work_dir, f"{name}.{self._play_step_index}.sds") + # No playlist: one file per open, selected by play_step + _candidate = path.join(self._work_dir, f"{name}.{self._play_step}.sds") if path.exists(_candidate): - _labels.append(str(self._play_step_index)) + _labels.append(str(self._play_step)) return _labels def _has_next_auto_playback_step(self) -> bool: if not self._flags.auto_playback or self.opened_streams: return False if self._play_list: - return self._play_step_index < len(self._play_list) + return self._play_step < self._get_play_step_limit() if self._last_playback_stream_name: return bool(self._create_play_label_list(self._last_playback_stream_name)) return False def _request_auto_playback_if_needed(self, target_flags: Optional[int] = None): - _target_flags = self._flags.target_flags if target_flags is None else target_flags - if _target_flags & SDS_FLAG_MASK_START: + with self._manager_lock: + _target_flags = self._flags.target_flags if target_flags is None else target_flags + if _target_flags & SDS_FLAG_MASK_START: + return + if self.opened_streams: + return + if self._has_next_auto_playback_step(): + self._flags.request_auto_playback_start() + elif self._flags.auto_playback and self._last_playback_stream_name: + if self._flags.request_auto_playback_terminate(): + _complete_msg = "Playback complete - no more steps remaining." if self._play_list else "Playback complete." + logger.info(_complete_msg) + self._request_exit_after_playback("playback complete") + + def _request_exit_after_playback(self, _reason: str): + if not self._exit_after_playback: return - if self.opened_streams: - return - if self._has_next_auto_playback_step(): - self._flags.request_auto_playback_start() - elif self._flags.auto_playback and self._last_playback_stream_name: - if self._flags.request_auto_playback_terminate(): - logger.info("Playback complete - no more steps remaining.") - + logger.info(f"SDSIO-Server terminating ({_reason}).") + self._send_ci_terminate_on_shutdown = True + self.shutdown_requested.set() + if self._loop and self._main_task: + self._loop.call_soon_threadsafe(self._main_task.cancel) def _open(self, mode, name): + with self._manager_lock: + return self._open_locked(mode, name) + + def _open_locked(self, mode, name): _cmd = CMD_OPEN # prepare error response _resp_err = bytearray() @@ -523,12 +600,13 @@ def _open(self, mode, name): if self._playback_mode: if not self._label_list: # Get flags, Set working dir + _index_based_playback = False if self._play_list: - if self._play_step_index < len(self._play_list): - _step = self._play_list[self._play_step_index] + if self._play_step < self._get_play_step_limit(): + _step = self._play_list[self._play_step] _step_desc = _step.get('step', '') _desc_suffix = f": {_step_desc}" if _step_desc else "" - logger.info(f"Playback step {self._play_step_index + 1}/{len(self._play_list)}{_desc_suffix}.") + logger.info(f"Playback step {self._play_step}{_desc_suffix}.") _set_flags = _step.get('setflags', 0) _clear_flags = _step.get('clearflags', 0) _recdir = _step.get('recdir', None) @@ -538,10 +616,13 @@ def _open(self, mode, name): self._rec_dir = self._work_dir else: logger.error(f"Open Failed. End of playlist. No more steps available for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err else: _set_flags = 0 _clear_flags = 0 + _index_based_playback = True if _set_flags or _clear_flags: logger.debug(f"Applying flags for playback stream '{name}': set=0x{_set_flags:08X}, clear=0x{_clear_flags:08X}.") @@ -550,12 +631,16 @@ def _open(self, mode, name): # Create label list _play_label_list = self._create_play_label_list(name) if not _play_label_list: - if not self._play_list and self._play_step_index > 0: + if not self._play_list and self._play_step > 0: logger.error(f"Open Failed. No more files available for playback stream '{name}'.") else: logger.error(f"Open Failed. No files found for playback stream '{name}'.") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err self._label_list = _play_label_list + if _index_based_playback and self._play_step == 0: + logger.info("No play steps, index based playback started.") else: if mode == 0: @@ -614,6 +699,8 @@ def _open(self, mode, name): for _sds_file_path in _file_paths: if not path.exists(_sds_file_path): logger.error(f"Missing file for playback stream '{name}': {self._format_path(_sds_file_path)}") + if self._exit_after_playback and self._flags.request_auto_playback_terminate(_force=True): + self._request_exit_after_playback("playback data unavailable") return _resp_err if not self._timestamp_boundaries: @@ -657,6 +744,10 @@ def _open(self, mode, name): return _resp def _close(self, sid): + with self._manager_lock: + return self._close_locked(sid) + + def _close_locked(self, sid): _resp = bytearray() _stream = self.opened_streams[sid] _name = _stream.name @@ -699,7 +790,7 @@ def _close(self, sid): if not self.opened_streams: if self._playback_mode: - self._play_step_index += 1 + self._play_step += 1 self._label_list.clear() self._timestamp_boundaries.clear() self._request_auto_playback_if_needed() @@ -809,7 +900,7 @@ def _info(self, flags: int, idle_rate: int, err_data: bytes): logger.info(f"{idle_rate}% idle.") self._info_IdleRate = idle_rate if err_data: - _status = int.from_bytes(err_data[0:4],'little') + _status = int.from_bytes(err_data[0:4], 'little', signed=True) _line = int.from_bytes(err_data[4:8],'little') _err_mgs = err_data[8:] if _status == 0: @@ -850,9 +941,14 @@ def get_async_response(self): def get_shutdown_flags(self): _resp = bytearray() _cmd = CMD_FLAGS + if self._send_ci_terminate_on_shutdown: + _set_mask = SDS_FLAG_MASK_CI_TERMINATE + else: + _set_mask = 0 + _clear_mask = SDS_FLAG_MASK_ALIVE _resp.extend(_cmd.to_bytes(4,'little')) - _resp.extend((0).to_bytes(4,'little')) - _resp.extend((1 << 28).to_bytes(4,'little')) + _resp.extend(_set_mask.to_bytes(4,'little')) + _resp.extend(_clear_mask.to_bytes(4,'little')) _resp.extend((0).to_bytes(4,'little')) return _resp diff --git a/ST/B-U585I-IOT02A/MotionRecognition/README.md b/ST/B-U585I-IOT02A/MotionRecognition/README.md index d40c1ec..5670721 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/README.md +++ b/ST/B-U585I-IOT02A/MotionRecognition/README.md @@ -118,7 +118,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\MotionRecognition SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -183,7 +183,7 @@ The SDS file `Test_Out..p.sds` created during playback should be identical to ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\MotionRecognition SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -286,7 +286,7 @@ To perform a recording, follow these steps: ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\MotionRecognition SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -349,7 +349,7 @@ The SDS file `ML_Out..p.sds` created during playback should be identical to t ```txt >sdsio-server usb -SDSIO-Server v3.0.0 +SDSIO-Server v3.1.0 Press 'Ctrl+C' or 'X' to exit. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\MotionRecognition SDSIO command input: R=Record, P=playback, S/s=stop, T/t=reset, X/x=exit, A-H=set flags 0-7, a-h=clear flags 0-7. @@ -455,7 +455,7 @@ Anomaly prediction: -0.180526 ```txt Created by ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\MotionRecognition\Board\Corstone-300\vsi\python\arm_vsi3.py -SDSIO VSI version 3.0.0 +SDSIO VSI version 3.1.0 SDSIO_FVP environment variable not set. Working directory: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\MotionRecognition\algorithm\SDS Recordings. SDSIO configuration YAML: ...\Arm-Examples\SDS-Examples\ST\B-U585I-IOT02A\MotionRecognition\algorithm.sdsio.yml. diff --git a/ST/B-U585I-IOT02A/MotionRecognition/SDS.csolution.yml b/ST/B-U585I-IOT02A/MotionRecognition/SDS.csolution.yml index a500dce..f69536c 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/SDS.csolution.yml +++ b/ST/B-U585I-IOT02A/MotionRecognition/SDS.csolution.yml @@ -15,7 +15,7 @@ solution: # Refer to https://open-cmsis-pack.github.io/cmsis-toolbox/ReferenceApplications/ for more information packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: Keil::B-U585I-IOT02A_BSP - pack: Keil::STM32U5xx_DFP - pack: ARM::V2M_MPS3_SSE_300_BSP@^1.5.0 diff --git a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_control.c b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_control.c index 6a11479..60ec0fb 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_control.c +++ b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_main.c b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_main.c index df1855d..50ac5fc 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_main.c +++ b/ST/B-U585I-IOT02A/MotionRecognition/algorithm/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_control.c b/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_control.c index 6a11479..60ec0fb 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_control.c +++ b/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_control.c @@ -34,7 +34,8 @@ osThreadAttr_t attrAlgorithmThread = { // sdsControlThread thread attributes osThreadAttr_t attr_sdsControlThread = { - .name = "sdsControl" + .name = "sdsControl", + .priority = osPriorityNormal1 }; // Idle time counter diff --git a/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_main.c b/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_main.c index b2e38c1..32de570 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_main.c +++ b/ST/B-U585I-IOT02A/MotionRecognition/datatest/sds_main.c @@ -164,7 +164,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsRead(sds_data_in_id, ×lot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_DATA) { - osDelay(10U); + osDelay(1U); DiscardInputData(); } } while (ret == SDS_NO_DATA); @@ -190,7 +190,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_in_id, timeslot, algo_data_in_buf, sizeof(algo_data_in_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_in_buf)); @@ -208,7 +208,7 @@ __NO_RETURN void AlgorithmThread (void *argument) { do { ret = sdsWrite(sds_data_out_id, timeslot, algo_data_out_buf, sizeof(algo_data_out_buf)); if (ret == SDS_NO_SPACE) { - osDelay(10U); + osDelay(1U); } } while (ret == SDS_NO_SPACE); SDS_ASSERT(ret == sizeof(algo_data_out_buf)); diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h +++ b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 deleted file mode 100644 index 8d0b50c..0000000 --- a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.0.0 +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2025-2026 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: sds_config.h - * Purpose: SDS configuration options - * Rev.: V3.0.0 - */ - -//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- - -// SDS System Configuration - -// Maximum concurrent streams <1-31> -// Default: 16 -#define SDS_MAX_STREAMS 16U - -// Internal buffer size for I/O transfers -// Default: 8192 -#define SDS_BUF_SIZE 8192U - -// - -//------------- <<< end of configuration section >>> --------------------------- - -// SDS system thread stack size -#define SDS_THREAD_STACK_SIZE 1024 - -// SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal - -// SDS stream open timeout in kernel ticks -#define SDS_OPEN_TIMEOUT 3000U - -// SDS stream close timeout in kernel ticks -#define SDS_CLOSE_TIMEOUT 3000U - -// Optimal I/O transfer size (read/write) -// Default: 8192 -// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) -// to ensure efficient read/write performance -#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 new file mode 100644 index 0000000..ecd50a5 --- /dev/null +++ b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/RTE/SDS/sds_config.h.base@3.1.0 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025-2026 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Name: sds_config.h + * Purpose: SDS configuration options + * Rev.: V3.1.0 + */ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +// SDS System Configuration + +// Maximum concurrent streams <1-31> +// Default: 16 +#define SDS_MAX_STREAMS 16U + +// Internal buffer size for I/O transfers +// Default: 8192 +#define SDS_BUF_SIZE 8192U + +// + +//------------- <<< end of configuration section >>> --------------------------- + +// SDS system thread stack size +#define SDS_THREAD_STACK_SIZE 1024 + +// SDS system thread priority +#define SDS_THREAD_PRIORITY osPriorityNormal1 + +// SDS stream open timeout in kernel ticks +#define SDS_OPEN_TIMEOUT 3000U + +// SDS stream close timeout in kernel ticks +#define SDS_CLOSE_TIMEOUT 3000U + +// Optimal I/O transfer size (read/write) +// Default: 8192 +// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) +// to ensure efficient read/write performance +#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/sdsio_fvp.clayer.yml b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/sdsio_fvp.clayer.yml index f4634a7..5c2f55a 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/sdsio_fvp.clayer.yml +++ b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/fvp/sdsio_fvp.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using VSI packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 connections: - connect: SDS diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h index 8d0b50c..ecd50a5 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h +++ b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h @@ -17,7 +17,7 @@ * * Name: sds_config.h * Purpose: SDS configuration options - * Rev.: V3.0.0 + * Rev.: V3.1.0 */ //-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- @@ -40,7 +40,7 @@ #define SDS_THREAD_STACK_SIZE 1024 // SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal +#define SDS_THREAD_PRIORITY osPriorityNormal1 // SDS stream open timeout in kernel ticks #define SDS_OPEN_TIMEOUT 3000U diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 deleted file mode 100644 index 8d0b50c..0000000 --- a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.0.0 +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2025-2026 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * Name: sds_config.h - * Purpose: SDS configuration options - * Rev.: V3.0.0 - */ - -//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- - -// SDS System Configuration - -// Maximum concurrent streams <1-31> -// Default: 16 -#define SDS_MAX_STREAMS 16U - -// Internal buffer size for I/O transfers -// Default: 8192 -#define SDS_BUF_SIZE 8192U - -// - -//------------- <<< end of configuration section >>> --------------------------- - -// SDS system thread stack size -#define SDS_THREAD_STACK_SIZE 1024 - -// SDS system thread priority -#define SDS_THREAD_PRIORITY osPriorityNormal - -// SDS stream open timeout in kernel ticks -#define SDS_OPEN_TIMEOUT 3000U - -// SDS stream close timeout in kernel ticks -#define SDS_CLOSE_TIMEOUT 3000U - -// Optimal I/O transfer size (read/write) -// Default: 8192 -// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) -// to ensure efficient read/write performance -#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 new file mode 100644 index 0000000..ecd50a5 --- /dev/null +++ b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/RTE/SDS/sds_config.h.base@3.1.0 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2025-2026 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Name: sds_config.h + * Purpose: SDS configuration options + * Rev.: V3.1.0 + */ + +//-------- <<< Use Configuration Wizard in Context Menu >>> -------------------- + +// SDS System Configuration + +// Maximum concurrent streams <1-31> +// Default: 16 +#define SDS_MAX_STREAMS 16U + +// Internal buffer size for I/O transfers +// Default: 8192 +#define SDS_BUF_SIZE 8192U + +// + +//------------- <<< end of configuration section >>> --------------------------- + +// SDS system thread stack size +#define SDS_THREAD_STACK_SIZE 1024 + +// SDS system thread priority +#define SDS_THREAD_PRIORITY osPriorityNormal1 + +// SDS stream open timeout in kernel ticks +#define SDS_OPEN_TIMEOUT 3000U + +// SDS stream close timeout in kernel ticks +#define SDS_CLOSE_TIMEOUT 3000U + +// Optimal I/O transfer size (read/write) +// Default: 8192 +// Select a value appropriate for the underlying I/O interface (e.g., socket, USART, VCOM, file system) +// to ensure efficient read/write performance +#define SDS_IO_TRANSFER_SIZE 8192U diff --git a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/sdsio_usb.clayer.yml b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/sdsio_usb.clayer.yml index 23e8729..5b36837 100644 --- a/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/sdsio_usb.clayer.yml +++ b/ST/B-U585I-IOT02A/MotionRecognition/sdsio/usb/sdsio_usb.clayer.yml @@ -3,7 +3,7 @@ layer: description: Layer with SDS and SDSIO using USB interface to the SDSIO-Server packs: - - pack: ARM::SDS@^3.0.0-0 + - pack: ARM::SDS@^3.1.0-0 - pack: Keil::MDK-Middleware@^8.0.0 connections: